[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#468114: Loopback file system support.



On 2015-08-11, Vagrant Cascadian wrote:
> 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.

Made some small changes, updated and *tested* this time! Patch below...

live well,
  vagrant

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..2ed3ce3 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -426,6 +426,42 @@ mountfs()
 	${type}_mount_fs "$1"
 }
 
+# Mount a loopback device, which is present on the mounted filesystem.
+mount_loop_root()
+{
+	mkdir -p /host
+	mount -o move ${rootmnt} /host
+	loopfile="/host/${LOOP#/}"
+
+	while [ ! -e "$loopfile" ]; do
+		panic "ALERT! $loopfile does not exist.  Dropping to a shell!"
+	done
+
+	if [ ${readonly} = y ]; then
+		roflag=-r
+	else
+		roflag=-w
+	fi
+
+	# Get the loop filesystem type if not set
+	if [ -z "${LOOPFSTYPE}" ]; then
+	    FSTYPE=$(get_fstype "$loopfile")
+	else
+	    FSTYPE=${LOOPFSTYPE}
+	fi
+
+	# FIXME This has no error checking
+	modprobe loop
+	modprobe ${FSTYPE}
+
+	# FIXME This has no error checking
+	mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "$loopfile" ${rootmnt}
+
+	if [ -d ${rootmnt}/host ]; then
+		mount -o move /host ${rootmnt}/host
+	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..072013e 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,10 @@ local_mount_root()
 	else
 		mount ${roflag} ${ROOTFLAGS} ${ROOT} ${rootmnt}
 	fi
+
+	if [ "${LOOP}" ]; then
+		mount_loop_root
+	fi
 }
 
 local_mount_fs()

Attachment: signature.asc
Description: PGP signature


Reply to: