fixup! fixup! fixup! Boot from USB
This commit is contained in:
parent
7239553135
commit
0d0d649e70
|
@ -0,0 +1,69 @@
|
||||||
|
# Builds a compressed EFI System Partition image
|
||||||
|
{ config, pkgs, espImage, storeFsImage }:
|
||||||
|
|
||||||
|
pkgs.stdenv.mkDerivation {
|
||||||
|
name = "boot.qcow2";
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs.buildPackages; [
|
||||||
|
config.system.build.qemu
|
||||||
|
utillinux
|
||||||
|
zstd
|
||||||
|
];
|
||||||
|
|
||||||
|
buildCommand = ''
|
||||||
|
img=./temp.raw
|
||||||
|
blockSize=512
|
||||||
|
sectorSize=$(( $blockSize * 1 ))
|
||||||
|
imgBytes=0
|
||||||
|
|
||||||
|
espSectorOffset=2048
|
||||||
|
esbByteOffset=$(( $espSectorOffset * $sectorSize ))
|
||||||
|
|
||||||
|
# Pad the front of the image
|
||||||
|
echo "Pad front of image with " $esbByteOffset " bytes"
|
||||||
|
truncate --size=$esbByteOffset $img
|
||||||
|
|
||||||
|
# Concatentenate the ESP
|
||||||
|
echo "Concatenate ESP ${espImage}"
|
||||||
|
zstdcat ${espImage} >> $img
|
||||||
|
|
||||||
|
imgBytes=$(stat --format=%s $img)
|
||||||
|
echo "Image is $(( $imgBytes >> 20 )) MiB with ESP partition"
|
||||||
|
|
||||||
|
nixSectorOffset=$(( ($imgBytes + $sectorSize - 1) / $sectorSize ))
|
||||||
|
nixByteOffset=$(( $nixSectorOffset * $sectorSize ))
|
||||||
|
|
||||||
|
# Pad the ESP
|
||||||
|
echo "Pad end of ESP with " $(( $nixByteOffset - $imgBytes )) " bytes"
|
||||||
|
truncate --size=$nixByteOffset $img
|
||||||
|
|
||||||
|
# Concatenate the nix partition
|
||||||
|
echo "Concatenate store ${storeFsImage}"
|
||||||
|
zstdcat ${storeFsImage} >> $img
|
||||||
|
|
||||||
|
imgBytes=$(stat --format=%s $img)
|
||||||
|
echo "Image is $(( $imgBytes >> 20 )) MiB with store partition"
|
||||||
|
|
||||||
|
endSectorOffset=$(( ($(stat --format=%s $img) + $sectorSize + 1) / $sectorSize ))
|
||||||
|
endByteOffset=$(( $endSectorOffset * $sectorSize ))
|
||||||
|
|
||||||
|
# Pad the end of the image
|
||||||
|
echo "Pad end of store with $(( $endByteOffset - $imgBytes )) bytes"
|
||||||
|
truncate --size=$endByteOffset $img
|
||||||
|
|
||||||
|
imgBytes=$(stat --format=%s $img)
|
||||||
|
echo "Image is $(( $imgBytes >> 20 )) MiB with final padding"
|
||||||
|
|
||||||
|
efiUuid=C12A7328-F81F-11D2-BA4B-00A0C93EC93B
|
||||||
|
|
||||||
|
# Create the partition table
|
||||||
|
sfdisk $img <<EOF
|
||||||
|
label: gpt
|
||||||
|
label-id: 44444444-4444-4444-8888-888888888888
|
||||||
|
start=$nixSectorOffset, type=${config.genode.boot.storePartUuid}
|
||||||
|
start=$espSectorOffset, type=$efiUuid
|
||||||
|
EOF
|
||||||
|
|
||||||
|
qemu-img convert $img $out
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
# Builds a compressed EFI System Partition image
|
||||||
|
{ config, pkgs }:
|
||||||
|
|
||||||
|
let
|
||||||
|
grub' = pkgs.buildPackages.grub2_efi;
|
||||||
|
|
||||||
|
# Name used by UEFI for architectures.
|
||||||
|
targetArch = if pkgs.stdenv.isi686 || config.boot.loader.grub.forcei686 then
|
||||||
|
"ia32"
|
||||||
|
else if pkgs.stdenv.isx86_64 then
|
||||||
|
"x64"
|
||||||
|
else if pkgs.stdenv.isAarch64 then
|
||||||
|
"aa64"
|
||||||
|
else
|
||||||
|
throw "Unsupported architecture";
|
||||||
|
|
||||||
|
in pkgs.stdenv.mkDerivation {
|
||||||
|
name = "esp.img.zst";
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs.buildPackages; [ grub' dosfstools mtools zstd ];
|
||||||
|
|
||||||
|
MODULES = [
|
||||||
|
"configfile"
|
||||||
|
"efi_gop"
|
||||||
|
"efi_uga"
|
||||||
|
"ext2"
|
||||||
|
"gzio"
|
||||||
|
"multiboot"
|
||||||
|
"multiboot2"
|
||||||
|
"normal"
|
||||||
|
"part_gpt"
|
||||||
|
"search_fs_uuid"
|
||||||
|
];
|
||||||
|
|
||||||
|
buildCommand = ''
|
||||||
|
img=tmp.raw
|
||||||
|
bootdir=EFI/boot/
|
||||||
|
mkdir -p $bootdir
|
||||||
|
|
||||||
|
cat <<EOF > embedded.cfg
|
||||||
|
insmod configfile
|
||||||
|
insmod efi_gop
|
||||||
|
insmod efi_uga
|
||||||
|
insmod ext2
|
||||||
|
insmod normal
|
||||||
|
insmod part_gpt
|
||||||
|
insmod search_fs_uuid
|
||||||
|
search.fs_uuid ${config.genode.boot.storeFsUuid} root
|
||||||
|
set prefix=($root)/boot/grub
|
||||||
|
configfile /boot/grub/grub.cfg
|
||||||
|
EOF
|
||||||
|
|
||||||
|
grub-script-check embedded.cfg
|
||||||
|
|
||||||
|
${grub'}/bin/grub-mkimage \
|
||||||
|
--config=embedded.cfg \
|
||||||
|
--output=$bootdir/boot${targetArch}.efi \
|
||||||
|
--prefix=/boot/grub \
|
||||||
|
--format=${grub'.grubTarget} \
|
||||||
|
$MODULES
|
||||||
|
|
||||||
|
# Make the ESP image twice as large as necessary
|
||||||
|
imageBytes=$(du --summarize --block-size=4096 --total $bootdir | tail -1 | awk '{ print int($1 * 8192) }')
|
||||||
|
|
||||||
|
truncate --size=$imageBytes $img
|
||||||
|
mkfs.vfat -n EFIBOOT --invariant $img
|
||||||
|
mcopy -sv -i $img EFI ::
|
||||||
|
fsck.vfat -nv $img
|
||||||
|
|
||||||
|
zstd --verbose --no-progress ./$img -o $out
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
"24b69406-18a1-428d-908e-d21a1437122c"
|
|
@ -0,0 +1 @@
|
||||||
|
"9668f8dd-d9a0-4398-a55a-0d499d5e5cbb"
|
Loading…
Reference in New Issue