diff --git a/nixos/modules/rename.nix b/nixos/modules/rename.nix
index 4ae642222740..e0d64914ef41 100644
--- a/nixos/modules/rename.nix
+++ b/nixos/modules/rename.nix
@@ -221,6 +221,7 @@ with lib;
(mkRemovedOptionModule [ "services" "mysql" "pidDir" ] "Don't wait for pidfiles, describe dependencies through systemd")
(mkRemovedOptionModule [ "services" "mysql" "rootPassword" ] "Use socket authentication or set the password outside of the nix store.")
(mkRemovedOptionModule [ "services" "zabbixServer" "dbPassword" ] "Use services.zabbixServer.database.passwordFile instead.")
+ (mkRemovedOptionModule [ "systemd" "generator-packages" ] "Use systemd.packages instead.")
# ZSH
(mkRenamedOptionModule [ "programs" "zsh" "enableSyntaxHighlighting" ] [ "programs" "zsh" "syntaxHighlighting" "enable" ])
diff --git a/nixos/modules/system/boot/stage-1.nix b/nixos/modules/system/boot/stage-1.nix
index 788e3f4a2ab1..4c2d130d5a5d 100644
--- a/nixos/modules/system/boot/stage-1.nix
+++ b/nixos/modules/system/boot/stage-1.nix
@@ -217,13 +217,11 @@ let
--replace ata_id ${extraUtils}/bin/ata_id \
--replace scsi_id ${extraUtils}/bin/scsi_id \
--replace cdrom_id ${extraUtils}/bin/cdrom_id \
- --replace ${pkgs.utillinux}/sbin/blkid ${extraUtils}/bin/blkid \
- --replace /sbin/blkid ${extraUtils}/bin/blkid \
+ --replace ${pkgs.coreutils}/bin/basename ${extraUtils}/bin/basename \
+ --replace ${pkgs.utillinux}/bin/blkid ${extraUtils}/bin/blkid \
--replace ${pkgs.lvm2}/sbin ${extraUtils}/bin \
- --replace /sbin/mdadm ${extraUtils}/bin/mdadm \
+ --replace ${pkgs.mdadm}/sbin ${extraUtils}/sbin \
--replace ${pkgs.bash}/bin/sh ${extraUtils}/bin/sh \
- --replace /usr/bin/readlink ${extraUtils}/bin/readlink \
- --replace /usr/bin/basename ${extraUtils}/bin/basename \
--replace ${udev}/bin/udevadm ${extraUtils}/bin/udevadm
done
diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix
index cf35504e5182..1025a038c4b3 100644
--- a/nixos/modules/system/boot/systemd.nix
+++ b/nixos/modules/system/boot/systemd.nix
@@ -427,7 +427,8 @@ in
systemd.packages = mkOption {
default = [];
type = types.listOf types.package;
- description = "Packages providing systemd units.";
+ example = literalExample "[ pkgs.systemd-cryptsetup-generator ]";
+ description = "Packages providing systemd units and hooks.";
};
systemd.targets = mkOption {
@@ -497,11 +498,14 @@ in
'';
};
- systemd.generator-packages = mkOption {
- default = [];
- type = types.listOf types.package;
- example = literalExample "[ pkgs.systemd-cryptsetup-generator ]";
- description = "Packages providing systemd generators.";
+ systemd.shutdown = mkOption {
+ type = types.attrsOf types.path;
+ default = {};
+ description = ''
+ Definition of systemd shutdown executables.
+ For each NAME = VALUE pair of the attrSet, a link is generated from
+ /etc/systemd/system-shutdown/NAME to VALUE.
+ '';
};
systemd.defaultUnit = mkOption {
@@ -761,18 +765,21 @@ in
environment.systemPackages = [ systemd ];
environment.etc = let
- # generate contents for /etc/systemd/system-generators from
- # systemd.generators and systemd.generator-packages
- generators = pkgs.runCommand "system-generators" {
+ # generate contents for /etc/systemd/system-${type} from attrset of links and packages
+ hooks = type: links: pkgs.runCommand "system-${type}" {
preferLocalBuild = true;
- packages = cfg.generator-packages;
- } ''
+ packages = cfg.packages;
+ } ''
+ set -e
mkdir -p $out
for package in $packages
do
- ln -s $package/lib/systemd/system-generators/* $out/
- done;
- ${concatStrings (mapAttrsToList (generator: target: "ln -s ${target} $out/${generator};\n") cfg.generators)}
+ for hook in $package/lib/systemd/system-${type}/*
+ do
+ ln -s $hook $out/
+ done
+ done
+ ${concatStrings (mapAttrsToList (exec: target: "ln -s ${target} $out/${exec};\n") links)}
'';
in ({
"systemd/system".source = generateUnits "system" cfg.units upstreamSystemUnits upstreamSystemWants;
@@ -834,7 +841,8 @@ in
${concatStringsSep "\n" cfg.tmpfiles.rules}
'';
- "systemd/system-generators" = { source = generators; };
+ "systemd/system-generators" = { source = hooks "generators" cfg.generators; };
+ "systemd/system-shutdown" = { source = hooks "shutdown" cfg.shutdown; };
});
services.dbus.enable = true;
diff --git a/nixos/modules/tasks/filesystems/nfs.nix b/nixos/modules/tasks/filesystems/nfs.nix
index d3a558738f4b..e0e8bb1f03de 100644
--- a/nixos/modules/tasks/filesystems/nfs.nix
+++ b/nixos/modules/tasks/filesystems/nfs.nix
@@ -56,7 +56,6 @@ in
boot.initrd.kernelModules = mkIf inInitrd [ "nfs" ];
systemd.packages = [ pkgs.nfs-utils ];
- systemd.generator-packages = [ pkgs.nfs-utils ];
environment.etc = {
"idmapd.conf".source = idmapdConfFile;
diff --git a/nixos/modules/tasks/swraid.nix b/nixos/modules/tasks/swraid.nix
index 93e03c44c868..8fa19194bed4 100644
--- a/nixos/modules/tasks/swraid.nix
+++ b/nixos/modules/tasks/swraid.nix
@@ -6,51 +6,12 @@
services.udev.packages = [ pkgs.mdadm ];
+ systemd.packages = [ pkgs.mdadm ];
+
boot.initrd.availableKernelModules = [ "md_mod" "raid0" "raid1" "raid10" "raid456" ];
boot.initrd.extraUdevRulesCommands = ''
cp -v ${pkgs.mdadm}/lib/udev/rules.d/*.rules $out/
'';
- systemd.services.mdadm-shutdown = {
- wantedBy = [ "final.target"];
- after = [ "umount.target" ];
-
- unitConfig = {
- DefaultDependencies = false;
- };
-
- serviceConfig = {
- Type = "oneshot";
- ExecStart = ''${pkgs.mdadm}/bin/mdadm --wait-clean --scan'';
- };
- };
-
- systemd.services."mdmon@" = {
- description = "MD Metadata Monitor on /dev/%I";
-
- unitConfig.DefaultDependencies = false;
-
- serviceConfig = {
- Type = "forking";
- Environment = "IMSM_NO_PLATFORM=1";
- ExecStart = ''${pkgs.mdadm}/bin/mdmon --offroot --takeover %I'';
- KillMode = "none";
- };
- };
-
- systemd.services."mdadm-grow-continue@" = {
- description = "Manage MD Reshape on /dev/%I";
-
- unitConfig.DefaultDependencies = false;
-
- serviceConfig = {
- ExecStart = ''${pkgs.mdadm}/bin/mdadm --grow --continue /dev/%I'';
- StandardInput = "null";
- StandardOutput = "null";
- StandardError = "null";
- KillMode = "none";
- };
- };
-
}
diff --git a/nixos/tests/systemd.nix b/nixos/tests/systemd.nix
index 4d470126abee..fadea52f1dbc 100644
--- a/nixos/tests/systemd.nix
+++ b/nixos/tests/systemd.nix
@@ -1,4 +1,4 @@
-import ./make-test.nix {
+import ./make-test.nix ({ pkgs, ... }: {
name = "systemd";
machine = { lib, ... }: {
@@ -21,6 +21,14 @@ import ./make-test.nix {
services.journald.extraConfig = "Storage=volatile";
services.xserver.displayManager.auto.user = "alice";
+ systemd.shutdown.test = pkgs.writeScript "test.shutdown" ''
+ #!${pkgs.stdenv.shell}
+ PATH=${lib.makeBinPath (with pkgs; [ utillinux coreutils ])}
+ mount -t 9p shared -o trans=virtio,version=9p2000.L /tmp/shared
+ touch /tmp/shared/shutdown-test
+ umount /tmp/shared
+ '';
+
systemd.services.testservice1 = {
description = "Test Service 1";
wantedBy = [ "multi-user.target" ];
@@ -69,5 +77,20 @@ import ./make-test.nix {
# has a last mount time, because the file system wasn't checked.
$machine->fail('dumpe2fs /dev/vdb | grep -q "^Last mount time: *n/a"');
};
+
+ # Regression test for https://github.com/NixOS/nixpkgs/issues/35268
+ subtest "file system with x-initrd.mount is not unmounted", sub {
+ $machine->shutdown;
+ $machine->waitForUnit('multi-user.target');
+ # If the file system was unmounted during the shutdown the file system
+ # has a last mount time, because the file system wasn't checked.
+ $machine->fail('dumpe2fs /dev/vdb | grep -q "^Last mount time: *n/a"');
+ };
+
+ subtest "systemd-shutdown works", sub {
+ $machine->shutdown;
+ $machine->waitForUnit('multi-user.target');
+ $machine->succeed('test -e /tmp/shared/shutdown-test');
+ };
'';
-}
+})
diff --git a/pkgs/os-specific/linux/mdadm/default.nix b/pkgs/os-specific/linux/mdadm/default.nix
index 4e0202cebf31..5aa9e9b43da6 100644
--- a/pkgs/os-specific/linux/mdadm/default.nix
+++ b/pkgs/os-specific/linux/mdadm/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, groff, system-sendmail }:
+{ stdenv, utillinux, coreutils, fetchurl, groff, system-sendmail }:
stdenv.mkDerivation rec {
name = "mdadm-4.1";
@@ -8,26 +8,37 @@ stdenv.mkDerivation rec {
sha256 = "0jjgjgqijpdp7ijh8slzzjjw690kydb1jjadf0x5ilq85628hxmb";
};
- # This is to avoid self-references, which causes the initrd to explode
- # in size and in turn prevents mdraid systems from booting.
- allowedReferences = [ stdenv.cc.libc.out system-sendmail ];
-
patches = [ ./no-self-references.patch ];
makeFlags = [
- "NIXOS=1" "INSTALL=install" "INSTALL_BINDIR=$(out)/sbin"
+ "NIXOS=1" "INSTALL=install" "BINDIR=$(out)/sbin"
+ "SYSTEMD_DIR=$(out)/lib/systemd/system"
"MANDIR=$(out)/share/man" "RUN_DIR=/dev/.mdadm"
"STRIP="
] ++ stdenv.lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
];
+ installFlags = [ "install-systemd" ];
+
+ enableParallelBuilding = true;
+
nativeBuildInputs = [ groff ];
- preConfigure = ''
+ postPatch = ''
sed -e 's@/lib/udev@''${out}/lib/udev@' \
-e 's@ -Werror @ @' \
-e 's@/usr/sbin/sendmail@${system-sendmail}@' -i Makefile
+ sed -i \
+ -e 's@/usr/bin/basename@${coreutils}/bin/basename@g' \
+ -e 's@BINDIR/blkid@${utillinux}/bin/blkid@g' \
+ *.rules
+ '';
+
+ # This is to avoid self-references, which causes the initrd to explode
+ # in size and in turn prevents mdraid systems from booting.
+ postFixup = ''
+ grep -r $out $out/bin && false || true
'';
meta = with stdenv.lib; {
diff --git a/pkgs/os-specific/linux/systemd/default.nix b/pkgs/os-specific/linux/systemd/default.nix
index 39aa855e3cc5..b7f1af618feb 100644
--- a/pkgs/os-specific/linux/systemd/default.nix
+++ b/pkgs/os-specific/linux/systemd/default.nix
@@ -24,8 +24,8 @@ stdenv.mkDerivation rec {
src = fetchFromGitHub {
owner = "NixOS";
repo = "systemd";
- rev = "aa4c4d39d75ce52664cb28d569b1ceafda7b4c06";
- sha256 = "1ax94gzbdwdcf3wgj7f9cabdkvn2zynnnli7gkbz4isidlpis86g";
+ rev = "5fb35fbc783516e2014115c3488134a2afb8494c";
+ sha256 = "0pyjvzzh8nnxv4z58n82lz1mjnzv44sylcjgkvw8sp35vx1ryxfh";
};
outputs = [ "out" "lib" "man" "dev" ];