Skip to contentSkip to conversation

read-only rootfs support

PATCH Superseded [email protected] 1 participant 8 messages Jan 14, 2013 – Jan 15, 2013

v7 of 8 Superseded Latest is v8 →

lore
Share & tools
lore
#0 lore raw

v7 cover read-only rootfs support

From: Chen Qi <[email protected]>

The series of patches add support to read-only rootfs.

The main idea is to use symbolic links to create the illuion that some directories are writable in case of a read-only rootfs.

This set of patches have been tested on minimal images with and without 'read-only-rootfs' image feature enabled. Everything is OK.

For sato images, everything is the same as before if 'read-only-rootfs' is not enabled. With 'read-only-rootfs' enabled, sato image could work if graphic interface is diabled. When all postinstall problems are resolved, sato image should work well (maybe with some small changes in volatiles-readonly-sato conf file).

Changes for Version 4:
1) Improve the commit messages to be clearer.
2) Use 'sed -i' to replace 'sed' and 'mv' operations to cut down the exec overhead.

Changes for Version 5:
Fix the problem of failing to build the live images

Changes for Version 6:
1) Let the image recipes provide the corresponding conf files for read-only rootfs. The config files are closely related to the image types, so it's more reasonable to let these image recipes provide the config files.
2) Support customized conf files for customized images.

Changes for Version 7:
1) Separate read-only-rootfs specific conf files from image recipes. Create recipes for them and let image recipes depend on the them.
2) 'choose_volatiel_conf' is no more need, thus removed.

The following changes since commit 53cc748b93e8af584557d6db5309c3e955182c5c:

linux-libc-headers: fix headers install in long path name environments (2013-01-10 23:53:51 +0000)

are available in the git repository at:

git://git.pokylinux.org/poky-contrib ChenQi/readonly-rootfs
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=ChenQi/readonly-rootfs

Chen Qi (6):
sysvinit: add ROOTFS_READ_ONLY variable to rcS-default image.bbclass: add a hook funtion to support readonly rootfs core-image.bbclass: support read-only rootfs
initscripts: support read-only rootfs
volatile-conf-minimal: add recipe
volatile-conf-sato: add recipe

 meta/classes/core-image.bbclass                    |    5 +-
 meta/classes/image.bbclass                         |   16 +-
 meta/recipes-core/images/core-image-minimal.bb     |    3 +
 .../initscripts/initscripts-1.0/bootmisc.sh        |    9 +-
 .../initscripts-1.0/populate-volatile.sh           |  281 ++++++++++----------
 .../initscripts/initscripts-1.0/volatiles          |    1 +
 meta/recipes-core/initscripts/initscripts_1.0.bb   |    5 +-
 .../files/volatiles-readonly-minimal               |    8 +
 .../volatile-conf-minimal_1.0.bb                   |   15 ++
 meta/recipes-core/sysvinit/sysvinit/rcS-default    |    4 +
 meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb     |    2 +-
 meta/recipes-sato/images/core-image-sato.bb        |    3 +
 .../files/volatiles-readonly-sato                  |   14 +
 .../volatile-conf-sato_1.0.bb                      |   15 ++
 14 files changed, 224 insertions(+), 157 deletions(-)
 create mode 100644 meta/recipes-core/readonly-volatile-conf/files/volatiles-readonly-minimal
 create mode 100644 meta/recipes-core/readonly-volatile-conf/volatile-conf-minimal_1.0.bb
 create mode 100644 meta/recipes-sato/readonly-volatile-conf/files/volatiles-readonly-sato
 create mode 100644 meta/recipes-sato/readonly-volatile-conf/volatile-conf-sato_1.0.bb
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH v7 1/6 sysvinit: add ROOTFS_READ_ONLY variable to rcS-default

From: Chen Qi <[email protected]>

This variable indicates whether the rootfs is intended to be read-only or not. Changing this value from 'no' to 'yes' on a currently running system with read-write rootfs and rebooting will give the user a working system with read-only rootfs.

However, it is not suggested to change its value. Normally, if a read-only rootfs is required, we should build an image with 'read-only-rootfs' image feature.

[YOCTO #3406]

---
 meta/recipes-core/sysvinit/sysvinit/rcS-default |    4 ++++
 meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb  |    2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)
meta/recipes-core/sysvinit/sysvinit/rcS-default +4 -0
index 3c9dea9..709cdf6 100644
@@ -23,3 +23,7 @@ FSCKFIX=yes
 #TICKADJ=10000
 # Enable caching in populate-volatile.sh
 VOLATILE_ENABLE_CACHE=yes
