nixos: Support fileSystems.<name>.depends with fstab-generator (#233707)

This commit is contained in:
Philip Taron
2024-08-30 15:55:39 -07:00
committed by GitHub
3 changed files with 41 additions and 16 deletions
+13 -2
View File
@@ -1,4 +1,4 @@
{ config, lib, pkgs, utils, ... }:
{ config, lib, pkgs, utils, ... }@moduleArgs:
with lib;
with utils;
@@ -136,10 +136,21 @@ let
};
config.options = mkMerge [
config.options = let
inInitrd = utils.fsNeededForBoot config;
in mkMerge [
(mkIf config.autoResize [ "x-systemd.growfs" ])
(mkIf config.autoFormat [ "x-systemd.makefs" ])
(mkIf (utils.fsNeededForBoot config) [ "x-initrd.mount" ])
(mkIf
# With scripted stage 1, depends is implemented by sorting 'config.system.build.fileSystems'
(lib.length config.depends > 0 && (inInitrd -> moduleArgs.config.boot.initrd.systemd.enable))
(
map (
x: "x-systemd.requires-mounts-for=${optionalString inInitrd "/sysroot"}${x}"
) config.depends
)
)
];
};
+28 -13
View File
@@ -82,6 +82,10 @@ let
config = lib.mkIf (config.overlay.lowerdir != null) {
fsType = "overlay";
device = lib.mkDefault "overlay";
depends = map (x: "${x}") (config.overlay.lowerdir ++ lib.optionals (config.overlay.upperdir != null) [
config.overlay.upperdir
config.overlay.workdir
]);
options =
let
@@ -96,7 +100,7 @@ let
] ++ lib.optionals (config.overlay.upperdir != null) [
"upperdir=${upperdir}"
"workdir=${workdir}"
] ++ (map (s: "x-systemd.requires-mounts-for=${s}") lowerdir);
];
};
};
@@ -123,18 +127,29 @@ in
boot.initrd.availableKernelModules = lib.mkIf (initrdFileSystems != { }) [ "overlay" ];
assertions = lib.concatLists (lib.mapAttrsToList
(_name: fs: [
{
assertion = (fs.overlay.upperdir == null) == (fs.overlay.workdir == null);
message = "You cannot define a `lowerdir` without a `workdir` and vice versa for mount point: ${fs.mountPoint}";
}
{
assertion = (fs.overlay.lowerdir != null && fs.overlay.upperdir == null) -> (lib.length fs.overlay.lowerdir) >= 2;
message = "A read-only overlay (without an `upperdir`) requires at least 2 `lowerdir`s: ${fs.mountPoint}";
}
])
config.fileSystems);
assertions =
lib.concatLists (
lib.mapAttrsToList (_name: fs: [
{
assertion = (fs.overlay.upperdir == null) == (fs.overlay.workdir == null);
message = "You cannot define a `lowerdir` without a `workdir` and vice versa for mount point: ${fs.mountPoint}";
}
{
assertion =
(fs.overlay.lowerdir != null && fs.overlay.upperdir == null)
-> (lib.length fs.overlay.lowerdir) >= 2;
message = "A read-only overlay (without an `upperdir`) requires at least 2 `lowerdir`s: ${fs.mountPoint}";
}
]) overlayFileSystems
)
++ lib.mapAttrsToList (_: fs: {
assertion = fs.overlay.upperdir == null -> config.boot.initrd.systemd.enable;
message = ''
Stage 1 overlay file system ${fs.mountPoint} has no upperdir,
which is not supported with scripted initrd. Please enable
'boot.initrd.systemd.enable'.
'';
}) initrdFileSystems;
boot.initrd.systemd.services = lib.mkMerge (lib.mapAttrsToList preMountService initrdFileSystems);
systemd.services = lib.mkMerge (lib.mapAttrsToList preMountService userspaceFileSystems);
-1
View File
@@ -26,7 +26,6 @@ in
nodes.machine = { config, pkgs, ... }: {
boot.initrd.systemd.enable = true;
boot.initrd.availableKernelModules = [ "overlay" ];
virtualisation.fileSystems = {
"/initrd-overlay" = {