From d2f5dccdf3bf02ca3959b6edd7cd012699b4c88a Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Sun, 30 Oct 2022 15:49:02 -0400 Subject: [PATCH 1/3] nixos/generations-dir: create relative symlinks when copyKernels When /boot is on a separate partition, absolute symlinks can break boot loaders that assume the partition is mounted at /. For example, U-Boot's ext2load command follows the relative symlinks correctly but fails to follow the absolute symlink. --- .../loader/generations-dir/generations-dir-builder.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh b/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh index 041fd905fed1f..1a23a659a86dc 100644 --- a/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh +++ b/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh @@ -57,17 +57,19 @@ addEntry() { local kernel=$(readlink -f $path/kernel) local initrd=$(readlink -f $path/initrd) + local extraLnArgs="" if test -n "@copyKernels@"; then copyToKernelsDir $kernel; kernel=$result copyToKernelsDir $initrd; initrd=$result + extraLnArgs="-r" fi mkdir -p $outdir ln -sf $(readlink -f $path) $outdir/system ln -sf $(readlink -f $path/init) $outdir/init - ln -sf $initrd $outdir/initrd - ln -sf $kernel $outdir/kernel + ln -sf $extraLnArgs $initrd $outdir/initrd + ln -sf $extraLnArgs $kernel $outdir/kernel if test $(readlink -f "$path") = "$default"; then cp "$kernel" /boot/nixos-kernel @@ -78,8 +80,8 @@ addEntry() { # ln -sfT: overrides target even if it exists. ln -sfT $(readlink -f $path) /boot/default/system ln -sfT $(readlink -f $path/init) /boot/default/init - ln -sfT $initrd /boot/default/initrd - ln -sfT $kernel /boot/default/kernel + ln -sfT $extraLnArgs $initrd /boot/default/initrd + ln -sfT $extraLnArgs $kernel /boot/default/kernel fi } From bb9b8f64870856f213e1f261244b5c0f6d496a6d Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Sun, 30 Oct 2022 15:51:59 -0400 Subject: [PATCH 2/3] nixos/generations-dir: symlink default to system generation This makes it easier to quickly change the default boot profile. The contents of the 'default' directory are already symlinks, so anything that can follow symlinks currently should continue to do so. --- .../generations-dir/generations-dir-builder.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh b/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh index 1a23a659a86dc..926709bd91952 100644 --- a/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh +++ b/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh @@ -50,6 +50,7 @@ addEntry() { local path="$1" local generation="$2" local outdir=/boot/system-$generation + local defaultdir=/boot/default if ! test -e $path/kernel -a -e $path/initrd; then return @@ -76,12 +77,13 @@ addEntry() { cp "$initrd" /boot/nixos-initrd cp "$(readlink -f "$path/init")" /boot/nixos-init - mkdir -p /boot/default - # ln -sfT: overrides target even if it exists. - ln -sfT $(readlink -f $path) /boot/default/system - ln -sfT $(readlink -f $path/init) /boot/default/init - ln -sfT $extraLnArgs $initrd /boot/default/initrd - ln -sfT $extraLnArgs $kernel /boot/default/kernel + # Clean up the /boot/default directory created by earlier + # versions of generations-dir. + if test -d $defaultdir -a ! -L $defaultdir; then + rm -Rf $defaultdir + fi + + ln -sfrT $outdir $defaultdir fi } From 0fd9962b39915dc34599f7fc5e5f07467531ba4e Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Sun, 30 Oct 2022 17:56:31 -0400 Subject: [PATCH 3/3] nixos/generations-dir: add copyDefault option Adds an option to suppress the second full copy of the default profile files (kernel, initrd, init) made in /boot. --- .../generations-dir-builder.sh | 8 ++++--- .../generations-dir/generations-dir.nix | 21 ++++++++++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh b/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh index 926709bd91952..56830096a52fa 100644 --- a/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh +++ b/nixos/modules/system/boot/loader/generations-dir/generations-dir-builder.sh @@ -73,9 +73,11 @@ addEntry() { ln -sf $extraLnArgs $kernel $outdir/kernel if test $(readlink -f "$path") = "$default"; then - cp "$kernel" /boot/nixos-kernel - cp "$initrd" /boot/nixos-initrd - cp "$(readlink -f "$path/init")" /boot/nixos-init + if test -n "@copyDefault@"; then + cp "$kernel" /boot/nixos-kernel + cp "$initrd" /boot/nixos-initrd + cp "$(readlink -f "$path/init")" /boot/nixos-init + fi # Clean up the /boot/default directory created by earlier # versions of generations-dir. diff --git a/nixos/modules/system/boot/loader/generations-dir/generations-dir.nix b/nixos/modules/system/boot/loader/generations-dir/generations-dir.nix index 75d83d3190a31..360c9da34da44 100644 --- a/nixos/modules/system/boot/loader/generations-dir/generations-dir.nix +++ b/nixos/modules/system/boot/loader/generations-dir/generations-dir.nix @@ -19,7 +19,7 @@ let pkgs.gnused pkgs.gnugrep ]; - inherit (config.boot.loader.generationsDir) copyKernels; + inherit (config.boot.loader.generationsDir) copyKernels copyDefault; }; }; @@ -58,6 +58,25 @@ in ''; }; + copyDefault = mkOption { + default = true; + type = types.bool; + description = '' + Whether to copy the default system profile boot files to a second set + of files in `/boot` (`nixos-kernel`, `nixos-initrd`, `nixos-init`). + + Disable this option to save space on the `/boot` partition if your + boot loader can follow the `default` symlink. + + If you previously enabled this option, you need to clean up the old + files manually: + + ``` + rm -vf /boot/nixos-{kernel,initrd,init} + ``` + ''; + }; + }; };