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

Bug#886328: live-boot: Please use /run/live instead of /lib/live/mount



Source: live-boot
Version: 1:20170623
Severity: normal
Tags: patch

Currently live-boot mounts following things:

  /lib/live/mount/medium: the live media mounted read-only
  /lib/live/mount/rootfs/filesystem.{squashfs,ext*,...}: the root fs image
  /lib/live/mount/overlay: the copy-on-write content from aufs
  /lib/live/mount/findiso: the loop-mounted iso image when using findiso
  /lib/live/mount/persistence/*: persistent devices with copy-on-write overlay

Some of these mounts are mounted in /live before they are moved to their
correct place. Since the final root filesystem is mounted in /root and
run-init switches to it, special care needs to be taken when moving the
mount points around.

/lib/live/mount/overlay is not accessible any more in the live system:

$ df -h
/dev/loop0 169M  169M     0 100% /lib/live/mount/rootfs/root.squashfs
tmpfs      744M     0  744M   0% /lib/live/mount/overlay
overlay    1,5G 1001M  536M  66% /

The early initramfs stage mounts tmpfs on /run which doesn't need to be
moved once the final root filesystem is in place. The mount points do
not need much space and can live on /run/live without problems. Since
these mount points are run-time variable data, they fit perfectly for
/run and comply with FHS 3.0.

Therefore move /lib/live/mount to /run/live and skip the intermedia
/live mount points. This reduces code and complexity. A tested patch is
attached.

See also for the previous larger layout change:
https://lists.debian.org/debian-live/2012/10/msg00021.html

-- 
Benjamin Drung
System Developer
Debian & Ubuntu Developer

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin

Email: benjamin.drung@profitbricks.com
URL: https://www.profitbricks.de

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Achim Weiss, Matthias Steinberg
>From 3f97c0d3153c2073eb93473eeb26d2f8153f6464 Mon Sep 17 00:00:00 2001
From: Benjamin Drung <benjamin.drung@profitbricks.com>
Date: Thu, 4 Jan 2018 11:02:32 +0100
Subject: [PATCH] Use /run/live instead of /lib/live/mount

Currently live-boot mounts following things:

  /lib/live/mount/medium: the live media mounted read-only
  /lib/live/mount/rootfs/filesystem.{squashfs,ext*,...}: the root fs image
  /lib/live/mount/overlay: the copy-on-write content from aufs
  /lib/live/mount/findiso: the loop-mounted iso image when using findiso
  /lib/live/mount/persistence/*: persistent devices with copy-on-write overlay

Some of these mounts are mounted in /live before they are moved to their
correct place. Since the final root filesystem is mounted in /root and
run-init switches to it, special care needs to be taken when moving the
mount points around.

/lib/live/mount/overlay is not accessible any more in the live system:

$ df -h
/dev/loop0 169M  169M     0 100% /lib/live/mount/rootfs/root.squashfs
tmpfs      744M     0  744M   0% /lib/live/mount/overlay
overlay    1,5G 1001M  536M  66% /

The early initramfs stage mounts tmpfs on /run which doesn't need to be
moved once the final root filesystem is in place. The mount points do
not need much space and can live on /run/live without problems. Since
these mount points are run-time variable data, they fit perfectly for
/run and comply with FHS 3.0.

Therefore move /lib/live/mount to /run/live and skip the intermedia
/live mount points. This reduces code and complexity.

See also for the previous larger layout change:
https://lists.debian.org/debian-live/2012/10/msg00021.html

Signed-off-by: Benjamin Drung <benjamin.drung@profitbricks.com>
---
 backend/initramfs-tools/live.hook  |  2 +-
 components/0001-init-vars.sh       |  2 +-
 components/2010-remove-persistence |  2 +-
 components/9990-main.sh            | 20 +++----------------
 components/9990-misc-helpers.sh    | 24 +++++++++++-----------
 components/9990-overlay.sh         | 41 +++++++-------------------------------
 6 files changed, 25 insertions(+), 66 deletions(-)

diff --git a/backend/initramfs-tools/live.hook b/backend/initramfs-tools/live.hook
index 1ce922d..97f4c5e 100755
--- a/backend/initramfs-tools/live.hook
+++ b/backend/initramfs-tools/live.hook
@@ -8,7 +8,7 @@ set -e
 
 # Reading configuration file from filesystem and live-media
 for _FILE in /etc/live/boot.conf /etc/live/boot/* \
-	     /lib/live/mount/media/live/boot.conf /lib/live/mount/media/live/boot/*
+	     /run/live/medium/live/boot.conf /run/live/medium/live/boot/*
 do
 	if [ -e "${_FILE}" ]
 	then
diff --git a/components/0001-init-vars.sh b/components/0001-init-vars.sh
index 7e69956..603cf43 100755
--- a/components/0001-init-vars.sh
+++ b/components/0001-init-vars.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-mountpoint="/live/medium"
+mountpoint="/run/live/medium"
 alt_mountpoint="/media"
 LIVE_MEDIA_PATH="live"
 HOSTNAME="host"
diff --git a/components/2010-remove-persistence b/components/2010-remove-persistence
index 5dcf0c0..717a408 100755
--- a/components/2010-remove-persistence
+++ b/components/2010-remove-persistence
@@ -27,5 +27,5 @@ Remove_persistence ()
 	esac
 
 	# Remove persistence
-	cd /live/overlay && find . -not -name 'persistence.conf' | xargs rm -rf
+	cd /run/live/overlay && find . -not -name 'persistence.conf' | xargs rm -rf
 }
diff --git a/components/9990-main.sh b/components/9990-main.sh
index e5884f9..20e8c0c 100755
--- a/components/9990-main.sh
+++ b/components/9990-main.sh
@@ -128,20 +128,6 @@ Live ()
 		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
 		echo "${ROOT_PID}" > "${rootmnt}"/lib/live/root.pid
@@ -162,10 +148,10 @@ Live ()
 	then
 		losetup -d /dev/loop0
 
-		if is_mountpoint /root/lib/live/mount/findiso
+		if is_mountpoint /run/live/findiso
 		then
-			umount /root/lib/live/mount/findiso
-			rmdir --ignore-fail-on-non-empty /root/lib/live/mount/findiso \
+			umount /run/live/findiso
+			rmdir --ignore-fail-on-non-empty /run/live/findiso \
 				>/dev/null 2>&1 || true
 		fi
 	fi
diff --git a/components/9990-misc-helpers.sh b/components/9990-misc-helpers.sh
index fba3d43..e21fced 100755
--- a/components/9990-misc-helpers.sh
+++ b/components/9990-misc-helpers.sh
@@ -203,9 +203,9 @@ check_dev ()
 			if [ -f ${mountpoint}/${FINDISO} ]
 			then
 				umount ${mountpoint}
-				mkdir -p /live/findiso
-				mount -t ${fstype} -o ro,noatime "${devname}" /live/findiso
-				loopdevname=$(setup_loop "/live/findiso/${FINDISO}" "loop" "/sys/block/loop*" 0 "")
+				mkdir -p /run/live/findiso
+				mount -t ${fstype} -o ro,noatime "${devname}" /run/live/findiso
+				loopdevname=$(setup_loop "/run/live/findiso/${FINDISO}" "loop" "/sys/block/loop*" 0 "")
 				devname="${loopdevname}"
 				mount -t iso9660 -o ro,noatime "${devname}" ${mountpoint}
 			else
@@ -703,7 +703,7 @@ mount_persistence_media ()
 
 	# get_custom_mounts() might call this with a directory path instead
 	# of a block device path. This means we have found sub-directory path
-	# underneath /lib/live/mounts/persistence, so we're done
+	# underneath /run/live/persistence, so we're done
 	if [ -d "${device}" ]
 	then
 		echo "${device}"
@@ -715,7 +715,7 @@ mount_persistence_media ()
 		return 1
 	fi
 
-	backing="/live/persistence/$(basename ${device})"
+	backing="/run/live/persistence/$(basename ${device})"
 
 	mkdir -p "${backing}"
 	old_backing="$(where_is_mounted ${device})"
@@ -1383,9 +1383,9 @@ get_custom_mounts ()
 				continue
 			fi
 
-			if trim_path ${dir} | grep -q -e "^[^/]" -e "^/lib" -e "^/lib/live\(/.*\)\?$" -e "^/\(.*/\)\?\.\.\?\(/.*\)\?$"
+			if trim_path ${dir} | grep -q -e "^[^/]" -e "^/lib" -e "^/run/live\(/.*\)\?$" -e "^/\(.*/\)\?\.\.\?\(/.*\)\?$"
 			then
