nixos/qemu-vm: add option for a separate boot partition on BIOS

This patch adds the option `virtualisation.useBootPartition` which
creates a separate boot partition on BIOS systems using the new
`legacy+boot` partition layout type in `nixos/lib/make-disk-image.nix`.

sanana 95355b4d 11ed9936

Changed files
+36 -5
nixos
modules
virtualisation
+36 -5
nixos/modules/virtualisation/qemu-vm.nix
···
};
selectPartitionTableLayout =
-
{ useEFIBoot, useDefaultFilesystems }:
-
if useDefaultFilesystems then if useEFIBoot then "efi" else "legacy" else "none";
driveCmdline =
idx:
···
format = "qcow2";
onlyNixStore = false;
label = rootFilesystemLabel;
-
partitionTableType = selectPartitionTableLayout { inherit (cfg) useDefaultFilesystems useEFIBoot; };
installBootLoader = cfg.installBootLoader;
touchEFIVars = cfg.useEFIBoot;
diskSize = "auto";
···
virtualisation.bootPartition = mkOption {
type = types.nullOr types.path;
-
default = if cfg.useEFIBoot then "/dev/disk/by-label/${espFilesystemLabel}" else null;
-
defaultText = literalExpression ''if cfg.useEFIBoot then "/dev/disk/by-label/${espFilesystemLabel}" else null'';
example = "/dev/disk/by-label/esp";
description = ''
The path (inside the VM) to the device containing the EFI System Partition (ESP).
···
This is best-effort and may break with unconventional partition setups.
Use `virtualisation.useDefaultFilesystems` for a known-working configuration.
'';
};
···
};
selectPartitionTableLayout =
+
{
+
useEFIBoot,
+
useDefaultFilesystems,
+
useBootPartition,
+
}:
+
if useDefaultFilesystems then
+
if useEFIBoot then
+
"efi"
+
else if useBootPartition then
+
"legacy+boot"
+
else
+
"legacy"
+
else
+
"none";
driveCmdline =
idx:
···
format = "qcow2";
onlyNixStore = false;
label = rootFilesystemLabel;
+
partitionTableType = selectPartitionTableLayout {
+
inherit (cfg) useBootPartition useDefaultFilesystems useEFIBoot;
+
};
installBootLoader = cfg.installBootLoader;
touchEFIVars = cfg.useEFIBoot;
diskSize = "auto";
···
virtualisation.bootPartition = mkOption {
type = types.nullOr types.path;
+
default =
+
if cfg.useEFIBoot then
+
"/dev/disk/by-label/${espFilesystemLabel}"
+
else if cfg.useBootPartition then
+
"/dev/disk/by-label/BOOT"
+
else
+
null;
+
defaultText = literalExpression ''
+
if cfg.useEFIBoot then "/dev/disk/by-label/${espFilesystemLabel}"
+
else if cfg.useBootPartition then "/dev/disk/by-label/BOOT"
+
else null'';
example = "/dev/disk/by-label/esp";
description = ''
The path (inside the VM) to the device containing the EFI System Partition (ESP).
···
This is best-effort and may break with unconventional partition setups.
Use `virtualisation.useDefaultFilesystems` for a known-working configuration.
+
'';
+
};
+
+
virtualisation.useBootPartition = mkEnableOption null // {
+
description = ''
+
If enabled for legacy MBR VMs, the VM image will have a separate boot
+
partition mounted at /boot.
+
useBootPartition is ignored if useEFIBoot == true.
'';
};