Compare commits

...

8 Commits

Author SHA1 Message Date
Pierre Schmitz
cfd81ab563 prepare release 2012-10-04 21:19:31 +02:00
Pierre Schmitz
ac1ee41e4d mkarchroot: use a helper function to simplify bind mounts 2012-10-04 19:57:19 +02:00
Pierre Schmitz
ecae65e7fd prepare release 2012-10-03 12:46:07 +02:00
Pierre Schmitz
c617c67ff8 mkarchroot: Use systemd's nspawn if available
* If we are running systemd use nspawn instead of our own chroot setup
* Use pacstrap to setup our chroot environment
* Make sure the common trap is still called
* Bind resolve.conf, timezone and lcoaltime from the host if nspawn is not used
* Run ldconfig within the chroot
2012-10-03 12:38:33 +02:00
Pierre Schmitz
7228cc00e8 Use dedicated trap functions to avoid unsetting the trap when e.g. cleanup is called 2012-10-03 12:35:40 +02:00
Pierre Schmitz
a26416dca3 makechrootpkg: do not run namcap as root 2012-10-03 12:32:55 +02:00
Pierre Schmitz
37bb1d33a7 archbuild: abort if update or creation of the chroot fails 2012-10-03 12:32:03 +02:00
Florian Pritz
dbef0b91bf Fix ownership when copying files from chroot to system
Previously files were always owned by nobody which means trying to write
to them directly would fail because only the owner has +w.

Signed-off-by: Florian Pritz <bluewind@xinu.at>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2012-09-14 16:01:01 +02:00
5 changed files with 118 additions and 82 deletions

View File

@@ -1,4 +1,4 @@
V=20120720 V=20121004
PREFIX = /usr/local PREFIX = /usr/local

View File

@@ -61,13 +61,13 @@ if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then
-C "@pkgdatadir@/pacman-${repo}.conf" \ -C "@pkgdatadir@/pacman-${repo}.conf" \
-M "@pkgdatadir@/makepkg-${arch}.conf" \ -M "@pkgdatadir@/makepkg-${arch}.conf" \
"${chroots}/${repo}-${arch}/root" \ "${chroots}/${repo}-${arch}/root" \
"${base_packages[@]}" "${base_packages[@]}" || abort
else else
setarch ${arch} mkarchroot \ setarch ${arch} mkarchroot \
-u \ -u \
-C "@pkgdatadir@/pacman-${repo}.conf" \ -C "@pkgdatadir@/pacman-${repo}.conf" \
-M "@pkgdatadir@/makepkg-${arch}.conf" \ -M "@pkgdatadir@/makepkg-${arch}.conf" \
"${chroots}/${repo}-${arch}/root" "${chroots}/${repo}-${arch}/root" || abort
fi fi
msg "Building in chroot for [${repo}] (${arch})..." msg "Building in chroot for [${repo}] (${arch})..."

View File

@@ -62,8 +62,6 @@ setup_workdir() {
} }
cleanup() { cleanup() {
trap - EXIT INT QUIT TERM HUP
[[ -n $WORKDIR ]] && rm -rf "$WORKDIR" [[ -n $WORKDIR ]] && rm -rf "$WORKDIR"
[[ $1 ]] && exit $1 [[ $1 ]] && exit $1
} }
@@ -73,13 +71,23 @@ abort() {
cleanup 0 cleanup 0
} }
trap_abort() {
trap - EXIT INT QUIT TERM HUP
abort
}
trap_exit() {
trap - EXIT INT QUIT TERM HUP
cleanup 0
}
die() { die() {
error "$*" error "$*"
cleanup 1 cleanup 1
} }
trap abort INT QUIT TERM HUP trap 'trap_abort' INT QUIT TERM HUP
trap 'cleanup 0' EXIT trap 'trap_exit' EXIT
## ##
# usage : in_array( $needle, $haystack ) # usage : in_array( $needle, $haystack )

View File