+# Indicate whether the rootfs is intended to be read-only or not.
+# Setting ROOTFS_READ_ONLY to yes and rebooting will give you a read-only rootfs.
+# Normally you should not change this value.
+ROOTFS_READ_ONLY=no
meta/recipes-core/sysvinit/sysvinit_2.88dsf.bb +1 -1
index de073b8..bf6a29b 100644
@@ -5,7 +5,7 @@ SECTION = "base"
 LICENSE = "GPLv2+"
 LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe \
                     file://COPYRIGHT;endline=15;md5=349c872e0066155e1818b786938876a4"
-PR = "r9"
+PR = "r10"
 
 RDEPENDS_${PN} = "${PN}-inittab"
 
Signature · 1 line
1.7.9.5
#2 lore raw

PATCH v7 2/6 image.bbclass: add a hook funtion to support readonly rootfs

In reply to [email protected]

From: Chen Qi <[email protected]>

read_only_rootfs_hook: this funtion is invoked only if 'read-only-rootfs' is in IMAGE_FEATURES. It tweaks some basic files and makes populate- volatile.sh script run at rootfs time.

[YOCTO #3406]

---
 meta/classes/image.bbclass |   16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)
meta/classes/image.bbclass +15 -1
index e494689..834497a 100644
@@ -185,7 +185,6 @@ do_build[nostamp] = "1"
 # task, so that we have a single fakeroot context for the whole process.
 do_rootfs[umask] = "022"
 
