From 95355b4d94fd6019c03e0c800af412d0f25ef72c Mon Sep 17 00:00:00 2001 From: sanana Date: Wed, 19 Mar 2025 22:42:42 +0300 Subject: [PATCH] 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`. --- nixos/modules/virtualisation/qemu-vm.nix | 41 +++++++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/nixos/modules/virtualisation/qemu-vm.nix b/nixos/modules/virtualisation/qemu-vm.nix index 4772cedb4beb..068aa7efa0b1 100644 --- a/nixos/modules/virtualisation/qemu-vm.nix +++ b/nixos/modules/virtualisation/qemu-vm.nix @@ -62,8 +62,20 @@ let }; selectPartitionTableLayout = - { useEFIBoot, useDefaultFilesystems }: - if useDefaultFilesystems then if useEFIBoot then "efi" else "legacy" else "none"; + { + useEFIBoot, + useDefaultFilesystems, + useBootPartition, + }: + if useDefaultFilesystems then + if useEFIBoot then + "efi" + else if useBootPartition then + "legacy+boot" + else + "legacy" + else + "none"; driveCmdline = idx: @@ -337,7 +349,9 @@ let format = "qcow2"; onlyNixStore = false; label = rootFilesystemLabel; - partitionTableType = selectPartitionTableLayout { inherit (cfg) useDefaultFilesystems useEFIBoot; }; + partitionTableType = selectPartitionTableLayout { + inherit (cfg) useBootPartition useDefaultFilesystems useEFIBoot; + }; installBootLoader = cfg.installBootLoader; touchEFIVars = cfg.useEFIBoot; diskSize = "auto"; @@ -431,8 +445,17 @@ in 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''; + 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). @@ -929,6 +952,14 @@ in ''; }; + 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. + ''; + }; + virtualisation.useEFIBoot = mkOption { type = types.bool; default = false;