Compare commits
	
		
			8 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 69d3897abb | |||
| 90060a3851 | |||
| 1bc756ec15 | |||
| 26daf3aaa0 | |||
| c772bf8ea1 | |||
| caccd55fc1 | |||
| a2b31b72a0 | |||
| 1beb5131ce | 
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| VERSION=0.8 | ||||
|  | ||||
| CHROOT_VERSION=0.7 | ||||
| CHROOT_VERSION=0.8 | ||||
|  | ||||
| TOOLS = artools | ||||
| ifdef PREFIX | ||||
|   | ||||
| @@ -86,8 +86,8 @@ else | ||||
|  | ||||
|     ${pretend} && display_settings && exit 1 | ||||
|  | ||||
|     chroot_api_efi_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" | ||||
|     chroot_mount /etc/resolv.conf "${chrootdir}/etc/resolv.conf" --bind | ||||
|     chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" | ||||
|     chroot_add_resolv_conf "${chrootdir}" | ||||
| fi | ||||
|  | ||||
| SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" ${run_args[*]} | ||||
|   | ||||
| @@ -20,6 +20,26 @@ import ${LIBDIR}/util.sh | ||||
| import ${LIBDIR}/util-mount.sh | ||||
| import ${LIBDIR}/util-chroot.sh | ||||
|  | ||||
| copy_mirrorlist(){ | ||||
|     cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" | ||||
| } | ||||
|  | ||||
| copy_keyring(){ | ||||
|     if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then | ||||
|         cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| create_min_fs(){ | ||||
|     msg "Creating install root at %s" "$1" | ||||
|     mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,etc} | ||||
|     mkdir -m 1777 -p $1/{tmp,run} | ||||
|     mkdir -m 0555 -p $1/{sys,proc} | ||||
| #     if [[ ! -f $1/etc/machine-id ]];then | ||||
| #         touch $1/etc/machine-id | ||||
| #     fi | ||||
| } | ||||
|  | ||||
| newroot=/mnt | ||||
|  | ||||
| hostcache=false | ||||
|   | ||||
| @@ -93,9 +93,9 @@ copy_hostconf () { | ||||
| } | ||||
|  | ||||
| chroot_extra_mount() { | ||||
|     chroot_mount "/etc/resolv.conf" "$1/etc/resolv.conf" -B | ||||
|     chroot_mount "/etc/hosts" "$1/etc/hosts" -B | ||||
|     chroot_mount_conditional "[[ -e $1/etc/machine-id ]]" "/etc/machine-id" "$1/etc/machine-id" -B | ||||
|     chroot_add_resolv_conf "$1" | ||||
| #     chroot_mount "/etc/hosts" "$1/etc/hosts" -B | ||||
| #     chroot_mount_conditional "[[ -e $1/etc/machine-id ]]" "/etc/machine-id" "$1/etc/machine-id" -B | ||||
|     chroot_mount "${cache_dirs[0]}" "$1${cache_dirs[0]}" -B | ||||
|  | ||||
|     for cache_dir in ${cache_dirs[@]:1}; do | ||||
|   | ||||
| @@ -93,6 +93,7 @@ usage() { | ||||
| usage: ${0##*/} [options] root | ||||
|  | ||||
|   Options: | ||||
|     -f FILTER      Restrict output to mountpoints matching the prefix FILTER | ||||
|     -L             Use labels for source identifiers (shortcut for -t LABEL) | ||||
|     -p             Exclude pseudofs mounts (default behavior) | ||||
|     -P             Include printing mounts | ||||
| @@ -112,10 +113,11 @@ if [[ -z $1 || $1 = @(-h|--help) ]]; then | ||||
|   exit $(( $# ? 0 : 1 )) | ||||
| fi | ||||
|  | ||||
| while getopts ':LPpt:U' flag; do | ||||
| while getopts ':f:LPpt:U' flag; do | ||||
|     case $flag in | ||||
|         L) bytag=LABEL ;; | ||||
|         U) bytag=UUID ;; | ||||
|         f) prefixfilter=$OPTARG ;; | ||||
|         P) pseudofs=1 ;; | ||||
|         p) pseudofs=0 ;; | ||||
|         t) bytag=${OPTARG^^} ;; | ||||
| @@ -139,6 +141,8 @@ while read -r src target fstype opts fsroot; do | ||||
|         continue | ||||
|     fi | ||||
|  | ||||
|     [[ $target = "$prefixfilter"* ]] || continue | ||||
|  | ||||
|     # default 5th and 6th columns | ||||
|     dump=0 pass=2 | ||||
|  | ||||
|   | ||||
| @@ -22,9 +22,6 @@ import ${LIBDIR}/util-chroot.sh | ||||
| working_dir='' | ||||
| files=() | ||||
|  | ||||
| build_locales=false | ||||
| keep_mirrors=false | ||||
| keep_flag='' | ||||
| nosetarch=false | ||||
|  | ||||
| usage() { | ||||
| @@ -73,9 +70,6 @@ else | ||||
|     cache_dirs=(${cache_dir}) | ||||
| fi | ||||
|  | ||||
| basestrap_args=(-Gc ${pacman_conf:+-C "$pacman_conf"}) | ||||
| [[ -n ${mirror} ]] && basestrap_args+=(-M) | ||||
|  | ||||
| umask 0022 | ||||
|  | ||||
| #[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir" | ||||
| @@ -104,17 +98,18 @@ while read -r varname; do | ||||
|     _env+=("$varname=${!varname}") | ||||
| done < <(declare -x | sed -r 's/^declare -x ([^=]*)=.*/\1/' | grep -i '_proxy$') | ||||
| env -i "${_env[@]}" \ | ||||
| basestrap "${basestrap_args[@]}" "$working_dir" ${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages' | ||||
| basestrap -Gc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" ${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages' | ||||
|  | ||||
| echo "$chroot_version" > "$working_dir/.artools" | ||||
|  | ||||
| default_locale "set" "$working_dir" | ||||
| printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen" | ||||
| echo 'LANG=en_US.UTF-8' > "$working_dir/etc/locale.conf" | ||||
|  | ||||
| dbus-uuidgen --ensure="$working_dir"/etc/machine-id | ||||
|  | ||||
| chroot_args=(${pacman_conf:+-C "$pacman_conf"} ${makepkg_conf:+-M "$makepkg_conf"} ${cache_dir:+-c "$cache_dir"}) | ||||
| ${nosetarch} && chroot_args+=(${nosetarch:+-s}) | ||||
|  | ||||
| [[ -n ${mirror} ]] && default_mirror "$working_dir" "$mirror" | ||||
|  | ||||
| exec chroot-run \ | ||||
|     "${chroot_args[@]}" \ | ||||
|     "$working_dir" locale-gen | ||||
|   | ||||
| @@ -8,26 +8,6 @@ | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
|  | ||||
| copy_mirrorlist(){ | ||||
|     cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" | ||||
| } | ||||
|  | ||||
| copy_keyring(){ | ||||
|     if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then | ||||
|         cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| create_min_fs(){ | ||||
|     msg "Creating install root at %s" "$1" | ||||
|     mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,etc} | ||||
|     mkdir -m 1777 -p $1/{tmp,run} | ||||
|     mkdir -m 0555 -p $1/{sys,proc} | ||||
|     if [[ ! -f $1/etc/machine-id ]];then | ||||
|         touch $1/etc/machine-id | ||||
|     fi | ||||
| } | ||||
|  | ||||
| is_btrfs() { | ||||
| 	[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] | ||||
| } | ||||
| @@ -47,30 +27,6 @@ subvolume_delete_recursive() { | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| default_locale(){ | ||||
|     local action="$1" mnt="$2" | ||||
|     if [[ $action == "set" ]];then | ||||
|         if [[ ! -f "$mnt/etc/locale.gen.bak" ]];then | ||||
|             info "Setting locale ..." | ||||
|             mv "$mnt/etc/locale.gen" "$mnt/etc/locale.gen.bak" | ||||
|             printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$mnt/etc/locale.gen" | ||||
|             echo 'LANG=en_US.UTF-8.UTF-8' > "$mnt/etc/locale.conf" | ||||
|         fi | ||||
|     elif [[ $action == "reset" ]];then | ||||
|         if [[ -f "$mnt/etc/locale.gen.bak" ]];then | ||||
|             info "Resetting locale ..." | ||||
|             mv "$mnt/etc/locale.gen.bak" "$mnt/etc/locale.gen" | ||||
|             rm "$mnt/etc/locale.conf" | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
|  | ||||
| default_mirror(){ | ||||
|     local mnt="$1" mirror="$2"'/$repo/os/$arch' | ||||
|     [[ -f $mnt/etc/pacman.d/mirrorlist ]] && mv "$mnt"/etc/pacman.d/mirrorlist "$mnt"/etc/pacman.d/mirrorlist.bak | ||||
|     echo "Server = $mirror" > $mnt/etc/pacman.d/mirrorlist | ||||
| } | ||||
|  | ||||
| # $1: chroot | ||||
| kill_chroot_process(){ | ||||
|     local prefix="$1" flink pid name | ||||
|   | ||||
| @@ -213,7 +213,6 @@ clean_up_image(){ | ||||
|     local path mnt="$1" | ||||
|     msg2 "Cleaning [%s]" "${mnt##*/}" | ||||
|  | ||||
|     default_locale "reset" "$mnt" | ||||
|     path=$mnt/boot | ||||
|     if [[ -d "$path" ]]; then | ||||
|         find "$path" -name 'initramfs*.img' -delete &> /dev/null | ||||
|   | ||||
| @@ -45,44 +45,100 @@ chroot_part_mount() { | ||||
| } | ||||
|  | ||||
| select_os(){ | ||||
|         local os_list=( $(detect) ) count=${#os_list[@]} | ||||
|     local os_list=( $(detect) ) count=${#os_list[@]} | ||||
|     if [[ ${count} > 1 ]];then | ||||
|                 msg "Detected systems:" | ||||
|                 local i=0 | ||||
|                 for os in ${os_list[@]};do | ||||
|         msg "Detected systems:" | ||||
|         local i=0 | ||||
|         for os in ${os_list[@]};do | ||||
|             local last=${os##*:} | ||||
|             case $last in | ||||
|                 'efi') count=$((count-1)) ;; | ||||
|                 *) info "$i) $(get_os_name $os)"; i=$((i+1)) ;; | ||||
|             esac | ||||
|                 done | ||||
|                 i=0 | ||||
|         done | ||||
|         i=0 | ||||
|         msg "Select system to mount [0-%s] : " "$((count-1))" | ||||
|                 read select | ||||
|         else | ||||
|         read select | ||||
|     else | ||||
|         select=0 | ||||
|     fi | ||||
|     local os_str=${os_list[$select]} type | ||||
|     type=$os_str | ||||
|     root=${os_str%%:*} | ||||
|     type=${type##*:} | ||||
|         if [[ "${type##*:}" == 'linux' ]];then | ||||
|     if [[ "${type##*:}" == 'linux' ]];then | ||||
|         msg "Mounting (%s) [%s]" "$(get_os_name $os_str)" "$root" | ||||
|         chroot_mount_partitions "$1" "$root" | ||||
|         else | ||||
|                 die "You can't mount %s!" "$select" | ||||
|         fi | ||||
|         mount_os "$1" "$root" | ||||
|     else | ||||
|         die "You can't mount %s!" "$select" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| chroot_mount_partitions(){ | ||||
| trap_setup(){ | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap "$1" EXIT | ||||
| } | ||||
|  | ||||
| chroot_mount() { | ||||
|     info "mount: [%s]" "$2" | ||||
|     mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") | ||||
| } | ||||
|  | ||||
| chroot_add_resolv_conf() { | ||||
|     local chrootdir=$1 resolv_conf=$1/etc/resolv.conf | ||||
|  | ||||
|     [[ -e /etc/resolv.conf ]] || return 0 | ||||
|  | ||||
|     # Handle resolv.conf as a symlink to somewhere else. | ||||
|     if [[ -L $chrootdir/etc/resolv.conf ]]; then | ||||
|         # readlink(1) should always give us *something* since we know at this point | ||||
|         # it's a symlink. For simplicity, ignore the case of nested symlinks. | ||||
|         resolv_conf=$(readlink "$chrootdir/etc/resolv.conf") | ||||
|         if [[ $resolv_conf = /* ]]; then | ||||
|             resolv_conf=$chrootdir$resolv_conf | ||||
|         else | ||||
|             resolv_conf=$chrootdir/etc/$resolv_conf | ||||
|         fi | ||||
|  | ||||
|         # ensure file exists to bind mount over | ||||
|         if [[ ! -f $resolv_conf ]]; then | ||||
|             install -Dm644 /dev/null "$resolv_conf" || return 1 | ||||
|         fi | ||||
|     elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then | ||||
|         # The chroot might not have a resolv.conf. | ||||
|         return 0 | ||||
|     fi | ||||
|  | ||||
|     chroot_mount /etc/resolv.conf "$resolv_conf" --bind | ||||
| } | ||||
|  | ||||
| chroot_mount_conditional() { | ||||
|     local cond=$1; shift | ||||
|     if eval "$cond"; then | ||||
|         chroot_mount "$@" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| chroot_setup(){ | ||||
|     chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind && | ||||
|     chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro && | ||||
|     ignore_error chroot_mount_conditional "[[ -d '$1/sys/firmware/efi/efivars' ]]" \ | ||||
|         efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && | ||||
|     chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid && | ||||
|     chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && | ||||
|     chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && | ||||
|     chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid | ||||
| } | ||||
|  | ||||
| mount_os(){ | ||||
|     CHROOT_ACTIVE_PART_MOUNTS=() | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|  | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap 'trap_handler' EXIT | ||||
|     trap_setup chroot_part_umount | ||||
|  | ||||
|     chroot_part_mount $2 $1 | ||||
|     chroot_part_mount "$2" "$1" | ||||
|  | ||||
|     local mounts=$(parse_fstab "$1") | ||||
|  | ||||
| @@ -105,82 +161,26 @@ chroot_mount_partitions(){ | ||||
|         ;; | ||||
|     esac | ||||
|  | ||||
|     chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind && | ||||
|     chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro && | ||||
|     ignore_error chroot_mount_conditional "[[ -d '$1/sys/firmware/efi/efivars' ]]" \ | ||||
|         efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && | ||||
|     chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid && | ||||
|     chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && | ||||
|     chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && | ||||
|     chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid | ||||
|     chroot_mount /etc/resolv.conf "$1/etc/resolv.conf" --bind | ||||
| } | ||||
|  | ||||
| chroot_mount() { | ||||
|     #info "mount: [%s]" "$2" | ||||
|     mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}") | ||||
| } | ||||
|  | ||||
| chroot_mount_conditional() { | ||||
|     local cond=$1; shift | ||||
|     if eval "$cond"; then | ||||
|         chroot_mount "$@" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| chroot_api_efi_mount() { | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap 'chroot_api_efi_umount' EXIT | ||||
|  | ||||
|     chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind && | ||||
|     chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro && | ||||
|     ignore_error chroot_mount_conditional "[[ -d '$1/sys/firmware/efi/efivars' ]]" \ | ||||
|         efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && | ||||
|     chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid && | ||||
|     chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && | ||||
|     chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && | ||||
|     chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid | ||||
|     chroot_setup "$1" | ||||
|     chroot_add_resolv_conf "$1" | ||||
| } | ||||
|  | ||||
| chroot_api_mount() { | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap 'chroot_api_umount' EXIT | ||||
|  | ||||
|     chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind && | ||||
|     chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro && | ||||
|     chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid && | ||||
|     chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && | ||||
|     chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && | ||||
|     chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid | ||||
|     trap_setup chroot_api_umount | ||||
|     chroot_setup "$1" | ||||
| } | ||||
|  | ||||
| chroot_part_umount() { | ||||
|     info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|     umount "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|     info "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}" | ||||
|     umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}" | ||||
|     unset CHROOT_ACTIVE_PART_MOUNTS | ||||
|     unset CHROOT_ACTIVE_PART_MOUNTS CHROOT_ACTIVE_MOUNTS | ||||
| } | ||||
|  | ||||
| chroot_api_umount() { | ||||
|     #info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|     info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|     umount "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|     unset CHROOT_ACTIVE_MOUNTS | ||||
| } | ||||
|  | ||||
| chroot_api_efi_umount() { | ||||
|     #info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|     umount "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|     unset CHROOT_ACTIVE_MOUNTS | ||||
| } | ||||
|  | ||||
| trap_handler(){ | ||||
|     chroot_api_umount | ||||
|     chroot_part_umount | ||||
| } | ||||
|   | ||||
| @@ -47,6 +47,7 @@ patch_pkg(){ | ||||
|             sed -e 's|-ARCH|-ARTIX|g' -i $pkg/trunk/PKGBUILD | ||||
|             sed -e 's|CONFIG_LOCALVERSION=.*|CONFIG_LOCALVERSION="-ARTIX"|' \ | ||||
|                 -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \ | ||||
|                 -e 's|CONFIG_CRYPTO_SPECK=.*|CONFIG_CRYPTO_SPECK=n|' \ | ||||
|                 -i $pkg/trunk/config | ||||
|             cd $pkg/trunk | ||||
|                 updpkgsums | ||||
|   | ||||
		Reference in New Issue
	
	Block a user