forked from mirrors/nixpkgs
Merge pull request #234034 from NixOS/qemu/direct-boot
nixos/qemu-vm: introduce `virtualisation.directBoot`
This commit is contained in:
commit
6262a46ba8
|
@ -263,7 +263,8 @@ let
|
||||||
if cfg.useEFIBoot then "efi_bootloading_with_default_fs"
|
if cfg.useEFIBoot then "efi_bootloading_with_default_fs"
|
||||||
else "legacy_bootloading_with_default_fs"
|
else "legacy_bootloading_with_default_fs"
|
||||||
else
|
else
|
||||||
"direct_boot_with_default_fs"
|
if cfg.directBoot.enable then "direct_boot_with_default_fs"
|
||||||
|
else "custom"
|
||||||
else
|
else
|
||||||
"custom";
|
"custom";
|
||||||
suggestedRootDevice = {
|
suggestedRootDevice = {
|
||||||
|
@ -769,6 +770,40 @@ in
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
virtualisation.directBoot = {
|
||||||
|
enable =
|
||||||
|
mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = !cfg.useBootLoader;
|
||||||
|
defaultText = "!cfg.useBootLoader";
|
||||||
|
description =
|
||||||
|
lib.mdDoc ''
|
||||||
|
If enabled, the virtual machine will boot directly into the kernel instead of through a bootloader. Other relevant parameters such as the initrd are also passed to QEMU.
|
||||||
|
|
||||||
|
If you want to test netboot, consider disabling this option.
|
||||||
|
|
||||||
|
This will not boot / reboot correctly into a system that has switched to a different configuration on disk.
|
||||||
|
|
||||||
|
This is enabled by default if you don't enable bootloaders, but you can still enable a bootloader if you need.
|
||||||
|
Read more about this feature: <https://qemu-project.gitlab.io/qemu/system/linuxboot.html>.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
initrd =
|
||||||
|
mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "${config.system.build.initialRamdisk}/${config.system.boot.loader.initrdFile}";
|
||||||
|
defaultText = "\${config.system.build.initialRamdisk}/\${config.system.boot.loader.initrdFile}";
|
||||||
|
description =
|
||||||
|
lib.mdDoc ''
|
||||||
|
In direct boot situations, you may want to influence the initrd to load
|
||||||
|
to use your own customized payload.
|
||||||
|
|
||||||
|
This is useful if you want to test the netboot image without
|
||||||
|
testing the firmware or the loading part.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
virtualisation.useBootLoader =
|
virtualisation.useBootLoader =
|
||||||
mkOption {
|
mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
|
@ -895,6 +930,18 @@ in
|
||||||
virtualisation.memorySize is above 2047, but qemu is only able to allocate 2047MB RAM on 32bit max.
|
virtualisation.memorySize is above 2047, but qemu is only able to allocate 2047MB RAM on 32bit max.
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
{ assertion = cfg.directBoot.initrd != options.virtualisation.directBoot.initrd.default -> cfg.directBoot.enable;
|
||||||
|
message =
|
||||||
|
''
|
||||||
|
You changed the default of `virtualisation.directBoot.initrd` but you are not
|
||||||
|
using QEMU direct boot. This initrd will not be used in your current
|
||||||
|
boot configuration.
|
||||||
|
|
||||||
|
Either do not mutate `virtualisation.directBoot.initrd` or enable direct boot.
|
||||||
|
|
||||||
|
If you have a more advanced usecase, please open an issue or a pull request.
|
||||||
|
'';
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
warnings =
|
warnings =
|
||||||
|
@ -915,6 +962,11 @@ in
|
||||||
Otherwise, we recommend
|
Otherwise, we recommend
|
||||||
|
|
||||||
${opt.writableStore} = false;
|
${opt.writableStore} = false;
|
||||||
|
''
|
||||||
|
++ optional (cfg.directBoot.enable && cfg.useBootLoader)
|
||||||
|
''
|
||||||
|
You enabled direct boot and a bootloader, QEMU will not boot your bootloader, rendering
|
||||||
|
`useBootLoader` useless. You might want to disable one of those options.
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# In UEFI boot, we use a EFI-only partition table layout, thus GRUB will fail when trying to install
|
# In UEFI boot, we use a EFI-only partition table layout, thus GRUB will fail when trying to install
|
||||||
|
@ -1036,9 +1088,9 @@ in
|
||||||
alphaNumericChars = lowerChars ++ upperChars ++ (map toString (range 0 9));
|
alphaNumericChars = lowerChars ++ upperChars ++ (map toString (range 0 9));
|
||||||
# Replace all non-alphanumeric characters with underscores
|
# Replace all non-alphanumeric characters with underscores
|
||||||
sanitizeShellIdent = s: concatMapStrings (c: if builtins.elem c alphaNumericChars then c else "_") (stringToCharacters s);
|
sanitizeShellIdent = s: concatMapStrings (c: if builtins.elem c alphaNumericChars then c else "_") (stringToCharacters s);
|
||||||
in mkIf (!cfg.useBootLoader) [
|
in mkIf cfg.directBoot.enable [
|
||||||
"-kernel \${NIXPKGS_QEMU_KERNEL_${sanitizeShellIdent config.system.name}:-${config.system.build.toplevel}/kernel}"
|
"-kernel \${NIXPKGS_QEMU_KERNEL_${sanitizeShellIdent config.system.name}:-${config.system.build.toplevel}/kernel}"
|
||||||
"-initrd ${config.system.build.toplevel}/initrd"
|
"-initrd ${cfg.directBoot.initrd}"
|
||||||
''-append "$(cat ${config.system.build.toplevel}/kernel-params) init=${config.system.build.toplevel}/init regInfo=${regInfo}/registration ${consoles} $QEMU_KERNEL_PARAMS"''
|
''-append "$(cat ${config.system.build.toplevel}/kernel-params) init=${config.system.build.toplevel}/init regInfo=${regInfo}/registration ${consoles} $QEMU_KERNEL_PARAMS"''
|
||||||
])
|
])
|
||||||
(mkIf cfg.useEFIBoot [
|
(mkIf cfg.useEFIBoot [
|
||||||
|
|
Loading…
Reference in a new issue