nixpkgs/nixos/release.nix
Will Fancher f8ed5f30c0 nixos/filesystems: Remove default = "auto" from fsType
NixOS has traditionally enabled the `ext` family of file systems by
default. Originally, when switching to systemd initrd, we wanted to
transition to making this explicit so that initrds could be made
without `ext`. The problem is that anyone with `fsType = "auto";` for
an `ext` file system in initrd will fail to boot, which is not really
an acceptable regression as we switch to systemd initrd by default.

By removing `default = "auto"` from `fsType`, we rule out the vast
majority of these regressions as eval errors, since most users of
`fsType = "auto"` for ext file systems are using it because of the
default value.

In hindsight, this is probably what #225352 was really about.
2026-04-05 19:06:28 -04:00

580 lines
14 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

with import ../lib;
{
nixpkgs ? {
outPath = cleanSource ./..;
revCount = 708350;
shortRev = "gfedcba";
},
stableBranch ? false,
supportedSystems ? [
"x86_64-linux"
"aarch64-linux"
],
configuration ? { },
# This flag, if set to true, causes the resulting tree of attributes
# to *not* have a ".${system}" suffixed upon every job name like Hydra
# expects. So far, this is only implemented for `tests`.
#
# This flag exists mainly for use by ci/eval/attrpaths.nix; see
# that file for full details. The exact behavior of this flag
# may change; it should be considered an internal implementation
# detail of ci/eval.
attrNamesOnly ? false,
}:
with import ../pkgs/top-level/release-lib.nix { inherit supportedSystems; };
let
version = fileContents ../.version;
versionSuffix =
(if stableBranch then "." else "pre") + "${toString nixpkgs.revCount}.${nixpkgs.shortRev}";
# Run the tests for each platform. You can run a test by doing
# e.g. nix-build release.nix -A tests.login.x86_64-linux,
# or equivalently, nix-build tests/login.nix.
# See also nixosTests in pkgs/top-level/all-packages.nix
allTestsForSystem =
system:
import ./tests/all-tests.nix {
inherit system;
pkgs = import ./.. { inherit system; };
callTest =
config:
let
inherit (config) test;
in
lib.optionalAttrs (builtins.elem system (getPlatforms test)) (
if attrNamesOnly then
hydraJob test
else
{
${system} = hydraJob test;
}
);
}
// {
# for typechecking of the scripts and evaluation of
# the nodes, without running VMs.
allDrivers = import ./tests/all-tests.nix {
inherit system;
pkgs = import ./.. { inherit system; };
callTest =
config:
let
inherit (config) driver;
in
lib.optionalAttrs (builtins.elem system (getPlatforms driver)) (
if attrNamesOnly then
hydraJob driver
else
{
${system} = hydraJob driver;
}
);
};
};
allTests = foldAttrs recursiveUpdate { } (
map allTestsForSystem (if attrNamesOnly then [ (head supportedSystems) ] else supportedSystems)
);
pkgs = import ./.. { system = "x86_64-linux"; };
versionModule =
{ config, ... }:
{
system.nixos.versionSuffix = versionSuffix;
system.nixos.revision = nixpkgs.rev or nixpkgs.shortRev;
# At creation time we do not have state yet, so just default to latest.
system.stateVersion = config.system.nixos.release;
};
makeModules = module: rest: [
configuration
versionModule
module
rest
];
makeIso =
{
module,
type,
system,
...
}:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = makeModules module { };
}).config.system.build.isoImage
);
makeSdImage =
{ module, system, ... }:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = makeModules module { };
}).config.system.build.sdImage
);
makeSystemTarball =
{
module,
maintainers ? [ "viric" ],
system,
}:
with import ./.. { inherit system; };
let
config =
(import lib/eval-config.nix {
inherit system;
modules = makeModules module { };
}).config;
tarball = config.system.build.tarball;
in
tarball
// {
meta = {
description = "NixOS system tarball for ${system} - ${stdenv.hostPlatform.linux-kernel.name}";
maintainers = map (x: lib.maintainers.${x}) maintainers;
};
inherit config;
};
makeClosure = module: buildFromConfig module (config: config.system.build.toplevel);
buildFromConfig =
module: sel:
forAllSystems (
system:
hydraJob (
sel
(import ./lib/eval-config.nix {
inherit system;
modules = makeModules module (
{ ... }:
{
fileSystems."/".device = mkDefault "/dev/sda1";
fileSystems."/".fsType = mkDefault "auto";
boot.loader.grub.device = mkDefault "/dev/sda";
}
);
}).config
)
);
makeNetboot =
{ module, system, ... }:
let
configEvaled = import lib/eval-config.nix {
inherit system;
modules = makeModules module { };
};
build = configEvaled.config.system.build;
kernelTarget = configEvaled.pkgs.stdenv.hostPlatform.linux-kernel.target;
in
configEvaled.pkgs.symlinkJoin {
name = "netboot";
paths = [
build.netbootRamdisk
build.kernel
build.netbootIpxeScript
];
postBuild = ''
mkdir -p $out/nix-support
echo "file ${kernelTarget} ${build.kernel}/${kernelTarget}" >> $out/nix-support/hydra-build-products
echo "file initrd ${build.netbootRamdisk}/initrd" >> $out/nix-support/hydra-build-products
echo "file ipxe ${build.netbootIpxeScript}/netboot.ipxe" >> $out/nix-support/hydra-build-products
'';
preferLocalBuild = true;
};
in
rec {
channel = import lib/make-channel.nix {
inherit
pkgs
nixpkgs
version
versionSuffix
;
};
manualHTML = buildFromConfig ({ ... }: { }) (config: config.system.build.manual.manualHTML);
manual = manualHTML; # TODO(@oxij): remove eventually
manualEpub = (buildFromConfig ({ ... }: { }) (config: config.system.build.manual.manualEpub));
nixos-configuration-reference-manpage = buildFromConfig ({ ... }: { }) (
config: config.system.build.manual.nixos-configuration-reference-manpage
);
options =
(buildFromConfig ({ ... }: { }) (config: config.system.build.manual.optionsJSON)).x86_64-linux;
# Build the initial ramdisk so Hydra can keep track of its size over time.
initialRamdisk = buildFromConfig ({ ... }: { }) (config: config.system.build.initialRamdisk);
kexec = forMatchingSystems supportedSystems (
system:
(import lib/eval-config.nix {
inherit system;
modules = [
./modules/installer/netboot/netboot-minimal.nix
];
}).config.system.build.kexecTree
);
netboot = forMatchingSystems supportedSystems (
system:
makeNetboot {
module = ./modules/installer/netboot/netboot-minimal.nix;
inherit system;
}
);
iso_minimal = forAllSystems (
system:
makeIso {
module = ./modules/installer/cd-dvd/installation-cd-minimal-combined.nix;
type = "minimal";
inherit system;
}
);
iso_graphical = forAllSystems (
system:
makeIso {
module = ./modules/installer/cd-dvd/installation-cd-graphical-combined.nix;
type = "graphical";
inherit system;
}
);
sd_image = forMatchingSystems [ "armv6l-linux" "armv7l-linux" "aarch64-linux" ] (
system:
makeSdImage {
module =
{
armv6l-linux = ./modules/installer/sd-card/sd-image-raspberrypi-installer.nix;
armv7l-linux = ./modules/installer/sd-card/sd-image-armv7l-multiplatform-installer.nix;
aarch64-linux = ./modules/installer/sd-card/sd-image-aarch64-installer.nix;
}
.${system};
inherit system;
}
);
sd_image_new_kernel = forMatchingSystems [ "aarch64-linux" ] (
system:
makeSdImage {
module =
{
aarch64-linux = ./modules/installer/sd-card/sd-image-aarch64-new-kernel-installer.nix;
}
.${system};
type = "minimal-new-kernel";
inherit system;
}
);
sd_image_new_kernel_no_zfs = forMatchingSystems [ "aarch64-linux" ] (
system:
makeSdImage {
module =
{
aarch64-linux = ./modules/installer/sd-card/sd-image-aarch64-new-kernel-no-zfs-installer.nix;
}
.${system};
type = "minimal-new-kernel-no-zfs";
inherit system;
}
);
# KVM image for proxmox in VMA format
proxmoxImage = forMatchingSystems [ "x86_64-linux" ] (
system:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = [
./modules/virtualisation/proxmox-image.nix
];
}).config.system.build.VMA
)
);
# LXC tarball for proxmox
proxmoxLXC = forMatchingSystems [ "x86_64-linux" ] (
system:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = [
./modules/virtualisation/proxmox-lxc.nix
];
}).config.system.build.tarball
)
);
# A disk image that can be imported to Amazon EC2 and registered as an AMI
amazonImage = forMatchingSystems [ "x86_64-linux" "aarch64-linux" ] (
system:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = [
configuration
versionModule
./maintainers/scripts/ec2/amazon-image.nix
];
}).config.system.build.amazonImage
)
);
amazonImageZfs = forMatchingSystems [ "x86_64-linux" "aarch64-linux" ] (
system:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = [
configuration
versionModule
./maintainers/scripts/ec2/amazon-image-zfs.nix
];
}).config.system.build.amazonImage
)
);
# An image that can be imported into incus and used for container creation
incusContainerImage =
forMatchingSystems
[
"x86_64-linux"
"aarch64-linux"
]
(
system:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = [
configuration
versionModule
./maintainers/scripts/incus/incus-container-image.nix
];
}).config.system.build.squashfs
)
);
# Metadata for the incus image
incusContainerMeta =
forMatchingSystems
[
"x86_64-linux"
"aarch64-linux"
]
(
system:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = [
configuration
versionModule
./maintainers/scripts/incus/incus-container-image.nix
];
}).config.system.build.metadata
)
);
# An image that can be imported into incus and used for container creation
incusVirtualMachineImage =
forMatchingSystems
[
"x86_64-linux"
"aarch64-linux"
]
(
system:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = [
configuration
versionModule
./maintainers/scripts/incus/incus-virtual-machine-image.nix
];
}).config.system.build.qemuImage
)
);
# Metadata for the incus image
incusVirtualMachineImageMeta =
forMatchingSystems
[
"x86_64-linux"
"aarch64-linux"
]
(
system:
with import ./.. { inherit system; };
hydraJob (
(import lib/eval-config.nix {
inherit system;
modules = [
configuration
versionModule
./maintainers/scripts/incus/incus-virtual-machine-image.nix
];
}).config.system.build.metadata
)
);
# Ensure that all packages used by the minimal NixOS config end up in the channel.
dummy = forAllSystems (
system:
pkgs.runCommand "dummy" {
toplevel =
(import lib/eval-config.nix {
inherit system;
modules = singleton (
{ ... }:
{
fileSystems."/" = {
device = mkDefault "/dev/sda1";
fsType = "ext4";
};
boot.loader.grub.device = mkDefault "/dev/sda";
system.stateVersion = mkDefault lib.trivial.release;
}
);
}).config.system.build.toplevel;
preferLocalBuild = true;
} "mkdir $out; ln -s $toplevel $out/dummy"
);
# Provide container tarball for lxc, libvirt-lxc, docker-lxc, ...
containerTarball = forAllSystems (
system:
makeSystemTarball {
module = ./modules/virtualisation/lxc-container.nix;
inherit system;
}
);
tests = allTests;
/*
Build a bunch of typical closures so that Hydra can keep track of
the evolution of closure sizes.
*/
closures = {
smallContainer = makeClosure (
{ ... }:
{
boot.isContainer = true;
services.openssh.enable = true;
}
);
tinyContainer = makeClosure (
{ ... }:
{
boot.isContainer = true;
imports = [ modules/profiles/minimal.nix ];
}
);
ec2 = makeClosure (
{ ... }:
{
imports = [ modules/virtualisation/amazon-image.nix ];
}
);
kde = makeClosure (
{ ... }:
{
services.xserver.enable = true;
services.displayManager.sddm.enable = true;
services.desktopManager.plasma6.enable = true;
}
);
xfce = makeClosure (
{ ... }:
{
services.xserver.enable = true;
services.xserver.desktopManager.xfce.enable = true;
}
);
gnome = makeClosure (
{ ... }:
{
services.xserver.enable = true;
services.displayManager.gdm.enable = true;
services.desktopManager.gnome.enable = true;
}
);
pantheon = makeClosure (
{ ... }:
{
services.xserver.enable = true;
services.desktopManager.pantheon.enable = true;
}
);
# Linux/Apache/PostgreSQL/PHP stack.
lapp = makeClosure (
{ pkgs, ... }:
{
services.httpd.enable = true;
services.httpd.adminAddr = "foo@example.org";
services.httpd.enablePHP = true;
services.postgresql.enable = true;
services.postgresql.package = pkgs.postgresql;
}
);
};
}