From 50062572301d6653d8c2574eadb0bed460d25322 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 30 Mar 2021 22:39:22 +0200 Subject: [PATCH] Put boot image into ESP --- nixos-modules/lib/make-bootable-image.nix | 6 ++-- nixos-modules/lib/make-esp-fs.nix | 40 +++++++++++++++++------ nixos-modules/lib/make-ext2-fs.nix | 24 ++------------ 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/nixos-modules/lib/make-bootable-image.nix b/nixos-modules/lib/make-bootable-image.nix index 9d9c260..f6056e7 100644 --- a/nixos-modules/lib/make-bootable-image.nix +++ b/nixos-modules/lib/make-bootable-image.nix @@ -10,6 +10,8 @@ pkgs.stdenv.mkDerivation { zstd ]; + inherit espImage; + buildCommand = '' img=./temp.raw blockSize=512 @@ -24,8 +26,8 @@ pkgs.stdenv.mkDerivation { truncate --size=$esbByteOffset $img # Concatentenate the ESP - echo "Concatenate ESP ${espImage}" - zstdcat ${espImage} >> $img + echo "Concatenate ESP $espImage" + zstdcat $espImage >> $img imgBytes=$(stat --format=%s $img) echo "Image is $(( $imgBytes >> 20 )) MiB with ESP partition" diff --git a/nixos-modules/lib/make-esp-fs.nix b/nixos-modules/lib/make-esp-fs.nix index 4e8233c..66616f0 100644 --- a/nixos-modules/lib/make-esp-fs.nix +++ b/nixos-modules/lib/make-esp-fs.nix @@ -23,29 +23,32 @@ in pkgs.stdenv.mkDerivation { "configfile" "efi_gop" "efi_uga" - "ext2" + "fat" "gzio" "multiboot" "multiboot2" "normal" "part_gpt" - "search_fs_uuid" + "search" ]; buildCommand = '' img=tmp.raw - bootdir=EFI/boot/ - mkdir -p $bootdir + bootdir=./espRoot/boot/ + grubdir=./espRoot/boot/grub + efidir=./espRoot/EFI/boot + + mkdir -p $bootdir $efidir $grubdir cat < embedded.cfg insmod configfile insmod efi_gop insmod efi_uga - insmod ext2 + insmod fat insmod normal insmod part_gpt insmod search_fs_uuid - search.fs_uuid ${config.genode.boot.storeFsUuid} root + search --set=root --label EFIBOOT set prefix=($root)/boot/grub configfile /boot/grub/grub.cfg EOF @@ -54,17 +57,34 @@ in pkgs.stdenv.mkDerivation { ${grub'}/bin/grub-mkimage \ --config=embedded.cfg \ - --output=$bootdir/boot${targetArch}.efi \ - --prefix=/boot/grub \ + --output=$efidir/boot${targetArch}.efi \ + --prefix=/sigil/grub \ --format=${grub'.grubTarget} \ $MODULES + cat > extraPrepareConfig.sh <<< '${config.boot.loader.grub.extraPrepareConfig}' + substituteInPlace extraPrepareConfig.sh \ + --replace '${pkgs.coreutils}' '${pkgs.buildPackages.coreutils}' \ + --replace '@bootPath@' "$bootdir" + source extraPrepareConfig.sh + + cat < $grubdir/grub.cfg + set timeout=3 + set default=0 + set gfxpayload=auto + + ${config.boot.loader.grub.extraEntries} + EOF + + grub-script-check $grubdir/grub.cfg + + # Make the ESP image twice as large as necessary - imageBytes=$(du --summarize --block-size=4096 --total $bootdir | tail -1 | awk '{ print int($1 * 8192) }') + imageBytes=$(du --summarize --block-size=4096 --total espRoot | tail -1 | awk '{ print int($1 * 8192) }') truncate --size=$imageBytes $img mkfs.vfat -n EFIBOOT --invariant $img - mcopy -sv -i $img EFI :: + mcopy -sv -i $img espRoot/* :: fsck.vfat -nv $img zstd --verbose --no-progress ./$img -o $out diff --git a/nixos-modules/lib/make-ext2-fs.nix b/nixos-modules/lib/make-ext2-fs.nix index 98d2103..013f14d 100644 --- a/nixos-modules/lib/make-ext2-fs.nix +++ b/nixos-modules/lib/make-ext2-fs.nix @@ -1,8 +1,6 @@ { config, lib, pkgs, extraInputs ? [ ], contents }: let - grub' = pkgs.buildPackages.grub2_efi; - copyEris = lib.strings.concatMapStrings ({ source, target }: '' cp -a --reflink=auto "${source}" "./rootImage/${target}" '') contents; @@ -12,7 +10,6 @@ in pkgs.stdenv.mkDerivation { nativeBuildInputs = with pkgs.buildPackages; [ e2fsprogs.bin - grub' libfaketime perl fakeroot @@ -23,23 +20,7 @@ in pkgs.stdenv.mkDerivation { img=temp.raw # Create nix/store before copying path - mkdir -p ./rootImage/boot/grub ./rootImage/nix/store - - cat > extraPrepareConfig.sh <<< '${config.boot.loader.grub.extraPrepareConfig}' - substituteInPlace extraPrepareConfig.sh \ - --replace '${pkgs.coreutils}' '${pkgs.buildPackages.coreutils}' \ - --replace '@bootPath@' './rootImage/boot' - source extraPrepareConfig.sh - - cat < ./rootImage/boot/grub/grub.cfg - set timeout=3 - set default=0 - set gfxpayload=auto - - ${config.boot.loader.grub.extraEntries} - EOF - - grub-script-check ./rootImage/boot/grub/grub.cfg + mkdir -p ./rootImage/nix/store ( GLOBIGNORE=".:.." @@ -65,7 +46,8 @@ in pkgs.stdenv.mkDerivation { faketime -f "1970-01-01 00:00:01" fakeroot mkfs.ext2 -L NIXOS_GENODE -U ${config.genode.boot.storeFsUuid} -d ./rootImage $img export EXT2FS_NO_MTAB_OK=yes - # I have ended up with corrupted images sometimes, I suspect that happens when the build machine's disk gets full during the build. + # I have ended up with corrupted images sometimes, I suspect that + # happens when the build machine's disk gets full during the build. if ! fsck.ext2 -n -f $img; then echo "--- Fsck failed for EXT2 image of $bytes bytes (numInodes=$numInodes, numDataBlocks=$numDataBlocks) ---" cat errorlog