-
 run_intercept_scriptlets () {
 	if [ -d ${WORKDIR}/intercept_scripts ]; then
 		cd ${WORKDIR}/intercept_scripts
@@ -396,6 +395,21 @@ zap_root_password () {
 	mv ${IMAGE_ROOTFS}/etc/passwd.new ${IMAGE_ROOTFS}/etc/passwd
 } 
 
+# A hook function to support read-only-rootfs IMAGE_FEATURES
+read_only_rootfs_hook () {
+	# Tweak the mount option in fstab
+	sed -i '/rootfs/ s/defaults/ro/' ${IMAGE_ROOTFS}/etc/fstab
+	# Change the value of ROOTFS_READ_ONLY in /etc/default/rcS to yes
+	if [ -e ${IMAGE_ROOTFS}/etc/default/rcS ]; then
+		sed -i 's/ROOTFS_READ_ONLY=no/ROOTFS_READ_ONLY=yes/' ${IMAGE_ROOTFS}/etc/default/rcS
+	fi
+	# Run populate-volatile.sh at rootfs time to set up basic files
+	# and directories to support read-only rootfs.
+	if [ -e ${IMAGE_ROOTFS}/etc/init.d/populate-volatile.sh ]; then
+		${IMAGE_ROOTFS}/etc/init.d/populate-volatile.sh
+	fi
+}
+
 # allow openssh accept login with empty password string
 openssh_allow_empty_password () {
 	if [ -e ${IMAGE_ROOTFS}${sysconfdir}/ssh/sshd_config ]; then
Signature · 1 line
1.7.9.5
#3 lore raw

PATCH v7 3/6 core-image.bbclass: support read-only rootfs

In reply to [email protected]

From: Chen Qi <[email protected]>

The hook function is appended to ROOTFS_POSTPROCESS_COMMAND properly to support the 'read-only-rootfs' image feature.

[YOCTO #3406]

---
 meta/classes/core-image.bbclass |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
meta/classes/core-image.bbclass +3 -2
index 2e67018..ebb9597 100644
@@ -28,6 +28,7 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=3f40d7994397109285ec7b81fdeb3
 # - dev-pkgs            - development packages (headers, etc.) for all installed packages in the rootfs
 # - dbg-pkgs            - debug symbol packages for all installed packages in the rootfs
 # - doc-pkgs            - documentation packages for all installed packages in the rootfs
+# - read-only-rootfs    - tweaks an image to support read-only rootfs
 #
 PACKAGE_GROUP_x11 = "packagegroup-core-x11"
 PACKAGE_GROUP_x11-base = "packagegroup-core-x11-base"
@@ -73,9 +74,9 @@ inherit image
 
 # Create /etc/timestamp during image construction to give a reasonably sane default time setting
 ROOTFS_POSTPROCESS_COMMAND += "rootfs_update_timestamp ; "
-
 # Zap the root password if debug-tweaks feature is not enabled
 ROOTFS_POSTPROCESS_COMMAND += '${@base_contains("IMAGE_FEATURES", "debug-tweaks", "", "zap_root_password ; ",d)}'
 # Allow openssh accept empty password login if both debug-tweaks and ssh-server-openssh are enabled
 ROOTFS_POSTPROCESS_COMMAND += '${@base_contains("IMAGE_FEATURES", "debug-tweaks ssh-server-openssh", "openssh_allow_empty_password; ", "",d)}'
-
+# Tweak the mount options for rootfs in /etc/fstab if read-only-rootfs is enabled
+ROOTFS_POSTPROCESS_COMMAND += '${@base_contains("IMAGE_FEATURES", "read-only-rootfs", "read_only_rootfs_hook; ", "",d)}'
Signature · 1 line
1.7.9.5
#4 lore raw

PATCH v7 4/6 initscripts: support read-only rootfs

In reply to [email protected]

From: Chen Qi <[email protected]>

To support a read-only rootfs, we use symbolic links which point to volatile storage to create the illusion that some directories are writable.

Improve populate-volatile.sh script to support read-only rootfs. Add two default config files specific to read-only-rootfs image.

[YOCTO #3406]

---
 .../initscripts/initscripts-1.0/bootmisc.sh        |    9 +-
 .../initscripts-1.0/populate-volatile.sh           |  281 ++++++++++----------
 .../initscripts/initscripts-1.0/volatiles          |    1 +
 meta/recipes-core/initscripts/initscripts_1.0.bb   |    5 +-
 4 files changed, 143 insertions(+), 153 deletions(-)
meta/recipes-core/initscripts/initscripts-1.0/bootmisc.sh +1 -8
index 4f76cb4..3b5a47f 100755
@@ -54,14 +54,7 @@ fi
 
 #
 # This is as good a place as any for a sanity check
-# /tmp should be a symlink to /var/tmp to cut down on the number
-# of mounted ramdisks.
-if test ! -L /tmp && test -d /var/tmp
-then
-	rm -rf /tmp
-	ln -sf /var/tmp /tmp
-fi
-
+#
 # Set the system clock from hardware clock
 # If the timestamp is more recent than the current time,
 # use the timestamp instead.
meta/recipes-core/initscripts/initscripts-1.0/populate-volatile.sh +138 -143

330 lines not on this page · raw message

meta/recipes-core/initscripts/initscripts-1.0/volatiles +1 -0
index e0741aa..f7e2ef7 100644
@@ -31,6 +31,7 @@ l root root 1777 /var/lock /var/volatile/lock
 l root root 0755 /var/log /var/volatile/log
 l root root 0755 /var/run /var/volatile/run
 l root root 1777 /var/tmp /var/volatile/tmp
+l root root 1777 /tmp /var/tmp
 d root root 0755 /var/lock/subsys none
 f root root 0664 /var/log/wtmp none
 f root root 0664 /var/run/utmp none
meta/recipes-core/initscripts/initscripts_1.0.bb +3 -2
index 39be9a8..3c4e9ee 100644
@@ -3,7 +3,7 @@ DESCRIPTION = "Initscripts provide the basic system startup initialization scrip
 SECTION = "base"
 LICENSE = "GPLv2"
 LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
-PR = "r138"
+PR = "r139"
 
 INHIBIT_DEFAULT_DEPS = "1"
 
@@ -31,7 +31,7 @@ SRC_URI = "file://functions \
            file://populate-volatile.sh \
            file://volatiles \
            file://save-rtc.sh \
-	   file://GPLv2.patch"
+           file://GPLv2.patch"
 
 SRC_URI_append_arm = " file://alignment.sh"
 
@@ -86,6 +86,7 @@ do_install () {
 	install -m 0755    ${WORKDIR}/populate-volatile.sh ${D}${sysconfdir}/init.d
 	install -m 0755    ${WORKDIR}/save-rtc.sh	${D}${sysconfdir}/init.d
 	install -m 0644    ${WORKDIR}/volatiles		${D}${sysconfdir}/default/volatiles/00_core
+
 	if [ "${TARGET_ARCH}" = "arm" ]; then
 		install -m 0755 ${WORKDIR}/alignment.sh	${D}${sysconfdir}/init.d
 	fi
Signature · 1 line
1.7.9.5
#5 lore raw

PATCH v7 5/6 volatile-conf-minimal: add recipe

In reply to [email protected]

From: Chen Qi <[email protected]>

This recipe provides a config file for core-image-minimal. This config file is used for volatile storage handling in case of a readonly rootfs.

Also, let core-image-minimal depend on this recipe.

[YOCTO #3406]

---
 meta/recipes-core/images/core-image-minimal.bb     |    3 +++
 .../files/volatiles-readonly-minimal               |    8 ++++++++
 .../volatile-conf-minimal_1.0.bb                   |   15 +++++++++++++++
 3 files changed, 26 insertions(+)
 create mode 100644 meta/recipes-core/readonly-volatile-conf/files/volatiles-readonly-minimal
 create mode 100644 meta/recipes-core/readonly-volatile-conf/volatile-conf-minimal_1.0.bb
meta/recipes-core/images/core-image-minimal.bb +3 -0
index 0d2613e..f6baeae 100644
@@ -6,6 +6,9 @@ IMAGE_LINGUAS = " "
 
 LICENSE = "MIT"
 
+RDEPENDS += "volatile-conf-minimal"
+IMAGE_INSTALL += "volatile-conf-minimal"
+
 inherit core-image
 
 IMAGE_ROOTFS_SIZE = "8192"
meta/recipes-core/readonly-volatile-conf/files/volatiles-readonly-minimal new file +8 -0
new file mode 100644
index 0000000..b7146a2
@@ -0,0 +1,8 @@
+# This configuration file lists filesystem objects specific to minimal image
+# with read-only rootfs.
+# This configuration file will only be applied if the image is minimal and the
+# rootfs is read-only.
+# For the detailed format information, refer to /etc/default/volatiles/00_core.
+d root root 0755 /var/volatile/lib/ none
+d root root 0755 /var/volatile/lib/urandom/ none
+l root root 0755 /var/lib/urandom /var/volatile/lib/urandom
meta/recipes-core/readonly-volatile-conf/volatile-conf-minimal_1.0.bb new file +15 -0
new file mode 100644
index 0000000..c5744e1
@@ -0,0 +1,15 @@
+SUMMARY = "Provide config files for core-image-minimal"
+DESCRIPTION = "This package contains a config file for core-image-minimal. \
+It is used to handle volatile storage in case of a read-only rootfs."
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI = "file://volatiles-readonly-minimal"
+
+PR = "r1"
+
+do_install () {
+	install -d ${D}${sysconfdir}/default/volatiles
+	install -m 0644 ${WORKDIR}/volatiles-readonly-minimal ${D}${sysconfdir}/default/volatiles/00_core_readonly
+}
Signature · 1 line
1.7.9.5
#6 lore raw

PATCH v7 6/6 volatile-conf-sato: add recipe

In reply to [email protected]

From: Chen Qi <[email protected]>

This recipe provides a config file for core-image-sato. The config file is used to handle volatile storage in case of a read-only-rootfs image.

Also, let core-image-sato.bb depend on this recipe.

[YOCTO #3406]

---
 meta/recipes-sato/images/core-image-sato.bb        |    3 +++
 .../files/volatiles-readonly-sato                  |   14 ++++++++++++++
 .../volatile-conf-sato_1.0.bb                      |   15 +++++++++++++++
 3 files changed, 32 insertions(+)
 create mode 100644 meta/recipes-sato/readonly-volatile-conf/files/volatiles-readonly-sato
 create mode 100644 meta/recipes-sato/readonly-volatile-conf/volatile-conf-sato_1.0.bb
meta/recipes-sato/images/core-image-sato.bb +3 -0
index f52a1a5..8aaeaf8 100644
@@ -6,6 +6,9 @@ IMAGE_FEATURES += "splash package-management x11-base x11-sato ssh-server-dropbe
 
 LICENSE = "MIT"
 
+RDEPENDS += "volatile-conf-sato"
+IMAGE_INSTALL += "volatile-conf-sato"
+
 inherit core-image
 
 IMAGE_INSTALL += "packagegroup-core-x11-sato-games"
meta/recipes-sato/readonly-volatile-conf/files/volatiles-readonly-sato new file +14 -0
new file mode 100644
index 0000000..4a56b81
@@ -0,0 +1,14 @@
+# This configuration file lists filesystem objects specific to sato image
+# with read-only rootfs.
+# This configuration file will only be applied if the image is sato and the
+# rootfs is read-only.
+# For the detailed format information, refer to /etc/default/volatiles/00_core.
+d root root 0755 /var/volatile/lib/ none
+d root root 0755 /var/volatile/lib/urandom/ none
+d root root 0755 /var/volatile/lib/dropbear/ none
+d root root 0755 /var/volatile/lib/nfs/ none
+d root root 0755 /var/volatile/lib/dbus/ none
+l root root 0755 /var/lib/urandom /var/volatile/lib/urandom
+l root root 0755 /var/lib/dropbear /var/volatile/lib/dropbear
+l root root 0755 /var/lib/nfs /var/volatile/lib/nfs
+l root root 0755 /var/lib/dbus /var/volatile/lib/dbus
meta/recipes-sato/readonly-volatile-conf/volatile-conf-sato_1.0.bb new file +15 -0
new file mode 100644
index 0000000..acc8901
@@ -0,0 +1,15 @@
+SUMMARY = "Provide config files for core-image-sato"
+DESCRIPTION = "This package contains a config file for core-image-sato. \
+It is used to handle volatile storage in case of a read-only rootfs."
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI = "file://volatiles-readonly-sato"
+
+PR = "r1"
+
+do_install () {
+	install -d ${D}${sysconfdir}/default/volatiles
+	install -m 0644 ${WORKDIR}/volatiles-readonly-sato ${D}${sysconfdir}/default/volatiles/00_core_readonly
+}
Signature · 1 line
1.7.9.5
author
#7 lore raw

Re: [PATCH V7 6/6] volatile-conf-sato: add recipe

I've got to apologize.
This patch has a serious problem.

The fact that the IMAGE_INSTALL statement was before the 'inherit' statement caused an override of IMAGE_INSTALL variable in image.bbclass, thus resulting a bunch of packaged not installed on target.

A new patch will be sent soon.
Sorry for that.

Chen Qi

Quoted 74 lines · On 01/14/2013 04:35 PM, [email protected] wrote:

From: Chen Qi<[email protected]>

This recipe provides a config file for core-image-sato. The config file is used to handle volatile storage in case of a read-only-rootfs image.

Also, let core-image-sato.bb depend on this recipe.

[YOCTO #3406]

---
  meta/recipes-sato/images/core-image-sato.bb        |    3 +++
  .../files/volatiles-readonly-sato                  |   14 ++++++++++++++
  .../volatile-conf-sato_1.0.bb                      |   15 +++++++++++++++
  3 files changed, 32 insertions(+)

create mode 100644 meta/recipes-sato/readonly-volatile-conf/files/volatiles-readonly-sato create mode 100644 meta/recipes-sato/readonly-volatile-conf/volatile-conf-sato_1.0.bb

meta/recipes-sato/images/core-image-sato.bb +3 -0
index f52a1a5..8aaeaf8 100644
@@ -6,6 +6,9 @@ IMAGE_FEATURES += "splash package-management x11-base x11-sato ssh-server-dropbe
 
  LICENSE = "MIT"
 
+RDEPENDS += "volatile-conf-sato"
+IMAGE_INSTALL += "volatile-conf-sato"
+
  inherit core-image
 
  IMAGE_INSTALL += "packagegroup-core-x11-sato-games"
meta/recipes-sato/readonly-volatile-conf/files/volatiles-readonly-sato new file +14 -0
new file mode 100644
index 0000000..4a56b81
@@ -0,0 +1,14 @@
+# This configuration file lists filesystem objects specific to sato image
+# with read-only rootfs.
+# This configuration file will only be applied if the image is sato and the
+# rootfs is read-only.
+# For the detailed format information, refer to /etc/default/volatiles/00_core.
+d root root 0755 /var/volatile/lib/ none
+d root root 0755 /var/volatile/lib/urandom/ none
+d root root 0755 /var/volatile/lib/dropbear/ none
+d root root 0755 /var/volatile/lib/nfs/ none
+d root root 0755 /var/volatile/lib/dbus/ none
+l root root 0755 /var/lib/urandom /var/volatile/lib/urandom
+l root root 0755 /var/lib/dropbear /var/volatile/lib/dropbear
+l root root 0755 /var/lib/nfs /var/volatile/lib/nfs
+l root root 0755 /var/lib/dbus /var/volatile/lib/dbus
meta/recipes-sato/readonly-volatile-conf/volatile-conf-sato_1.0.bb new file +15 -0
new file mode 100644
index 0000000..acc8901
@@ -0,0 +1,15 @@
+SUMMARY = "Provide config files for core-image-sato"
+DESCRIPTION = "This package contains a config file for core-image-sato. \
+It is used to handle volatile storage in case of a read-only rootfs."
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM ="file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI ="file://volatiles-readonly-sato"
+
+PR = "r1"
+
+do_install () {
+	install -d ${D}${sysconfdir}/default/volatiles
+	install -m 0644 ${WORKDIR}/volatiles-readonly-sato ${D}${sysconfdir}/default/volatiles/00_core_readonly
+}