From e74755c422180bfa0ca2f74eb11f32e20d4030ee Mon Sep 17 00:00:00 2001 From: Chuck Date: Tue, 28 Jan 2020 15:08:56 -0800 Subject: [PATCH] nixos/qemu-vm: Don't assume boot drive is always vdb --- nixos/modules/virtualisation/qemu-vm.nix | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/nixos/modules/virtualisation/qemu-vm.nix b/nixos/modules/virtualisation/qemu-vm.nix index 7507db40578..5a502c36180 100644 --- a/nixos/modules/virtualisation/qemu-vm.nix +++ b/nixos/modules/virtualisation/qemu-vm.nix @@ -46,6 +46,13 @@ let description = "Extra options passed to device flag."; }; + name = mkOption { + type = types.nullOr types.str; + default = null; + description = + "A name for the drive. Must be unique in the drives list. Not passed to qemu."; + }; + }; }; @@ -84,6 +91,14 @@ let else "/dev/vd${letter}"; + lookupDriveDeviceName = driveName: driveList: + (findSingle (drive: drive.name == driveName) + (throw "Drive ${driveName} not found") + (throw "Multiple drives named ${driveName}") driveList).device; + + addDeviceNames = + imap1 (idx: drive: drive // { device = driveDeviceName idx; }); + # Shell script to start the VM. startVM = '' @@ -406,6 +421,7 @@ in mkOption { type = types.listOf (types.submodule driveOpts); description = "Drives passed to qemu."; + apply = addDeviceNames; }; diskInterface = @@ -552,12 +568,14 @@ in virtualisation.qemu.drives = mkMerge [ [{ + name = "root"; file = "$NIX_DISK_IMAGE"; driveExtraOpts.cache = "writeback"; driveExtraOpts.werror = "report"; }] (mkIf cfg.useBootLoader [ { + name = "boot"; file = "$TMPDIR/disk.img"; driveExtraOpts.media = "disk"; deviceExtraOpts.bootindex = "1"; @@ -610,7 +628,7 @@ in }; } // optionalAttrs cfg.useBootLoader { "/boot" = - { device = "${driveDeviceName 1}2"; + { device = "${lookupDriveDeviceName "boot" cfg.qemu.drives}2"; fsType = "vfat"; options = [ "ro" ]; noCheck = true; # fsck fails on a r/o filesystem