From 5da960a8bd984142e237dc16bcfb84882041f7f3 Mon Sep 17 00:00:00 2001 From: Valeria Fadeeva Date: Sat, 15 Apr 2023 18:13:49 +0500 Subject: [PATCH] Init --- .SRCINFO | 26 +++++ .gitignore | 7 ++ 10-dracut-ukify-pre-install.hook | 16 +++ 60-dracut-ukify-remove.hook | 11 ++ 90-dracut-ukify-install.hook | 17 +++ PKGBUILD | 31 ++++++ README.md | 10 ++ dracut-ukify | 171 +++++++++++++++++++++++++++++++ make.sh | 11 ++ sha256sum.txt | 7 ++ 10 files changed, 307 insertions(+) create mode 100644 .SRCINFO create mode 100644 .gitignore create mode 100644 10-dracut-ukify-pre-install.hook create mode 100644 60-dracut-ukify-remove.hook create mode 100644 90-dracut-ukify-install.hook create mode 100644 PKGBUILD create mode 100755 dracut-ukify create mode 100755 make.sh create mode 100644 sha256sum.txt diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 0000000..f2272c9 --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,26 @@ +pkgbase = melawy-dracut-ukify + pkgdesc = Integration layer for dracut and systemd's ukify tool for Arch Linux. Placing kernels to /ESP_PATH/EFI/Linux + pkgver = 0 + pkgrel = 1 + url = https://github.com/Valeria-Fadeeva/melawy-dracut-ukify + arch = any + license = AGPL3 + depends = dracut + depends = systemd-ukify + depends = python + depends = util-linux + depends = python-pefile + optdepends = sbsigntools: secureboot support + provides = dracut-hook + conflicts = dracut-hook-uefi + conflicts = dracut-uefi-hook + source = 10-dracut-ukify-pre-install.hook + source = 60-dracut-ukify-remove.hook + source = 90-dracut-ukify-install.hook + source = dracut-ukify + sha256sums = e9592f4f738e8ac70044db1e3f0c4839bc07f37662d5dbc221230cf1617a6b4d + sha256sums = 341cd01546d840e7401f7bec868a78e2f6ca12563e93d993a07bc51efe674ed0 + sha256sums = 08225b2c3f5e2a734561b5fa9a3e84060dfffd85b2898adb0fff0ce3b068b4d0 + sha256sums = 45de7b379bca66b96327b0a7957fefce5acc53968828cc412f5e5d0f13c4151f + +pkgname = melawy-dracut-ukify diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bf46a7c --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.pkg.tar +*.pkg.tar.* +*.zst +*.zst.* +pkg/ +src/ +.idea/ diff --git a/10-dracut-ukify-pre-install.hook b/10-dracut-ukify-pre-install.hook new file mode 100644 index 0000000..d823fde --- /dev/null +++ b/10-dracut-ukify-pre-install.hook @@ -0,0 +1,16 @@ +[Trigger] +Type = Path +Operation = Install +Operation = Upgrade +Target = usr/lib/modules/*/pkgbase +Target = usr/lib/dracut/* +Target = usr/lib/systemd/systemd +Target = usr/lib/systemd/boot/efi/*.efi.stub +Target = usr/share/libalpm/hooks/90-dracut-ukify-install.hook +Target = usr/bin/dracut-ukify +Target = usr/src/*/dkms.conf + +[Action] +Description = Ensure ESP is mounted... +When = PreTransaction +Exec = /usr/bin/dracut-ukify -x diff --git a/60-dracut-ukify-remove.hook b/60-dracut-ukify-remove.hook new file mode 100644 index 0000000..936cbd7 --- /dev/null +++ b/60-dracut-ukify-remove.hook @@ -0,0 +1,11 @@ +[Trigger] +Type = Path +Operation = Remove +Target = usr/lib/modules/*/pkgbase +Target = usr/src/*/dkms.conf + +[Action] +Description = Removing linux images... +When = PreTransaction +Exec = /usr/bin/dracut-ukify -y +NeedsTargets diff --git a/90-dracut-ukify-install.hook b/90-dracut-ukify-install.hook new file mode 100644 index 0000000..9701fac --- /dev/null +++ b/90-dracut-ukify-install.hook @@ -0,0 +1,17 @@ +[Trigger] +Type = Path +Operation = Install +Operation = Upgrade +Target = usr/lib/modules/*/pkgbase +Target = usr/lib/dracut/* +Target = usr/lib/systemd/systemd +Target = usr/lib/systemd/boot/efi/*.efi.stub +Target = usr/share/libalpm/hooks/90-dracut-ukify-install.hook +Target = usr/bin/dracut-ukify +Target = usr/src/*/dkms.conf + +[Action] +Description = Updating linux images... +When = PostTransaction +Exec = /usr/bin/dracut-ukify -z +NeedsTargets diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 0000000..58df712 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,31 @@ +# Maintainer: Valeria Fadeeva + +pkgname=melawy-dracut-ukify +pkgver=0 +pkgrel=1 +pkgdesc="Integration layer for dracut and systemd's ukify tool for Arch Linux. Placing kernels to /ESP_PATH/EFI/Linux" +url="https://github.com/Valeria-Fadeeva/melawy-dracut-ukify" +arch=(any) +license=('AGPL3') +depends=(dracut systemd-ukify python util-linux python-pefile) +optdepends=( + 'sbsigntools: secureboot support' +) +source=('10-dracut-ukify-pre-install.hook' + '60-dracut-ukify-remove.hook' + '90-dracut-ukify-install.hook' + 'dracut-ukify') +sha256sums=('e9592f4f738e8ac70044db1e3f0c4839bc07f37662d5dbc221230cf1617a6b4d' + '341cd01546d840e7401f7bec868a78e2f6ca12563e93d993a07bc51efe674ed0' + '08225b2c3f5e2a734561b5fa9a3e84060dfffd85b2898adb0fff0ce3b068b4d0' + '45de7b379bca66b96327b0a7957fefce5acc53968828cc412f5e5d0f13c4151f') +backup=() +provides=(dracut-hook) +conflicts=(dracut-hook-uefi dracut-uefi-hook) + +package() { + install -Dm644 "${srcdir}/10-dracut-ukify-pre-install.hook" "${pkgdir}/usr/share/libalpm/hooks/10-dracut-ukify-pre-install.hook" + install -Dm644 "${srcdir}/60-dracut-ukify-remove.hook" "${pkgdir}/usr/share/libalpm/hooks/60-dracut-ukify-remove.hook" + install -Dm644 "${srcdir}/90-dracut-ukify-install.hook" "${pkgdir}/usr/share/libalpm/hooks/90-dracut-ukify-install.hook" + install -Dm755 "${srcdir}/dracut-ukify" "${pkgdir}/usr/bin/dracut-ukify" +} diff --git a/README.md b/README.md index 74215a2..36aadd4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,12 @@ # melawy-dracut-ukify Integration layer for dracut and systemd's ukify tool for Arch Linux. Placing kernels to /ESP_PATH/EFI/Linux + +``` +ls -1 /efi/EFI/Linux +``` +``` +... +linux-xanmod-anbox.efi +linux-xanmod-anbox-fallback.efi +... +``` diff --git a/dracut-ukify b/dracut-ukify new file mode 100755 index 0000000..d896393 --- /dev/null +++ b/dracut-ukify @@ -0,0 +1,171 @@ +#!/bin/bash -e + +function usage { + echo "$(basename "$0") [OPTIONS]" + echo " -h shows usage" + echo " -g generate UKI image for specified kernel version" + echo " -a generate UKI images for all available kernels" +} + +function check_root { + [ $EUID -eq 0 ] && return + echo "dracut-ukify requires root privileges to work" >&2 + exit 1 +} + +if [[ ${#} -eq 0 ]]; then + usage +fi + +declare -a ukify_global_args=() + +ESP_PATH=$(bootctl --print-esp-path) +BOOT_PATH="${ESP_PATH}/EFI/Linux" + +declare -A kernels +update_all=0 + +while getopts ":hag:xyz" arg; do + case ${arg} in + g) + found=0 + for line in $(pacman -Qql "$OPTARG"); do + if [[ $line =~ ^/usr/lib/modules/([^/]+)/pkgbase$ ]]; then + read -r kernel_name < "/${line}" + kernels["${kernel_name}"]="${BASH_REMATCH[1]}" + found=1 + break + fi + done + if (( ! found )); then + echo "Error occurred during '$OPTARG' package traversal" >&2 + exit 1 + fi + ;; + a) + update_all=1 + ;; + x) + check_root + # Trigger some IO on ESP path to be sure it's mounted by autofs if it's the case + # Otherwise upgrading systemd may cause ESP partition not mounted at the time dracut attempt to write new image + stat "$ESP_PATH" >/dev/null + ;; + y) + check_root + while read -r line; do + if [[ "$line" == 'usr/lib/modules/'+([^/])'/pkgbase' ]]; then + read -r kernel_name < "/${line}" + path="$(grep -lE "^${kernel_name}\$" /usr/lib/modules/*/pkgbase)" + kernel_version=$(basename "${path%/pkgbase}") + + efi_image="$BOOT_PATH/$kernel_name.efi" + efi_image_fallback="$BOOT_PATH/$kernel_name-fallback.efi" + + declare -a images=() + images+=($efi_image) + images+=($efi_image_fallback) + + for image in "${images[@]}"; + do + if [ -f ]; then + echo "==> Removing $image..." + rm -f $image + fi + done + fi + done + exit 0 + ;; + z) + check_root + while read -r line; do + if [[ $line =~ ^usr/lib/modules/([^/]+)/pkgbase$ ]]; then + read -r kernel_name < "/${line}" + kernels["${kernel_name}"]="${BASH_REMATCH[1]}" + else + update_all=1 + break + fi + done + ;; + h) + usage + ;; + *) + usage + ;; + esac +done + +if (( update_all )); then + for kernel_path in /usr/lib/modules/*; do + [ -f "$kernel_path/pkgbase" ] || continue + + kernel_version=$(basename $kernel_path) + kernel_dir="/usr/lib/modules/$kernel_version" + pkgbase="$kernel_dir/pkgbase" + kernel_name=$(sed -e 's/^[[:space:]]//g' -e 's/[[:space:]]$//g' "$pkgbase") + + if [ -n "$kernel_name" ]; then + kernels["$kernel_name"]="$kernel_version" + fi + done +fi + +function gen_image() { + check_root + kernel_name="$1" + kernel_version="$2" + + kernel_dir="/usr/lib/modules/$kernel_version" + + if [ -f "/etc/kernel/cmdline" ]; then + cmdline=$(sed -e 's/^[[:space:]]//g' -e 's/[[:space:]]$//g' "/etc/kernel/cmdline") + else + cmdline=$(sed -e 's/^[[:space:]]//g' -e 's/[[:space:]]$//g' -e 's/initrd.*$//g' "/proc/cmdline") + fi + + vmlinuz="$kernel_dir/vmlinuz" + + initrd_image="$(mktemp)" + initrd_image_fallback="$(mktemp)" + + efi_image="$BOOT_PATH/$kernel_name.efi" + efi_image_fallback="$BOOT_PATH/$kernel_name-fallback.efi" + + echo "==> Building initrd image $kernel_name $initrd_image" + dracut --force --hostonly --no-hostonly-cmdline --kver "$kernel_version" "$initrd_image" + + declare -a ukify_args=("${ukify_global_args[@]}") + ukify_args+=(--cmdline "$cmdline") + ukify_args+=(--uname "$kernel_version") + ukify_args+=(--os-release "/etc/os-release") + ukify_args+=(--output "$efi_image") + ukify_args+=("$vmlinuz" "$initrd_image") + + echo "==> Ukify image $kernel_name $efi_image" + /usr/lib/systemd/ukify "${ukify_args[@]}" + + + echo "==> Building initrd image $kernel_name $initrd_image_fallback" + dracut --force --kver "$kernel_version" "$initrd_image_fallback" + + declare -a ukify_args=("${ukify_global_args[@]}") + ukify_args+=(--cmdline "$cmdline") + ukify_args+=(--uname "$kernel_version") + ukify_args+=(--os-release "/etc/os-release") + ukify_args+=(--output "$efi_image_fallback") + ukify_args+=("$vmlinuz" "$initrd_image_fallback") + + echo "==> Ukify image $kernel_name $efi_image_fallback" + /usr/lib/systemd/ukify "${ukify_args[@]}" + + rm -f "$initrd_image" + rm -f "$initrd_image_fallback" +} + +for kernel_name in "${!kernels[@]}"; do + kernel_version="${kernels[$kernel_name]}" + gen_image "$kernel_name" "$kernel_version" +done diff --git a/make.sh b/make.sh new file mode 100755 index 0000000..cae8f43 --- /dev/null +++ b/make.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +echo -n > sha256sum.txt + +for i in *; +do +([ -f $i ] && [ "$i" != "PKGBUILD" ] && [ "$i" != "$(basename $0)" ] && [ "$i" != "sha256sum.txt" ] ) || continue +echo $(sha256sum $i) | column -t >> sha256sum.txt +done + +makepkg --printsrcinfo > .SRCINFO \ No newline at end of file diff --git a/sha256sum.txt b/sha256sum.txt new file mode 100644 index 0000000..ab9e7b1 --- /dev/null +++ b/sha256sum.txt @@ -0,0 +1,7 @@ +e9592f4f738e8ac70044db1e3f0c4839bc07f37662d5dbc221230cf1617a6b4d 10-dracut-ukify-pre-install.hook +341cd01546d840e7401f7bec868a78e2f6ca12563e93d993a07bc51efe674ed0 60-dracut-ukify-remove.hook +08225b2c3f5e2a734561b5fa9a3e84060dfffd85b2898adb0fff0ce3b068b4d0 90-dracut-ukify-install.hook +45de7b379bca66b96327b0a7957fefce5acc53968828cc412f5e5d0f13c4151f dracut-ukify +8486a10c4393cee1c25392769ddd3b2d6c242d6ec7928e1414efff7dfb2f07ef LICENSE +42a0e788242b943cebe5ed2b7e47f2c97d23836e0abd41c8d2c1a81ba443fe83 melawy-dracut-ukify-0-1-any.pkg.tar.zst +3b388b0772ec118899c52aea924f6e03b575dfea368ecfb846cd3fcdf23c63eb README.md