nixos/stage-1: Added boot.initrd.logCommands

Changed files
+36 -2
nixos
modules
+26
nixos/modules/system/boot/stage-1-init.sh
···
mkdir -p /run
mount -t tmpfs -o "mode=0755,size=@runSize@" tmpfs /run
+
# Optionally log the script output to /dev/kmsg or /run/log/stage-1-init.log
+
if test -n "@logCommands@"; then
+
mkdir -p /tmp
+
mkfifo /tmp/stage-1-init.log.fifo
+
logOutFd=8 && logErrFd=9
+
eval "exec $logOutFd>&1 $logErrFd>&2"
+
if test -w /dev/kmsg; then
+
tee -i < /tmp/stage-1-init.log.fifo /proc/self/fd/"$logOutFd" | while read line; do
+
if test -n "$line"; then
+
echo "stage-1-init: $line" > /dev/kmsg
+
fi
+
done &
+
else
+
mkdir -p /run/log
+
tee -i < /tmp/stage-1-init.log.fifo /run/log/stage-1-init.log &
+
fi
+
exec > /tmp/stage-1-init.log.fifo 2>&1
+
fi
# Process the kernel command line.
export stage2Init=/init
···
# Stop udevd.
udevadm control --exit
+
+
# Reset the logging file descriptors.
+
# Do this just before pkill, which will kill the tee process.
+
if test -n "@logCommands@"
+
then
+
exec 1>&$logOutFd 2>&$logErrFd
+
eval "exec $logOutFd>&- $logErrFd>&-"
+
fi
# Kill any remaining processes, just to be sure we're not taking any
# with us into stage 2. But keep storage daemons like unionfs-fuse.
+10 -2
nixos/modules/system/boot/stage-1.nix
···
inherit (config.boot) resumeDevice devSize runSize;
-
inherit (config.boot.initrd) checkJournalingFS
-
preLVMCommands preDeviceCommands postDeviceCommands postMountCommands kernelModules;
+
inherit (config.boot.initrd) checkJournalingFS
+
logCommands preLVMCommands preDeviceCommands postDeviceCommands postMountCommands kernelModules;
resumeDevices = map (sd: if sd ? device then sd.device else "/dev/disk/by-label/${sd.label}")
(filter (sd: (sd ? label || hasPrefix "/dev/" sd.device) && !sd.randomEncryption) config.swapDevices);
···
Specify here the device where the file resides.
You should also use <varname>boot.kernelParams</varname> to specify
<literal><replaceable>resume_offset</replaceable></literal>.
+
'';
+
};
+
+
boot.initrd.logCommands = mkOption {
+
default = false;
+
type = types.bool;
+
description = ''
+
Whether to replicate command output of stage-1 booting to <filename>/dev/kmsg</filename> or <filename>/run/log/stage-1-init.log</filename> if <filename>/dev/kmsg</filename> is not writable.
'';
};