#!/hint/bash -euE # Copyright (C) 2023 Umorpha Systems # SPDX-License-Identifier: AGPL-3.0-or-later packages+=(lvm2) pre_install+=(20:umorpha-disk:pre_install) post_install+=(20:umorpha-disk:post_install) umorpha-disk:pre_install() { local arg_mountpoint=$1 mkdir -p "$arg_mountpoint/etc/pacman.d/hooks" ln -sT /dev/null "$arg_mountpoint/etc/pacman.d/hooks/90-mkinitcpio-install.hook" } umorpha-disk:post_install() { local arg_mountpoint=$1 rm "$arg_mountpoint/etc/pacman.d/hooks/90-mkinitcpio-install.hook" rmdir "$arg_mountpoint/etc/pacman.d/hooks" || true ######################################################################## # Patch a bug in the libalpm mkinitcpio hook that our `hook.preset` # below would trigger. # https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio/-/merge_requests/277 TMPDIR="$arg_mountpoint/usr/share/libalpm/scripts" patch "$arg_mountpoint/usr/share/libalpm/scripts/mkinitcpio" <<-'EOF' --- /usr/share/libalpm/scripts/mkinitcpio.orig +++ /usr/share/libalpm/scripts/mkinitcpio @@ -39,10 +39,14 @@ unsorted_filelist+=("${ALL_uki}") fi if [[ -v preset_kver ]]; then - unsorted_filelist+=("${preset_kver}") + if [[ "${preset_kver}" == /* && "${preset_kver}" != /usr/lib/modules/*/vmlinuz ]]; then + unsorted_filelist+=("${preset_kver}") + fi unsorted_kernellist+=("${preset_kver}") elif [[ -v ALL_kver ]]; then - unsorted_filelist+=("${ALL_kver}") + if [[ "${ALL_kver}" == /* && "${ALL_kver}" != /usr/lib/modules/*/vmlinuz ]]; then + unsorted_filelist+=("${ALL_kver}") + fi unsorted_kernellist+=("${ALL_kver}") fi done @@ -88,8 +92,10 @@ read_preset "$pkgbase" # always install the kernel - for kernelfile in "${kernellist[@]}"; do - install -Dm644 -- "$line" "${kernelfile}" + for kernel in "${kernellist[@]}"; do + if [[ "${kernel}" == /* && "${kernel}" != "/${line}" ]]; then + install -Dm644 -- "${line}" "${kernel}" + fi done ) EOF cat >"$arg_mountpoint/usr/share/mkinitcpio/hook.preset" <<-'EOF' #!/hint/bash # mkinitcpio preset file for the '%PKGBASE%' package #ALL_config="/etc/mkinitcpio.conf" ALL_kver=$(grep -Fxl '%PKGBASE%' /usr/lib/modules/*/pkgbase|sed 's,pkgbase$,vmlinuz,') ALL_microcode=(/boot/*-ucode.img) PRESETS=('default' 'fallback') #default_config="/etc/mkinitcpio.conf" #default_image="/boot/initramfs-%PKGBASE%.img" default_uki="/boot/EFI/Linux/parabola-%PKGBASE%.efi" #default_options="--splash /usr/share/systemd/bootctl/splash-parabola.bmp" #fallback_config="/etc/mkinitcpio.conf" #fallback_image="/boot/initramfs-%PKGBASE%-fallback.img" fallback_uki="/boot/EFI/Linux/parabola-%PKGBASE%-fallback.efi" fallback_options="-S autodetect" EOF cat >"$arg_mountpoint/etc/mkinitcpio.conf.d/umorpha.conf" <<'EOF' #!/hint/bash # Copyright (C) 2023 Umorpha Systems # SPDX-License-Identifier: AGPL-3.0-or-later # Insert 'umorpha-overlayfs' and 'lvm2' into HOOKS. for ((i=0; i<${#HOOKS[@]}; i++)); do if [[ ${HOOKS[i]} == filesystems ]]; then HOOKS=("${HOOKS[@]:0:i}" umorpha-overlayfs lvm2 "${HOOKS[@]:i}" ) break fi done EOF cat >"$arg_mountpoint/usr/lib/initcpio/install/umorpha-overlayfs" <<-'EOF' #!/hint/bash # Copyright (C) 2023 Umorpha Systems # SPDX-License-Identifier: AGPL-3.0-or-later build() { add_module 'overlay' add_runscript } help() { cat <"$arg_mountpoint/usr/lib/initcpio/hooks/umorpha-overlayfs" <<-'EOF' #!/hint/bash # Copyright (C) 2023 Umorpha Systems # SPDX-License-Identifier: AGPL-3.0-or-later # args: errmsg umorpha_emergency_shell() { run_hookfunctions 'run_emergencyhook' 'emergency hook' $EMERGENCYHOOKS err "$*" echo "You are now being dropped into an emergency shell." launch_interactive_shell msg "Trying to continue (this will most likely fail) ..." } # args: /path/to/newroot umorpha_mount_handler() { local newroot="$1" msg ":: mounting '$root'+'$overlay_root' on real root" mkdir -p /run/umorpha-root/root /run/umorpha-root/overlay local mnt_root=/run/umorpha-root/root local mnt_overlay=/run/umorpha-root/overlay if ! mount -t "${rootfstype:-auto}" -o "ro${rootflags:+,$rootflags}" "$root" "$mnt_root"; then umorpha_emergency_shell "Failed to mount root '$root'" fi if ! mount -t "${overlay_rootfstype:-auto}" -o "${rwopt:-ro}${overlay_rootflags:+,$overlayrootflags}" "$overlay_root" "$mnt_overlay"; then umorpha_emergency_shell "Failed to mount overlay root '$overlay_root'" fi mkdir -p -- "$mnt_overlay/upperdir" "$mnt_overlay/workdir" if ! mount -t overlay -o "lowerdir=${mnt_root},upperdir=${mnt_overlay}/upperdir,workdir=${mnt_overlay}/workdir" umorpha-rootfs "$newroot"; then umorpha_emergency_shell "Failed to mount overlayfs lowerdir='${mnt_root}' overlaydir='${mnt_overlay}'" fi if [ -n "$boot" ]; then local bootdev if bootdev=$(resolve_device "$boot"); then case "$boot" in 'UUID='* | 'LABEL='* | 'PARTUUID='* | 'PARTLABEL='*) : ;; *) boot="$bootdev" ;; esac fi msg ":: mounting '${boot}' on /boot" if ! mount -t "${bootfstype:-auto}" -o "${rwopt:-ro}${bootflags:+,$bootflags}" "$boot" "$newroot/boot"; then umorpha_emergency_shell "Failed to mount boot '$boot'" fi fi } run_hook() { export mount_handler='umorpha_mount_handler' } EOF }