diff options
author | Chen Qi <Qi.Chen@windriver.com> | 2013-06-28 15:48:53 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-06-28 10:43:24 +0100 |
commit | 3cd6fedd815688b2f3fd97a56feb5f8696ebeace (patch) | |
tree | 46661deccef0ff509ac2528ee5405b9be5241239 /meta | |
parent | ba5e437bc7335468a70ea293496f78e1a9d66287 (diff) | |
download | openembedded-core-3cd6fedd815688b2f3fd97a56feb5f8696ebeace.tar.gz openembedded-core-3cd6fedd815688b2f3fd97a56feb5f8696ebeace.tar.bz2 openembedded-core-3cd6fedd815688b2f3fd97a56feb5f8696ebeace.zip |
init-live.sh: try to make a union mount when possible
This patch tries to make a union mount in live image. For example,
if aufs is enabled with the aufs-enable.scc configuration fragment,
the init-live.sh script will use aufs to make a union mount.
Although overlayfs is not supported by Yocto kernel yet, this patch
still takes it into consideration with the expect that the related
code should at least serve as a placeholder.
[YOCTO #1487]
[YOCTO #4761]
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/recipes-core/initrdscripts/files/init-live.sh | 63 |
1 files changed, 56 insertions, 7 deletions
diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh b/meta/recipes-core/initrdscripts/files/init-live.sh index ca4135141f..890c56280a 100644 --- a/meta/recipes-core/initrdscripts/files/init-live.sh +++ b/meta/recipes-core/initrdscripts/files/init-live.sh @@ -137,15 +137,64 @@ 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. +mount_and_boot() { + mkdir $ROOT_MOUNT + mknod /dev/loop0 b 7 0 2>/dev/null + + # determine which unification filesystem to use + union_fs_type="" + if grep -q -w "overlayfs" /proc/filesystems; then + union_fs_type="overlayfs" + elif grep -q -w "aufs" /proc/filesystems; then + union_fs_type="aufs" + else + union_fs_type="" + fi + + # make a union mount if possible + 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 + rm -rf /rootfs.ro /rootfs.rw + fatal "Could not mount rootfs image" + 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 + mkdir -p $ROOT_MOUNT/rootfs.ro $ROOT_MOUNT/rootfs.rw + mount --move /rootfs.ro $ROOT_MOUNT/rootfs.ro + mount --move /rootfs.rw $ROOT_MOUNT/rootfs.rw + fi + ;; + "aufs") + mkdir -p /rootfs.ro /rootfs.rw + if ! mount -o rw,loop,noatime,nodiratime /media/$i/$ISOLINUX/$ROOT_IMAGE /rootfs.ro; then + rm -rf /rootfs.ro /rootfs.rw + fatal "Could not mount rootfs image" + 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 + mkdir -p $ROOT_MOUNT/rootfs.ro $ROOT_MOUNT/rootfs.rw + mount --move /rootfs.ro $ROOT_MOUNT/rootfs.ro + mount --move /rootfs.rw $ROOT_MOUNT/rootfs.rw + fi + ;; + "") + if ! mount -o rw,loop,noatime,nodiratime /media/$i/$ISOLINUX/$ROOT_IMAGE $ROOT_MOUNT ; then + fatal "Could not mount rootfs image" + fi + ;; + esac + + # boot the image + boot_live_root +} + case $label in 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" - else - boot_live_root - fi + mount_and_boot ;; install|install-efi) if [ -f /media/$i/$ISOLINUX/$ROOT_IMAGE ] ; then |