summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Reisner <dreisner@archlinux.org>2013-03-10 20:11:26 +0100
committerPierre Schmitz <pierre@archlinux.de>2013-04-06 18:15:14 +0200
commitf03086a0e11fdf39a03b8887f9b36b118efecf81 (patch)
tree3c5011b4114b21d9d4f0e516b78587c4951bfb22
parent35dc7485fb1bbbe6c1dc236f35702561516f0836 (diff)
downloaddevtools-f03086a0e11fdf39a03b8887f9b36b118efecf81.tar.gz
devtools-f03086a0e11fdf39a03b8887f9b36b118efecf81.tar.xz
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: Dave Reisner <dreisner@archlinux.org> Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
-rw-r--r--mkarchroot.in55
1 files 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