-				log_warning_msg "Skipping unsafe custom mount ${dir}: must be an absolute path containing neither the \".\" nor \"..\" special dirs, and cannot be \"/lib\", or \"/lib/live\" or any of its sub-directories."
+				log_warning_msg "Skipping unsafe custom mount ${dir}: must be an absolute path containing neither the \".\" nor \"..\" special dirs, and cannot be \"/lib\", or \"/run/live\" or any of its sub-directories."
 				continue
 			fi
 
@@ -1575,11 +1575,11 @@ activate_custom_mounts ()
 		local cow_dir links_source
 		if [ -n "${opt_link}" ] && [ -z "${PERSISTENCE_READONLY}" ]
 		then
-			link_files ${source} ${dest} "s|^/live/|/lib/live/mount/|"
+			link_files ${source} ${dest} ""
 		elif [ -n "${opt_link}" ] && [ -n "${PERSISTENCE_READONLY}" ]
 		then
-			mkdir -p ${rootmnt}/lib/live/mount/persistence
-			links_source=$(mktemp -d ${rootmnt}/lib/live/mount/persistence/links-source-XXXXXX)
+			mkdir -p /run/live/persistence
+			links_source=$(mktemp -d /run/live/persistence/links-source-XXXXXX)
 			chown_ref ${source} ${links_source}
 			chmod_ref ${source} ${links_source}
 			# We put the cow dir in the below strange place to
