diff --git a/manjarobuild.in b/manjarobuild.in index 56cc07734122f0152a0ae434d3a2c6f337b69329..32cbbfd387098c60b81796aa376617db9a8f6939 100644 --- a/manjarobuild.in +++ b/manjarobuild.in @@ -75,6 +75,7 @@ if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then -C "@pkgdatadir@/pacman-${pacman_conf_arch}.conf" \ -M "@pkgdatadir@/makepkg-${arch}.conf" \ -b "${branch}" \ + -a "${arch}" \ "${chroots}/${repo}-${arch}/root" \ "${base_packages[@]}" || abort else @@ -83,6 +84,7 @@ else -C "@pkgdatadir@/pacman-${pacman_conf_arch}.conf" \ -M "@pkgdatadir@/makepkg-${arch}.conf" \ -b "${branch}" \ + -a "${arch}" \ "${chroots}/${repo}-${arch}/root" || abort fi diff --git a/mkmanjaroroot.in b/mkmanjaroroot.in index 9cbc6be2b32bc6c5064471d88babccf167fda0c3..7220b5f612e026e85ab36fb920f8a98ea68def1d 100644 --- a/mkmanjaroroot.in +++ b/mkmanjaroroot.in @@ -17,6 +17,7 @@ NOCOPY='n' working_dir='' branch='stable' +chroot_arch=$(uname -m) APPNAME=$(basename "${0}") @@ -39,11 +40,12 @@ usage() { echo ' -n Do not copy config files into the chroot' echo ' -c <dir> Set pacman cache' echo ' -b <branch> Set repository branch' + echo ' -a <arch> Set arch' echo ' -h This message' exit 1 } -while getopts 'r:ufnhC:M:S:c:b:' arg; do +while getopts 'r:ufnhC:M:S:a:c:b:' arg; do case "${arg}" in r) RUN="$OPTARG" ;; u) RUN='pacman -Syu --noconfirm' ;; @@ -53,6 +55,7 @@ while getopts 'r:ufnhC:M:S:c:b:' arg; do c) cache_dir="$OPTARG" ;; b) branch="$OPTARG" ;; S) mirrors_conf="$OPTARG" ;; + a) chroot_arch="$OPTARG" ;; h|?) usage ;; *) error "invalid argument '${arg}'"; usage ;; esac @@ -113,6 +116,10 @@ copy_hostconf () { if [[ -n $pac_conf && $NOCOPY = 'n' ]]; then cp ${pac_conf} ${working_dir}/etc/pacman.conf + + if [[ "$chroot_arch" == "i686" ]]; then + sed -i -e "s/^Architecture = auto/Architecture = i686/" ${working_dir}/etc/pacman.conf + fi fi if [[ -n $makepkg_conf && $NOCOPY = 'n' ]]; then @@ -141,47 +148,37 @@ chroot_lock () { fi } -chroot_mount(){ - - [ -e "${working_dir}/sys" ] || mkdir "${working_dir}/sys" - mount -t sysfs sysfs "${working_dir}/sys" - - [ -e "${working_dir}/proc" ] || mkdir "${working_dir}/proc" - mount -t proc proc "${working_dir}/proc" - - [ -e "${working_dir}/dev" ] || mkdir "${working_dir}/dev" - mount -B /dev "${working_dir}/dev" - - [ -e "${working_dir}/dev/shm" ] || mkdir "${working_dir}/dev/shm" - mount -t tmpfs shm "${working_dir}/dev/shm" - - [ -e "${working_dir}/dev/pts" ] || mkdir "${working_dir}/dev/pts" - mount -t devpts devpts "${working_dir}/dev/pts" - - mount -B /etc/resolv.conf "${working_dir}/etc/resolv.conf" +track_mount() { + if [[ -z $CHROOT_ACTIVE_MOUNTS ]]; then + CHROOT_ACTIVE_MOUNTS=() + trap 'chroot_umount' EXIT + fi - [ -e "${cache_dirs[0]}" ] || mkdir -p "${cache_dirs[0]}" - [ -e "${working_dir}/${cache_dirs[0]}" ] || mkdir -p "${working_dir}/${cache_dirs[0]}" - mount -B "${cache_dirs[0]}" "${working_dir}/${cache_dirs[0]}" + mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") +} - if [ -n "${host_mirror_path}" ]; then - [ -e "${working_dir}/${host_mirror_path}" ] || mkdir -p "${working_dir}/${host_mirror_path}" - mount -B "${host_mirror_path}" "${working_dir}/${host_mirror_path}" - mount -o remount,ro,bind "${host_mirror_path}" "${working_dir}/${host_mirror_path}" +mount_conditionally() { + local cond=$1; shift + if eval "$cond"; then + track_mount "$@" fi +} - trap 'chroot_umount' 0 1 2 15 +api_fs_mount() { + mount_conditionally "! mountpoint -q '$1'" "$1" "$1" --bind && + track_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && + track_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro && + track_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid && + track_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && + track_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && + track_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && + track_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid + track_mount /etc/resolv.conf "$1/etc/resolv.conf" --bind + track_mount ${cache_dirs[0]} "$1/${cache_dirs[0]}" --bind } -chroot_umount(){ - umount "${working_dir}/proc" - umount "${working_dir}/sys" - umount "${working_dir}/dev/pts" - umount "${working_dir}/dev/shm" - umount "${working_dir}/dev" - umount "${working_dir}/etc/resolv.conf" - umount "${working_dir}/${cache_dirs[0]}" - [ -n "${host_mirror_path}" ] && umount "${working_dir}/${host_mirror_path}" +chroot_umount() { + umount "${CHROOT_ACTIVE_MOUNTS[@]}" } chroot_run() { @@ -190,7 +187,7 @@ chroot_run() { if (( $IS_SYSTEMD ));then systemd-nspawn -D "${dir}" "${mount_args[@]}" -- ${@} 2>/dev/null else - chroot "${dir}" "${@}" 2>/dev/null + chroot "${dir}" "${@}" fi } @@ -211,7 +208,7 @@ if [[ -n $RUN ]]; then if (( $IS_SYSTEMD ));then build_mount_args else - chroot_mount + api_fs_mount "${working_dir}" fi copy_hostconf