[arch-projects] [devtools] [PATCHv2] use nspawn to bind mount needed directories

Dave Reisner dreisner at archlinux.org
Sun Mar 10 15:11:26 EDT 2013


systemd-nspawn is capable of doing this as of systemd-198. Doing this
means we can remove all of our home grown chroot mount/umount logic, as
it's all performed by pacstrap or systemd-nspawn.

Signed-off-by: Dave Reisner <dreisner at archlinux.org>
---
 mkarchroot.in | 55 +++++++++++++++++--------------------------------------
 1 file changed, 17 insertions(+), 38 deletions(-)

diff --git a/mkarchroot.in b/mkarchroot.in
index 20de5e6..fee2a37 100644
--- a/mkarchroot.in
+++ b/mkarchroot.in
@@ -78,31 +78,21 @@ if echo "${host_mirror}" | grep -q 'file://'; then
 fi
 
 # {{{ functions
-bind_mount() {
-	local mode="${2:-rw}"
-	local target="${working_dir}${1}"
-
-	if [[ ! -e "$target" ]]; then
-		if [[ -d "$1" ]]; then
-			install -d "$target"
-		else
-			install -D /dev/null "$target"
-		fi
-	fi
+build_mount_args() {
+	local p
+	declare -g mount_args=()
 
-	mount -o bind "$1" "$target"
-	mount -o remount,${mode},bind "$target"
-	mount --make-slave "$target"
-}
-
-chroot_mount() {
-	trap 'trap_chroot_umount' EXIT INT QUIT TERM HUP
+	if [[ -n $host_mirror_path ]]; then
+		printf -v p '%q' "$host_mirror_path"
+		mount_args+=(--bind-ro="$p")
+	fi
 
-	[[ -n $host_mirror_path ]] && bind_mount "$host_mirror_path" ro
+	printf -v p '%q' "${cache_dirs[0]}"
+	mount_args+=(--bind="$p")
 
-	bind_mount "${cache_dirs[0]}"
 	for cache_dir in ${cache_dirs[@]:1}; do
-		bind_mount "$cache_dir" ro
+		printf -v p '%q' "$cache_dir"
+		mount_args+=(--bind-ro="$p")
 	done
 }
 
@@ -121,16 +111,6 @@ copy_hostconf () {
 	sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n ${cache_dirs[@]})|g" -i ${working_dir}/etc/pacman.conf
 }
 
-trap_chroot_umount () {
-	trap 'trap_abort' INT QUIT TERM HUP
-	trap 'trap_exit' EXIT
-
-	for cache_dir in ${cache_dirs[@]}; do
-		umount "${working_dir}/${cache_dir}"
-	done
-	[[ -n $host_mirror_path ]] && umount "${working_dir}/${host_mirror_path}"
-}
-
 chroot_lock () {
 	# Only reopen the FD if it wasn't handed to us
 	if [[ $(readlink -f /dev/fd/9) != "${working_dir}.lock" ]]; then
@@ -148,7 +128,7 @@ chroot_lock () {
 chroot_run() {
 	local dir=$1
 	shift
-	eval systemd-nspawn -D "${dir}" -- ${@} 2>/dev/null
+	eval systemd-nspawn -D "${dir}" "${mount_args[@]}" -- ${@} 2>/dev/null
 }
 
 # }}}
@@ -164,7 +144,7 @@ if [[ -n $RUN ]]; then
 	fi
 
 	chroot_lock
-	chroot_mount
+	build_mount_args
 	copy_hostconf
 
 	chroot_run "${working_dir}" ${RUN}
@@ -181,18 +161,17 @@ else
 	fi
 
 	chroot_lock
-	chroot_mount
 
-	pacargs="${cache_dirs[@]/#/--cachedir=}"
+	pacargs=("${cache_dirs[@]/#/--cachedir=}")
 	if [[ -n $pac_conf ]]; then
-		pacargs="$pacargs --config=${pac_conf}"
+		pacargs+=("--config=${pac_conf}")
 	fi
 
 	if (( $# != 0 )); then
 		if [[ $FORCE = 'y' ]]; then
-			pacargs="$pacargs --force"
+			pacargs+=("--force")
 		fi
-		if ! pacstrap -GMcd "${working_dir}" ${pacargs} $@; then
+		if ! pacstrap -GMcd "${working_dir}" "${pacargs[@]}" "$@"; then
 			die 'Failed to install all packages'
 		fi
 	fi
-- 
1.8.1.5



More information about the arch-projects mailing list