I've taken a quick stab as refreshing this, though I haven't yet tested
it. I did move mounting of the loopback to mount_loop_root in functions,
as I would like to eventually support loopback mounted files from NFS.
live well,
vagrant
commit aab4c43f484fa44b6f35e9bf0b358a70b165bcbd
Author: Vagrant Cascadian <vagrant@debian.org>
Date: Tue Aug 11 16:17:09 2015 +0200
Refreshed patch from Luke Yelavich to add loopback support to
initramfs-tools.
diff --git a/init b/init
index abf7f25..2760bcb 100755
--- a/init
+++ b/init
@@ -98,6 +98,15 @@ for x in $(cat /proc/cmdline); do
;;
esac
;;
+ loop=*)
+ LOOP="${x#loop=}"
+ ;;
+ loopflags=*)
+ LOOPFLAGS="-o ${x#loopflags=}"
+ ;;
+ loopfstype=*)
+ LOOPFSTYPE="${x#loopfstype=}"
+ ;;
nfsroot=*)
NFSROOT="${x#nfsroot=}"
;;
diff --git a/initramfs-tools.8 b/initramfs-tools.8
index ea8c098..ce8e830 100644
--- a/initramfs-tools.8
+++ b/initramfs-tools.8
@@ -42,6 +42,19 @@ The default is 180 seconds.
set the file system mount option string.
.TP
+\fB\fI loop
+path within the original root file system to loop-mount and use as the
+real root file system.
+
+.TP
+\fB\fI loopflags
+set the loop file system mount option string, if applicable.
+
+.TP
+\fB\fI loopfstype
+set the loop file system type, if applicable.
+
+.TP
\fB\fI nfsroot
can be either "auto" to try to get the relevant information from DHCP or a
string of the form NFSSERVER:NFSPATH or NFSSERVER:NFSPATH:NFSOPTS.
diff --git a/scripts/functions b/scripts/functions
index 8c1bb1f..99de1aa 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -426,6 +426,36 @@ mountfs()
${type}_mount_fs "$1"
}
+# Mount a loopback device, which is present on the mounted filesystem.
+mount_loop_root()
+{
+ 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
+
+ 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}
+
+ if [ -d ${rootmnt}/host ]; then
+ mount -o move /host ${rootmnt}/host
+ fi
+ fi
+}
+
# Mount the root file system. It should be overridden by all
# boot scripts.
mountroot()
diff --git a/scripts/local b/scripts/local
index f6424f0..94d6ddc 100644
--- a/scripts/local
+++ b/scripts/local
@@ -135,7 +135,8 @@ local_mount_root()
ROOT=$(resolve_device "$ROOT")
- if [ "${readonly}" = "y" ]; then
+ if [ "${readonly}" = "y" ] && \
+ ([ -z "$LOOP" ] || [ "${FSTYPE#ntfs}" = "$FSTYPE" ]); then
roflag=-r
else
roflag=-w
@@ -153,6 +154,8 @@ local_mount_root()
else
mount ${roflag} ${ROOTFLAGS} ${ROOT} ${rootmnt}
fi
+
+ mount_loop_root
}
local_mount_fs()
Attachment:
signature.asc
Description: PGP signature