From 891c3be903d1640b3efae4f4712280c7c9b2f4df Mon Sep 17 00:00:00 2001 From: phaer Date: Fri, 22 Nov 2024 11:47:30 +0100 Subject: [PATCH 1/9] virtualisation/lxc: use system.build.image From 22255ddec41b459f7f480ab6422ad10d0c4a98b7 Mon Sep 17 00:00:00 2001 From: phaer Date: Fri, 15 Nov 2024 00:46:22 +0100 Subject: [PATCH 2/9] installer/sd-image: use system.build.image... and rename: - sdImage.imageBaseName -> image.BaseName - sdImage.imageName -> image.fileName --- nixos/modules/installer/sd-card/sd-image.nix | 48 +++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/nixos/modules/installer/sd-card/sd-image.nix b/nixos/modules/installer/sd-card/sd-image.nix index 3cf2b98ec9d726..617f10edddf6f0 100644 --- a/nixos/modules/installer/sd-card/sd-image.nix +++ b/nixos/modules/installer/sd-card/sd-image.nix @@ -29,23 +29,33 @@ in imports = [ (mkRemovedOptionModule [ "sdImage" "bootPartitionID" ] "The FAT partition for SD image now only holds the Raspberry Pi firmware files. Use firmwarePartitionID to configure that partition's ID.") (mkRemovedOptionModule [ "sdImage" "bootSize" ] "The boot files for SD image have been moved to the main ext4 partition. The FAT partition now only holds the Raspberry Pi firmware files. Changing its size may not be required.") + (lib.mkRenamedOptionModuleWith { + sinceRelease = 2505; + from = [ + "sdImage" + "imageBaseName" + ]; + to = [ + "image" + "baseName" + ]; + }) + (lib.mkRenamedOptionModuleWith { + sinceRelease = 2505; + from = [ + "sdImage" + "imageName" + ]; + to = [ + "image" + "fileName" + ]; + }) + ../../profiles/all-hardware.nix + ../../image/file-options.nix ]; options.sdImage = { - imageName = mkOption { - default = "${config.sdImage.imageBaseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}.img"; - description = '' - Name of the generated image file. - ''; - }; - - imageBaseName = mkOption { - default = "nixos-sd-image"; - description = '' - Prefix of the name of the generated image file. - ''; - }; - storePaths = mkOption { type = with types; listOf package; example = literalExpression "[ pkgs.stdenv ]"; @@ -180,18 +190,22 @@ in sdImage.storePaths = [ config.system.build.toplevel ]; + image.extension = if config.sdImage.compressImage then "img.zst" else "img"; + image.filePath = "sd-card/${config.image.fileName}"; + system.nixos.tags = [ "sd-card" ]; + system.build.image = config.system.build.sdImage; system.build.sdImage = pkgs.callPackage ({ stdenv, dosfstools, e2fsprogs, mtools, libfaketime, util-linux, zstd }: stdenv.mkDerivation { - name = config.sdImage.imageName; + name = config.image.fileName; nativeBuildInputs = [ dosfstools e2fsprogs libfaketime mtools util-linux ] ++ lib.optional config.sdImage.compressImage zstd; - inherit (config.sdImage) imageName compressImage; + inherit (config.sdImage) compressImage; buildCommand = '' mkdir -p $out/nix-support $out/sd-image - export img=$out/sd-image/${config.sdImage.imageName} + export img=$out/sd-image/${config.image.baseName}.img echo "${pkgs.stdenv.buildPlatform.system}" > $out/nix-support/system if test -n "$compressImage"; then From a582fba754216b8ae6cfc95a260fc5feefa6e20d Mon Sep 17 00:00:00 2001 From: phaer Date: Fri, 15 Nov 2024 01:03:21 +0100 Subject: [PATCH 3/9] installer/iso-image: use system.build.image and rename: - isoImage.isoBaseName -> image.baseName - isoImage.isoName -> image.fileName --- .../installer/cd-dvd/installation-cd-base.nix | 3 -- nixos/modules/installer/cd-dvd/iso-image.nix | 48 ++++++++++++------- nixos/release.nix | 2 +- pkgs/desktops/gnome/installer.nix | 2 +- 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/nixos/modules/installer/cd-dvd/installation-cd-base.nix b/nixos/modules/installer/cd-dvd/installation-cd-base.nix index 90d49255b5015b..dde6cca9eb8f88 100644 --- a/nixos/modules/installer/cd-dvd/installation-cd-base.nix +++ b/nixos/modules/installer/cd-dvd/installation-cd-base.nix @@ -15,9 +15,6 @@ # Adds terminus_font for people with HiDPI displays console.packages = options.console.packages.default ++ [ pkgs.terminus_font ]; - # ISO naming. - isoImage.isoName = "${config.isoImage.isoBaseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}.iso"; - # EFI booting isoImage.makeEfiBootable = true; diff --git a/nixos/modules/installer/cd-dvd/iso-image.nix b/nixos/modules/installer/cd-dvd/iso-image.nix index cf2cdb8eecef00..6a320b8cc4a33c 100644 --- a/nixos/modules/installer/cd-dvd/iso-image.nix +++ b/nixos/modules/installer/cd-dvd/iso-image.nix @@ -476,23 +476,33 @@ let in { - options = { - - isoImage.isoName = lib.mkOption { - default = "${config.isoImage.isoBaseName}.iso"; - type = lib.types.str; - description = '' - Name of the generated ISO image file. - ''; - }; + imports = [ + (lib.mkRenamedOptionModuleWith { + sinceRelease = 2505; + from = [ + "isoImage" + "isoBaseName" + ]; + to = [ + "image" + "baseName" + ]; + }) + (lib.mkRenamedOptionModuleWith { + sinceRelease = 2505; + from = [ + "isoImage" + "isoName" + ]; + to = [ + "image" + "fileName" + ]; + }) + ../../image/file-options.nix + ]; - isoImage.isoBaseName = lib.mkOption { - default = config.system.nixos.distroId; - type = lib.types.str; - description = '' - Prefix of the name of the generated ISO image file. - ''; - }; + options = { isoImage.compressImage = lib.mkOption { default = false; @@ -858,8 +868,12 @@ in boot.loader.timeout = 10; # Create the ISO image. + image.extension = if config.isoImage.compressImage then "iso.zst" else "iso"; + image.filePath = "iso/${config.image.fileName}"; + system.build.image = config.system.build.isoImage; system.build.isoImage = pkgs.callPackage ../../../lib/make-iso9660-image.nix ({ - inherit (config.isoImage) isoName compressImage volumeID contents; + inherit (config.isoImage) compressImage volumeID contents; + isoName = "${config.image.baseName}.iso"; bootable = config.isoImage.makeBiosBootable; bootImage = "/isolinux/isolinux.bin"; syslinux = if config.isoImage.makeBiosBootable then pkgs.syslinux else null; diff --git a/nixos/release.nix b/nixos/release.nix index 7845ff5d180e37..69abef4b982dde 100644 --- a/nixos/release.nix +++ b/nixos/release.nix @@ -62,7 +62,7 @@ let hydraJob ((import lib/eval-config.nix { inherit system; modules = makeModules module { - isoImage.isoBaseName = "nixos-${type}"; + image.baseName = "nixos-${type}"; }; }).config.system.build.isoImage); diff --git a/pkgs/desktops/gnome/installer.nix b/pkgs/desktops/gnome/installer.nix index 4999e1f3343cfb..f3399a6e7819f8 100644 --- a/pkgs/desktops/gnome/installer.nix +++ b/pkgs/desktops/gnome/installer.nix @@ -7,7 +7,7 @@ let config = (import ../../../../nixos/lib/eval-config.nix { inherit system; - modules = [ module { isoImage.isoBaseName = isoBaseName; } ] ++ extraModules; + modules = [ module { image.baseName = isoBaseName; } ] ++ extraModules; }).config; in From fdb144fb411b31aa2829d00ccfc9ddafe3ccd0f6 Mon Sep 17 00:00:00 2001 From: phaer Date: Fri, 15 Nov 2024 01:10:33 +0100 Subject: [PATCH 4/9] ec2/amazon-image: use system.build.image and rename: - amazonImage.name -> image.baseName --- .../maintainers/scripts/ec2/amazon-image.nix | 36 +++++++++++-------- nixos/tests/ec2.nix | 2 +- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/nixos/maintainers/scripts/ec2/amazon-image.nix b/nixos/maintainers/scripts/ec2/amazon-image.nix index e08cf572f7f941..d5b23d8a65f66f 100644 --- a/nixos/maintainers/scripts/ec2/amazon-image.nix +++ b/nixos/maintainers/scripts/ec2/amazon-image.nix @@ -20,6 +20,7 @@ in imports = [ ../../../modules/virtualisation/amazon-image.nix ../../../modules/virtualisation/disk-size-option.nix + ../../../modules/image/file-options.nix (lib.mkRenamedOptionModuleWith { sinceRelease = 2411; from = [ @@ -31,6 +32,17 @@ in "diskSize" ]; }) + (lib.mkRenamedOptionModuleWith { + sinceRelease = 2505; + from = [ + "amazonImage" + "name" + ]; + to = [ + "image" + "baseName" + ]; + }) ]; # Amazon recommends setting this to the highest possible value for a good EBS @@ -44,12 +56,6 @@ in [ "nvme_core.io_timeout=${timeout}" ]; options.amazonImage = { - name = mkOption { - type = types.str; - description = "The name of the generated derivation"; - default = "nixos-amazon-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}"; - }; - contents = mkOption { example = literalExpression '' [ { source = pkgs.memtest86 + "/memtest.bin"; @@ -80,6 +86,10 @@ in config.virtualisation.diskSize = lib.mkOverride 1490 (3 * 1024); config.virtualisation.diskSizeAutoSupported = !config.ec2.zfs.enable; + config.system.nixos.tags = [ "amazon" ]; + config.system.build.image = config.system.build.amazonImage; + config.image.extension = cfg.format; + config.system.build.amazonImage = let configFile = pkgs.writeText "configuration.nix" '' @@ -102,7 +112,8 @@ in configFile pkgs ; - inherit (cfg) contents format name; + inherit (cfg) contents format; + name = config.image.baseName; includeChannel = true; @@ -118,7 +129,7 @@ in postVM = '' extension=''${rootDiskImage##*.} - friendlyName=$out/${cfg.name} + friendlyName=$out/${config.image.baseName} rootDisk="$friendlyName.root.$extension" bootDisk="$friendlyName.boot.$extension" mv "$rootDiskImage" "$rootDisk" @@ -156,7 +167,9 @@ in pkgs ; - inherit (cfg) contents format name; + inherit (cfg) contents format; + inherit (config.image) baseName; + name = config.image.baseName; fsType = "ext4"; partitionTableType = if config.ec2.efi then "efi" else "legacy+gpt"; @@ -164,11 +177,6 @@ in inherit (config.virtualisation) diskSize; postVM = '' - extension=''${diskImage##*.} - friendlyName=$out/${cfg.name}.$extension - mv "$diskImage" "$friendlyName" - diskImage=$friendlyName - mkdir -p $out/nix-support echo "file ${cfg.format} $diskImage" >> $out/nix-support/hydra-build-products diff --git a/nixos/tests/ec2.nix b/nixos/tests/ec2.nix index 4511a37854eae3..2381d773a470e9 100644 --- a/nixos/tests/ec2.nix +++ b/nixos/tests/ec2.nix @@ -55,7 +55,7 @@ let } ]; }).config; - image = "${imageCfg.system.build.amazonImage}/${imageCfg.amazonImage.name}.qcow2"; + image = "${imageCfg.system.build.amazonImage}/${imageCfg.image.imageFile}"; sshKeys = import ./ssh-keys.nix pkgs; snakeOilPrivateKey = sshKeys.snakeOilPrivateKey.text; From e04d4cc0ea3b9ab403b3e5adfc17b8159fa496a8 Mon Sep 17 00:00:00 2001 From: phaer Date: Fri, 15 Nov 2024 12:16:10 +0100 Subject: [PATCH 5/9] openstack-image: use system.build.image --- nixos/maintainers/scripts/openstack/openstack-image.nix | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/nixos/maintainers/scripts/openstack/openstack-image.nix b/nixos/maintainers/scripts/openstack/openstack-image.nix index 6728a98758b834..fa381294c5cfa9 100644 --- a/nixos/maintainers/scripts/openstack/openstack-image.nix +++ b/nixos/maintainers/scripts/openstack/openstack-image.nix @@ -3,19 +3,24 @@ { config, lib, pkgs, ... }: let copyChannel = true; + format = "qcow2"; in { imports = [ ../../../modules/virtualisation/openstack-config.nix + ../../../modules/image/file-options.nix ] ++ (lib.optional copyChannel ../../../modules/installer/cd-dvd/channel.nix); documentation.enable = copyChannel; + image.extension = format; + system.nixos.tags = [ "openstack" ]; + system.build.image = config.system.build.openstackImage; system.build.openstackImage = import ../../../lib/make-disk-image.nix { - inherit lib config copyChannel; + inherit lib config copyChannel format; + inherit (config.image) baseName; additionalSpace = "1024M"; pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package - format = "qcow2"; configFile = pkgs.writeText "configuration.nix" '' { From 53e68e04f271802fd98e509b284231eed6614a8d Mon Sep 17 00:00:00 2001 From: phaer Date: Fri, 15 Nov 2024 12:17:04 +0100 Subject: [PATCH 6/9] openstack-image-zfs: use system.build.image --- .../scripts/openstack/openstack-image-zfs.nix | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/nixos/maintainers/scripts/openstack/openstack-image-zfs.nix b/nixos/maintainers/scripts/openstack/openstack-image-zfs.nix index 57022bd2f784a3..869d5a3c1fc3fc 100644 --- a/nixos/maintainers/scripts/openstack/openstack-image-zfs.nix +++ b/nixos/maintainers/scripts/openstack/openstack-image-zfs.nix @@ -16,6 +16,7 @@ in imports = [ ../../../modules/virtualisation/openstack-config.nix ../../../modules/virtualisation/disk-size-option.nix + ../../../modules/image/file-options.nix (lib.mkRenamedOptionModuleWith { sinceRelease = 2411; from = [ @@ -27,15 +28,21 @@ in "diskSize" ]; }) + (lib.mkRenamedOptionModuleWith { + sinceRelease = 2505; + from = [ + "openstackImage" + "name" + ]; + to = [ + "image" + "baseName" + ]; + }) + ] ++ (lib.optional copyChannel ../../../modules/installer/cd-dvd/channel.nix); options.openstackImage = { - name = mkOption { - type = types.str; - description = "The name of the generated derivation"; - default = "nixos-openstack-image-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}"; - }; - ramMB = mkOption { type = types.int; default = (3 * 1024); @@ -72,9 +79,16 @@ in virtualisation.diskSize = lib.mkOverride 1490 (8 * 1024); virtualisation.diskSizeAutoSupported = false; + image.extension = cfg.format; + system.nixos.tags = [ + "openstack" + "zfs" + ]; + system.build.image = config.system.build.openstackImage; system.build.openstackImage = import ../../../lib/make-single-disk-zfs-image.nix { inherit lib config; - inherit (cfg) contents format name; + inherit (cfg) contents format; + name = config.image.baseName; pkgs = import ../../../.. { inherit (pkgs) system; }; # ensure we use the regular qemu-kvm package configFile = pkgs.writeText "configuration.nix" '' @@ -98,7 +112,7 @@ in postVM = '' extension=''${rootDiskImage##*.} - friendlyName=$out/${cfg.name} + friendlyName=$out/${config.image.baseName} rootDisk="$friendlyName.root.$extension" mv "$rootDiskImage" "$rootDisk" From 63d0a4ea61bc694fa1607473ebafffb4025cc7a8 Mon Sep 17 00:00:00 2001 From: phaer Date: Mon, 18 Nov 2024 14:42:29 +0100 Subject: [PATCH 7/9] modules/netboot: add system.build.image for new kexecTarball --- nixos/modules/installer/netboot/netboot.nix | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/nixos/modules/installer/netboot/netboot.nix b/nixos/modules/installer/netboot/netboot.nix index ae8655f407e6ea..856ecb3f94ad47 100644 --- a/nixos/modules/installer/netboot/netboot.nix +++ b/nixos/modules/installer/netboot/netboot.nix @@ -1,11 +1,15 @@ # This module creates netboot media containing the given NixOS # configuration. -{ config, lib, pkgs, ... }: +{ config, lib, pkgs, modulesPath, ... }: with lib; { + imports = [ + ../../image/file-options.nix + ]; + options = { netboot.squashfsCompression = mkOption { @@ -129,6 +133,21 @@ with lib; } ]; + image.extension = "tar.xz"; + image.filePath = "tarball/${config.image.fileName}"; + system.nixos.tags = [ "kexec" ]; + system.build.image = config.system.build.kexecTarball; + system.build.kexecTarball = pkgs.callPackage "${toString modulesPath}/../lib/make-system-tarball.nix" { + fileName = config.image.baseName; + storeContents = [ + { + object = config.system.build.kexecScript; + symlink = "/kexec_nixos"; + } + ]; + contents = []; + }; + boot.loader.timeout = 10; boot.postBootCommands = '' From 48ec455ae83f6255b312d71918b3434bcd4609b2 Mon Sep 17 00:00:00 2001 From: phaer Date: Fri, 22 Nov 2024 12:48:31 +0100 Subject: [PATCH 8/9] virtualisation/disk-image: init New module to support qemu, qemu-efi, raw, raw-efi outputs as known from nixos-generators in system.build.images. --- nixos/modules/virtualisation/disk-image.nix | 61 +++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 nixos/modules/virtualisation/disk-image.nix diff --git a/nixos/modules/virtualisation/disk-image.nix b/nixos/modules/virtualisation/disk-image.nix new file mode 100644 index 00000000000000..c524b66271139d --- /dev/null +++ b/nixos/modules/virtualisation/disk-image.nix @@ -0,0 +1,61 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.image; +in +{ + imports = [ + ./disk-size-option.nix + ../image/file-options.nix + ]; + + options.image = { + format = lib.mkOption { + description = "Format of the disk image to generate: raw or qcow2"; + type = lib.types.enum [ + "raw" + "qcow2" + ]; + default = "qcow2"; + }; + efiSupport = lib.mkOption { + description = "Whether the disk image should support EFI boot or legacy boot"; + type = lib.types.bool; + default = true; + }; + }; + + config = { + boot.loader.grub = lib.mkIf (!cfg.efiSupport) { + enable = lib.mkOptionDefault true; + devices = lib.mkDefault [ "/dev/vda" ]; + }; + boot.loader.systemd-boot.enable = lib.mkDefault cfg.efiSupport; + boot.growPartition = lib.mkDefault true; + + fileSystems = { + "/" = { + device = "/dev/disk/by-label/nixos"; + autoResize = true; + fsType = "ext4"; + }; + "/boot" = lib.mkIf (cfg.efiSupport) { + device = "/dev/disk/by-label/ESP"; + fsType = "vfat"; + }; + }; + + system.nixos.tags = [ cfg.format ] ++ lib.optionals cfg.efiSupport [ "efi" ]; + image.extension = cfg.format; + system.build.image = import ../../lib/make-disk-image.nix { + inherit lib config pkgs; + inherit (config.virtualisation) diskSize; + inherit (cfg) baseName format; + partitionTableType = if cfg.efiSupport then "efi" else "legacy"; + }; + }; +} From e3347c19b376a7942ae19c4f219964776bb6e871 Mon Sep 17 00:00:00 2001 From: phaer Date: Tue, 26 Nov 2024 18:10:07 +0100 Subject: [PATCH 9/9] image/images: Add remaining image modules to achieve feature parity with nixos-generators --- nixos/modules/image/images.nix | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/nixos/modules/image/images.nix b/nixos/modules/image/images.nix index 776f896f720f8a..84e364818adc5d 100644 --- a/nixos/modules/image/images.nix +++ b/nixos/modules/image/images.nix @@ -9,6 +9,7 @@ let inherit (lib) types; imageModules = { + amazon = [ ../../maintainers/scripts/ec2/amazon-image.nix ]; azure = [ ../virtualisation/azure-image.nix ]; digital-ocean = [ ../virtualisation/digital-ocean-image.nix ]; google-compute = [ ../virtualisation/google-compute-image.nix ]; @@ -17,11 +18,45 @@ let lxc = [ ../virtualisation/lxc-container.nix ]; lxc-metadata = [ ../virtualisation/lxc-image-metadata.nix ]; oci = [ ../virtualisation/oci-image.nix ]; + openstack = [ ../../maintainers/scripts/openstack/openstack-image.nix ]; + openstack-zfs = [ ../../maintainers/scripts/openstack/openstack-image-zfs.nix ]; proxmox = [ ../virtualisation/proxmox-image.nix ]; + proxmox-lxc = [ ../virtualisation/proxmox-lxc.nix ]; + qemu-efi = [ ../virtualisation/disk-image.nix ]; + qemu = [ + ../virtualisation/disk-image.nix + { + image.efiSupport = false; + } + ]; + raw-efi = [ + ../virtualisation/disk-image.nix + { + image.format = "raw"; + } + ]; + raw = [ + ../virtualisation/disk-image.nix + { + image.format = "raw"; + image.efiSupport = false; + } + ]; kubevirt = [ ../virtualisation/kubevirt.nix ]; vagrant-virtualbox = [ ../virtualisation/vagrant-virtualbox-image.nix ]; virtualbox = [ ../virtualisation/virtualbox-image.nix ]; vmware = [ ../virtualisation/vmware-image.nix ]; + iso = [ ../installer/cd-dvd/iso-image.nix ]; + iso-installer = [ ../installer/cd-dvd/installation-cd-base.nix ]; + sd-card = [ + ( + let + module = ../. + "/installer/sd-card/sd-image-${pkgs.targetPlatform.linuxArch}.nix"; + in + if builtins.pathExists module then module else throw "The module ${module} does not exist." + ) + ]; + kexec = [ ../installer/netboot/netboot-minimal.nix ]; }; imageConfigs = lib.mapAttrs ( name: modules: