diff options
author | 2013-09-11 13:01:55 +0800 | |
---|---|---|
committer | 2013-09-11 11:04:05 +0100 | |
commit | 29f869b68a9017502f75915784a924f0fe9d4be1 (patch) | |
tree | 3d50b86d1d9179ba7cd1e34297f555246dbee6b2 /meta/recipes-core/initrdscripts/files | |
parent | 1b0602b5933b3ee8e4ae36d447bf881308528a47 (diff) | |
download | openembedded-core-contrib-29f869b68a9017502f75915784a924f0fe9d4be1.tar.gz |
init-live.sh: distinguish between a read-only image and a read-write image
The iso and hddimg share a common concept of 'live image', and they
use the same initramfs and thus the same init. However, that init
script in initramfs made a wrong assumption that the rootfs image
was read-only by itself. This is apparently not true for hddimg.
To make things work as expected, this init script should at least
distinguish between a read-only rootfs image and a read-write one.
This patch adds this ability to the init script. After this change,
the init script would be able to check whether the rootfs image is
read-only or not. If the rootfs image is read-write, the image will
be mounted and then booted directly. No union mounts will be attempted
in this case.
[YOCTO #5164]
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-core/initrdscripts/files')
-rw-r--r-- | meta/recipes-core/initrdscripts/files/init-live.sh | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh b/meta/recipes-core/initrdscripts/files/init-live.sh index 861d874657..df0076dd84 100644 --- a/meta/recipes-core/initrdscripts/files/init-live.sh +++ b/meta/recipes-core/initrdscripts/files/init-live.sh @@ -137,12 +137,23 @@ do sleep 1 done -# Try to make a union mount of the root image. -# If no unification filesystem is available, mount the image read-only. +# Try to mount the root image read-write and then boot it up. +# This function distinguishes between a read-only image and a read-write image. +# In the former case (typically an iso), it tries to make a union mount if possible. +# In the latter case, the root image could be mounted and then directly booted up. mount_and_boot() { mkdir $ROOT_MOUNT mknod /dev/loop0 b 7 0 2>/dev/null + if ! mount -o rw,loop,noatime,nodiratime /media/$i/$ISOLINUX/$ROOT_IMAGE $ROOT_MOUNT ; then + fatal "Could not mount rootfs image" + fi + + if touch $ROOT_MOUNT/bin 2>/dev/null; then + # The root image is read-write, directly boot it up. + boot_live_root + fi + # determine which unification filesystem to use union_fs_type="" if grep -q -w "overlayfs" /proc/filesystems; then @@ -157,9 +168,9 @@ mount_and_boot() { case $union_fs_type in "overlayfs") mkdir -p /rootfs.ro /rootfs.rw - if ! mount -o rw,loop,noatime,nodiratime /media/$i/$ISOLINUX/$ROOT_IMAGE /rootfs.ro; then + if ! mount -n --move $ROOT_MOUNT /rootfs.ro; then rm -rf /rootfs.ro /rootfs.rw - fatal "Could not mount rootfs image" + fatal "Could not move rootfs mount point" else mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw mount -t overlayfs -o "lowerdir=/rootfs.ro,upperdir=/rootfs.rw" overlayfs $ROOT_MOUNT @@ -170,9 +181,9 @@ mount_and_boot() { ;; "aufs") mkdir -p /rootfs.ro /rootfs.rw - if ! mount -o rw,loop,noatime,nodiratime /media/$i/$ISOLINUX/$ROOT_IMAGE /rootfs.ro; then + if ! mount -n --move $ROOT_MOUNT /rootfs.ro; then rm -rf /rootfs.ro /rootfs.rw - fatal "Could not mount rootfs image" + fatal "Could not move rootfs mount point" else mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw mount -t aufs -o "dirs=/rootfs.rw=rw:/rootfs.ro=ro" aufs $ROOT_MOUNT @@ -182,11 +193,7 @@ mount_and_boot() { fi ;; "") - if ! mount -o rw,loop,noatime,nodiratime /media/$i/$ISOLINUX/$ROOT_IMAGE $ROOT_MOUNT ; then - fatal "Could not mount rootfs image" - else - mount -t tmpfs -o rw,noatime,mode=755 tmpfs $ROOT_MOUNT/media - fi + mount -t tmpfs -o rw,noatime,mode=755 tmpfs $ROOT_MOUNT/media ;; esac |