2012-03-13 20:27:59 +01:00
|
|
|
{pkgs, config, ...}:
|
|
|
|
|
|
|
|
###### interface
|
|
|
|
let
|
|
|
|
inherit (pkgs.lib) mkOption mkIf;
|
|
|
|
|
|
|
|
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.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
efiDisk = mkOption {
|
|
|
|
default = "/dev/sda";
|
|
|
|
description = ''
|
|
|
|
The disk that contains the EFI system partition. Only used by
|
|
|
|
efibootmgr
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
efiPartition = mkOption {
|
|
|
|
default = "1";
|
|
|
|
description = ''
|
|
|
|
The partition number of the EFI system partition. Only used by
|
|
|
|
efibootmgr
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
efiSysMountPoint = mkOption {
|
|
|
|
default = "/boot";
|
|
|
|
description = ''
|
|
|
|
Where the EFI System Partition is mounted.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
runEfibootmgr = mkOption {
|
|
|
|
default = false;
|
|
|
|
description = ''
|
|
|
|
Whether to run efibootmgr to add the configuration to the boot options list.
|
2012-05-05 17:43:28 +02:00
|
|
|
WARNING! efibootmgr has been rumored to brick Apple firmware on
|
|
|
|
old kernels! Don't use it on kernels older than 2.6.39!
|
2012-03-13 20:27:59 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
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.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2012-05-05 00:16:35 +02:00
|
|
|
installShell = mkOption {
|
2012-03-16 03:34:07 +01:00
|
|
|
default = false;
|
|
|
|
description = ''
|
2012-05-05 00:16:35 +02:00
|
|
|
Whether to install an EFI shell in \EFI\BOOT.
|
|
|
|
This _should_ only be needed for removable devices
|
2012-03-16 03:34:07 +01:00
|
|
|
(CDs, usb sticks, etc.), but it may be an option for broken
|
2012-05-05 00:16:35 +02:00
|
|
|
systems where efibootmgr doesn't work. Particularly useful in
|
|
|
|
conjunction with installStartupNsh
|
2012-03-16 03:34:07 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2012-03-13 20:27:59 +01:00
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
in
|
|
|
|
|
|
|
|
###### implementation
|
|
|
|
let
|
2012-03-18 18:14:52 +01:00
|
|
|
efiBootStubBuilder = pkgs.substituteAll {
|
2012-03-13 20:27:59 +01:00
|
|
|
src = ./efi-boot-stub-builder.sh;
|
|
|
|
isExecutable = true;
|
|
|
|
inherit (pkgs) bash;
|
2012-03-16 03:34:07 +01:00
|
|
|
path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep pkgs.glibc] ++ (pkgs.stdenv.lib.optionals config.boot.loader.efiBootStub.runEfibootmgr [pkgs.efibootmgr pkgs.module_init_tools]);
|
2012-05-05 00:16:35 +02:00
|
|
|
inherit (config.boot.loader.efiBootStub) efiSysMountPoint runEfibootmgr installStartupNsh efiDisk efiPartition;
|
|
|
|
|
|
|
|
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";
|
2012-07-02 08:11:55 +02:00
|
|
|
sha256 = "1gv6kyaspczdp7x8qnx5x76ilriaygkfs99ay7ihhdi6riclkhfl";
|
2012-05-05 00:16:35 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
pkgs.fetchurl {
|
|
|
|
url = "https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/EdkShellBinPkg/FullShell/X64/Shell_Full.efi";
|
2012-07-02 08:11:55 +02:00
|
|
|
sha256 = "1g18z84rlavxr5gsrh2g942rfr6znv9fs3fqww5m7dhmnysgyv8p";
|
2012-05-05 00:16:35 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
null;
|
|
|
|
|
2012-03-13 20:27:59 +01:00
|
|
|
kernelFile = platform.kernelTarget;
|
2012-03-16 03:34:07 +01:00
|
|
|
targetArch = if pkgs.stdenv.isi686 then
|
|
|
|
"IA32"
|
|
|
|
else if pkgs.stdenv.isx86_64 then
|
2012-03-16 07:08:55 +01:00
|
|
|
"X64"
|
2012-03-16 03:34:07 +01:00
|
|
|
else
|
|
|
|
throw "Unsupported architecture";
|
2012-03-18 18:14:52 +01:00
|
|
|
};
|
2012-03-13 20:27:59 +01:00
|
|
|
|
|
|
|
# Temporary check, for nixos to cope both with nixpkgs stdenv-updates and trunk
|
|
|
|
platform = pkgs.stdenv.platform;
|
|
|
|
in
|
|
|
|
{
|
|
|
|
require = [
|
|
|
|
options
|
|
|
|
|
|
|
|
# config.system.build
|
|
|
|
# ../system/system-options.nix
|
|
|
|
];
|
|
|
|
|
2012-03-16 03:55:17 +01:00
|
|
|
system = mkIf (config.boot.loader.efiBootStub.enable && (assert
|
|
|
|
(config.boot.kernelPackages.kernel.features ? efiBootStub &&
|
|
|
|
config.boot.kernelPackages.kernel.features.efiBootStub); true)) {
|
2012-03-13 20:27:59 +01:00
|
|
|
build = {
|
|
|
|
menuBuilder = efiBootStubBuilder;
|
|
|
|
};
|
|
|
|
boot.loader.id = "efiBootStub";
|
|
|
|
boot.loader.kernelFile = platform.kernelTarget;
|
|
|
|
};
|
|
|
|
}
|