@@ -25,6 +25,7 @@ passeddir=
default_copy=$USER default_copy=$USER
[[ -n $SUDO_USER ]] && default_copy=$SUDO_USER [[ -n $SUDO_USER ]] && default_copy=$SUDO_USER
[[ -z $default_copy || $default_copy = root ]] && default_copy=copy [[ -z $default_copy || $default_copy = root ]] && default_copy=copy
src_owner=${SUDO_USER:-$USER}
usage() { usage() {
echo "usage ${0##*/} [options] -r <chrootdir> [--] [makepkg args]" echo "usage ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
@@ -274,7 +275,7 @@ if $run_namcap; then
pacman -S --needed --noconfirm namcap pacman -S --needed --noconfirm namcap
for pkgfile in /build/PKGBUILD /pkgdest/*.pkg.tar.?z; do for pkgfile in /build/PKGBUILD /pkgdest/*.pkg.tar.?z; do
echo "Checking \${pkgfile##*/}" echo "Checking \${pkgfile##*/}"
namcap "\$pkgfile" 2>&1 | tee "/build/\${pkgfile##*/}-namcap.log" sudo -u nobody namcap "\$pkgfile" 2>&1 | tee "/build/\${pkgfile##*/}-namcap.log"
done done
fi fi
@@ -292,10 +293,12 @@ if mkarchroot -r "/chrootbuild" "$copydir"; then
popd >/dev/null popd >/dev/null
fi fi
chown "$src_owner" "$pkgfile"
mv "$pkgfile" "$PKGDEST" mv "$pkgfile" "$PKGDEST"
done done
for l in "$copydir"/build/*-{build,check,namcap,package,package_*}.log; do for l in "$copydir"/build/*-{build,check,namcap,package,package_*}.log; do
chown "$src_owner" "$l"
[[ -f $l ]] && mv "$l" . [[ -f $l ]] && mv "$l" .
done done
else else
@@ -304,6 +307,7 @@ else
fi fi
for f in "$copydir"/srcdest/*; do for f in "$copydir"/srcdest/*; do
chown "$src_owner" "$f"
mv "$f" "$SRCDEST" mv "$f" "$SRCDEST"
done done

View File

@@ -78,15 +78,32 @@ if echo "${host_mirror}" | grep -q 'file://'; then
fi fi
# {{{ functions # {{{ 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
mount -o bind "$1" "$target"
mount -o remount,${mode},bind "$target"
mount --make-slave "$target"
}
chroot_mount() { chroot_mount() {
[[ -e "${working_dir}/sys" ]] || mkdir "${working_dir}/sys" trap 'trap_chroot_umount' EXIT INT QUIT TERM HUP
mount -o bind /sys "${working_dir}/sys"
mount -o remount,ro,bind "${working_dir}/sys" if (( ! have_nspawn )); then
bind_mount /sys ro
[[ -e "${working_dir}/proc" ]] || mkdir "${working_dir}/proc" [[ -e "${working_dir}/proc" ]] || mkdir "${working_dir}/proc"
mount -t proc proc -o nosuid,noexec,nodev "${working_dir}/proc" mount -t proc proc -o nosuid,noexec,nodev "${working_dir}/proc"
mount -o bind /proc/sys "${working_dir}/proc/sys" bind_mount /proc/sys ro
mount -o remount,ro,bind "${working_dir}/proc/sys"
[[ -e "${working_dir}/dev" ]] || mkdir "${working_dir}/dev" [[ -e "${working_dir}/dev" ]] || mkdir "${working_dir}/dev"
mount -t tmpfs dev "${working_dir}/dev" -o mode=0755,size=10M,nosuid,strictatime mount -t tmpfs dev "${working_dir}/dev" -o mode=0755,size=10M,nosuid,strictatime
@@ -109,35 +126,25 @@ chroot_mount() {
[[ -e "${working_dir}/dev/shm" ]] || mkdir "${working_dir}/dev/shm" [[ -e "${working_dir}/dev/shm" ]] || mkdir "${working_dir}/dev/shm"
mount -t tmpfs shm "${working_dir}/dev/shm" -o nodev,nosuid,size=128M mount -t tmpfs shm "${working_dir}/dev/shm" -o nodev,nosuid,size=128M
[[ -e "${working_dir}/dev/pts" ]] || mkdir "${working_dir}/dev/pts" bind_mount /dev/pts
mount -o bind /dev/pts "${working_dir}/dev/pts"
[[ -e "${working_dir}/run" ]] || mkdir "${working_dir}/run" [[ -e "${working_dir}/run" ]] || mkdir "${working_dir}/run"
mount -t tmpfs tmpfs "${working_dir}/run" -o mode=0755,nodev,nosuid,strictatime,size=64M mount -t tmpfs tmpfs "${working_dir}/run" -o mode=0755,nodev,nosuid,strictatime,size=64M
if [[ -n $host_mirror_path ]]; then for host_config in resolv.conf timezone localtime; do
[[ -e "${working_dir}/${host_mirror_path}" ]] || mkdir -p "${working_dir}/${host_mirror_path}" bind_mount /etc/$host_config ro
mount -o bind "${host_mirror_path}" "${working_dir}/${host_mirror_path}"
mount -o remount,ro,bind "${working_dir}/${host_mirror_path}"
fi
local cache_dir_first=true
for cache_dir in ${cache_dirs[@]}; do
[[ -e $cache_dir ]] || mkdir -p "${cache_dir}"
[[ -e "${working_dir}/${cache_dir}" ]] || mkdir -p "${working_dir}/${cache_dir}"
mount -o bind "${cache_dir}" "${working_dir}/${cache_dir}"
if ! ${cache_dir_first}; then
mount -o remount,ro,bind "${working_dir}/${cache_dir}"
else
cache_dir_first=false
fi
done done
fi
trap 'chroot_umount' EXIT INT QUIT TERM HUP [[ -n $host_mirror_path ]] && bind_mount "$host_mirror_path" ro
bind_mount "${cache_dirs[0]}"
for cache_dir in ${cache_dirs[@]:1}; do
bind_mount "$cache_dir" ro
done
} }
copy_hostconf () { copy_hostconf () {
cp /etc/resolv.conf "${working_dir}/etc/resolv.conf"
cp -a /etc/pacman.d/gnupg "${working_dir}/etc/pacman.d" cp -a /etc/pacman.d/gnupg "${working_dir}/etc/pacman.d"
echo "Server = ${host_mirror}" > ${working_dir}/etc/pacman.d/mirrorlist echo "Server = ${host_mirror}" > ${working_dir}/etc/pacman.d/mirrorlist
@@ -152,8 +159,18 @@ copy_hostconf () {
sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n ${cache_dirs[@]})|g" -i ${working_dir}/etc/pacman.conf sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n ${cache_dirs[@]})|g" -i ${working_dir}/etc/pacman.conf
} }
chroot_umount () { trap_chroot_umount () {
trap - EXIT INT QUIT TERM HUP trap 'trap_exit' EXIT INT QUIT TERM HUP
for cache_dir in ${cache_dirs[@]}; do
umount "${working_dir}/${cache_dir}"
done
[[ -n $host_mirror_path ]] && umount "${working_dir}/${host_mirror_path}"
if (( ! have_nspawn )); then
for host_config in resolv.conf timezone localtime; do
umount "${working_dir}/etc/${host_config}"
done
umount "${working_dir}/proc/sys" umount "${working_dir}/proc/sys"
umount "${working_dir}/proc" umount "${working_dir}/proc"
umount "${working_dir}/sys" umount "${working_dir}/sys"
@@ -161,10 +178,7 @@ chroot_umount () {
umount "${working_dir}/dev/shm" umount "${working_dir}/dev/shm"
umount "${working_dir}/dev" umount "${working_dir}/dev"
umount "${working_dir}/run" umount "${working_dir}/run"
for cache_dir in ${cache_dirs[@]}; do fi
umount "${working_dir}/${cache_dir}"
done
[[ -n $host_mirror_path ]] && umount "${working_dir}/${host_mirror_path}"
} }
chroot_lock () { chroot_lock () {
@@ -180,8 +194,24 @@ chroot_lock () {
stat_done stat_done
fi fi
} }
chroot_run() {
local dir=$1
shift
if (( have_nspawn)); then
eval systemd-nspawn -D "${dir}" -- ${@} 2>/dev/null
else
eval unshare -mui -- chroot "${dir}" ${@}
fi
}
# }}} # }}}
# use systemd-nspawn if we have it available and systemd is running
if type -P systemd-nspawn >/dev/null && mountpoint -q /sys/fs/cgroup/systemd; then
have_nspawn=1
fi
umask 0022 umask 0022
if [[ -n $RUN ]]; then if [[ -n $RUN ]]; then
# run chroot {{{ # run chroot {{{
@@ -196,7 +226,7 @@ if [[ -n $RUN ]]; then
chroot_mount chroot_mount
copy_hostconf copy_hostconf
eval unshare -mui -- chroot "${working_dir}" ${RUN} chroot_run "${working_dir}" ${RUN}
# }}} # }}}
else else
@@ -209,37 +239,31 @@ else
chmod 0755 "${working_dir}" chmod 0755 "${working_dir}"
fi fi
mkdir -p "${working_dir}/var/lib/pacman/sync"
mkdir -p "${working_dir}/etc/"
chroot_lock chroot_lock
chroot_mount chroot_mount
pacargs="--noconfirm --root=${working_dir} ${cache_dirs[@]/#/--cachedir=}" pacargs="${cache_dirs[@]/#/--cachedir=}"
if [[ -n $pac_conf ]]; then if [[ -n $pac_conf ]]; then
pacargs="$pacargs --config=${pac_conf}" pacargs="$pacargs --config=${pac_conf}"
fi fi
if (( $# != 0 )); then if (( $# != 0 )); then
op='-Sy'
if [[ $FORCE = 'y' ]]; then if [[ $FORCE = 'y' ]]; then
op="${op}f" pacargs="$pacargs --force"
fi fi
if ! pacman ${op} ${pacargs} $@; then if ! pacstrap -GMcd "${working_dir}" ${pacargs} $@; then
die 'Failed to install all packages' die 'Failed to install all packages'
fi fi
fi fi
if [[ -d "${working_dir}/lib/modules" ]]; then if [[ -d "${working_dir}/lib/modules" ]]; then
ldconfig -r "${working_dir}" chroot_run "${working_dir}" ldconfig
fi fi
if [[ -e "${working_dir}/etc/locale.gen" ]]; then if [[ -e "${working_dir}/etc/locale.gen" ]]; then
sed -i 's@^#\(en_US\|de_DE\)\(\.UTF-8\)@\1\2@' "${working_dir}/etc/locale.gen" sed -i 's@^#\(en_US\|de_DE\)\(\.UTF-8\)@\1\2@' "${working_dir}/etc/locale.gen"
chroot "${working_dir}" /usr/sbin/locale-gen chroot_run "${working_dir}" locale-gen
fi fi
echo 'UTC' > "${working_dir}/etc/timezone"
ln -s /usr/share/zoneinfo/UTC "${working_dir}/etc/localtime"
echo 'LANG=C' > "${working_dir}/etc/locale.conf" echo 'LANG=C' > "${working_dir}/etc/locale.conf"
copy_hostconf copy_hostconf