summary refs log tree commit diff
path: root/nixos/modules/system/boot/stage-2-init.sh
diff options
context:
space:
mode:
authorJamey Sharp <jamey@minilop.net>2018-09-29 11:35:00 -0700
committerJamey Sharp <jamey@minilop.net>2018-09-30 10:45:35 -0700
commit8d40083690c2d20d20c32d7d90b9fd7b7f559042 (patch)
treeec7c212d074a9d26298110cabcfb9969e49bbf53 /nixos/modules/system/boot/stage-2-init.sh
parentf449242e83bd441300f009321157dd308326cfcc (diff)
downloadnixpkgs-8d40083690c2d20d20c32d7d90b9fd7b7f559042.tar
nixpkgs-8d40083690c2d20d20c32d7d90b9fd7b7f559042.tar.gz
nixpkgs-8d40083690c2d20d20c32d7d90b9fd7b7f559042.tar.bz2
nixpkgs-8d40083690c2d20d20c32d7d90b9fd7b7f559042.tar.lz
nixpkgs-8d40083690c2d20d20c32d7d90b9fd7b7f559042.tar.xz
nixpkgs-8d40083690c2d20d20c32d7d90b9fd7b7f559042.tar.zst
nixpkgs-8d40083690c2d20d20c32d7d90b9fd7b7f559042.zip
nixos/stage-2: create empty machine-id at boot
Previously, the activation script was responsible for ensuring that
/etc/machine-id exists. However, the only time it could not already
exist is during stage-2-init, not while switching configurations,
because one of the first things systemd does when starting up as PID 1
is to create this file. So I've moved the initialization to
stage-2-init.

Furthermore, since systemd will do the equivalent of
systemd-machine-id-setup if /etc/machine-id doesn't have valid contents,
we don't need to do that ourselves.

We _do_, however, want to ensure that the file at least exists, because
systemd also uses the non-existence of this file to guess that this is a
first-boot situation. In that case, systemd tries to create some
symlinks in /etc/systemd/system according to its presets, which it can't
do because we've already populated /etc according to the current NixOS
configuration.

This is not necessary for any other activation script snippets, so it's
okay to do it after stage-2-init runs the activation script. None of
them declare a dependency on the "systemd" snippet. Also, most of them
only create files or directories in ways that obviously don't need the
machine-id set.
Diffstat (limited to 'nixos/modules/system/boot/stage-2-init.sh')
-rw-r--r--nixos/modules/system/boot/stage-2-init.sh8
1 files changed, 8 insertions, 0 deletions
diff --git a/nixos/modules/system/boot/stage-2-init.sh b/nixos/modules/system/boot/stage-2-init.sh
index 49764b75a55..03daafa1ce4 100644
--- a/nixos/modules/system/boot/stage-2-init.sh
+++ b/nixos/modules/system/boot/stage-2-init.sh
@@ -152,6 +152,14 @@ ln -sfn /run/booted-system /nix/var/nix/gcroots/booted-system
 @shell@ @postBootCommands@
 
 
+# Ensure systemd doesn't try to populate /etc, by forcing its first-boot
+# heuristic off. It doesn't matter what's in /etc/machine-id for this purpose,
+# and systemd will immediately fill in the file when it starts, so just
+# creating it is enough. This `: >>` pattern avoids forking and avoids changing
+# the mtime if the file already exists.
+: >> /etc/machine-id
+
+
 # Reset the logging file descriptors.
 exec 1>&$logOutFd 2>&$logErrFd
 exec {logOutFd}>&- {logErrFd}>&-