diff --git a/setup.sh b/setup.sh index 6d4d9f2..ecabb66 100644 --- a/setup.sh +++ b/setup.sh @@ -41,6 +41,54 @@ function install_pkgs () { pacman -S --needed --noconfirm "${@}" } +function prepare_zfsbootmenu_efi_bin_pkg () { + # Our Arch Linux will use prebuilt ZFSBootMenu UEFI image files for ease + # of use. We'd like to install them from within our chroot but the AUR + # package 'zfsbootmenu-efi-bin' that we're using currently (Friday, + # October 20, 2023) identifies its target EFI system partition (ESP) by + # doing 'lsblk' and checking the partition type name. Since within + # arch-chroot there's no '/run/udev' but only an empty '/run' tmpfs + # 'lsblk' cannot see partition type names and some other pieces of info. + # + # See also + # https://gitlab.archlinux.org/archlinux/arch-install-scripts/-/issues/24 + # + # Thus within arch-chroot the installation of 'zfsbootmenu-efi-bin' and + # even 'makepkg -s' fails. We build the package in our Arch Linux live + # CD ISO image and copy the resulting file into our chroot. + # + # We circle back to the package file when we chroot into Arch and + # install_zbm_image(). + pacman_cache_dir='/var/cache/pacman/pkg' + chroot_pacman_cache_dir='/mnt'"${pacman_cache_dir}" + git_zbm_efi_bin_dir='/tmp/zfsbootmenu-efi-bin' + sudo -u 'arch' git -C '/tmp' clone 'https://aur.archlinux.org/zfsbootmenu-efi-bin.git' + + # We briefly bind-mount our ESP into '/efi' before we build the package. + # Its PKGBUILD will then find the ESP at the correct location and write + # a package file with that internal location ('/efi'). + mkdir -p '/efi' + mount --bind '/mnt/efi' '/efi' + pushd "${git_zbm_efi_bin_dir}" + sudo -u 'arch' makepkg -s || { + printf -- '%s\n' 'Failed building zfsbootmenu-efi-bin package. Exiting ...' + exit 77 + } + popd + umount '/efi' + rmdir '/efi' + + package_file_abs="$(find "${git_zbm_efi_bin_dir}" -type f -iname '*pkg.tar.zst')" + package_file="$(basename "${package_file_abs}")" + mkdir -p "${chroot_pacman_cache_dir}" + rsync -av "${package_file_abs}" "${chroot_pacman_cache_dir}"'/'"${package_file}" || { + printf -- '%s\n' 'Failed rsyncing zfsbootmenu-efi-bin package file into chroot. Exiting ...' + exit 77 + } + export ZFSBOOTMENU_EFI_BIN_PKG_PATH="${pacman_cache_dir}"'/'"${package_file}" + rm -rf "${git_zbm_efi_bin_dir}" +} + function install_zfs () { #1.4 declare reset_colors='\033[0m' @@ -502,6 +550,15 @@ function paru_install () { fi } +function install_zbm_image () { + # This takes image files written earlier in our Arch Linux live CD ISO + # image at prepare_zfsbootmenu_efi_bin_pkg() and installs them via their + # locally built package file. When done we delete the manually built + # package file from pacman's cache dir. + pacman -U "${ZFSBOOTMENU_EFI_BIN_PKG_PATH}" --noconfirm + rm "${ZFSBOOTMENU_EFI_BIN_PKG_PATH}" +} + function keep_initiramfs_root_only_rw () { declare systemd_local_admin_override_path unit_name systemd_local_admin_override_path='/etc/systemd/system' @@ -571,15 +628,8 @@ function install_os_in_chroot () { source /etc/locale.conf mkinitcpio -P - # Install ZFSBootMenu and deps - git clone --depth=1 https://github.com/zbm-dev/zfsbootmenu/ '/tmp/zfsbootmenu' - paru_install 'cpanminus' 'kexec-tools' 'fzf' 'util-linux' - pushd '/tmp/zfsbootmenu' - make - make install - cpanm --notest --installdeps . - popd - rm -rf '/tmp/zfsbootmenu' + # Install ZFSBootMenu image + install_zbm_image } function set_root_pw () { @@ -636,24 +686,6 @@ function configure_zfs_mount_gen () { function configure_zfsbootmenu () { #2.7 - curl -s 'https://raw.githubusercontent.com/zbm-dev/zfsbootmenu/master/etc/zfsbootmenu/mkinitcpio.conf' | sed -r -e '/^#/d' -e '/^$/d' > '/mnt/etc/zfsbootmenu/mkinitcpio.conf' - cat > '/mnt/etc/zfsbootmenu/config.yaml' <