| Submitter | Saul Wold |
|---|---|
| Date | April 11, 2012, 1:33 a.m. |
| Message ID | <5db901b79e5dde24e04a4c6237c377d8a9fdac22.1334107957.git.sgw@linux.intel.com> |
| Download | mbox | patch |
| Permalink | /patch/25551/ |
| State | New |
| Headers | show |
Comments
On Tue, 2012-04-10 at 18:33 -0700, Saul Wold wrote: > From: Yang Shi <yang.shi@windriver.com> > > [YOCTO #1487] > > When booting up with liveCD image, init scripts can't work well on read-only filesystem. Unionfs, > which is supported in Yocto kernel, allows a filesystem to appear as writeable, but without > actually allowing writes to change the filesystem. > > Use unionfs to mount rootfs and make root file system can be writen when using liveCD to boot up. > Set UNION_FS variable depending on kernel config, so that it can work with kernel which doesn't > have unionfs feature. > > Signed-off-by: Yang Shi <yang.shi@windriver.com> > --- > meta/recipes-core/initrdscripts/files/init-live.sh | 23 ++++++++++++++++--- > .../initrdscripts/initramfs-live-boot_1.0.bb | 9 +++++++- > 2 files changed, 27 insertions(+), 5 deletions(-) > > diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh b/meta/recipes-core/initrdscripts/files/init-live.sh > index eb5ab5b..737dae4 100644 > --- a/meta/recipes-core/initrdscripts/files/init-live.sh > +++ b/meta/recipes-core/initrdscripts/files/init-live.sh > @@ -7,6 +7,7 @@ ROOT_IMAGE="rootfs.img" > MOUNT="/bin/mount" > UMOUNT="/bin/umount" > ISOLINUX="" > +UNIONFS="no" > > early_setup() { > mkdir /proc > @@ -89,17 +90,31 @@ case $label in > 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 "Couldnt mount rootfs image" > + > + if [ "$UNIONFS" = "yes" ]; then > + mkdir /rootfs-tmp > + > + if ! $MOUNT -o rw,loop,noatime,nodiratime /media/$i/$ISOLINUX/$ROOT_IMAGE /rootfs-tmp ; then > + fatal "Could not mount rootfs image" > + else > + mkdir /cow > + mount -t tmpfs -o rw,noatime,mode=755 tmpfs /cow > + mount -t unionfs -o dirs=/cow:/rootfs-tmp=ro unionfs $ROOT_MOUNT > + boot_live_root > + fi > else > - boot_live_root > + 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 > fi > ;; > install) > if [ -f /media/$i/$ISOLINUX/$ROOT_IMAGE ] ; then > ./install.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode > else > - fatal "Couldnt find install script" > + fatal "Could not find install script" > fi > > # If we're getting here, we failed... > diff --git a/meta/recipes-core/initrdscripts/initramfs-live-boot_1.0.bb b/meta/recipes-core/initrdscripts/initramfs-live-boot_1.0.bb > index e85a0e1..f7f0c9d 100644 > --- a/meta/recipes-core/initrdscripts/initramfs-live-boot_1.0.bb > +++ b/meta/recipes-core/initrdscripts/initramfs-live-boot_1.0.bb > @@ -2,10 +2,17 @@ DESCRIPTION = "A live image init script" > LICENSE = "MIT" > LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" > RDEPENDS = "udev" > +DEPENDS = "virtual/kernel" > SRC_URI = "file://init-live.sh" > > -PR = "r7" > +PR = "r8" > > +do_compile() { > + if grep -q "CONFIG_UNION_FS=y" ${STAGING_KERNEL_DIR}/.config; then > + sed -i 's/UNIONFS="no"/UNIONFS="yes"/g' ${WORKDIR}/init-live.sh > + fi > +} > + > do_install() { > install -m 0755 ${WORKDIR}/init-live.sh ${D}/init > } Sadly, virtual/kernel is a machine specific dependency so we need to remove the allarch inherit from the recipe and mark it as machine specific too. Cheers, Richard
Patch
diff --git a/meta/recipes-core/initrdscripts/files/init-live.sh b/meta/recipes-core/initrdscripts/files/init-live.sh index eb5ab5b..737dae4 100644 --- a/meta/recipes-core/initrdscripts/files/init-live.sh +++ b/meta/recipes-core/initrdscripts/files/init-live.sh @@ -7,6 +7,7 @@ ROOT_IMAGE="rootfs.img" MOUNT="/bin/mount" UMOUNT="/bin/umount" ISOLINUX="" +UNIONFS="no" early_setup() { mkdir /proc @@ -89,17 +90,31 @@ case $label in 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 "Couldnt mount rootfs image" + + if [ "$UNIONFS" = "yes" ]; then + mkdir /rootfs-tmp + + if ! $MOUNT -o rw,loop,noatime,nodiratime /media/$i/$ISOLINUX/$ROOT_IMAGE /rootfs-tmp ; then + fatal "Could not mount rootfs image" + else + mkdir /cow + mount -t tmpfs -o rw,noatime,mode=755 tmpfs /cow + mount -t unionfs -o dirs=/cow:/rootfs-tmp=ro unionfs $ROOT_MOUNT + boot_live_root + fi else - boot_live_root + 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 fi ;; install) if [ -f /media/$i/$ISOLINUX/$ROOT_IMAGE ] ; then ./install.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode else - fatal "Couldnt find install script" + fatal "Could not find install script" fi # If we're getting here, we failed... diff --git a/meta/recipes-core/initrdscripts/initramfs-live-boot_1.0.bb b/meta/recipes-core/initrdscripts/initramfs-live-boot_1.0.bb index e85a0e1..f7f0c9d 100644 --- a/meta/recipes-core/initrdscripts/initramfs-live-boot_1.0.bb +++ b/meta/recipes-core/initrdscripts/initramfs-live-boot_1.0.bb @@ -2,10 +2,17 @@ DESCRIPTION = "A live image init script" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" RDEPENDS = "udev" +DEPENDS = "virtual/kernel" SRC_URI = "file://init-live.sh" -PR = "r7" +PR = "r8" +do_compile() { + if grep -q "CONFIG_UNION_FS=y" ${STAGING_KERNEL_DIR}/.config; then + sed -i 's/UNIONFS="no"/UNIONFS="yes"/g' ${WORKDIR}/init-live.sh + fi +} + do_install() { install -m 0755 ${WORKDIR}/init-live.sh ${D}/init }