diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix index 74e0931..5612185 100644 --- a/pkgs/image/default.nix +++ b/pkgs/image/default.nix @@ -18,6 +18,7 @@ stdenvNoCC.mkDerivation (finalAttrs: { mtools e2fsprogs jq + openssl ]; env = { diff --git a/pkgs/image/mkimage.sh b/pkgs/image/mkimage.sh index 8c94348..3e6ed9e 100644 --- a/pkgs/image/mkimage.sh +++ b/pkgs/image/mkimage.sh @@ -58,8 +58,7 @@ $systemd/usr/bin/systemd-repart \ --split=true \ --json=pretty \ --root=$out \ - patos-$version.raw > init-repart-output.json -rm -f patos-$version.raw + patos-$version.raw > init-repart-output.json && rm -f patos-$version.raw roothash=$(jq -r '.[0].roothash' init-repart-output.json) rootPart=$(jq -r '.[0].split_path' init-repart-output.json) @@ -91,12 +90,29 @@ $systemd/usr/bin/ukify build \ --os-release @./reset-os-release \ --cmdline "$kernelCmdLine roothash=$roothash systemd.factory_reset=yes" \ -o patos_factory_reset.efi -rm -rf rootfs -cp patos_${version}.efi boot/ -cp patos_factory_reset.efi boot/ -cp ${systemd}/usr/lib/systemd/boot/efi/systemd-bootx64.efi boot/ -echo "timeout 2" > boot/loader.conf +# Secure boot +openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout key.pem -subj "/CN=patagia-signing" + +SYSTEMD_RELAX_ESP_CHECKS=1 $systemd/usr/bin/bootctl install --root ./rootfs --esp-path /boot \ + --secure-boot-auto-enroll=true --certificate=./cert.pem --private-key=./key.pem + +# install UKIs +cp patos_${version}.efi rootfs/boot/EFI/Linux +cp patos_factory_reset.efi rootfs/boot/EFI/Linux + +# sign EFIs +$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \ + rootfs/boot/EFI/BOOT/BOOTX64.EFI --output=rootfs/boot/EFI/BOOT/BOOTX64.EFI + +$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \ + rootfs/boot/EFI/Linux/patos_0.0.1.efi --output=rootfs/boot/EFI/Linux/patos_0.0.1.efi + +$systemd/usr/lib/systemd/systemd-sbsign sign --certificate=./cert.pem --private-key=./key.pem \ + rootfs/boot/EFI/Linux/patos_factory_reset.efi --output=rootfs/boot/EFI/Linux/patos_factory_reset.efi + +echo "timeout 2" > rootfs/boot/loader/loader.conf +echo "secure-boot-enroll force" >> rootfs/boot/loader/loader.conf # Final partitioning cat <<EOF > final.repart.d/10-esp.conf @@ -105,10 +121,7 @@ Type=esp Format=vfat SizeMinBytes=160M SizeMaxBytes=160M -CopyFiles=/boot/systemd-bootx64.efi:/EFI/BOOT/BOOTX64.EFI -CopyFiles=/boot/patos_${version}.efi:/EFI/Linux/patos_${version}.efi -CopyFiles=/boot/patos_factory_reset.efi:/EFI/Linux/patos_factory_reset.efi -CopyFiles=/boot/loader.conf:/loader/loader.conf +CopyFiles=/rootfs/boot:/ EOF cat <<EOF > final.repart.d/20-root.conf @@ -142,6 +155,6 @@ $systemd/usr/bin/systemd-repart \ --root=$out \ patos-$version.raw > final-repart-output.json -rm -rf boot +rm -rf rootfs popd diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix index b22d243..a1cb314 100644 --- a/pkgs/systemd/default.nix +++ b/pkgs/systemd/default.nix @@ -30,6 +30,8 @@ stdenv.mkDerivation (finalAttrs: { hash = "sha256-6rxJUYRq785U6aik5VhQRqG+Ss67lBB6T3eQF+tkyhk="; }; + patches = [ ./skip-verify-esp.patch ]; + dontCheckForBrokenSymlinks = true; nativeBuildInputs = with pkgs; [ diff --git a/pkgs/systemd/skip-verify-esp.patch b/pkgs/systemd/skip-verify-esp.patch new file mode 100644 index 0000000..2cb9505 --- /dev/null +++ b/pkgs/systemd/skip-verify-esp.patch @@ -0,0 +1,24 @@ +diff --git a/src/shared/find-esp.c b/src/shared/find-esp.c +index f830d6dfe3..7ad2a8cd1d 100644 +--- a/src/shared/find-esp.c ++++ b/src/shared/find-esp.c +@@ -403,15 +403,15 @@ static int verify_esp( + "File system \"%s\" is not a FAT EFI System Partition (ESP) file system.", p); + } + +- r = verify_fsroot_dir(pfd, p, flags, FLAGS_SET(flags, VERIFY_ESP_SKIP_DEVICE_CHECK) ? NULL : &devid); +- if (r < 0) +- return r; +- + /* In a container we don't have access to block devices, skip this part of the verification, we trust + * the container manager set everything up correctly on its own. */ + if (FLAGS_SET(flags, VERIFY_ESP_SKIP_DEVICE_CHECK)) + goto finish; + ++ r = verify_fsroot_dir(pfd, p, flags, FLAGS_SET(flags, VERIFY_ESP_SKIP_DEVICE_CHECK) ? NULL : &devid); ++ if (r < 0) ++ return r; ++ + if (devnum_is_zero(devid)) + return log_full_errno(searching ? LOG_DEBUG : LOG_ERR, + SYNTHETIC_ERRNO(searching ? EADDRNOTAVAIL : ENODEV),