@@ -1587,7 +1587,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="/live/overlay/lib/live/mount/persistence/$(basename ${links_source})"
+			cow_dir="/run/live/overlay/run/live/persistence/$(basename ${links_source})"
 			mkdir -p ${cow_dir}
 			chown_ref "${source}" "${cow_dir}"
 			chmod_ref "${source}" "${cow_dir}"
@@ -1604,7 +1604,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="/live/overlay/${dest}"
+			cow_dir="/run/live/overlay/${dest}"
 			if [ -e "${cow_dir}" ] && [ -z "${opt_link}" ]
 			then
 				# If an earlier custom mount has files here
diff --git a/components/9990-overlay.sh b/components/9990-overlay.sh
index d1b9cef..220fa3a 100755
--- a/components/9990-overlay.sh
+++ b/components/9990-overlay.sh
@@ -15,12 +15,7 @@ setup_unionfs ()
 		panic "${UNIONTYPE} not available."
 	fi
 
-	# run-init can't deal with images in a subdir, but we're going to
-	# move all of these away before it runs anyway.  No, we're not,
-	# put them in / since move-mounting them into / breaks mono and
-	# some other apps.
-
-	croot="/"
+	croot="/run/live/rootfs"
 
 	# Let's just mount the read-only file systems first
 	rootfslist=""
@@ -135,8 +130,7 @@ setup_unionfs ()
 
 	# tmpfs file systems
 	touch /etc/fstab
-	mkdir -p /live/overlay
-	mount -t tmpfs tmpfs /live/overlay
+	mkdir -p /run/live/overlay
 
 	# Looking for persistence devices or files
 	if [ -n "${PERSISTENCE}" ] && [ -z "${NOPERSISTENCE}" ]
@@ -245,11 +239,11 @@ setup_unionfs ()
 
 	if [ -n "${PERSISTENCE_READONLY}" ] && [ "${cowdevice}" != "tmpfs" ]
 	then
-		mount -t tmpfs -o rw,noatime,mode=755 tmpfs "/live/overlay"
-		root_backing="/live/persistence/$(basename ${cowdevice})-root"
+		mount -t tmpfs -o rw,noatime,mode=755 tmpfs "/run/live/overlay"
+		root_backing="/run/live/persistence/$(basename ${cowdevice})-root"
 		mkdir -p ${root_backing}
 	else
-		root_backing="/live/overlay"
+		root_backing="/run/live/overlay"
 	fi
 
 	if [ "${cow_fstype}" = "nfs" ]
@@ -290,7 +284,7 @@ setup_unionfs ()
 	for dir in ${cow_dirs}; do
 		unionmountpoint="${rootmnt}${dir}"
 		mkdir -p ${unionmountpoint}
-		cow_dir="/live/overlay${dir}"
+		cow_dir="/run/live/overlay${dir}"
 		rootfs_dir="${rootfs}${dir}"
 		mkdir -p ${cow_dir}
 		if [ -n "${PERSISTENCE_READONLY}" ] && [ "${cowdevice}" != "tmpfs" ]
@@ -313,22 +307,6 @@ setup_unionfs ()
 		chmod 1777 "${rootmnt}"/tmp
 	fi
 
-	live_rootfs_list=""
-	for d in ${rootfslist}
-	do
-		live_rootfs="/live/rootfs/${d##*/}"
-		live_rootfs_list="${live_rootfs_list} ${live_rootfs}"
-		mkdir -p "${live_rootfs}"
-		case "${d}" in
-			*.dir)
-				# do nothing # mount -o bind "${d}" "${live_rootfs}"
-				;;
-			*)
-				mount -o move "${d}" "${live_rootfs}"
-				;;
-		esac
-	done
-
 	# Adding custom persistence
 	if [ -n "${PERSISTENCE}" ] && [ -z "${NOPERSISTENCE}" ]
 	then
@@ -339,7 +317,7 @@ setup_unionfs ()
 		# Gather information about custom mounts from devies detected as overlays
 		get_custom_mounts ${custom_mounts} ${overlay_devices}
 
-		[ -n "${LIVE_BOOT_DEBUG}" ] && cp ${custom_mounts} "/lib/live/mount/persistence"
+		[ -n "${LIVE_BOOT_DEBUG}" ] && cp ${custom_mounts} "/run/live/persistence"
 
 		# Now we do the actual mounting (and symlinking)
 		local used_overlays
@@ -356,9 +334,4 @@ setup_unionfs ()
 			fi
 		done
 	fi
-
-	# ensure that a potentially stray tmpfs gets removed
-	# otherways, initramfs-tools is unable to remove /live
-	# and fails to boot
-	umount /live/overlay > /dev/null 2>&1 || true
 }
-- 
2.14.1


Reply to: