Remove old efi boot stub bootloader
Signed-off-by: Shea Levy <shea@shealevy.com>
This commit is contained in:
parent
762164c8a7
commit
a63b4dc555
@ -240,7 +240,6 @@
|
|||||||
./system/activation/top-level.nix
|
./system/activation/top-level.nix
|
||||||
./system/boot/kernel.nix
|
./system/boot/kernel.nix
|
||||||
./system/boot/kexec.nix
|
./system/boot/kexec.nix
|
||||||
./system/boot/loader/efi-boot-stub/efi-boot-stub.nix
|
|
||||||
./system/boot/loader/efi.nix
|
./system/boot/loader/efi.nix
|
||||||
./system/boot/loader/generations-dir/generations-dir.nix
|
./system/boot/loader/generations-dir/generations-dir.nix
|
||||||
./system/boot/loader/gummiboot/gummiboot.nix
|
./system/boot/loader/gummiboot/gummiboot.nix
|
||||||
|
@ -101,11 +101,6 @@ in zipModules ([]
|
|||||||
# ++ rename obsolete "environment.kdePackages" "environment.systemPackages" # !!! doesn't work!
|
# ++ rename obsolete "environment.kdePackages" "environment.systemPackages" # !!! doesn't work!
|
||||||
|
|
||||||
# Multiple efi bootloaders now
|
# Multiple efi bootloaders now
|
||||||
++ rename obsolete "boot.loader.efiBootStub.efiSysMountPoint" "boot.loader.efi.efiSysMountPoint"
|
|
||||||
++ rename obsolete "boot.loader.efiBootStub.efiDisk" "boot.loader.efi.efibootmgr.efiDisk"
|
|
||||||
++ rename obsolete "boot.loader.efiBootStub.efiPartition" "boot.loader.efi.efibootmgr.efiPartition"
|
|
||||||
++ rename obsolete "boot.loader.efiBootStub.postEfiBootMgrCommands" "boot.loader.efi.efibootmgr.postEfiBootMgrCommands"
|
|
||||||
++ rename obsolete "boot.loader.efiBootStub.runEfibootmgr" "boot.loader.efi.canTouchEfiVariables"
|
|
||||||
++ rename obsolete "boot.loader.efi.efibootmgr.enable" "boot.loader.efi.canTouchEfiVariables"
|
++ rename obsolete "boot.loader.efi.efibootmgr.enable" "boot.loader.efi.canTouchEfiVariables"
|
||||||
|
|
||||||
# NixOS environment changes
|
# NixOS environment changes
|
||||||
|
@ -1,131 +0,0 @@
|
|||||||
#! @bash@/bin/sh -e
|
|
||||||
|
|
||||||
shopt -s nullglob
|
|
||||||
|
|
||||||
export PATH=/empty
|
|
||||||
for i in @path@; do PATH=$PATH:$i/bin:$i/sbin; done
|
|
||||||
|
|
||||||
default=$1
|
|
||||||
if test -z "$1"; then
|
|
||||||
echo "Syntax: efi-boot-stub-builder.sh <DEFAULT-CONFIG>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "updating the efi system partition..."
|
|
||||||
|
|
||||||
# Convert a path to a file in the Nix store such as
|
|
||||||
# /nix/store/<hash>-<name>/file to <hash>-<name>-<file>.
|
|
||||||
# Also, efi executables need the .efi extension
|
|
||||||
cleanName() {
|
|
||||||
local path="$1"
|
|
||||||
echo "$path" | sed 's|^/nix/store/||' | sed 's|/|-|g' | sed 's|@kernelFile@$|@kernelFile@.efi|'
|
|
||||||
}
|
|
||||||
|
|
||||||
# Copy a file from the Nix store to the EFI system partition
|
|
||||||
declare -A filesCopied
|
|
||||||
|
|
||||||
copyToKernelsDir() {
|
|
||||||
local src="$1"
|
|
||||||
local dst="@efiSysMountPoint@/efi/nixos/$(cleanName $src)"
|
|
||||||
# Don't copy the file if $dst already exists. This means that we
|
|
||||||
# have to create $dst atomically to prevent partially copied
|
|
||||||
# kernels or initrd if this script is ever interrupted.
|
|
||||||
if ! test -e $dst; then
|
|
||||||
local dstTmp=$dst.tmp.$$
|
|
||||||
cp $src $dstTmp
|
|
||||||
mv $dstTmp $dst
|
|
||||||
fi
|
|
||||||
filesCopied[$dst]=1
|
|
||||||
result=$dst
|
|
||||||
}
|
|
||||||
|
|
||||||
# Copy its kernel, initrd, and startup script to the efi system partition
|
|
||||||
# Add the efibootmgr entry if requested
|
|
||||||
addEntry() {
|
|
||||||
local path="$1"
|
|
||||||
local generation="$2"
|
|
||||||
|
|
||||||
if ! test -e $path/kernel -a -e $path/initrd; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local kernel=$(readlink -f $path/kernel)
|
|
||||||
local initrd=$(readlink -f $path/initrd)
|
|
||||||
copyToKernelsDir $kernel; kernel=$result
|
|
||||||
copyToKernelsDir $initrd; initrd=$result
|
|
||||||
|
|
||||||
local startup="@efiSysMountPoint@/efi/nixos/generation-$generation-startup.nsh"
|
|
||||||
if ! test -e $startup; then
|
|
||||||
local dstTmp=$startup.tmp.$$
|
|
||||||
echo "$(echo $kernel | sed 's|@efiSysMountPoint@||' | sed 's|/|\\|g') systemConfig=$(readlink -f $path) init=$(readlink -f $path/init) initrd=$(echo $initrd | sed 's|@efiSysMountPoint@||' | sed 's|/|\\|g') $(cat $path/kernel-params)" > $dstTmp
|
|
||||||
mv $dstTmp $startup
|
|
||||||
fi
|
|
||||||
filesCopied[$startup]=1
|
|
||||||
|
|
||||||
if test -n "@runEfibootmgr@"; then
|
|
||||||
set +e
|
|
||||||
efibootmgr -c -d "@efiDisk@" -g -l $(echo $kernel | sed 's|@efiSysMountPoint@||' | sed 's|/|\\|g') -L "NixOS $generation Generation" -p "@efiPartition@" \
|
|
||||||
-u systemConfig=$(readlink -f $path) init=$(readlink -f $path/init) initrd=$(echo $initrd | sed 's|@efiSysMountPoint@||' | sed 's|/|\\|g') $(cat $path/kernel-params) > /dev/null 2>&1
|
|
||||||
set -e
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $(readlink -f "$path") = "$default"; then
|
|
||||||
if test -n "@runEfibootmgr@"; then
|
|
||||||
set +e
|
|
||||||
defaultbootnum=$(efibootmgr | grep "NixOS $generation Generation" | sed 's/Boot//' | sed 's/\*.*//')
|
|
||||||
set -e
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "@installStartupNsh@"; then
|
|
||||||
sed 's|.*@kernelFile@.efi|@kernelFile@.efi|' < $startup > "@efiSysMountPoint@/startup.nsh"
|
|
||||||
cp $kernel "@efiSysMountPoint@/@kernelFile@.efi"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
mkdir -p "@efiSysMountPoint@/efi/nixos/"
|
|
||||||
|
|
||||||
# Remove all old boot manager entries
|
|
||||||
if test -n "@runEfibootmgr@"; then
|
|
||||||
set +e
|
|
||||||
modprobe efivars > /dev/null 2>&1
|
|
||||||
for bootnum in $(efibootmgr | grep "NixOS" | grep "Generation" | sed 's/Boot//' | sed 's/\*.*//'); do
|
|
||||||
efibootmgr -B -b "$bootnum" > /dev/null 2>&1
|
|
||||||
done
|
|
||||||
set -e
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Add all generations of the system profile to the system partition, in reverse
|
|
||||||
# (most recent to least recent) order.
|
|
||||||
for generation in $(
|
|
||||||
(cd /nix/var/nix/profiles && ls -d system-*-link) \
|
|
||||||
| sed 's/system-\([0-9]\+\)-link/\1/' \
|
|
||||||
| sort -n -r); do
|
|
||||||
link=/nix/var/nix/profiles/system-$generation-link
|
|
||||||
addEntry $link $generation
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "@runEfibootmgr@"; then
|
|
||||||
set +e
|
|
||||||
efibootmgr -o $defaultbootnum > /dev/null 2>&1
|
|
||||||
set -e
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "@efiShell@"; then
|
|
||||||
mkdir -pv "@efiSysMountPoint@"/efi/boot
|
|
||||||
cp "@efiShell@" "@efiSysMountPoint@"/efi/boot/boot"@targetArch@".efi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove obsolete files from the EFI system partition
|
|
||||||
for fn in "@efiSysMountPoint@/efi/nixos/"*; do
|
|
||||||
if ! test "${filesCopied[$fn]}" = 1; then
|
|
||||||
rm -vf -- "$fn"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Run any extra commands users may need
|
|
||||||
if test -n "@runEfibootmgr@"; then
|
|
||||||
set +e
|
|
||||||
@postEfiBootMgrCommands@
|
|
||||||
set -e
|
|
||||||
fi
|
|
@ -1,98 +0,0 @@
|
|||||||
{pkgs, config, ...}:
|
|
||||||
|
|
||||||
with pkgs.lib;
|
|
||||||
|
|
||||||
let
|
|
||||||
efiBootStubBuilder = pkgs.substituteAll {
|
|
||||||
src = ./efi-boot-stub-builder.sh;
|
|
||||||
isExecutable = true;
|
|
||||||
inherit (pkgs) bash;
|
|
||||||
path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep pkgs.glibc] ++ (pkgs.stdenv.lib.optionals config.boot.loader.efi.canTouchEfiVariables [pkgs.efibootmgr pkgs.module_init_tools]);
|
|
||||||
inherit (config.boot.loader.efiBootStub) installStartupNsh;
|
|
||||||
|
|
||||||
inherit (config.boot.loader.efi) efiSysMountPoint;
|
|
||||||
|
|
||||||
inherit (config.boot.loader.efi.efibootmgr) efiDisk efiPartition postEfiBootMgrCommands;
|
|
||||||
|
|
||||||
runEfibootmgr = config.boot.loader.efi.canTouchEfiVariables;
|
|
||||||
|
|
||||||
efiShell = if config.boot.loader.efiBootStub.installShell then
|
|
||||||
if pkgs.stdenv.isi686 then
|
|
||||||
pkgs.fetchurl {
|
|
||||||
url = "https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/EdkShellBinPkg/FullShell/Ia32/Shell_Full.efi";
|
|
||||||
sha256 = "1gv6kyaspczdp7x8qnx5x76ilriaygkfs99ay7ihhdi6riclkhfl";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pkgs.fetchurl {
|
|
||||||
url = "https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/EdkShellBinPkg/FullShell/X64/Shell_Full.efi";
|
|
||||||
sha256 = "1g18z84rlavxr5gsrh2g942rfr6znv9fs3fqww5m7dhmnysgyv8p";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
null;
|
|
||||||
|
|
||||||
kernelFile = platform.kernelTarget;
|
|
||||||
targetArch = if pkgs.stdenv.isi686 then
|
|
||||||
"IA32"
|
|
||||||
else if pkgs.stdenv.isx86_64 then
|
|
||||||
"X64"
|
|
||||||
else
|
|
||||||
throw "Unsupported architecture";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Temporary check, for nixos to cope both with nixpkgs stdenv-updates and trunk
|
|
||||||
platform = pkgs.stdenv.platform;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options = {
|
|
||||||
boot = {
|
|
||||||
loader = {
|
|
||||||
efiBootStub = {
|
|
||||||
|
|
||||||
enable = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
Whether to use the linux kernel as an EFI bootloader.
|
|
||||||
When enabled, the kernel, initrd, and an EFI shell script
|
|
||||||
to boot the system are copied to the EFI system partition.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
installStartupNsh = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
Whether to install a startup.nsh in the root of the EFI system partition.
|
|
||||||
For now, it will just boot the latest version when run, the eventual goal
|
|
||||||
is to have a basic menu-type interface.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
installShell = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
Whether to install an EFI shell in \EFI\BOOT.
|
|
||||||
This _should_ only be needed for removable devices
|
|
||||||
(CDs, usb sticks, etc.), but it may be an option for broken
|
|
||||||
systems where efibootmgr doesn't work. Particularly useful in
|
|
||||||
conjunction with installStartupNsh
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkIf config.boot.loader.efiBootStub.enable {
|
|
||||||
assertions = [ { assertion = ! config.boot.kernelPackages.kernel ? features || config.boot.kernelPackages.kernel.features ? efiBootStub; message = "This kernel does not support the EFI boot stub"; } ];
|
|
||||||
|
|
||||||
system = {
|
|
||||||
build.installBootLoader = efiBootStubBuilder;
|
|
||||||
boot.loader.id = "efiBootStub";
|
|
||||||
boot.loader.kernelFile = platform.kernelTarget;
|
|
||||||
requiredKernelConfig = with config.lib.kernelConfig; [
|
|
||||||
(isYes "EFI_STUB")
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -12,32 +12,6 @@ with pkgs.lib;
|
|||||||
description = "Whether or not the installation process should modify efi boot variables.";
|
description = "Whether or not the installation process should modify efi boot variables.";
|
||||||
};
|
};
|
||||||
|
|
||||||
efibootmgr = {
|
|
||||||
efiDisk = mkOption {
|
|
||||||
default = "/dev/sda";
|
|
||||||
|
|
||||||
type = types.string;
|
|
||||||
|
|
||||||
description = "The disk that contains the EFI system partition.";
|
|
||||||
};
|
|
||||||
|
|
||||||
efiPartition = mkOption {
|
|
||||||
default = "1";
|
|
||||||
description = "The partition number of the EFI system partition.";
|
|
||||||
};
|
|
||||||
|
|
||||||
postEfiBootMgrCommands = mkOption {
|
|
||||||
default = "";
|
|
||||||
type = types.string;
|
|
||||||
description = ''
|
|
||||||
Shell commands to be executed immediately after efibootmgr has setup the system EFI.
|
|
||||||
Some systems do not follow the EFI specifications properly and insert extra entries.
|
|
||||||
Others will brick (fix by removing battery) on boot when it finds more than X entries.
|
|
||||||
This hook allows for running a few extra efibootmgr commands to combat these issues.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
efiSysMountPoint = mkOption {
|
efiSysMountPoint = mkOption {
|
||||||
default = "/boot";
|
default = "/boot";
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user