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

Bug#652459: initramfs-tools: [patch] Please support mounting of /usr in the initramfs



On Sun, Dec 18, 2011 at 03:38:20AM +0100, Marco d'Itri wrote:
> On Dec 17, Roger Leigh <rleigh@debian.org> wrote:
> 
> > 1) Generation of /etc/fstab in the initramfs, including the rootfs
> >    and all the filesystems desired to be mounted
> This is highly suboptimal, because it suddenly makes the initramfs not
> generic anymore.
> The initramfs should:
> - mount / as usual
> - look at the rootfs fstab
> - mount /usr using the information from the rootfs fstab

The attached patch does this.

Note that the patch isn't complete; it won't mount an LVM VG because
it lacks the LV activation performed for the root in
"scripts/local-top/lvm2".  I haven't included this in the patch
because I'm not sure of the best approach to take here.

Maybe it would make sense to make the existing scripts a bit more
generic, to permit setup of devices other than $ROOT?  Maybe if the
scripts were idempotent, they could be invoked multiple times (once
per device)?

I didn't want to do this without discussing it with you, so hope the
patch is useful as a basis for a complete solution.

Regarding mounting of /etc; I think this would be useful in a number
of uncommon situations.  I'll look at (separately) implementing an
--etc/etc= option similar to the existing root options which would
permit this to work, and keep the initramfs generic at the same time.
As for /usr above, having the ability to generically activate devices
other than $ROOT would also be useful here.


Regards,
Roger

-- 
  .''`.  Roger Leigh
 : :' :  Debian GNU/Linux             http://people.debian.org/~rleigh/
 `. `'   Printing on GNU/Linux?       http://gutenprint.sourceforge.net/
   `-    GPG Public Key: 0x25BFB848   Please GPG sign your mail.
>From 02574bd223ac21ad18e5c4fa801766e7eaa7c00a Mon Sep 17 00:00:00 2001
From: Roger Leigh <Roger Leigh rleigh@debian.org>
Date: Sat, 17 Dec 2011 11:47:59 +0000
Subject: [PATCH] scripts/local: Add parse_initramfs_fstab function and mount
 /usr

This parses /etc/fstab and /etc/fstab.d/*.fstab on the rootfs,
in order to obtain the mount information for /usr (if available).
If an entry for /usr exists, mount /usr immediately after mounting
the rootfs.
---
 scripts/local |   51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/scripts/local b/scripts/local
index 521e69a..fc70c02 100644
--- a/scripts/local
+++ b/scripts/local
@@ -1,5 +1,54 @@
 # Local filesystem mounting			-*- shell-script -*-
 
+# Find a specific fstab entry from the mounted rootfs
+# $1=mountpoint
+# $2=fstype (optional)
+# returns 0 on success, 1 on failure (not found or no fstab)
+parse_initramfs_fstab () {
+	local found
+	found=1
+	for file in ${rootmnt}/etc/fstab ${rootmnt}/etc/fstab.d/*.fstab; do
+		if [ -f "${file}" ]; then
+			while read MNT_FSNAME MNT_DIR MNT_TYPE MNT_OPTS MNT_FREQ MNT_PASS MNT_JUNK
+			do
+				case "${MNT_FSNAME}" in
+				    ""|\#*)
+					continue;;
+				esac
+
+				if [ "$MNT_DIR" = "$1" ]; then
+					if [ -n "$2" ]; then
+						[ "$MNT_TYPE" = "$2" ] || continue;
+					fi
+					found=0;
+					break 2
+				fi
+
+		done < "${file}"
+	fi
+	done
+	return $found
+}
+
+# /usr mounting
+mountusr()
+{
+	if parse_initramfs_fstab /usr; then
+		if [ "${readonly}" = "y" ]; then
+			roflag=-r
+		else
+			roflag=-w
+		fi
+
+		# FIXME This has no error checking
+		modprobe ${MNT_TYPE}
+
+		# FIXME This has no error checking
+		# Mount /usr
+		mount ${roflag} -t "${MNT_TYPE}" -o "${MNT_OPTS}" "${MNT_FSNAME}" "${rootmnt}${MNT_DIR}"
+	fi
+}
+
 pre_mountroot()
 {
 	[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-top"
@@ -106,6 +155,8 @@ mountroot()
 		mount ${roflag} ${ROOTFLAGS} ${ROOT} ${rootmnt}
 	fi
 
+	mountusr
+
 	[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
 	run_scripts /scripts/local-bottom
 	[ "$quiet" != "y" ] && log_end_msg
-- 
1.7.7.3


Reply to: