summaryrefslogtreecommitdiff
path: root/meta/recipes-core
diff options
context:
space:
mode:
authorChen Qi <Qi.Chen@windriver.com>2013-06-28 15:48:53 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-06-28 10:43:24 +0100
commit3cd6fedd815688b2f3fd97a56feb5f8696ebeace (patch)
tree46661deccef0ff509ac2528ee5405b9be5241239 /meta/recipes-core
parentba5e437bc7335468a70ea293496f78e1a9d66287 (diff)
downloadopenembedded-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/recipes-core')
-rw-r--r--meta/recipes-core/initrdscripts/files/init-live.sh63
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