Commit f03086a0 authored by Dave Reisner's avatar Dave Reisner Committed by Pierre Schmitz
Browse files

use nspawn to bind mount needed directories



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: default avatarDave Reisner <dreisner@archlinux.org>
Signed-off-by: default avatarPierre Schmitz <pierre@archlinux.de>
parent 35dc7485
Loading
Loading
Loading
Loading
+17 −38
Original line number Diff line number Diff line
@@ -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}"
build_mount_args() {
	local p
	declare -g mount_args=()

	if [[ ! -e "$target" ]]; then
		if [[ -d "$1" ]]; then
			install -d "$target"
		else
			install -D /dev/null "$target"
		fi
	if [[ -n $host_mirror_path ]]; then
		printf -v p '%q' "$host_mirror_path"
		mount_args+=(--bind-ro="$p")
	fi

	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

	[[ -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