Loading nixos/tests/boot.nix +50 −29 Original line number Diff line number Diff line Loading @@ -4,10 +4,41 @@ }: with import ../lib/testing-python.nix { inherit system pkgs; }; with pkgs.lib; let qemu-common = import ../lib/qemu-common.nix { inherit (pkgs) lib pkgs; }; lib = pkgs.lib; qemu-common = import ../lib/qemu-common.nix { inherit lib pkgs; }; mkStartCommand = { memory ? 2048, cdrom ? null, usb ? null, pxe ? null, uboot ? false, uefi ? false, extraFlags ? [], }: let qemu = qemu-common.qemuBinary pkgs.qemu_test; flags = [ "-m" (toString memory) "-netdev" ("user,id=net0" + (lib.optionalString (pxe != null) ",tftp=${pxe},bootfile=netboot.ipxe")) "-device" ("virtio-net-pci,netdev=net0" + (lib.optionalString (pxe != null && uefi) ",romfile=${pkgs.ipxe}/ipxe.efirom")) ] ++ lib.optionals (cdrom != null) [ "-cdrom" cdrom ] ++ lib.optionals (usb != null) [ "-device" "usb-ehci" "-drive" "id=usbdisk,file=${usb},if=none,readonly" "-device" "usb-storage,drive=usbdisk" ] ++ lib.optionals (pxe != null) [ "-boot" "order=n" ] ++ lib.optionals uefi [ "-drive" "if=pflash,format=raw,unit=0,readonly=on,file=${pkgs.OVMF.firmware}" "-drive" "if=pflash,format=raw,unit=1,readonly=on,file=${pkgs.OVMF.variables}" ] ++ extraFlags; flagsStr = lib.concatStringsSep " " flags; in "${qemu} ${flagsStr}"; iso = (import ../lib/eval-config.nix { Loading @@ -28,21 +59,16 @@ let ]; }).config.system.build.sdImage; pythonDict = params: "\n {\n ${concatStringsSep ",\n " (mapAttrsToList (name: param: "\"${name}\": \"${param}\"") params)},\n }\n"; makeBootTest = name: extraConfig: makeBootTest = name: config: let machineConfig = pythonDict ({ qemuBinary = qemu-common.qemuBinary pkgs.qemu_test; qemuFlags = "-m 768"; } // extraConfig); startCommand = mkStartCommand config; in makeTest { name = "boot-" + name; nodes = { }; testScript = '' machine = create_machine(${machineConfig}) machine = create_machine({"startCommand": "${startCommand}"}) machine.start() machine.wait_for_unit("multi-user.target") machine.succeed("nix store verify --no-trust -r --option experimental-features nix-command /run/current-system") Loading Loading @@ -73,43 +99,35 @@ let config.system.build.netbootIpxeScript ]; }; machineConfig = pythonDict ({ qemuBinary = qemu-common.qemuBinary pkgs.qemu_test; qemuFlags = "-boot order=n -m 2000"; netBackendArgs = "tftp=${ipxeBootDir},bootfile=netboot.ipxe"; startCommand = mkStartCommand ({ pxe = ipxeBootDir; } // extraConfig); in makeTest { name = "boot-netboot-" + name; nodes = { }; testScript = '' machine = create_machine(${machineConfig}) machine = create_machine({"startCommand": "${startCommand}"}) machine.start() machine.wait_for_unit("multi-user.target") machine.shutdown() ''; }; uefiBinary = { x86_64-linux = "${pkgs.OVMF.fd}/FV/OVMF.fd"; aarch64-linux = "${pkgs.OVMF.fd}/FV/QEMU_EFI.fd"; }.${pkgs.stdenv.hostPlatform.system}; in { uefiCdrom = makeBootTest "uefi-cdrom" { uefi = true; cdrom = "${iso}/iso/${iso.isoName}"; bios = uefiBinary; }; uefiUsb = makeBootTest "uefi-usb" { uefi = true; usb = "${iso}/iso/${iso.isoName}"; bios = uefiBinary; }; uefiNetboot = makeNetbootTest "uefi" { bios = uefiBinary; # Custom ROM is needed for EFI PXE boot. I failed to understand exactly why, because QEMU should still use iPXE for EFI. netFrontendArgs = "romfile=${pkgs.ipxe}/ipxe.efirom"; uefi = true; }; } // optionalAttrs (pkgs.stdenv.hostPlatform.system == "x86_64-linux") { } // lib.optionalAttrs (pkgs.stdenv.hostPlatform.system == "x86_64-linux") { biosCdrom = makeBootTest "bios-cdrom" { cdrom = "${iso}/iso/${iso.isoName}"; }; Loading @@ -124,9 +142,12 @@ in { sdImage = "${sd}/sd-image/${sd.imageName}"; mutableImage = "/tmp/linked-image.qcow2"; machineConfig = pythonDict { bios = "${pkgs.ubootQemuX86}/u-boot.rom"; qemuFlags = "-m 768 -machine type=pc,accel=tcg -drive file=${mutableImage},if=ide,format=qcow2"; startCommand = mkStartCommand { extraFlags = [ "-bios" "${pkgs.ubootQemuX86}/u-boot.rom" "-machine" "type=pc,accel=tcg" "-drive" "file=${mutableImage},if=virtio" ]; }; in makeTest { name = "boot-uboot-extlinux"; Loading @@ -138,7 +159,7 @@ in { if os.system("qemu-img create -f qcow2 -F raw -b ${sdImage} ${mutableImage}") != 0: raise RuntimeError("Could not create mutable linked image") machine = create_machine(${machineConfig}) machine = create_machine({"startCommand": "${startCommand}"}) machine.start() machine.wait_for_unit("multi-user.target") machine.succeed("nix store verify -r --no-trust --option experimental-features nix-command /run/current-system") Loading Loading
nixos/tests/boot.nix +50 −29 Original line number Diff line number Diff line Loading @@ -4,10 +4,41 @@ }: with import ../lib/testing-python.nix { inherit system pkgs; }; with pkgs.lib; let qemu-common = import ../lib/qemu-common.nix { inherit (pkgs) lib pkgs; }; lib = pkgs.lib; qemu-common = import ../lib/qemu-common.nix { inherit lib pkgs; }; mkStartCommand = { memory ? 2048, cdrom ? null, usb ? null, pxe ? null, uboot ? false, uefi ? false, extraFlags ? [], }: let qemu = qemu-common.qemuBinary pkgs.qemu_test; flags = [ "-m" (toString memory) "-netdev" ("user,id=net0" + (lib.optionalString (pxe != null) ",tftp=${pxe},bootfile=netboot.ipxe")) "-device" ("virtio-net-pci,netdev=net0" + (lib.optionalString (pxe != null && uefi) ",romfile=${pkgs.ipxe}/ipxe.efirom")) ] ++ lib.optionals (cdrom != null) [ "-cdrom" cdrom ] ++ lib.optionals (usb != null) [ "-device" "usb-ehci" "-drive" "id=usbdisk,file=${usb},if=none,readonly" "-device" "usb-storage,drive=usbdisk" ] ++ lib.optionals (pxe != null) [ "-boot" "order=n" ] ++ lib.optionals uefi [ "-drive" "if=pflash,format=raw,unit=0,readonly=on,file=${pkgs.OVMF.firmware}" "-drive" "if=pflash,format=raw,unit=1,readonly=on,file=${pkgs.OVMF.variables}" ] ++ extraFlags; flagsStr = lib.concatStringsSep " " flags; in "${qemu} ${flagsStr}"; iso = (import ../lib/eval-config.nix { Loading @@ -28,21 +59,16 @@ let ]; }).config.system.build.sdImage; pythonDict = params: "\n {\n ${concatStringsSep ",\n " (mapAttrsToList (name: param: "\"${name}\": \"${param}\"") params)},\n }\n"; makeBootTest = name: extraConfig: makeBootTest = name: config: let machineConfig = pythonDict ({ qemuBinary = qemu-common.qemuBinary pkgs.qemu_test; qemuFlags = "-m 768"; } // extraConfig); startCommand = mkStartCommand config; in makeTest { name = "boot-" + name; nodes = { }; testScript = '' machine = create_machine(${machineConfig}) machine = create_machine({"startCommand": "${startCommand}"}) machine.start() machine.wait_for_unit("multi-user.target") machine.succeed("nix store verify --no-trust -r --option experimental-features nix-command /run/current-system") Loading Loading @@ -73,43 +99,35 @@ let config.system.build.netbootIpxeScript ]; }; machineConfig = pythonDict ({ qemuBinary = qemu-common.qemuBinary pkgs.qemu_test; qemuFlags = "-boot order=n -m 2000"; netBackendArgs = "tftp=${ipxeBootDir},bootfile=netboot.ipxe"; startCommand = mkStartCommand ({ pxe = ipxeBootDir; } // extraConfig); in makeTest { name = "boot-netboot-" + name; nodes = { }; testScript = '' machine = create_machine(${machineConfig}) machine = create_machine({"startCommand": "${startCommand}"}) machine.start() machine.wait_for_unit("multi-user.target") machine.shutdown() ''; }; uefiBinary = { x86_64-linux = "${pkgs.OVMF.fd}/FV/OVMF.fd"; aarch64-linux = "${pkgs.OVMF.fd}/FV/QEMU_EFI.fd"; }.${pkgs.stdenv.hostPlatform.system}; in { uefiCdrom = makeBootTest "uefi-cdrom" { uefi = true; cdrom = "${iso}/iso/${iso.isoName}"; bios = uefiBinary; }; uefiUsb = makeBootTest "uefi-usb" { uefi = true; usb = "${iso}/iso/${iso.isoName}"; bios = uefiBinary; }; uefiNetboot = makeNetbootTest "uefi" { bios = uefiBinary; # Custom ROM is needed for EFI PXE boot. I failed to understand exactly why, because QEMU should still use iPXE for EFI. netFrontendArgs = "romfile=${pkgs.ipxe}/ipxe.efirom"; uefi = true; }; } // optionalAttrs (pkgs.stdenv.hostPlatform.system == "x86_64-linux") { } // lib.optionalAttrs (pkgs.stdenv.hostPlatform.system == "x86_64-linux") { biosCdrom = makeBootTest "bios-cdrom" { cdrom = "${iso}/iso/${iso.isoName}"; }; Loading @@ -124,9 +142,12 @@ in { sdImage = "${sd}/sd-image/${sd.imageName}"; mutableImage = "/tmp/linked-image.qcow2"; machineConfig = pythonDict { bios = "${pkgs.ubootQemuX86}/u-boot.rom"; qemuFlags = "-m 768 -machine type=pc,accel=tcg -drive file=${mutableImage},if=ide,format=qcow2"; startCommand = mkStartCommand { extraFlags = [ "-bios" "${pkgs.ubootQemuX86}/u-boot.rom" "-machine" "type=pc,accel=tcg" "-drive" "file=${mutableImage},if=virtio" ]; }; in makeTest { name = "boot-uboot-extlinux"; Loading @@ -138,7 +159,7 @@ in { if os.system("qemu-img create -f qcow2 -F raw -b ${sdImage} ${mutableImage}") != 0: raise RuntimeError("Could not create mutable linked image") machine = create_machine(${machineConfig}) machine = create_machine({"startCommand": "${startCommand}"}) machine.start() machine.wait_for_unit("multi-user.target") machine.succeed("nix store verify -r --no-trust --option experimental-features nix-command /run/current-system") Loading