forked from Snektron/nixos-vf2
-
Notifications
You must be signed in to change notification settings - Fork 2
/
efi-image.nix
85 lines (73 loc) · 3.02 KB
/
efi-image.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
{ config, lib, pkgs, modulesPath, ... }:
{
fileSystems.${config.boot.loader.efi.efiSysMountPoint}.neededForBoot = true;
fileSystems."/".autoResize = true;
# boot.growPartition = true;
system.build.efiImage =
let
toplevel = config.system.build.toplevel;
rootImage = pkgs.callPackage (modulesPath + "/../lib/make-ext4-fs.nix") {
storePaths = [ toplevel ];
volumeLabel = "NIXOS_ROOT";
};
efiArch = pkgs.hostPlatform.efiArch;
bootloader = "${pkgs.systemd}/lib/systemd/boot/efi/systemd-boot${efiArch}.efi";
bootloaderDest = "${lib.strings.toUpper efiArch}.EFI";
populateEspCommands = ''
toEspName() {
local file="$(realpath "$1")"
local base="$(basename "$file")"
local dir="$(dirname "$file")"
local dirbase="$(basename "$dir")"
echo -n "$dirbase-$base.efi"
}
mkdir -p esp/EFI/BOOT esp/EFI/nixos esp/loader/entries
cp "${bootloader}" "esp/EFI/BOOT/BOOT${bootloaderDest}"
echo "type1" > esp/loader/entries.srel
kernelDest="$(toEspName "${toplevel}/kernel")"
initrdDest="$(toEspName "${toplevel}/initrd")"
dtbDest="$(basename "${config.hardware.deviceTree.name}").efi"
cp --no-preserve=mode "${toplevel}/kernel" "esp/EFI/nixos/$kernelDest"
cp --no-preserve=mode "${toplevel}/initrd" "esp/EFI/nixos/$initrdDest"
cp --no-preserve=mode "${config.hardware.deviceTree.package}/${config.hardware.deviceTree.name}" "esp/EFI/nixos/$dtbDest"
cat > esp/loader/entries/initial-nixos.conf <<END
title NixOS
version 0
linux /EFI/nixos/$kernelDest
initrd /EFI/nixos/$initrdDest
devicetree /EFI/nixos/$dtbDest
options init=${toplevel}/init $(cat ${toplevel}/kernel-params)
END
'';
in pkgs.callPackage ./make-efi-image {
inherit rootImage populateEspCommands;
imageName = let
imageType = if (with pkgs.stdenv; hostPlatform == buildPlatform) then "native" else "cross";
boardName = lib.removeSuffix ".dtb" (lib.last (lib.splitString "/" config.hardware.deviceTree.name));
in
"nixos-${imageType}-${boardName}.img";
skipSize = 1;
espSize = 256;
};
boot.postBootCommands = ''
# On the first boot do some maintenance tasks
if [ -f /nix-path-registration ]; then
set -euo pipefail
set -x
# Register the contents of the initial Nix store
${config.nix.package.out}/bin/nix-store --load-db < /nix-path-registration
touch /etc/NIXOS
${config.nix.package.out}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
NIXOS_INSTALL_BOOTLOADER=1 /nix/var/nix/profiles/system/bin/switch-to-configuration boot
rm -f /boot/loader/entries/initial-nixos.conf
# Prevents this from running on later boots.
rm -f /nix-path-registration
fi
'';
assertions = [
{
assertion = config.boot.loader.systemd-boot.enable;
message = "Building EFI Image requires systemd-boot";
}
];
}