2014-04-14 15:26:48 +01:00
|
|
|
|
{ config, lib, pkgs, ... }:
|
2009-01-02 16:07:34 +00:00
|
|
|
|
|
2014-04-14 15:26:48 +01:00
|
|
|
|
with lib;
|
2009-01-02 16:07:34 +00:00
|
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
2012-05-14 02:53:47 +01:00
|
|
|
|
cfg = config.boot.loader.grub;
|
|
|
|
|
|
2015-01-14 09:30:57 +00:00
|
|
|
|
efi = config.boot.loader.efi;
|
|
|
|
|
|
2019-08-08 21:48:27 +01:00
|
|
|
|
grubPkgs =
|
2019-01-28 11:00:58 +00:00
|
|
|
|
# Package set of targeted architecture
|
|
|
|
|
if cfg.forcei686 then pkgs.pkgsi686Linux else pkgs;
|
|
|
|
|
|
|
|
|
|
realGrub = if cfg.version == 1 then grubPkgs.grub
|
|
|
|
|
else if cfg.zfsSupport then grubPkgs.grub2.override { zfsSupport = true; }
|
2015-12-21 19:20:29 +00:00
|
|
|
|
else if cfg.trustedBoot.enable
|
|
|
|
|
then if cfg.trustedBoot.isHPLaptop
|
2019-01-28 11:00:58 +00:00
|
|
|
|
then grubPkgs.trustedGrub-for-HP
|
|
|
|
|
else grubPkgs.trustedGrub
|
|
|
|
|
else grubPkgs.grub2;
|
2013-06-04 13:05:07 +01:00
|
|
|
|
|
|
|
|
|
grub =
|
|
|
|
|
# Don't include GRUB if we're only generating a GRUB menu (e.g.,
|
|
|
|
|
# in EC2 instances).
|
|
|
|
|
if cfg.devices == ["nodev"]
|
|
|
|
|
then null
|
|
|
|
|
else realGrub;
|
2009-12-15 21:11:39 +00:00
|
|
|
|
|
2015-01-14 09:30:57 +00:00
|
|
|
|
grubEfi =
|
|
|
|
|
# EFI version of Grub v2
|
2015-04-29 19:18:47 +01:00
|
|
|
|
if cfg.efiSupport && (cfg.version == 2)
|
2015-02-13 22:40:41 +00:00
|
|
|
|
then realGrub.override { efiSupport = cfg.efiSupport; }
|
2015-01-14 09:30:57 +00:00
|
|
|
|
else null;
|
|
|
|
|
|
2012-07-25 14:27:51 +01:00
|
|
|
|
f = x: if x == null then "" else "" + x;
|
|
|
|
|
|
2015-06-10 23:47:08 +01:00
|
|
|
|
grubConfig = args:
|
|
|
|
|
let
|
|
|
|
|
efiSysMountPoint = if args.efiSysMountPoint == null then args.path else args.efiSysMountPoint;
|
|
|
|
|
efiSysMountPoint' = replaceChars [ "/" ] [ "-" ] efiSysMountPoint;
|
|
|
|
|
in
|
|
|
|
|
pkgs.writeText "grub-config.xml" (builtins.toXML
|
2015-06-10 19:50:21 +01:00
|
|
|
|
{ splashImage = f cfg.splashImage;
|
2018-08-29 04:53:10 +01:00
|
|
|
|
splashMode = f cfg.splashMode;
|
|
|
|
|
backgroundColor = f cfg.backgroundColor;
|
2012-07-25 14:27:51 +01:00
|
|
|
|
grub = f grub;
|
2015-02-09 03:31:14 +00:00
|
|
|
|
grubTarget = f (grub.grubTarget or "");
|
2018-03-01 19:38:53 +00:00
|
|
|
|
shell = "${pkgs.runtimeShell}";
|
2019-11-24 17:22:28 +00:00
|
|
|
|
fullName = lib.getName realGrub;
|
|
|
|
|
fullVersion = lib.getVersion realGrub;
|
2015-01-14 09:30:57 +00:00
|
|
|
|
grubEfi = f grubEfi;
|
2015-02-16 19:19:44 +00:00
|
|
|
|
grubTargetEfi = if cfg.efiSupport && (cfg.version == 2) then f (grubEfi.grubTarget or "") else "";
|
2015-05-25 22:57:20 +01:00
|
|
|
|
bootPath = args.path;
|
2015-06-13 14:00:43 +01:00
|
|
|
|
storePath = config.boot.loader.grub.storePath;
|
2015-06-10 23:47:08 +01:00
|
|
|
|
bootloaderId = if args.efiBootloaderId == null then "NixOS${efiSysMountPoint'}" else args.efiBootloaderId;
|
2016-05-25 09:34:54 +01:00
|
|
|
|
timeout = if config.boot.loader.timeout == null then -1 else config.boot.loader.timeout;
|
2019-07-21 17:39:07 +01:00
|
|
|
|
users = if cfg.users == {} || cfg.version != 1 then cfg.users else throw "GRUB version 1 does not support user accounts.";
|
2020-07-05 04:16:25 +01:00
|
|
|
|
theme = f cfg.theme;
|
2018-06-07 13:23:37 +01:00
|
|
|
|
inherit efiSysMountPoint;
|
2015-05-25 22:57:20 +01:00
|
|
|
|
inherit (args) devices;
|
|
|
|
|
inherit (efi) canTouchEfiVariables;
|
2013-06-04 13:05:07 +01:00
|
|
|
|
inherit (cfg)
|
2017-02-13 13:53:15 +00:00
|
|
|
|
version extraConfig extraPerEntryConfig extraEntries forceInstall useOSProber
|
2020-04-23 21:44:21 +01:00
|
|
|
|
extraGrubInstallArgs
|
2018-03-28 00:57:52 +01:00
|
|
|
|
extraEntriesBeforeNixOS extraPrepareConfig configurationLimit copyKernels
|
2019-03-21 10:00:39 +00:00
|
|
|
|
default fsIdentifier efiSupport efiInstallAsRemovable gfxmodeEfi gfxmodeBios gfxpayloadEfi gfxpayloadBios;
|
2019-01-28 11:00:58 +00:00
|
|
|
|
path = with pkgs; makeBinPath (
|
2020-11-24 15:29:28 +00:00
|
|
|
|
[ coreutils gnused gnugrep findutils diffutils btrfs-progs util-linux mdadm ]
|
2019-01-28 11:00:58 +00:00
|
|
|
|
++ optional (cfg.efiSupport && (cfg.version == 2)) efibootmgr
|
|
|
|
|
++ optionals cfg.useOSProber [ busybox os-prober ]);
|
2018-06-05 15:37:12 +01:00
|
|
|
|
font = if cfg.font == null then ""
|
|
|
|
|
else (if lib.last (lib.splitString "." cfg.font) == "pf2"
|
2017-06-10 14:53:24 +01:00
|
|
|
|
then cfg.font
|
2018-06-05 15:37:12 +01:00
|
|
|
|
else "${convertedFont}");
|
2012-07-25 00:16:27 +01:00
|
|
|
|
});
|
2011-09-14 19:20:50 +01:00
|
|
|
|
|
2019-08-13 22:52:01 +01:00
|
|
|
|
bootDeviceCounters = fold (device: attr: attr // { ${device} = (attr.${device} or 0) + 1; }) {}
|
2015-05-25 22:57:20 +01:00
|
|
|
|
(concatMap (args: args.devices) cfg.mirroredBoots);
|
|
|
|
|
|
2017-06-10 14:53:24 +01:00
|
|
|
|
convertedFont = (pkgs.runCommand "grub-font-converted.pf2" {}
|
|
|
|
|
(builtins.concatStringsSep " "
|
|
|
|
|
([ "${realGrub}/bin/grub-mkfont"
|
|
|
|
|
cfg.font
|
|
|
|
|
"--output" "$out"
|
|
|
|
|
] ++ (optional (cfg.fontSize!=null) "--size ${toString cfg.fontSize}")))
|
|
|
|
|
);
|
2018-08-29 04:55:00 +01:00
|
|
|
|
|
2020-04-28 03:35:31 +01:00
|
|
|
|
defaultSplash = pkgs.nixos-artwork.wallpapers.simple-dark-gray-bootloader.gnomeFilePath;
|
2009-01-02 16:07:34 +00:00
|
|
|
|
in
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
2009-09-29 10:50:38 +01:00
|
|
|
|
###### interface
|
|
|
|
|
|
|
|
|
|
options = {
|
2009-10-13 22:39:23 +01:00
|
|
|
|
|
2009-09-29 10:50:38 +01:00
|
|
|
|
boot.loader.grub = {
|
|
|
|
|
|
|
|
|
|
enable = mkOption {
|
2013-11-27 15:54:20 +00:00
|
|
|
|
default = !config.boot.isContainer;
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.bool;
|
2009-09-29 10:50:38 +01:00
|
|
|
|
description = ''
|
2009-10-13 22:39:23 +01:00
|
|
|
|
Whether to enable the GNU GRUB boot loader.
|
2009-09-29 10:50:38 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-10-13 22:39:18 +01:00
|
|
|
|
version = mkOption {
|
2013-10-07 10:06:08 +01:00
|
|
|
|
default = 2;
|
|
|
|
|
example = 1;
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.int;
|
2009-10-13 22:39:18 +01:00
|
|
|
|
description = ''
|
2013-10-07 10:05:33 +01:00
|
|
|
|
The version of GRUB to use: <literal>1</literal> for GRUB
|
2013-10-07 10:06:08 +01:00
|
|
|
|
Legacy (versions 0.9x), or <literal>2</literal> (the
|
|
|
|
|
default) for GRUB 2.
|
2009-10-13 22:39:18 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-29 10:50:38 +01:00
|
|
|
|
device = mkOption {
|
|
|
|
|
default = "";
|
2018-02-24 10:50:23 +00:00
|
|
|
|
example = "/dev/disk/by-id/wwn-0x500001234567890a";
|
2013-10-30 10:02:04 +00:00
|
|
|
|
type = types.str;
|
2009-10-13 22:39:23 +01:00
|
|
|
|
description = ''
|
2012-05-14 02:53:47 +01:00
|
|
|
|
The device on which the GRUB boot loader will be installed.
|
|
|
|
|
The special value <literal>nodev</literal> means that a GRUB
|
|
|
|
|
boot menu will be generated, but GRUB itself will not
|
|
|
|
|
actually be installed. To install GRUB on multiple devices,
|
|
|
|
|
use <literal>boot.loader.grub.devices</literal>.
|
2012-03-08 21:37:30 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
devices = mkOption {
|
|
|
|
|
default = [];
|
2018-02-24 10:50:23 +00:00
|
|
|
|
example = [ "/dev/disk/by-id/wwn-0x500001234567890a" ];
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.listOf types.str;
|
2012-03-08 21:37:30 +00:00
|
|
|
|
description = ''
|
|
|
|
|
The devices on which the boot loader, GRUB, will be
|
|
|
|
|
installed. Can be used instead of <literal>device</literal> to
|
2015-07-25 17:54:26 +01:00
|
|
|
|
install GRUB onto multiple devices.
|
2009-10-13 22:39:23 +01:00
|
|
|
|
'';
|
2009-09-29 10:50:38 +01:00
|
|
|
|
};
|
|
|
|
|
|
2019-07-21 17:39:07 +01:00
|
|
|
|
users = mkOption {
|
|
|
|
|
default = {};
|
|
|
|
|
example = {
|
|
|
|
|
root = { hashedPasswordFile = "/path/to/file"; };
|
|
|
|
|
};
|
|
|
|
|
description = ''
|
|
|
|
|
User accounts for GRUB. When specified, the GRUB command line and
|
|
|
|
|
all boot options except the default are password-protected.
|
|
|
|
|
All passwords and hashes provided will be stored in /boot/grub/grub.cfg,
|
|
|
|
|
and will be visible to any local user who can read this file. Additionally,
|
|
|
|
|
any passwords and hashes provided directly in a Nix configuration
|
|
|
|
|
(as opposed to external files) will be copied into the Nix store, and
|
|
|
|
|
will be visible to all local users.
|
|
|
|
|
'';
|
|
|
|
|
type = with types; attrsOf (submodule {
|
|
|
|
|
options = {
|
|
|
|
|
hashedPasswordFile = mkOption {
|
|
|
|
|
example = "/path/to/file";
|
|
|
|
|
default = null;
|
|
|
|
|
type = with types; uniq (nullOr str);
|
|
|
|
|
description = ''
|
|
|
|
|
Specifies the path to a file containing the password hash
|
|
|
|
|
for the account, generated with grub-mkpasswd-pbkdf2.
|
|
|
|
|
This hash will be stored in /boot/grub/grub.cfg, and will
|
|
|
|
|
be visible to any local user who can read this file.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
hashedPassword = mkOption {
|
|
|
|
|
example = "grub.pbkdf2.sha512.10000.674DFFDEF76E13EA...2CC972B102CF4355";
|
|
|
|
|
default = null;
|
|
|
|
|
type = with types; uniq (nullOr str);
|
|
|
|
|
description = ''
|
|
|
|
|
Specifies the password hash for the account,
|
|
|
|
|
generated with grub-mkpasswd-pbkdf2.
|
|
|
|
|
This hash will be copied to the Nix store, and will be visible to all local users.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
passwordFile = mkOption {
|
|
|
|
|
example = "/path/to/file";
|
|
|
|
|
default = null;
|
|
|
|
|
type = with types; uniq (nullOr str);
|
|
|
|
|
description = ''
|
|
|
|
|
Specifies the path to a file containing the
|
|
|
|
|
clear text password for the account.
|
|
|
|
|
This password will be stored in /boot/grub/grub.cfg, and will
|
|
|
|
|
be visible to any local user who can read this file.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
password = mkOption {
|
|
|
|
|
example = "Pa$$w0rd!";
|
|
|
|
|
default = null;
|
|
|
|
|
type = with types; uniq (nullOr str);
|
|
|
|
|
description = ''
|
|
|
|
|
Specifies the clear text password for the account.
|
|
|
|
|
This password will be copied to the Nix store, and will be visible to all local users.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2015-05-25 22:57:20 +01:00
|
|
|
|
mirroredBoots = mkOption {
|
|
|
|
|
default = [ ];
|
|
|
|
|
example = [
|
2018-02-24 10:50:23 +00:00
|
|
|
|
{ path = "/boot1"; devices = [ "/dev/disk/by-id/wwn-0x500001234567890a" ]; }
|
|
|
|
|
{ path = "/boot2"; devices = [ "/dev/disk/by-id/wwn-0x500009876543210a" ]; }
|
2015-05-25 22:57:20 +01:00
|
|
|
|
];
|
|
|
|
|
description = ''
|
|
|
|
|
Mirror the boot configuration to multiple partitions and install grub
|
|
|
|
|
to the respective devices corresponding to those partitions.
|
|
|
|
|
'';
|
|
|
|
|
|
2016-09-11 10:51:48 +01:00
|
|
|
|
type = with types; listOf (submodule {
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
|
|
path = mkOption {
|
|
|
|
|
example = "/boot1";
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = ''
|
|
|
|
|
The path to the boot directory where GRUB will be written. Generally
|
|
|
|
|
this boot path should double as an EFI path.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
efiSysMountPoint = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
example = "/boot1/efi";
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
description = ''
|
|
|
|
|
The path to the efi system mount point. Usually this is the same
|
|
|
|
|
partition as the above path and can be left as null.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
efiBootloaderId = mkOption {
|
|
|
|
|
default = null;
|
|
|
|
|
example = "NixOS-fsid";
|
|
|
|
|
type = types.nullOr types.str;
|
|
|
|
|
description = ''
|
|
|
|
|
The id of the bootloader to store in efi nvram.
|
|
|
|
|
The default is to name it NixOS and append the path or efiSysMountPoint.
|
|
|
|
|
This is only used if <literal>boot.loader.efi.canTouchEfiVariables</literal> is true.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
devices = mkOption {
|
|
|
|
|
default = [ ];
|
2018-02-24 10:50:23 +00:00
|
|
|
|
example = [ "/dev/disk/by-id/wwn-0x500001234567890a" "/dev/disk/by-id/wwn-0x500009876543210a" ];
|
2016-09-11 10:51:48 +01:00
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
description = ''
|
|
|
|
|
The path to the devices which will have the GRUB MBR written.
|
|
|
|
|
Note these are typically device paths and not paths to partitions.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2015-05-25 22:57:20 +01:00
|
|
|
|
|
|
|
|
|
};
|
2016-09-11 10:51:48 +01:00
|
|
|
|
});
|
2015-05-25 22:57:20 +01:00
|
|
|
|
};
|
|
|
|
|
|
2014-08-27 08:26:40 +01:00
|
|
|
|
configurationName = mkOption {
|
|
|
|
|
default = "";
|
|
|
|
|
example = "Stable 2.6.21";
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = ''
|
|
|
|
|
GRUB entry name instead of default.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2015-06-13 14:00:43 +01:00
|
|
|
|
storePath = mkOption {
|
|
|
|
|
default = "/nix/store";
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = ''
|
|
|
|
|
Path to the Nix store when looking for kernels at boot.
|
|
|
|
|
Only makes sense when copyKernels is false.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2012-04-02 18:19:21 +01:00
|
|
|
|
extraPrepareConfig = mkOption {
|
|
|
|
|
default = "";
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.lines;
|
2012-04-02 18:19:21 +01:00
|
|
|
|
description = ''
|
|
|
|
|
Additional bash commands to be run at the script that
|
2015-07-25 17:54:26 +01:00
|
|
|
|
prepares the GRUB menu entries.
|
2012-04-02 18:19:21 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2010-06-16 23:18:26 +01:00
|
|
|
|
extraConfig = mkOption {
|
|
|
|
|
default = "";
|
2020-02-15 21:45:47 +00:00
|
|
|
|
example = ''
|
|
|
|
|
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
|
|
|
|
|
terminal_input --append serial
|
|
|
|
|
terminal_output --append serial
|
|
|
|
|
'';
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.lines;
|
2010-06-16 23:18:26 +01:00
|
|
|
|
description = ''
|
|
|
|
|
Additional GRUB commands inserted in the configuration file
|
|
|
|
|
just before the menu entries.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2020-04-23 21:44:21 +01:00
|
|
|
|
extraGrubInstallArgs = mkOption {
|
|
|
|
|
default = [ ];
|
|
|
|
|
example = [ "--modules=nativedisk ahci pata part_gpt part_msdos diskfilter mdraid1x lvm ext2" ];
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
description = ''
|
|
|
|
|
Additional arguments passed to <literal>grub-install</literal>.
|
|
|
|
|
|
|
|
|
|
A use case for this is to build specific GRUB2 modules
|
|
|
|
|
directly into the GRUB2 kernel image, so that they are available
|
|
|
|
|
and activated even in the <literal>grub rescue</literal> shell.
|
|
|
|
|
|
|
|
|
|
They are also necessary when the BIOS/UEFI is bugged and cannot
|
|
|
|
|
correctly read large disks (e.g. above 2 TB), so GRUB2's own
|
|
|
|
|
<literal>nativedisk</literal> and related modules can be used
|
|
|
|
|
to use its own disk drivers. The example shows one such case.
|
|
|
|
|
This is also useful for booting from USB.
|
|
|
|
|
See the
|
|
|
|
|
<link xlink:href="http://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/commands/nativedisk.c?h=grub-2.04#n326">
|
|
|
|
|
GRUB source code
|
|
|
|
|
</link>
|
|
|
|
|
for which disk modules are available.
|
|
|
|
|
|
|
|
|
|
The list elements are passed directly as <literal>argv</literal>
|
|
|
|
|
arguments to the <literal>grub-install</literal> program, in order.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2021-01-02 17:23:49 +00:00
|
|
|
|
extraInstallCommands = mkOption {
|
|
|
|
|
default = "";
|
|
|
|
|
example = literalExample ''
|
|
|
|
|
# the example below generates detached signatures that GRUB can verify
|
|
|
|
|
# https://www.gnu.org/software/grub/manual/grub/grub.html#Using-digital-signatures
|
|
|
|
|
''${pkgs.findutils}/bin/find /boot -not -path "/boot/efi/*" -type f -name '*.sig' -delete
|
|
|
|
|
old_gpg_home=$GNUPGHOME
|
|
|
|
|
export GNUPGHOME="$(mktemp -d)"
|
|
|
|
|
''${pkgs.gnupg}/bin/gpg --import ''${priv_key} > /dev/null 2>&1
|
|
|
|
|
''${pkgs.findutils}/bin/find /boot -not -path "/boot/efi/*" -type f -exec ''${pkgs.gnupg}/bin/gpg --detach-sign "{}" \; > /dev/null 2>&1
|
|
|
|
|
rm -rf $GNUPGHOME
|
|
|
|
|
export GNUPGHOME=$old_gpg_home
|
|
|
|
|
'';
|
|
|
|
|
type = types.lines;
|
|
|
|
|
description = ''
|
|
|
|
|
Additional shell commands inserted in the bootloader installer
|
|
|
|
|
script after generating menu entries.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2010-07-22 15:40:29 +01:00
|
|
|
|
extraPerEntryConfig = mkOption {
|
|
|
|
|
default = "";
|
|
|
|
|
example = "root (hd0)";
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.lines;
|
2010-07-22 15:40:29 +01:00
|
|
|
|
description = ''
|
|
|
|
|
Additional GRUB commands inserted in the configuration file
|
|
|
|
|
at the start of each NixOS menu entry.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-29 10:50:38 +01:00
|
|
|
|
extraEntries = mkOption {
|
|
|
|
|
default = "";
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.lines;
|
2009-10-13 22:39:23 +01:00
|
|
|
|
example = ''
|
2012-03-28 11:34:40 +01:00
|
|
|
|
# GRUB 1 example (not GRUB 2 compatible)
|
2009-09-29 10:50:38 +01:00
|
|
|
|
title Windows
|
|
|
|
|
chainloader (hd0,1)+1
|
2012-03-28 11:34:40 +01:00
|
|
|
|
|
|
|
|
|
# GRUB 2 example
|
2014-04-20 18:41:15 +01:00
|
|
|
|
menuentry "Windows 7" {
|
|
|
|
|
chainloader (hd0,4)+1
|
2012-03-28 11:34:40 +01:00
|
|
|
|
}
|
2017-04-25 06:48:54 +01:00
|
|
|
|
|
|
|
|
|
# GRUB 2 with UEFI example, chainloading another distro
|
|
|
|
|
menuentry "Fedora" {
|
|
|
|
|
set root=(hd1,1)
|
|
|
|
|
chainloader /efi/fedora/grubx64.efi
|
|
|
|
|
}
|
2009-10-13 22:39:23 +01:00
|
|
|
|
'';
|
|
|
|
|
description = ''
|
|
|
|
|
Any additional entries you want added to the GRUB boot menu.
|
|
|
|
|
'';
|
2009-09-29 10:50:38 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extraEntriesBeforeNixOS = mkOption {
|
|
|
|
|
default = false;
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.bool;
|
2009-10-13 22:39:23 +01:00
|
|
|
|
description = ''
|
2009-09-29 10:50:38 +01:00
|
|
|
|
Whether extraEntries are included before the default option.
|
2009-10-13 22:39:23 +01:00
|
|
|
|
'';
|
2009-09-29 10:50:38 +01:00
|
|
|
|
};
|
|
|
|
|
|
2013-10-02 11:29:07 +01:00
|
|
|
|
extraFiles = mkOption {
|
2016-01-17 18:34:55 +00:00
|
|
|
|
type = types.attrsOf types.path;
|
2013-10-02 11:29:07 +01:00
|
|
|
|
default = {};
|
|
|
|
|
example = literalExample ''
|
2013-10-30 15:19:07 +00:00
|
|
|
|
{ "memtest.bin" = "''${pkgs.memtest86plus}/memtest.bin"; }
|
2013-10-02 11:29:07 +01:00
|
|
|
|
'';
|
|
|
|
|
description = ''
|
|
|
|
|
A set of files to be copied to <filename>/boot</filename>.
|
|
|
|
|
Each attribute name denotes the destination file name in
|
|
|
|
|
<filename>/boot</filename>, while the corresponding
|
|
|
|
|
attribute value specifies the source file.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2017-02-13 13:53:15 +00:00
|
|
|
|
useOSProber = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
|
|
|
|
If set to true, append entries for other OSs detected by os-prober.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-29 10:50:38 +01:00
|
|
|
|
splashImage = mkOption {
|
2015-02-23 17:00:21 +00:00
|
|
|
|
type = types.nullOr types.path;
|
2013-10-23 19:06:39 +01:00
|
|
|
|
example = literalExample "./my-background.png";
|
2009-10-13 22:39:23 +01:00
|
|
|
|
description = ''
|
2018-05-13 21:59:51 +01:00
|
|
|
|
Background image used for GRUB.
|
|
|
|
|
Set to <literal>null</literal> to run GRUB in text mode.
|
|
|
|
|
|
|
|
|
|
<note><para>
|
|
|
|
|
For grub 1:
|
|
|
|
|
It must be a 640x480,
|
2009-09-29 10:50:38 +01:00
|
|
|
|
14-colour image in XPM format, optionally compressed with
|
2018-05-13 21:59:51 +01:00
|
|
|
|
<command>gzip</command> or <command>bzip2</command>.
|
|
|
|
|
</para></note>
|
|
|
|
|
|
|
|
|
|
<note><para>
|
|
|
|
|
For grub 2:
|
|
|
|
|
File must be one of .png, .tga, .jpg, or .jpeg. JPEG images must
|
|
|
|
|
not be progressive.
|
|
|
|
|
The image will be scaled if necessary to fit the screen.
|
|
|
|
|
</para></note>
|
2009-10-13 22:39:23 +01:00
|
|
|
|
'';
|
2009-09-29 10:50:38 +01:00
|
|
|
|
};
|
|
|
|
|
|
2018-08-29 04:53:10 +01:00
|
|
|
|
backgroundColor = mkOption {
|
2019-08-08 21:48:27 +01:00
|
|
|
|
type = types.nullOr types.str;
|
2018-08-29 04:53:10 +01:00
|
|
|
|
example = "#7EBAE4";
|
|
|
|
|
default = null;
|
|
|
|
|
description = ''
|
|
|
|
|
Background color to be used for GRUB to fill the areas the image isn't filling.
|
|
|
|
|
|
|
|
|
|
<note><para>
|
|
|
|
|
This options has no effect for GRUB 1.
|
|
|
|
|
</para></note>
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2020-07-05 04:16:25 +01:00
|
|
|
|
theme = mkOption {
|
|
|
|
|
type = types.nullOr types.path;
|
|
|
|
|
example = literalExample "pkgs.nixos-grub2-theme";
|
|
|
|
|
default = null;
|
|
|
|
|
description = ''
|
|
|
|
|
Grub theme to be used.
|
|
|
|
|
|
|
|
|
|
<note><para>
|
|
|
|
|
This options has no effect for GRUB 1.
|
|
|
|
|
</para></note>
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2018-08-29 04:53:10 +01:00
|
|
|
|
splashMode = mkOption {
|
|
|
|
|
type = types.enum [ "normal" "stretch" ];
|
|
|
|
|
default = "stretch";
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to stretch the image or show the image in the top-left corner unstretched.
|
|
|
|
|
|
|
|
|
|
<note><para>
|
|
|
|
|
This options has no effect for GRUB 1.
|
|
|
|
|
</para></note>
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2017-06-10 14:53:24 +01:00
|
|
|
|
font = mkOption {
|
|
|
|
|
type = types.nullOr types.path;
|
|
|
|
|
default = "${realGrub}/share/grub/unicode.pf2";
|
2019-06-03 13:19:44 +01:00
|
|
|
|
defaultText = ''"''${pkgs.grub2}/share/grub/unicode.pf2"'';
|
2017-06-10 14:53:24 +01:00
|
|
|
|
description = ''
|
|
|
|
|
Path to a TrueType, OpenType, or pf2 font to be used by Grub.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
fontSize = mkOption {
|
|
|
|
|
type = types.nullOr types.int;
|
|
|
|
|
example = literalExample 16;
|
|
|
|
|
default = null;
|
|
|
|
|
description = ''
|
|
|
|
|
Font size for the grub menu. Ignored unless <literal>font</literal>
|
|
|
|
|
is set to a ttf or otf font.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2015-06-10 19:50:21 +01:00
|
|
|
|
gfxmodeEfi = mkOption {
|
|
|
|
|
default = "auto";
|
|
|
|
|
example = "1024x768";
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = ''
|
2015-07-25 17:54:26 +01:00
|
|
|
|
The gfxmode to pass to GRUB when loading a graphical boot interface under EFI.
|
2015-06-10 19:50:21 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
gfxmodeBios = mkOption {
|
|
|
|
|
default = "1024x768";
|
|
|
|
|
example = "auto";
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = ''
|
2015-07-25 17:54:26 +01:00
|
|
|
|
The gfxmode to pass to GRUB when loading a graphical boot interface under BIOS.
|
2015-06-10 19:50:21 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2019-03-21 10:00:39 +00:00
|
|
|
|
gfxpayloadEfi = mkOption {
|
|
|
|
|
default = "keep";
|
|
|
|
|
example = "text";
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = ''
|
2019-08-08 21:48:27 +01:00
|
|
|
|
The gfxpayload to pass to GRUB when loading a graphical boot interface under EFI.
|
2019-03-21 10:00:39 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
gfxpayloadBios = mkOption {
|
|
|
|
|
default = "text";
|
|
|
|
|
example = "keep";
|
|
|
|
|
type = types.str;
|
|
|
|
|
description = ''
|
2019-08-08 21:48:27 +01:00
|
|
|
|
The gfxpayload to pass to GRUB when loading a graphical boot interface under BIOS.
|
2019-03-21 10:00:39 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-29 10:50:38 +01:00
|
|
|
|
configurationLimit = mkOption {
|
|
|
|
|
default = 100;
|
|
|
|
|
example = 120;
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.int;
|
2009-10-13 22:39:23 +01:00
|
|
|
|
description = ''
|
2009-09-29 10:50:38 +01:00
|
|
|
|
Maximum of configurations in boot menu. GRUB has problems when
|
|
|
|
|
there are too many entries.
|
2009-10-13 22:39:23 +01:00
|
|
|
|
'';
|
2009-09-29 10:50:38 +01:00
|
|
|
|
};
|
2009-01-02 16:07:34 +00:00
|
|
|
|
|
2009-09-29 10:50:38 +01:00
|
|
|
|
copyKernels = mkOption {
|
|
|
|
|
default = false;
|
2013-10-07 10:05:33 +01:00
|
|
|
|
type = types.bool;
|
2009-10-13 22:39:23 +01:00
|
|
|
|
description = ''
|
|
|
|
|
Whether the GRUB menu builder should copy kernels and initial
|
2009-12-16 18:57:02 +00:00
|
|
|
|
ramdisks to /boot. This is done automatically if /boot is
|
|
|
|
|
on a different partition than /.
|
2009-10-13 22:39:23 +01:00
|
|
|
|
'';
|
2009-09-29 10:50:38 +01:00
|
|
|
|
};
|
2009-10-13 22:39:23 +01:00
|
|
|
|
|
2009-12-11 00:51:07 +00:00
|
|
|
|
default = mkOption {
|
2018-06-19 07:59:21 +01:00
|
|
|
|
default = "0";
|
2018-06-19 10:05:50 +01:00
|
|
|
|
type = types.either types.int types.str;
|
|
|
|
|
apply = toString;
|
2009-12-11 00:51:07 +00:00
|
|
|
|
description = ''
|
2009-12-15 18:21:55 +00:00
|
|
|
|
Index of the default menu item to be booted.
|
2009-12-11 00:51:07 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2014-08-31 17:18:13 +01:00
|
|
|
|
fsIdentifier = mkOption {
|
|
|
|
|
default = "uuid";
|
2016-11-04 04:05:13 +00:00
|
|
|
|
type = types.enum [ "uuid" "label" "provided" ];
|
2014-04-09 19:27:18 +01:00
|
|
|
|
description = ''
|
2015-07-25 17:54:26 +01:00
|
|
|
|
Determines how GRUB will identify devices when generating the
|
2014-08-31 17:18:13 +01:00
|
|
|
|
configuration file. A value of uuid / label signifies that grub
|
|
|
|
|
will always resolve the uuid or label of the device before using
|
2015-07-25 17:54:26 +01:00
|
|
|
|
it in the configuration. A value of provided means that GRUB will
|
2014-08-31 17:18:13 +01:00
|
|
|
|
use the device name as show in <command>df</command> or
|
|
|
|
|
<command>mount</command>. Note, zfs zpools / datasets are ignored
|
|
|
|
|
and will always be mounted using their labels.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
zfsSupport = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
2016-04-06 17:16:23 +01:00
|
|
|
|
Whether GRUB should be built against libzfs.
|
2015-01-14 09:30:57 +00:00
|
|
|
|
ZFS support is only available for GRUB v2.
|
|
|
|
|
This option is ignored for GRUB v1.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
efiSupport = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
2016-04-06 17:16:23 +01:00
|
|
|
|
Whether GRUB should be built with EFI support.
|
2015-01-14 09:30:57 +00:00
|
|
|
|
EFI support is only available for GRUB v2.
|
|
|
|
|
This option is ignored for GRUB v1.
|
2014-04-09 19:27:18 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2016-09-13 18:46:53 +01:00
|
|
|
|
efiInstallAsRemovable = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
2017-04-18 13:21:48 +01:00
|
|
|
|
Whether to invoke <literal>grub-install</literal> with
|
2016-09-16 19:12:35 +01:00
|
|
|
|
<literal>--removable</literal>.</para>
|
2016-09-13 18:46:53 +01:00
|
|
|
|
|
2016-09-16 19:12:35 +01:00
|
|
|
|
<para>Unless you turn this on, GRUB will install itself somewhere in
|
2016-09-16 18:09:50 +01:00
|
|
|
|
<literal>boot.loader.efi.efiSysMountPoint</literal> (exactly where
|
|
|
|
|
depends on other config variables). If you've set
|
2016-09-13 18:46:53 +01:00
|
|
|
|
<literal>boot.loader.efi.canTouchEfiVariables</literal> *AND* you
|
|
|
|
|
are currently booted in UEFI mode, then GRUB will use
|
2016-09-16 18:09:50 +01:00
|
|
|
|
<literal>efibootmgr</literal> to modify the boot order in the
|
|
|
|
|
EFI variables of your firmware to include this location. If you are
|
|
|
|
|
*not* booted in UEFI mode at the time GRUB is being installed, the
|
2016-09-13 18:46:53 +01:00
|
|
|
|
NVRAM will not be modified, and your system will not find GRUB at
|
2016-09-16 18:09:50 +01:00
|
|
|
|
boot time. However, GRUB will still return success so you may miss
|
|
|
|
|
the warning that gets printed ("<literal>efibootmgr: EFI variables
|
2016-09-16 19:12:35 +01:00
|
|
|
|
are not supported on this system.</literal>").</para>
|
2016-09-13 18:46:53 +01:00
|
|
|
|
|
2016-09-16 19:12:35 +01:00
|
|
|
|
<para>If you turn this feature on, GRUB will install itself in a
|
|
|
|
|
special location within <literal>efiSysMountPoint</literal> (namely
|
2016-09-16 18:09:50 +01:00
|
|
|
|
<literal>EFI/boot/boot$arch.efi</literal>) which the firmwares
|
2016-09-16 19:12:35 +01:00
|
|
|
|
are hardcoded to try first, regardless of NVRAM EFI variables.</para>
|
2016-09-13 18:46:53 +01:00
|
|
|
|
|
2016-09-16 19:12:35 +01:00
|
|
|
|
<para>To summarize, turn this on if:
|
2016-09-13 18:46:53 +01:00
|
|
|
|
<itemizedlist>
|
2016-09-16 19:12:35 +01:00
|
|
|
|
<listitem><para>You are installing NixOS and want it to boot in UEFI mode,
|
|
|
|
|
but you are currently booted in legacy mode</para></listitem>
|
|
|
|
|
<listitem><para>You want to make a drive that will boot regardless of
|
|
|
|
|
the NVRAM state of the computer (like a USB "removable" drive)</para></listitem>
|
|
|
|
|
<listitem><para>You simply dislike the idea of depending on NVRAM
|
|
|
|
|
state to make your drive bootable</para></listitem>
|
2017-04-18 13:21:48 +01:00
|
|
|
|
</itemizedlist>
|
2016-09-13 18:46:53 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2014-09-21 19:41:46 +01:00
|
|
|
|
enableCryptodisk = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
2015-07-25 17:54:26 +01:00
|
|
|
|
Enable support for encrypted partitions. GRUB should automatically
|
2014-09-21 19:41:46 +01:00
|
|
|
|
unlock the correct encrypted partition and look for filesystems.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2016-10-09 04:59:42 +01:00
|
|
|
|
forceInstall = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to try and forcibly install GRUB even if problems are
|
|
|
|
|
detected. It is not recommended to enable this unless you know what
|
|
|
|
|
you are doing.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2019-01-28 11:00:58 +00:00
|
|
|
|
forcei686 = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
2019-08-08 21:48:27 +01:00
|
|
|
|
Whether to force the use of a ia32 boot loader on x64 systems. Required
|
2019-01-28 11:00:58 +00:00
|
|
|
|
to install and run NixOS on 64bit x86 systems with 32bit (U)EFI.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2015-12-21 19:20:29 +00:00
|
|
|
|
trustedBoot = {
|
|
|
|
|
|
|
|
|
|
enable = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
|
|
|
|
Enable trusted boot. GRUB will measure all critical components during
|
|
|
|
|
the boot process to offer TCG (TPM) support.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
systemHasTPM = mkOption {
|
|
|
|
|
default = "";
|
|
|
|
|
example = "YES_TPM_is_activated";
|
2019-08-08 21:48:27 +01:00
|
|
|
|
type = types.str;
|
2015-12-21 19:20:29 +00:00
|
|
|
|
description = ''
|
|
|
|
|
Assertion that the target system has an activated TPM. It is a safety
|
|
|
|
|
check before allowing the activation of 'trustedBoot.enable'. TrustedBoot
|
|
|
|
|
WILL FAIL TO BOOT YOUR SYSTEM if no TPM is available.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
isHPLaptop = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
|
|
|
|
description = ''
|
|
|
|
|
Use a special version of TrustedGRUB that is needed by some HP laptops
|
|
|
|
|
and works only for the HP laptops.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2015-07-05 17:54:35 +01:00
|
|
|
|
|
2015-10-05 12:45:20 +01:00
|
|
|
|
};
|
|
|
|
|
|
2009-01-02 16:07:34 +00:00
|
|
|
|
};
|
Making modular my previous changes for armv5tel. I updated the way to use
grub. Its options are no more inside 'boot', but inside 'boot.loader.grub'.
I added a new bootloader configuration for nixos, generationsDir. It creates
/boot/default/{init,initrd,kernel,system} symlinks, and the same for the generations
in /boot/system-$gen/{init,initrd,kernel,system}.
I can program the u-boot loader to load /boot/default files always, and have
a minimal nixos boot loader installer functionality. Additionally, I can refer
to the other system generations easily, with a simple 'ls' in /boot.
svn path=/nixos/trunk/; revision=17460
2009-09-27 22:51:37 +01:00
|
|
|
|
|
2009-01-02 16:07:34 +00:00
|
|
|
|
};
|
2011-09-14 19:20:50 +01:00
|
|
|
|
|
2009-09-29 10:50:38 +01:00
|
|
|
|
|
|
|
|
|
###### implementation
|
2009-01-02 16:07:34 +00:00
|
|
|
|
|
2013-10-24 00:48:07 +01:00
|
|
|
|
config = mkMerge [
|
2011-09-14 19:20:50 +01:00
|
|
|
|
|
2013-10-24 00:48:07 +01:00
|
|
|
|
{ boot.loader.grub.splashImage = mkDefault (
|
|
|
|
|
if cfg.version == 1 then pkgs.fetchurl {
|
2020-04-01 02:11:51 +01:00
|
|
|
|
url = "http://www.gnome-look.org/CONTENT/content-files/36909-soft-tux.xpm.gz";
|
2013-10-24 00:48:07 +01:00
|
|
|
|
sha256 = "14kqdx2lfqvh40h6fjjzqgff1mwk74dmbjvmqphi6azzra7z8d59";
|
|
|
|
|
}
|
|
|
|
|
# GRUB 1.97 doesn't support gzipped XPMs.
|
2018-08-29 04:55:00 +01:00
|
|
|
|
else defaultSplash);
|
2013-10-24 00:48:07 +01:00
|
|
|
|
}
|
2012-05-14 02:53:47 +01:00
|
|
|
|
|
2018-08-29 04:55:00 +01:00
|
|
|
|
(mkIf (cfg.splashImage == defaultSplash) {
|
|
|
|
|
boot.loader.grub.backgroundColor = mkDefault "#2F302F";
|
|
|
|
|
boot.loader.grub.splashMode = mkDefault "normal";
|
|
|
|
|
})
|
|
|
|
|
|
2013-10-24 00:48:07 +01:00
|
|
|
|
(mkIf cfg.enable {
|
2013-10-23 19:06:39 +01:00
|
|
|
|
|
2013-10-24 00:48:07 +01:00
|
|
|
|
boot.loader.grub.devices = optional (cfg.device != "") cfg.device;
|
2013-10-17 12:30:49 +01:00
|
|
|
|
|
2015-05-25 22:57:20 +01:00
|
|
|
|
boot.loader.grub.mirroredBoots = optionals (cfg.devices != [ ]) [
|
|
|
|
|
{ path = "/boot"; inherit (cfg) devices; inherit (efi) efiSysMountPoint; }
|
|
|
|
|
];
|
|
|
|
|
|
2018-03-28 00:57:52 +01:00
|
|
|
|
boot.loader.supportsInitrdSecrets = true;
|
|
|
|
|
|
2016-09-01 09:36:38 +01:00
|
|
|
|
system.build.installBootLoader =
|
|
|
|
|
let
|
|
|
|
|
install-grub-pl = pkgs.substituteAll {
|
|
|
|
|
src = ./install-grub.pl;
|
2020-11-24 15:29:28 +00:00
|
|
|
|
utillinux = pkgs.util-linux;
|
2016-09-01 09:36:38 +01:00
|
|
|
|
btrfsprogs = pkgs.btrfs-progs;
|
|
|
|
|
};
|
2021-02-24 19:53:45 +00:00
|
|
|
|
perl = pkgs.perl.withPackages (p: with p; [
|
|
|
|
|
FileSlurp FileCopyRecursive
|
|
|
|
|
XMLLibXML XMLSAX XMLSAXBase
|
|
|
|
|
ListCompare JSON
|
|
|
|
|
]);
|
2016-09-01 09:36:38 +01:00
|
|
|
|
in pkgs.writeScript "install-grub.sh" (''
|
2018-03-01 19:38:53 +00:00
|
|
|
|
#!${pkgs.runtimeShell}
|
2015-05-25 22:57:20 +01:00
|
|
|
|
set -e
|
|
|
|
|
${optionalString cfg.enableCryptodisk "export GRUB_ENABLE_CRYPTODISK=y"}
|
|
|
|
|
'' + flip concatMapStrings cfg.mirroredBoots (args: ''
|
2021-02-24 19:53:45 +00:00
|
|
|
|
${perl}/bin/perl ${install-grub-pl} ${grubConfig args} $@
|
2021-01-02 17:23:49 +00:00
|
|
|
|
'') + cfg.extraInstallCommands);
|
Making modular my previous changes for armv5tel. I updated the way to use
grub. Its options are no more inside 'boot', but inside 'boot.loader.grub'.
I added a new bootloader configuration for nixos, generationsDir. It creates
/boot/default/{init,initrd,kernel,system} symlinks, and the same for the generations
in /boot/system-$gen/{init,initrd,kernel,system}.
I can program the u-boot loader to load /boot/default files always, and have
a minimal nixos boot loader installer functionality. Additionally, I can refer
to the other system generations easily, with a simple 'ls' in /boot.
svn path=/nixos/trunk/; revision=17460
2009-09-27 22:51:37 +01:00
|
|
|
|
|
2013-10-24 00:48:07 +01:00
|
|
|
|
system.build.grub = grub;
|
2009-10-13 22:39:18 +01:00
|
|
|
|
|
2013-10-24 00:48:07 +01:00
|
|
|
|
# Common attribute for boot loaders so only one of them can be
|
|
|
|
|
# set at once.
|
|
|
|
|
system.boot.loader.id = "grub";
|
2009-10-13 22:39:18 +01:00
|
|
|
|
|
2013-10-30 13:18:41 +00:00
|
|
|
|
environment.systemPackages = optional (grub != null) grub;
|
2013-10-02 11:29:07 +01:00
|
|
|
|
|
2013-10-24 00:48:07 +01:00
|
|
|
|
boot.loader.grub.extraPrepareConfig =
|
|
|
|
|
concatStrings (mapAttrsToList (n: v: ''
|
2020-01-13 03:39:03 +00:00
|
|
|
|
${pkgs.coreutils}/bin/cp -pf "${v}" "@bootPath@/${n}"
|
2013-10-24 00:48:07 +01:00
|
|
|
|
'') config.boot.loader.grub.extraFiles);
|
|
|
|
|
|
2015-05-25 22:57:20 +01:00
|
|
|
|
assertions = [
|
|
|
|
|
{
|
|
|
|
|
assertion = !cfg.zfsSupport || cfg.version == 2;
|
2015-07-25 17:54:26 +01:00
|
|
|
|
message = "Only GRUB version 2 provides ZFS support";
|
2015-05-25 22:57:20 +01:00
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
assertion = cfg.mirroredBoots != [ ];
|
|
|
|
|
message = "You must set the option ‘boot.loader.grub.devices’ or "
|
|
|
|
|
+ "'boot.loader.grub.mirroredBoots' to make the system bootable.";
|
|
|
|
|
}
|
|
|
|
|
{
|
2020-09-09 06:37:17 +01:00
|
|
|
|
assertion = cfg.efiSupport || all (c: c < 2) (mapAttrsToList (n: c: if n == "nodev" then 0 else c) bootDeviceCounters);
|
2015-05-25 22:57:20 +01:00
|
|
|
|
message = "You cannot have duplicated devices in mirroredBoots";
|
|
|
|
|
}
|
2015-07-05 17:54:35 +01:00
|
|
|
|
{
|
2015-12-21 19:20:29 +00:00
|
|
|
|
assertion = !cfg.trustedBoot.enable || cfg.version == 2;
|
2015-07-05 17:54:35 +01:00
|
|
|
|
message = "Trusted GRUB is only available for GRUB 2";
|
|
|
|
|
}
|
|
|
|
|
{
|
2015-12-21 19:20:29 +00:00
|
|
|
|
assertion = !cfg.efiSupport || !cfg.trustedBoot.enable;
|
2015-07-05 17:54:35 +01:00
|
|
|
|
message = "Trusted GRUB does not have EFI support";
|
|
|
|
|
}
|
|
|
|
|
{
|
2015-12-21 19:20:29 +00:00
|
|
|
|
assertion = !cfg.zfsSupport || !cfg.trustedBoot.enable;
|
2015-07-05 17:54:35 +01:00
|
|
|
|
message = "Trusted GRUB does not have ZFS support";
|
|
|
|
|
}
|
|
|
|
|
{
|
2015-12-21 19:20:29 +00:00
|
|
|
|
assertion = !cfg.trustedBoot.enable || cfg.trustedBoot.systemHasTPM == "YES_TPM_is_activated";
|
2015-10-05 12:45:20 +01:00
|
|
|
|
message = "Trusted GRUB can break the system! Confirm that the system has an activated TPM by setting 'systemHasTPM'.";
|
2015-07-05 17:54:35 +01:00
|
|
|
|
}
|
2016-09-13 18:46:53 +01:00
|
|
|
|
{
|
|
|
|
|
assertion = cfg.efiInstallAsRemovable -> cfg.efiSupport;
|
|
|
|
|
message = "If you wish to to use boot.loader.grub.efiInstallAsRemovable, then turn on boot.loader.grub.efiSupport";
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
assertion = cfg.efiInstallAsRemovable -> !config.boot.loader.efi.canTouchEfiVariables;
|
|
|
|
|
message = "If you wish to to use boot.loader.grub.efiInstallAsRemovable, then turn off boot.loader.efi.canTouchEfiVariables";
|
|
|
|
|
}
|
2015-05-25 22:57:20 +01:00
|
|
|
|
] ++ flip concatMap cfg.mirroredBoots (args: [
|
|
|
|
|
{
|
|
|
|
|
assertion = args.devices != [ ];
|
2015-12-10 18:52:08 +00:00
|
|
|
|
message = "A boot path cannot have an empty devices string in ${args.path}";
|
2015-05-25 22:57:20 +01:00
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
assertion = hasPrefix "/" args.path;
|
|
|
|
|
message = "Boot paths must be absolute, not ${args.path}";
|
|
|
|
|
}
|
|
|
|
|
{
|
2015-05-26 07:03:24 +01:00
|
|
|
|
assertion = if args.efiSysMountPoint == null then true else hasPrefix "/" args.efiSysMountPoint;
|
2016-05-31 15:52:40 +01:00
|
|
|
|
message = "EFI paths must be absolute, not ${args.efiSysMountPoint}";
|
2015-05-25 22:57:20 +01:00
|
|
|
|
}
|
2019-08-05 12:03:38 +01:00
|
|
|
|
] ++ forEach args.devices (device: {
|
2015-05-25 22:57:20 +01:00
|
|
|
|
assertion = device == "nodev" || hasPrefix "/" device;
|
2016-04-20 21:27:34 +01:00
|
|
|
|
message = "GRUB devices must be absolute paths, not ${device} in ${args.path}";
|
2015-05-25 22:57:20 +01:00
|
|
|
|
}));
|
2013-10-24 00:48:07 +01:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
];
|
2011-09-14 19:20:50 +01:00
|
|
|
|
|
2015-10-14 17:05:50 +01:00
|
|
|
|
|
|
|
|
|
imports =
|
2016-03-26 23:01:43 +00:00
|
|
|
|
[ (mkRemovedOptionModule [ "boot" "loader" "grub" "bootDevice" ] "")
|
2015-10-14 17:05:50 +01:00
|
|
|
|
(mkRenamedOptionModule [ "boot" "copyKernels" ] [ "boot" "loader" "grub" "copyKernels" ])
|
|
|
|
|
(mkRenamedOptionModule [ "boot" "extraGrubEntries" ] [ "boot" "loader" "grub" "extraEntries" ])
|
|
|
|
|
(mkRenamedOptionModule [ "boot" "extraGrubEntriesBeforeNixos" ] [ "boot" "loader" "grub" "extraEntriesBeforeNixOS" ])
|
|
|
|
|
(mkRenamedOptionModule [ "boot" "grubDevice" ] [ "boot" "loader" "grub" "device" ])
|
|
|
|
|
(mkRenamedOptionModule [ "boot" "bootMount" ] [ "boot" "loader" "grub" "bootDevice" ])
|
|
|
|
|
(mkRenamedOptionModule [ "boot" "grubSplashImage" ] [ "boot" "loader" "grub" "splashImage" ])
|
2018-03-28 00:57:52 +01:00
|
|
|
|
(mkRemovedOptionModule [ "boot" "loader" "grub" "extraInitrd" ] ''
|
|
|
|
|
This option has been replaced with the bootloader agnostic
|
|
|
|
|
boot.initrd.secrets option. To migrate to the initrd secrets system,
|
|
|
|
|
extract the extraInitrd archive into your main filesystem:
|
|
|
|
|
|
|
|
|
|
# zcat /boot/extra_initramfs.gz | cpio -idvmD /etc/secrets/initrd
|
|
|
|
|
/path/to/secret1
|
|
|
|
|
/path/to/secret2
|
|
|
|
|
|
|
|
|
|
then replace boot.loader.grub.extraInitrd with boot.initrd.secrets:
|
|
|
|
|
|
|
|
|
|
boot.initrd.secrets = {
|
|
|
|
|
"/path/to/secret1" = "/etc/secrets/initrd/path/to/secret1";
|
|
|
|
|
"/path/to/secret2" = "/etc/secrets/initrd/path/to/secret2";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
See the boot.initrd.secrets option documentation for more information.
|
|
|
|
|
'')
|
2015-10-14 17:05:50 +01:00
|
|
|
|
];
|
|
|
|
|
|
2009-01-02 16:07:34 +00:00
|
|
|
|
}
|