mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-21 22:43:01 +00:00
modules/virtualisation: add unified diskSize opt
See https://github.com/NixOS/nixpkgs/pull/339535 and https://github.com/NixOS/nixpkgs/pull/341058
This commit is contained in:
parent
6071ee8e31
commit
c6da9ef32d
@ -15,11 +15,23 @@ let
|
||||
inherit (lib.options) literalExpression;
|
||||
cfg = config.amazonImage;
|
||||
amiBootMode = if config.ec2.efi then "uefi" else "legacy-bios";
|
||||
|
||||
in
|
||||
{
|
||||
|
||||
imports = [ ../../../modules/virtualisation/amazon-image.nix ];
|
||||
imports = [
|
||||
../../../modules/virtualisation/amazon-image.nix
|
||||
../../../modules/virtualisation/disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"amazonImage"
|
||||
"sizeMB"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
# Amazon recommends setting this to the highest possible value for a good EBS
|
||||
# experience, which prior to 4.15 was 255.
|
||||
@ -52,13 +64,6 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
sizeMB = mkOption {
|
||||
type = with types; either (enum [ "auto" ]) int;
|
||||
default = 3072;
|
||||
example = 8192;
|
||||
description = "The size in MB of the image";
|
||||
};
|
||||
|
||||
format = mkOption {
|
||||
type = types.enum [
|
||||
"raw"
|
||||
@ -70,6 +75,11 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
# Use a priority just below mkOptionDefault (1500) instead of lib.mkDefault
|
||||
# to avoid breaking existing configs using that.
|
||||
config.virtualisation.diskSize = lib.mkOverride 1490 (3 * 1024);
|
||||
config.virtualisation.diskSizeAutoSupported = !config.ec2.zfs.enable;
|
||||
|
||||
config.system.build.amazonImage =
|
||||
let
|
||||
configFile = pkgs.writeText "configuration.nix" ''
|
||||
@ -98,7 +108,7 @@ in
|
||||
|
||||
bootSize = 1000; # 1G is the minimum EBS volume
|
||||
|
||||
rootSize = cfg.sizeMB;
|
||||
rootSize = config.virtualisation.diskSize;
|
||||
rootPoolProperties = {
|
||||
ashift = 12;
|
||||
autoexpand = "on";
|
||||
@ -151,7 +161,7 @@ in
|
||||
fsType = "ext4";
|
||||
partitionTableType = if config.ec2.efi then "efi" else "legacy+gpt";
|
||||
|
||||
diskSize = cfg.sizeMB;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
|
||||
postVM = ''
|
||||
extension=''${diskImage##*.}
|
||||
|
@ -15,6 +15,18 @@ in
|
||||
{
|
||||
imports = [
|
||||
../../../modules/virtualisation/openstack-config.nix
|
||||
../../../modules/virtualisation/disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"openstackImage"
|
||||
"sizeMB"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
] ++ (lib.optional copyChannel ../../../modules/installer/cd-dvd/channel.nix);
|
||||
|
||||
options.openstackImage = {
|
||||
@ -26,16 +38,10 @@ in
|
||||
|
||||
ramMB = mkOption {
|
||||
type = types.int;
|
||||
default = 1024;
|
||||
default = (3 * 1024);
|
||||
description = "RAM allocation for build VM";
|
||||
};
|
||||
|
||||
sizeMB = mkOption {
|
||||
type = types.int;
|
||||
default = 8192;
|
||||
description = "The size in MB of the image";
|
||||
};
|
||||
|
||||
format = mkOption {
|
||||
type = types.enum [
|
||||
"raw"
|
||||
@ -61,6 +67,11 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
# Use a priority just below mkOptionDefault (1500) instead of lib.mkDefault
|
||||
# to avoid breaking existing configs using that.
|
||||
virtualisation.diskSize = lib.mkOverride 1490 (8 * 1024);
|
||||
virtualisation.diskSizeAutoSupported = false;
|
||||
|
||||
system.build.openstackImage = import ../../../lib/make-single-disk-zfs-image.nix {
|
||||
inherit lib config;
|
||||
inherit (cfg) contents format name;
|
||||
@ -77,7 +88,7 @@ in
|
||||
|
||||
bootSize = 1000;
|
||||
memSize = cfg.ramMB;
|
||||
rootSize = cfg.sizeMB;
|
||||
rootSize = config.virtualisation.diskSize;
|
||||
rootPoolProperties = {
|
||||
ashift = 12;
|
||||
autoexpand = "on";
|
||||
|
@ -10,18 +10,24 @@ let
|
||||
cfg = config.virtualisation.azureImage;
|
||||
in
|
||||
{
|
||||
imports = [ ./azure-common.nix ];
|
||||
imports = [
|
||||
./azure-common.nix
|
||||
./disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"virtualisation"
|
||||
"azureImage"
|
||||
"diskSize"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
options.virtualisation.azureImage = {
|
||||
diskSize = mkOption {
|
||||
type = with types; either (enum [ "auto" ]) int;
|
||||
default = "auto";
|
||||
example = 2048;
|
||||
description = ''
|
||||
Size of disk image. Unit is MB.
|
||||
'';
|
||||
};
|
||||
|
||||
bootSize = mkOption {
|
||||
type = types.int;
|
||||
default = 256;
|
||||
@ -67,7 +73,8 @@ in
|
||||
bootSize = "${toString cfg.bootSize}M";
|
||||
partitionTableType = if cfg.vmGeneration == "v2" then "efi" else "legacy";
|
||||
|
||||
inherit (cfg) diskSize contents;
|
||||
inherit (cfg) contents;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
inherit config lib pkgs;
|
||||
};
|
||||
};
|
||||
|
@ -11,18 +11,24 @@ let
|
||||
in
|
||||
{
|
||||
|
||||
imports = [ ./digital-ocean-config.nix ];
|
||||
imports = [
|
||||
./digital-ocean-config.nix
|
||||
./disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"virtualisation"
|
||||
"digitalOceanImage"
|
||||
"diskSize"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
options = {
|
||||
virtualisation.digitalOceanImage.diskSize = mkOption {
|
||||
type = with types; either (enum [ "auto" ]) int;
|
||||
default = "auto";
|
||||
example = 4096;
|
||||
description = ''
|
||||
Size of disk image. Unit is MB.
|
||||
'';
|
||||
};
|
||||
|
||||
virtualisation.digitalOceanImage.configFile = mkOption {
|
||||
type = with types; nullOr path;
|
||||
default = null;
|
||||
@ -52,7 +58,6 @@ in
|
||||
|
||||
#### implementation
|
||||
config = {
|
||||
|
||||
system.build.digitalOceanImage = import ../../lib/make-disk-image.nix {
|
||||
name = "digital-ocean-image";
|
||||
format = "qcow2";
|
||||
@ -73,7 +78,7 @@ in
|
||||
config.virtualisation.digitalOcean.defaultConfigFile
|
||||
else
|
||||
cfg.configFile;
|
||||
inherit (cfg) diskSize;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
inherit config lib pkgs;
|
||||
};
|
||||
|
||||
|
38
nixos/modules/virtualisation/disk-size-option.nix
Normal file
38
nixos/modules/virtualisation/disk-size-option.nix
Normal file
@ -0,0 +1,38 @@
|
||||
{ lib, config, ... }:
|
||||
let
|
||||
t = lib.types;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
virtualisation.diskSizeAutoSupported = lib.mkOption {
|
||||
type = t.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether the current image builder or vm runner supports `virtualisation.diskSize = "auto".`
|
||||
'';
|
||||
internal = true;
|
||||
};
|
||||
|
||||
virtualisation.diskSize = lib.mkOption {
|
||||
type = t.either (t.enum [ "auto" ]) t.ints.positive;
|
||||
default = if config.virtualisation.diskSizeAutoSupported then "auto" else 1024;
|
||||
defaultText = "\"auto\" if diskSizeAutoSupported, else 1024";
|
||||
description = ''
|
||||
The disk size in megabytes of the virtual machine.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config =
|
||||
let
|
||||
inherit (config.virtualisation) diskSize diskSizeAutoSupported;
|
||||
in
|
||||
{
|
||||
assertions = [
|
||||
{
|
||||
assertion = diskSize != "auto" || diskSizeAutoSupported;
|
||||
message = "Setting virtualisation.diskSize to `auto` is not supported by the current image build or vm runner; use an explicit size.";
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
@ -19,18 +19,24 @@ let
|
||||
in
|
||||
{
|
||||
|
||||
imports = [ ./google-compute-config.nix ];
|
||||
imports = [
|
||||
./google-compute-config.nix
|
||||
./disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"virtualisation"
|
||||
"googleComputeImage"
|
||||
"diskSize"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
options = {
|
||||
virtualisation.googleComputeImage.diskSize = mkOption {
|
||||
type = with types; either (enum [ "auto" ]) int;
|
||||
default = "auto";
|
||||
example = 1536;
|
||||
description = ''
|
||||
Size of disk image. Unit is MB.
|
||||
'';
|
||||
};
|
||||
|
||||
virtualisation.googleComputeImage.configFile = mkOption {
|
||||
type = with types; nullOr str;
|
||||
default = null;
|
||||
@ -86,7 +92,7 @@ in
|
||||
format = "raw";
|
||||
configFile = if cfg.configFile == null then defaultConfigFile else cfg.configFile;
|
||||
partitionTableType = if cfg.efi then "efi" else "legacy";
|
||||
inherit (cfg) diskSize;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
inherit config lib pkgs;
|
||||
};
|
||||
|
||||
|
@ -9,19 +9,26 @@ with lib;
|
||||
|
||||
let
|
||||
cfg = config.hyperv;
|
||||
|
||||
in
|
||||
{
|
||||
|
||||
imports = [
|
||||
./disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"hyperv"
|
||||
"baseImageSize"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
options = {
|
||||
hyperv = {
|
||||
baseImageSize = mkOption {
|
||||
type = with types; either (enum [ "auto" ]) int;
|
||||
default = "auto";
|
||||
example = 2048;
|
||||
description = ''
|
||||
The size of the hyper-v base image in MiB.
|
||||
'';
|
||||
};
|
||||
vmDerivationName = mkOption {
|
||||
type = types.str;
|
||||
default = "nixos-hyperv-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}";
|
||||
@ -40,6 +47,10 @@ in
|
||||
};
|
||||
|
||||
config = {
|
||||
# Use a priority just below mkOptionDefault (1500) instead of lib.mkDefault
|
||||
# to avoid breaking existing configs using that.
|
||||
virtualisation.diskSize = lib.mkOverride 1490 (4 * 1024);
|
||||
|
||||
system.build.hypervImage = import ../../lib/make-disk-image.nix {
|
||||
name = cfg.vmDerivationName;
|
||||
postVM = ''
|
||||
@ -47,7 +58,7 @@ in
|
||||
rm $diskImage
|
||||
'';
|
||||
format = "raw";
|
||||
diskSize = cfg.baseImageSize;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
partitionTableType = "efi";
|
||||
inherit config lib pkgs;
|
||||
};
|
||||
|
@ -17,17 +17,24 @@ let
|
||||
'';
|
||||
in
|
||||
{
|
||||
imports = [ ./linode-config.nix ];
|
||||
imports = [
|
||||
./linode-config.nix
|
||||
./disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"virtualisation"
|
||||
"linodeImage"
|
||||
"diskSize"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
options = {
|
||||
virtualisation.linodeImage.diskSize = mkOption {
|
||||
type = with types; either (enum (singleton "auto")) ints.positive;
|
||||
default = "auto";
|
||||
example = 1536;
|
||||
description = ''
|
||||
Size of disk image in MB.
|
||||
'';
|
||||
};
|
||||
|
||||
virtualisation.linodeImage.configFile = mkOption {
|
||||
type = with types; nullOr str;
|
||||
@ -62,7 +69,7 @@ in
|
||||
format = "raw";
|
||||
partitionTableType = "none";
|
||||
configFile = if cfg.configFile == null then defaultConfigFile else cfg.configFile;
|
||||
inherit (cfg) diskSize;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
inherit config lib pkgs;
|
||||
};
|
||||
};
|
||||
|
@ -12,9 +12,14 @@ in
|
||||
imports = [ ./oci-common.nix ];
|
||||
|
||||
config = {
|
||||
# Use a priority just below mkOptionDefault (1500) instead of lib.mkDefault
|
||||
# to avoid breaking existing configs using that.
|
||||
virtualisation.diskSize = lib.mkOverride 1490 (8 * 1024);
|
||||
virtualisation.diskSizeAutoSupported = false;
|
||||
|
||||
system.build.OCIImage = import ../../lib/make-disk-image.nix {
|
||||
inherit config lib pkgs;
|
||||
inherit (cfg) diskSize;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
name = "oci-image";
|
||||
configFile = ./oci-config-user.nix;
|
||||
format = "qcow2";
|
||||
|
@ -1,10 +1,23 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
./disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"oci"
|
||||
"diskSize"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
options = {
|
||||
oci = {
|
||||
efi = lib.mkOption {
|
||||
@ -14,12 +27,6 @@
|
||||
Whether the OCI instance is using EFI.
|
||||
'';
|
||||
};
|
||||
diskSize = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 8192;
|
||||
description = "Size of the disk image created in MB.";
|
||||
example = "diskSize = 12 * 1024; # 12GiB";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -6,8 +6,23 @@
|
||||
}:
|
||||
|
||||
with lib;
|
||||
|
||||
{
|
||||
imports = [
|
||||
./disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"proxmox"
|
||||
"qemuConf"
|
||||
"diskSize"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
options.proxmox = {
|
||||
qemuConf = {
|
||||
# essential configs
|
||||
@ -95,16 +110,6 @@ with lib;
|
||||
either "efi" or "hybrid".
|
||||
'';
|
||||
};
|
||||
diskSize = mkOption {
|
||||
type = types.str;
|
||||
default = "auto";
|
||||
example = "20480";
|
||||
description = ''
|
||||
The size of the disk, in megabytes.
|
||||
if "auto" size is calculated based on the contents copied to it and
|
||||
additionalSpace is taken into account.
|
||||
'';
|
||||
};
|
||||
net0 = mkOption {
|
||||
type = types.commas;
|
||||
default = "virtio=00:00:00:00:00:00,bridge=vmbr0,firewall=1";
|
||||
@ -305,7 +310,8 @@ with lib;
|
||||
mkdir -p $out/nix-support
|
||||
echo "file vma $out/vzdump-qemu-${cfg.filenameSuffix}.vma.zst" > $out/nix-support/hydra-build-products
|
||||
'';
|
||||
inherit (cfg.qemuConf) additionalSpace diskSize bootSize;
|
||||
inherit (cfg.qemuConf) additionalSpace bootSize;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
format = "raw";
|
||||
inherit config lib pkgs;
|
||||
};
|
||||
|
@ -317,12 +317,11 @@ let
|
||||
copyChannel = false;
|
||||
OVMF = cfg.efi.OVMF;
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
imports = [
|
||||
../profiles/qemu-guest.nix
|
||||
./disk-size-option.nix
|
||||
(mkRenamedOptionModule
|
||||
[
|
||||
"virtualisation"
|
||||
@ -378,14 +377,6 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
virtualisation.diskSize = mkOption {
|
||||
type = types.ints.positive;
|
||||
default = 1024;
|
||||
description = ''
|
||||
The disk size in megabytes of the virtual machine.
|
||||
'';
|
||||
};
|
||||
|
||||
virtualisation.diskImage = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = "./${config.system.name}.qcow2";
|
||||
@ -1250,6 +1241,8 @@ in
|
||||
# override by setting `virtualisation.fileSystems = lib.mkForce { };`.
|
||||
fileSystems = lib.mkIf (cfg.fileSystems != { }) (mkVMOverride cfg.fileSystems);
|
||||
|
||||
virtualisation.diskSizeAutoSupported = false;
|
||||
|
||||
virtualisation.fileSystems =
|
||||
let
|
||||
mkSharedDir = tag: share: {
|
||||
|
@ -7,22 +7,27 @@
|
||||
let
|
||||
|
||||
cfg = config.virtualbox;
|
||||
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./disk-size-option.nix
|
||||
(lib.mkRenamedOptionModuleWith {
|
||||
sinceRelease = 2411;
|
||||
from = [
|
||||
"virtualbox"
|
||||
"baseImageSize"
|
||||
];
|
||||
to = [
|
||||
"virtualisation"
|
||||
"diskSize"
|
||||
];
|
||||
})
|
||||
];
|
||||
|
||||
options = {
|
||||
virtualbox = {
|
||||
baseImageSize = lib.mkOption {
|
||||
type = with lib.types; either (enum [ "auto" ]) int;
|
||||
default = "auto";
|
||||
example = 50 * 1024;
|
||||
description = ''
|
||||
The size of the VirtualBox base image in MiB.
|
||||
'';
|
||||
};
|
||||
baseImageFreeSpace = lib.mkOption {
|
||||
type = with lib.types; int;
|
||||
type = lib.types.int;
|
||||
default = 30 * 1024;
|
||||
description = ''
|
||||
Free space in the VirtualBox base image in MiB.
|
||||
@ -180,6 +185,9 @@ in
|
||||
};
|
||||
|
||||
config = {
|
||||
# Use a priority just below mkOptionDefault (1500) instead of lib.mkDefault
|
||||
# to avoid breaking existing configs using that.
|
||||
virtualisation.diskSize = lib.mkOverride 1490 (50 * 1024);
|
||||
|
||||
virtualbox.params = lib.mkMerge [
|
||||
(lib.mapAttrs (name: lib.mkDefault) {
|
||||
@ -204,7 +212,7 @@ in
|
||||
|
||||
inherit pkgs lib config;
|
||||
partitionTableType = "legacy";
|
||||
diskSize = cfg.baseImageSize;
|
||||
inherit (config.virtualisation) diskSize;
|
||||
additionalSpace = "${toString cfg.baseImageFreeSpace}M";
|
||||
|
||||
postVM = ''
|
||||
|
@ -312,7 +312,7 @@ in rec {
|
||||
[ configuration
|
||||
versionModule
|
||||
./maintainers/scripts/ec2/amazon-image.nix
|
||||
({ ... }: { amazonImage.sizeMB = "auto"; })
|
||||
({ ... }: { amazonImage.virtualisation.diskSize = "auto"; })
|
||||
];
|
||||
}).config.system.build.amazonImage)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user