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

Bug#696495: underlying filesystems are hidden when using custom persistency with aufs



Package: live-boot
Version: 3.0~b10-1
Severity: important
Tags: patch

With commit 77dab1cb394c5fc2b9a848c6297d24f65a3b8259 the underlying
filesystems are no longer visible, because they are mounted to
/lib/live/mount before the root filesystem is mounted and masks them.

The attached patch fixes this by reverting part of that commit.
Filesystems are again mounted below /live first then moved
after the root filesystem is mounted. The move loop also moves all
filesystems mounted below /live and thus simplifies the code.

Gaudenz

-- System Information:
Debian Release: wheezy/sid
  APT prefers testing
  APT policy: (800, 'testing'), (700, 'unstable'), (50, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.2.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=de_CH.UTF-8, LC_CTYPE=de_CH.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
>From 5266dc2df1867d2a56dd6aa91c4745cb6d9fe57e Mon Sep 17 00:00:00 2001
From: Gaudenz Steinlin <gaudenz@debian.org>
Date: Fri, 21 Dec 2012 16:40:23 +0100
Subject: [PATCH] Fix mounting of rootfs, cow and medium filesystems

This partly reverts commit 77dab1cb394c5fc2b9a848c6297d24f65a3b8259. The
underlying filesystems have to be moved to (/root)/lib/live/mount after the
root filesystems is mounted. Otherwise they will be masked by the root
filesystem.

This code reverts to mounting everything under /live in the initrd and
only moves the mount points to (/root)/lib/live/mount after the final root
filesystems is mounted.
---
 scripts/boot/9990-main.sh         |   23 +++++++++++++----------
 scripts/boot/9990-misc-helpers.sh |   14 +++++++-------
 scripts/boot/9990-overlay.sh      |   23 -----------------------
 3 files changed, 20 insertions(+), 40 deletions(-)

diff --git a/scripts/boot/9990-main.sh b/scripts/boot/9990-main.sh
index c696781..fd10e5d 100755
--- a/scripts/boot/9990-main.sh
+++ b/scripts/boot/9990-main.sh
@@ -135,6 +135,19 @@ Main ()
 		mount_images_in_directory "${livefs_root}" "${rootmnt}" "${mac}"
 	fi
 
+	# At this point /root should contain the final root filesystem.
+	# Move all mountpoints below /live into /root/lib/live/mount.
+	# This has to be done after mounting the root filesystem to /
+	# otherwise these mount points won't be accessible from the running system.
+	for _MOUNT in $(cat /proc/mounts | cut -f 2 -d " " | grep -e "^/live/")
+	do
+		local newmount
+		newmount="${rootmnt}/lib/live/mount/${_MOUNT#/live/}"
+		mkdir -p "${newmount}"
+		mount -o move "${_MOUNT}" "${newmount}" > /dev/null 2>&1 || \
+		mount -o bind "${_MOUNT}" "${newmount}" > /dev/null || \
+		log_warning_msg "W: failed to move or bindmount ${_MOUNT} to ${newmount}"
+	done
 
 	if [ -n "${ROOT_PID}" ]
 	then
@@ -151,9 +164,6 @@ Main ()
 			;;
 	esac
 
-	# Move to the new root filesystem so that programs there can get at it.
-	mkdir -p /root/lib/live/mount/medium
-	mount --move /live/medium /root/lib/live/mount/medium
 
 	# aufs2 in kernel versions around 2.6.33 has a regression:
 	# directories can't be accessed when read for the first the time,
@@ -161,13 +171,6 @@ Main ()
 	# when booting FAI, this simple workaround solves it
 	ls /root/* >/dev/null 2>&1
 
-	# Move findiso directory to the new root filesystem so that programs there can get at it.
-	if [ -d /live/findiso ]
-	then
-		mkdir -p /root/lib/live/mount/findiso
-		mount -n --move /live/findiso /root/lib/live/mount/findiso
-	fi
-
 	# if we do not unmount the ISO we can't run "fsck /dev/ice" later on
 	# because the mountpoint is left behind in /proc/mounts, so let's get
 	# rid of it when running from RAM
diff --git a/scripts/boot/9990-misc-helpers.sh b/scripts/boot/9990-misc-helpers.sh
index 71ba7e1..8219ea4 100755
--- a/scripts/boot/9990-misc-helpers.sh
+++ b/scripts/boot/9990-misc-helpers.sh
@@ -742,7 +742,7 @@ mount_persistence_media ()
 	device=${1}
 	probe=${2}
 
-	backing="${rootmnt}/lib/live/mount/persistence/$(basename ${device})"
+	backing="/live/persistence/$(basename ${device})"
 
 	mkdir -p "${backing}"
 	old_backing="$(where_is_mounted ${device})"
@@ -966,7 +966,7 @@ find_persistence_media ()
 	white_listed_devices="${2}"
 	ret=""
 
-	black_listed_devices="$(what_is_mounted_on ${rootmnt}/lib/live/medium)"
+	black_listed_devices="$(what_is_mounted_on /live/medium)"
 
 	for dev in $(storage_devices "${black_listed_devices}" "${white_listed_devices}")
 	do
@@ -1263,7 +1263,7 @@ do_union ()
 
 get_custom_mounts ()
 {
-	# Side-effect: leaves $devices with persistence.conf mounted in ${rootmnt}/lib/live/mount/persistence
+	# Side-effect: leaves $devices with persistence.conf mounted in /live/persistence
 	# Side-effect: prints info to file $custom_mounts
 
 	local custom_mounts devices bindings links
@@ -1302,7 +1302,7 @@ get_custom_mounts ()
 
 		if [ -n "${DEBUG}" ] && [ -e "${include_list}" ]
 		then
-			cp ${include_list} ${rootmnt}/lib/live/mount/persistence/${persistence_list}.${device_name}
+			cp ${include_list} /live/persistence/${persistence_list}.${device_name}
 		fi
 
 		while read dir options # < ${include_list}
@@ -1487,7 +1487,7 @@ activate_custom_mounts ()
 		rootfs_dest_backing=""
 		if [ -n "${opt_link}"]
 		then
-			for d in ${rootmnt}/lib/live/mount/rootfs/*
+			for d in /live/rootfs/*
 			do
 				if [ -n "${rootmnt}" ]
 				then
@@ -1519,7 +1519,7 @@ activate_custom_mounts ()
 			# has its own directory and isn't nested with some
 			# other custom mount (if so that mount's files would
 			# be linked, causing breakage.
-			cow_dir="${rootmnt}/lib/live/mount/overlay/lib/live/mount/persistence/$(basename ${links_source})"
+			cow_dir="/live/overlay/lib/live/mount/persistence/$(basename ${links_source})"
 			mkdir -p ${cow_dir}
 			chown_ref "${source}" "${cow_dir}"
 			chmod_ref "${source}" "${cow_dir}"
@@ -1536,7 +1536,7 @@ activate_custom_mounts ()
 			# bind-mount and union mount are handled the same
 			# in read-only mode, but note that rootfs_dest_backing
 			# is non-empty (and necessary) only for unions
-			cow_dir="${rootmnt}/lib/live/mount/overlay/${dest}"
+			cow_dir="/live/overlay/${dest}"
 			if [ -e "${cow_dir}" ] && [ -z "${opt_link}" ]
 			then
 				# If an earlier custom mount has files here
diff --git a/scripts/boot/9990-overlay.sh b/scripts/boot/9990-overlay.sh
index dba042b..098111c 100755
--- a/scripts/boot/9990-overlay.sh
+++ b/scripts/boot/9990-overlay.sh
@@ -383,29 +383,6 @@ setup_unionfs ()
 		esac
 	done
 
-	# move all /live mountpoints that the custom persistence
-	# system depends on into /lib/live on the root filesystem
-	for _DIRECTORY in rootfs
-	do
-		if [ -d "/live/${_DIRECTORY}" ]
-		then
-			mkdir -p "${rootmnt}/lib/live/mount/${_DIRECTORY}"
-
-			for _MOUNT in $(ls /live/${_DIRECTORY})
-			do
-				mkdir -p "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}"
-				mount -o move "/live/${_DIRECTORY}/${_MOUNT}" "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}" > /dev/null 2>&1 || \
-					mount -o bind "/live/${_DIRECTORY}/${_MOUNT}" "${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}" || \
-					log_warning_msg "W: failed to mount /live/${_DIRECTORY}/${_MOUNT} to ${rootmnt}/lib/live/mount/${_DIRECTORY}/${_MOUNT}"
-			done
-		fi
-	done
-
-	mkdir -p "${rootmnt}/lib/live/mount/overlay"
-	mount -o move /live/overlay "${rootmnt}/lib/live/mount/overlay" > /dev/null 2>&1 || \
-		mount -o bind /live/overlay "${rootmnt}/lib/live/mount/overlay" || \
-		log_warning_msg "W: failed to mount /live/overlay to ${rootmnt}/lib/live/mount/overlay"
-
 	# Adding custom persistence
 	if [ -n "${PERSISTENCE}" ] && [ -z "${NOPERSISTENCE}" ]
 	then
-- 
1.7.10.4


Reply to: