Merge pull request #60246 from dfordivam/virtualbox-add-extra-disk
nixos/modules/virtualization: Options to add an extra disk in virtualbox VM
This commit is contained in:
commit
3a512ab84e
|
@ -58,6 +58,35 @@ in {
|
||||||
Run <literal>VBoxManage modifyvm --help</literal> to see more options.
|
Run <literal>VBoxManage modifyvm --help</literal> to see more options.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
extraDisk = mkOption {
|
||||||
|
description = ''
|
||||||
|
Optional extra disk/hdd configuration.
|
||||||
|
The disk will be an 'ext4' partition on a separate VMDK file.
|
||||||
|
'';
|
||||||
|
default = null;
|
||||||
|
example = {
|
||||||
|
label = "storage";
|
||||||
|
mountPoint = "/home/demo/storage";
|
||||||
|
size = 100 * 1024;
|
||||||
|
};
|
||||||
|
type = types.nullOr (types.submodule {
|
||||||
|
options = {
|
||||||
|
size = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
description = "Size in MiB";
|
||||||
|
};
|
||||||
|
label = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "vm-extra-storage";
|
||||||
|
description = "Label for the disk partition";
|
||||||
|
};
|
||||||
|
mountPoint = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "Path where to mount this disk.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -96,6 +125,20 @@ in {
|
||||||
echo "creating VirtualBox pass-through disk wrapper (no copying involved)..."
|
echo "creating VirtualBox pass-through disk wrapper (no copying involved)..."
|
||||||
VBoxManage internalcommands createrawvmdk -filename disk.vmdk -rawdisk $diskImage
|
VBoxManage internalcommands createrawvmdk -filename disk.vmdk -rawdisk $diskImage
|
||||||
|
|
||||||
|
${optionalString (cfg.extraDisk != null) ''
|
||||||
|
echo "creating extra disk: data-disk.raw"
|
||||||
|
dataDiskImage=data-disk.raw
|
||||||
|
truncate -s ${toString cfg.extraDisk.size}M $dataDiskImage
|
||||||
|
|
||||||
|
parted --script $dataDiskImage -- \
|
||||||
|
mklabel msdos \
|
||||||
|
mkpart primary ext4 1MiB -1
|
||||||
|
eval $(partx $dataDiskImage -o START,SECTORS --nr 1 --pairs)
|
||||||
|
mkfs.ext4 -F -L ${cfg.extraDisk.label} $dataDiskImage -E offset=$(sectorsToBytes $START) $(sectorsToKilobytes $SECTORS)K
|
||||||
|
echo "creating extra disk: data-disk.vmdk"
|
||||||
|
VBoxManage internalcommands createrawvmdk -filename data-disk.vmdk -rawdisk $dataDiskImage
|
||||||
|
''}
|
||||||
|
|
||||||
echo "creating VirtualBox VM..."
|
echo "creating VirtualBox VM..."
|
||||||
vmName="${cfg.vmName}";
|
vmName="${cfg.vmName}";
|
||||||
VBoxManage createvm --name "$vmName" --register \
|
VBoxManage createvm --name "$vmName" --register \
|
||||||
|
@ -106,6 +149,10 @@ in {
|
||||||
VBoxManage storagectl "$vmName" --name SATA --add sata --portcount 4 --bootable on --hostiocache on
|
VBoxManage storagectl "$vmName" --name SATA --add sata --portcount 4 --bootable on --hostiocache on
|
||||||
VBoxManage storageattach "$vmName" --storagectl SATA --port 0 --device 0 --type hdd \
|
VBoxManage storageattach "$vmName" --storagectl SATA --port 0 --device 0 --type hdd \
|
||||||
--medium disk.vmdk
|
--medium disk.vmdk
|
||||||
|
${optionalString (cfg.extraDisk != null) ''
|
||||||
|
VBoxManage storageattach "$vmName" --storagectl SATA --port 1 --device 0 --type hdd \
|
||||||
|
--medium data-disk.vmdk
|
||||||
|
''}
|
||||||
|
|
||||||
echo "exporting VirtualBox VM..."
|
echo "exporting VirtualBox VM..."
|
||||||
mkdir -p $out
|
mkdir -p $out
|
||||||
|
@ -119,11 +166,19 @@ in {
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
fileSystems."/" = {
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
device = "/dev/disk/by-label/nixos";
|
device = "/dev/disk/by-label/nixos";
|
||||||
autoResize = true;
|
autoResize = true;
|
||||||
fsType = "ext4";
|
fsType = "ext4";
|
||||||
};
|
};
|
||||||
|
} // (lib.optionalAttrs (cfg.extraDisk != null) {
|
||||||
|
${cfg.extraDisk.mountPoint} = {
|
||||||
|
device = "/dev/disk/by-label/" + cfg.extraDisk.label;
|
||||||
|
autoResize = true;
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
boot.growPartition = true;
|
boot.growPartition = true;
|
||||||
boot.loader.grub.device = "/dev/sda";
|
boot.loader.grub.device = "/dev/sda";
|
||||||
|
|
Loading…
Reference in a new issue