On Wed, 27 Feb 2008, Luke Yelavich wrote: > Attached is a patch to allow an initramfs to use a root filesystem as a > loop device, on top of another file system. A good example and use of > this code is for Ubuntu's Windows installer, which creates a loopback > filesystem on top of the Windows NTFS partition. The Windows partition > is mounted, then the loopback filesystem is mounted from the Windows > partition. The patch applies against git head.
ack cool, see specific critics below. > diff -urN initramfs-tools/init initramfs-tools.new/init > --- initramfs-tools/init 2008-02-26 10:36:10.347676705 +1100 > +++ initramfs-tools.new/init 2008-02-26 13:50:26.459676705 +1100 > @@ -85,6 +85,15 @@ > ;; > esac > ;; > + loop=*) > + LOOP="${x#loop=}" > + ;; > + loopflags=*) > + LOOPFLAGS="-o ${x#loopflags=}" > + ;; > + loopfstype=*) > + LOOPFSTYPE="${x#loopfstype=}" > + ;; > nfsroot=*) > NFSROOT="${x#nfsroot=}" > ;; don't see them in kernel-parameter.txt but this namespace seems sane, so ack from me. > diff -urN initramfs-tools/initramfs-tools.8 > initramfs-tools.new/initramfs-tools.8 > --- initramfs-tools/initramfs-tools.8 2008-02-26 13:48:37.435676705 +1100 > +++ initramfs-tools.new/initramfs-tools.8 2008-02-26 13:49:26.251676705 > +1100 <snipp manpage diff> ok too. > diff -urN initramfs-tools/scripts/local initramfs-tools.new/scripts/local > --- initramfs-tools/scripts/local 2008-02-26 13:48:37.423676705 +1100 > +++ initramfs-tools.new/scripts/local 2008-02-26 13:49:26.239676705 +1100 > @@ -101,7 +101,8 @@ > run_scripts /scripts/local-premount > [ "$quiet" != "y" ] && log_end_msg > > - if [ "${readonly}" = "y" ]; then > + if [ ${readonly} = y ] && \ > + ([ -z "$LOOP" ] || [ "${FSTYPE#ntfs}" = "$FSTYPE" ]); then > roflag=-r > else > roflag=-w hmm at first sight i found a bit strange that you use not a different boot method for the loop fs stuff, like setting BOOT=loop if loop bootarg is given and then just having scripts/loop. but on the contrary i agree that it is on a local fs almost identical path and would lead otherwise to code duplication of the local boot scripts and thus fine with me. > @@ -114,6 +115,43 @@ > # Mount root > mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt} > > + if [ "$LOOP" ]; then > + mkdir -p /host > + mount -o move ${rootmnt} /host > + > + while [ ! -e "/host/${LOOP#/}" ]; do > + panic "ALERT! /host/${LOOP#/} does not exist. > Dropping to a shell!" > + done that check should go up and check that aboves mount doesn't fail, otherwise i don't see a possibility of that happening. > + > + # Get the loop filesystem type if not set > + if [ -z "${LOOPFSTYPE}" ]; then > + eval $(fstype < "/host/${LOOP#/}") > + else > + FSTYPE="${LOOPFSTYPE}" > + fi > + if [ "$FSTYPE" = "unknown" ] && [ -x /lib/udev/vol_id ]; then > + FSTYPE=$(/lib/udev/vol_id -t "/host/${LOOP#/}") > + [ -z "$FSTYPE" ] && FSTYPE="unknown" > + fi no thanks duplication use get_fstype > + > + if [ ${readonly} = y ]; then > + roflag=-r > + else > + roflag=-w > + fi > + > + # FIXME This has no error checking > + modprobe loop > + modprobe ${FSTYPE} > + > + # FIXME This has no error checking > + mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} > "/host/${LOOP#/}" ${rootmnt} yep that was the FIXME i was talking about above. please add mount returnvalue check here too. afais klibc mount returns sensible error codes. > + > + if [ -d ${rootmnt}/host ]; then > + mount -o move /host ${rootmnt}/host > + fi > + fi > + > [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom" > run_scripts /scripts/local-bottom > [ "$quiet" != "y" ] && log_end_msg thanks for the submission. -- maks -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]