Files
nixpkgs/nixos/tests/grub/efi.nix
Tom Fitzhenry 889571cf97 nixos/tests/grub: split into a directory and expand coverage
Move nixos/tests/grub.nix to nixos/tests/grub/basic.nix unchanged, and add
new GRUB boot tests under nixos/tests/grub/:

- hashed-password: GRUB user authentication with a
  users.<name>.hashedPasswordFile (a grub-mkpasswd-pbkdf2 hash). The hash is
  generated in a derivation and passed by store path (via toString) rather
  than read at evaluation time, to avoid import-from-derivation. Kept separate
  from basic so each login is exercised on its own VM boot rather than
  multiplexed onto one menu.
- efi: boot through GRUB's EFI support.
- graphical: verify GRUB renders its menu in graphical (gfxterm) mode. A
  marker string is baked into the splash image (which GRUB only draws in
  gfxterm) and read back via OCR, so a silent fallback to text mode would
  fail the test rather than pass it.
- mirrored-boots: verify GRUB is installed and configured on every path
  in boot.loader.grub.mirroredBoots.

Assisted-by: Claude Opus 4.8
2026-07-22 11:34:12 +00:00

46 lines
1.0 KiB
Nix

{ lib, ... }:
{
name = "grub-efi";
meta = with lib.maintainers; {
maintainers = [
tomfitzhenry
rnhmjoj
];
};
nodes.machine =
{ ... }:
{
virtualisation.useBootLoader = true;
virtualisation.useEFIBoot = true;
boot.loader.grub = {
enable = true;
efiSupport = true;
device = "nodev";
# Read GRUB from the serial console so its output can be matched
# deterministically with wait_for_console_text, rather than via OCR.
extraConfig = "serial; terminal_output serial";
};
boot.loader.efi.canTouchEfiVariables = true;
};
testScript = ''
machine.start()
with subtest("Enters GRUB"):
machine.wait_for_console_text("GNU GRUB")
with subtest("Loads kernel"):
machine.wait_for_console_text("Linux version")
with subtest("Reaches multi-user target"):
machine.wait_for_unit("multi-user.target")
with subtest("Boots via UEFI"):
machine.succeed("test -d /sys/firmware/efi")
'';
}