nixos/iso-image: remove with lib;

This commit is contained in:
Felix Buehler 2024-08-30 00:46:29 +02:00
commit e3ee1a97d4

View file

@ -1,11 +1,7 @@
# This module creates a bootable ISO image containing the given NixOS
# configuration. The derivation for the ISO image will be placed in
# config.system.build.isoImage.
{ config, lib, pkgs, ... }:
with lib;
let
/**
* Given a list of `options`, concats the result of mapping each options
@ -22,8 +18,8 @@ let
(option: ''
menuentry '${defaults.name} ${
# Name appended to menuentry defaults to params if no specific name given.
option.name or (optionalString (option ? params) "(${option.params})")
}' ${optionalString (option ? class) " --class ${option.class}"} {
option.name or (lib.optionalString (option ? params) "(${option.params})")
}' ${lib.optionalString (option ? class) " --class ${option.class}"} {
# Fallback to UEFI console for boot, efifb sometimes has difficulties.
terminal_output console
@ -153,8 +149,8 @@ let
APPEND ${toString config.boot.loader.grub.memtest86.params}
'';
isolinuxCfg = concatStringsSep "\n"
([ baseIsolinuxCfg ] ++ optional config.boot.loader.grub.memtest86.enable isolinuxMemtest86Entry);
isolinuxCfg = lib.concatStringsSep "\n"
([ baseIsolinuxCfg ] ++ lib.optional config.boot.loader.grub.memtest86.enable isolinuxMemtest86Entry);
refindBinary = if targetArch == "x64" || targetArch == "aa64" then "refind_${targetArch}.efi" else null;
@ -182,7 +178,7 @@ let
insmod gfxterm
insmod png
set gfxpayload=keep
set gfxmode=${concatStringsSep "," [
set gfxmode=${lib.concatStringsSep "," [
# GRUB will use the first valid mode listed here.
# `auto` will sometimes choose the smallest valid mode it detects.
# So instead we'll list a lot of possibly valid modes :/
@ -321,7 +317,7 @@ let
cat <<EOF > $out/EFI/boot/grub.cfg
set textmode=${boolToString (config.isoImage.forceTextMode)}
set textmode=${lib.boolToString (config.isoImage.forceTextMode)}
set timeout=${toString grubEfiTimeout}
clear
@ -480,7 +476,7 @@ in
{
options = {
isoImage.isoName = mkOption {
isoImage.isoName = lib.mkOption {
default = "${config.isoImage.isoBaseName}.iso";
type = lib.types.str;
description = ''
@ -488,7 +484,7 @@ in
'';
};
isoImage.isoBaseName = mkOption {
isoImage.isoBaseName = lib.mkOption {
default = config.system.nixos.distroId;
type = lib.types.str;
description = ''
@ -496,7 +492,7 @@ in
'';
};
isoImage.compressImage = mkOption {
isoImage.compressImage = lib.mkOption {
default = false;
type = lib.types.bool;
description = ''
@ -505,7 +501,7 @@ in
'';
};
isoImage.squashfsCompression = mkOption {
isoImage.squashfsCompression = lib.mkOption {
default = "zstd -Xcompression-level 19";
type = lib.types.nullOr lib.types.str;
description = ''
@ -515,7 +511,7 @@ in
example = "zstd -Xcompression-level 6";
};
isoImage.edition = mkOption {
isoImage.edition = lib.mkOption {
default = "";
type = lib.types.str;
description = ''
@ -524,9 +520,9 @@ in
'';
};
isoImage.volumeID = mkOption {
isoImage.volumeID = lib.mkOption {
# nixos-$EDITION-$RELEASE-$ARCH
default = "nixos${optionalString (config.isoImage.edition != "") "-${config.isoImage.edition}"}-${config.system.nixos.release}-${pkgs.stdenv.hostPlatform.uname.processor}";
default = "nixos${lib.optionalString (config.isoImage.edition != "") "-${config.isoImage.edition}"}-${config.system.nixos.release}-${pkgs.stdenv.hostPlatform.uname.processor}";
type = lib.types.str;
description = ''
Specifies the label or volume ID of the generated ISO image.
@ -535,8 +531,8 @@ in
'';
};
isoImage.contents = mkOption {
example = literalExpression ''
isoImage.contents = lib.mkOption {
example = lib.literalExpression ''
[ { source = pkgs.memtest86 + "/memtest.bin";
target = "boot/memtest.bin";
}
@ -548,15 +544,15 @@ in
'';
};
isoImage.storeContents = mkOption {
example = literalExpression "[ pkgs.stdenv ]";
isoImage.storeContents = lib.mkOption {
example = lib.literalExpression "[ pkgs.stdenv ]";
description = ''
This option lists additional derivations to be included in the
Nix store in the generated ISO image.
'';
};
isoImage.includeSystemBuildDependencies = mkOption {
isoImage.includeSystemBuildDependencies = lib.mkOption {
default = false;
type = lib.types.bool;
description = ''
@ -568,7 +564,7 @@ in
'';
};
isoImage.makeBiosBootable = mkOption {
isoImage.makeBiosBootable = lib.mkOption {
# Before this option was introduced, images were BIOS-bootable if the
# hostPlatform was x86-based. This option is enabled by default for
# backwards compatibility.
@ -586,7 +582,7 @@ in
'';
};
isoImage.makeEfiBootable = mkOption {
isoImage.makeEfiBootable = lib.mkOption {
default = false;
type = lib.types.bool;
description = ''
@ -594,7 +590,7 @@ in
'';
};
isoImage.makeUsbBootable = mkOption {
isoImage.makeUsbBootable = lib.mkOption {
default = false;
type = lib.types.bool;
description = ''
@ -602,7 +598,7 @@ in
'';
};
isoImage.efiSplashImage = mkOption {
isoImage.efiSplashImage = lib.mkOption {
default = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/a9e05d7deb38a8e005a2b52575a3f59a63a4dba0/bootloader/efi-background.png";
sha256 = "18lfwmp8yq923322nlb9gxrh5qikj1wsk6g5qvdh31c4h5b1538x";
@ -612,7 +608,7 @@ in
'';
};
isoImage.splashImage = mkOption {
isoImage.splashImage = lib.mkOption {
default = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/NixOS/nixos-artwork/a9e05d7deb38a8e005a2b52575a3f59a63a4dba0/bootloader/isolinux/bios-boot.png";
sha256 = "1wp822zrhbg4fgfbwkr7cbkr4labx477209agzc0hr6k62fr6rxd";
@ -622,15 +618,15 @@ in
'';
};
isoImage.grubTheme = mkOption {
isoImage.grubTheme = lib.mkOption {
default = pkgs.nixos-grub2-theme;
type = types.nullOr (types.either types.path types.package);
type = lib.types.nullOr (lib.types.either lib.types.path lib.types.package);
description = ''
The grub2 theme used for UEFI boot.
'';
};
isoImage.syslinuxTheme = mkOption {
isoImage.syslinuxTheme = lib.mkOption {
default = ''
MENU TITLE ${config.system.nixos.distroName}
MENU RESOLUTION 800 600
@ -655,15 +651,15 @@ in
MENU COLOR UNSEL 37;44 #FF000000 #00000000 none
MENU COLOR SEL 7;37;40 #FFFFFFFF #FF5277C3 std
'';
type = types.str;
type = lib.types.str;
description = ''
The syslinux theme used for BIOS boot.
'';
};
isoImage.prependToMenuLabel = mkOption {
isoImage.prependToMenuLabel = lib.mkOption {
default = "";
type = types.str;
type = lib.types.str;
example = "Install ";
description = ''
The string to prepend before the menu label for the NixOS system.
@ -674,9 +670,9 @@ in
'';
};
isoImage.appendToMenuLabel = mkOption {
isoImage.appendToMenuLabel = lib.mkOption {
default = " Installer";
type = types.str;
type = lib.types.str;
example = " Live System";
description = ''
The string to append after the menu label for the NixOS system.
@ -687,9 +683,9 @@ in
'';
};
isoImage.forceTextMode = mkOption {
isoImage.forceTextMode = lib.mkOption {
default = false;
type = types.bool;
type = lib.types.bool;
example = true;
description = ''
Whether to use text mode instead of graphical grub.
@ -706,7 +702,7 @@ in
# store them in lib so we can mkImageMediaOverride the
# entire file system layout in installation media (only)
config.lib.isoFileSystems = {
"/" = mkImageMediaOverride
"/" = lib.mkImageMediaOverride
{
fsType = "tmpfs";
options = [ "mode=0755" ];
@ -715,7 +711,7 @@ in
# Note that /dev/root is a symlink to the actual root device
# specified on the kernel command line, created in the stage 1
# init script.
"/iso" = mkImageMediaOverride
"/iso" = lib.mkImageMediaOverride
{ device = "/dev/root";
neededForBoot = true;
noCheck = true;
@ -723,20 +719,20 @@ in
# In stage 1, mount a tmpfs on top of /nix/store (the squashfs
# image) to make this a live CD.
"/nix/.ro-store" = mkImageMediaOverride
"/nix/.ro-store" = lib.mkImageMediaOverride
{ fsType = "squashfs";
device = "/iso/nix-store.squashfs";
options = [ "loop" ];
neededForBoot = true;
};
"/nix/.rw-store" = mkImageMediaOverride
"/nix/.rw-store" = lib.mkImageMediaOverride
{ fsType = "tmpfs";
options = [ "mode=0755" ];
neededForBoot = true;
};
"/nix/store" = mkImageMediaOverride
"/nix/store" = lib.mkImageMediaOverride
{ fsType = "overlay";
device = "overlay";
options = [
@ -760,11 +756,11 @@ in
message = "BIOS boot is only supported on x86-based architectures.";
}
{
assertion = !(stringLength config.isoImage.volumeID > 32);
assertion = !(lib.stringLength config.isoImage.volumeID > 32);
# https://wiki.osdev.org/ISO_9660#The_Primary_Volume_Descriptor
# Volume Identifier can only be 32 bytes
message = let
length = stringLength config.isoImage.volumeID;
length = lib.stringLength config.isoImage.volumeID;
howmany = toString length;
toomany = toString (length - 32);
in
@ -777,7 +773,7 @@ in
boot.loader.grub.enable = false;
environment.systemPackages = [ grubPkgs.grub2 grubPkgs.grub2_efi ]
++ optional (config.isoImage.makeBiosBootable) pkgs.syslinux
++ lib.optional (config.isoImage.makeBiosBootable) pkgs.syslinux
;
# In stage 1 of the boot, mount the CD as the root FS by label so
@ -803,7 +799,7 @@ in
# script and the top-level system configuration directory.
isoImage.storeContents =
[ config.system.build.toplevel ] ++
optional config.isoImage.includeSystemBuildDependencies
lib.optional config.isoImage.includeSystemBuildDependencies
config.system.build.toplevel.drvPath;
# Individual files to be included on the CD, outside of the Nix
@ -819,7 +815,7 @@ in
{ source = pkgs.writeText "version" config.system.nixos.label;
target = "/version.txt";
}
] ++ optionals (config.isoImage.makeBiosBootable) [
] ++ lib.optionals (config.isoImage.makeBiosBootable) [
{ source = config.isoImage.splashImage;
target = "/isolinux/background.png";
}
@ -833,7 +829,7 @@ in
{ source = "${pkgs.syslinux}/share/syslinux";
target = "/isolinux";
}
] ++ optionals config.isoImage.makeEfiBootable [
] ++ lib.optionals config.isoImage.makeEfiBootable [
{ source = efiImg;
target = "/boot/efi.img";
}
@ -846,11 +842,11 @@ in
{ source = config.isoImage.efiSplashImage;
target = "/EFI/boot/efi-background.png";
}
] ++ optionals (config.boot.loader.grub.memtest86.enable && config.isoImage.makeBiosBootable) [
] ++ lib.optionals (config.boot.loader.grub.memtest86.enable && config.isoImage.makeBiosBootable) [
{ source = "${pkgs.memtest86plus}/memtest.bin";
target = "/boot/memtest.bin";
}
] ++ optionals (config.isoImage.grubTheme != null) [
] ++ lib.optionals (config.isoImage.grubTheme != null) [
{ source = config.isoImage.grubTheme;
target = "/EFI/boot/grub-theme";
}
@ -866,10 +862,10 @@ in
syslinux = if config.isoImage.makeBiosBootable then pkgs.syslinux else null;
squashfsContents = config.isoImage.storeContents;
squashfsCompression = config.isoImage.squashfsCompression;
} // optionalAttrs (config.isoImage.makeUsbBootable && config.isoImage.makeBiosBootable) {
} // lib.optionalAttrs (config.isoImage.makeUsbBootable && config.isoImage.makeBiosBootable) {
usbBootable = true;
isohybridMbrImage = "${pkgs.syslinux}/share/syslinux/isohdpfx.bin";
} // optionalAttrs config.isoImage.makeEfiBootable {
} // lib.optionalAttrs config.isoImage.makeEfiBootable {
efiBootable = true;
efiBootImage = "boot/efi.img";
});