summaryrefslogtreecommitdiffstats
path: root/nixos
diff options
context:
space:
mode:
authorFlorian Franzen <Florian.Franzen@gmail.com>2019-01-28 12:00:58 +0100
committerFlorian Franzen <Florian.Franzen@gmail.com>2019-03-18 10:38:07 +0100
commite51a8402597b7d3ba505b35451c86c8c7bf63d5e (patch)
treebdae0783032c599a1ca0ac7c5e471f1a65dc5854 /nixos
parentca5004e26cb312bb8576a14788d073ee5db768b4 (diff)
grub: Support 32bit EFI on 64bit x86 platforms
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/installer/cd-dvd/iso-image.nix12
-rw-r--r--nixos/modules/system/boot/loader/grub/grub.nix35
2 files changed, 29 insertions, 18 deletions
diff --git a/nixos/modules/installer/cd-dvd/iso-image.nix b/nixos/modules/installer/cd-dvd/iso-image.nix
index 9475da23b1ff..2d41370e8aec 100644
--- a/nixos/modules/installer/cd-dvd/iso-image.nix
+++ b/nixos/modules/installer/cd-dvd/iso-image.nix
@@ -165,6 +165,8 @@ let
else
"# No refind for ${targetArch}"
;
+
+ grubPkgs = if config.boot.loader.grub.forcei686 then pkgs.pkgsi686Linux else pkgs;
grubMenuCfg = ''
#
@@ -241,7 +243,7 @@ let
# Modules that may or may not be available per-platform.
echo "Adding additional modules:"
for mod in efi_uga; do
- if [ -f ${pkgs.grub2_efi}/lib/grub/${pkgs.grub2_efi.grubTarget}/$mod.mod ]; then
+ if [ -f ${grubPkgs.grub2_efi}/lib/grub/${grubPkgs.grub2_efi.grubTarget}/$mod.mod ]; then
echo " - $mod"
MODULES+=" $mod"
fi
@@ -249,9 +251,9 @@ let
# Make our own efi program, we can't rely on "grub-install" since it seems to
# probe for devices, even with --skip-fs-probe.
- ${pkgs.grub2_efi}/bin/grub-mkimage -o $out/EFI/boot/boot${targetArch}.efi -p /EFI/boot -O ${pkgs.grub2_efi.grubTarget} \
+ ${grubPkgs.grub2_efi}/bin/grub-mkimage -o $out/EFI/boot/boot${targetArch}.efi -p /EFI/boot -O ${grubPkgs.grub2_efi.grubTarget} \
$MODULES
- cp ${pkgs.grub2_efi}/share/grub/unicode.pf2 $out/EFI/boot/
+ cp ${grubPkgs.grub2_efi}/share/grub/unicode.pf2 $out/EFI/boot/
cat <<EOF > $out/EFI/boot/grub.cfg
@@ -362,7 +364,7 @@ let
# Name used by UEFI for architectures.
targetArch =
- if pkgs.stdenv.isi686 then
+ if pkgs.stdenv.isi686 || config.boot.loader.grub.forcei686 then
"ia32"
else if pkgs.stdenv.isx86_64 then
"x64"
@@ -506,7 +508,7 @@ in
# here and it causes a cyclic dependency.
boot.loader.grub.enable = false;
- environment.systemPackages = [ pkgs.grub2 pkgs.grub2_efi ]
+ environment.systemPackages = [ grubPkgs.grub2 grubPkgs.grub2_efi ]
++ optional canx86BiosBoot pkgs.syslinux
;
diff --git a/nixos/modules/system/boot/loader/grub/grub.nix b/nixos/modules/system/boot/loader/grub/grub.nix
index a1537ad3cedc..d3cf8b29bb46 100644
--- a/nixos/modules/system/boot/loader/grub/grub.nix
+++ b/nixos/modules/system/boot/loader/grub/grub.nix
@@ -8,13 +8,17 @@ let
efi = config.boot.loader.efi;
- realGrub = if cfg.version == 1 then pkgs.grub
- else if cfg.zfsSupport then pkgs.grub2.override { zfsSupport = true; }
+ grubPkgs =
+ # 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; }
else if cfg.trustedBoot.enable
then if cfg.trustedBoot.isHPLaptop
- then pkgs.trustedGrub-for-HP
- else pkgs.trustedGrub
- else pkgs.grub2;
+ then grubPkgs.trustedGrub-for-HP
+ else grubPkgs.trustedGrub
+ else grubPkgs.grub2;
grub =
# Don't include GRUB if we're only generating a GRUB menu (e.g.,
@@ -58,14 +62,10 @@ let
version extraConfig extraPerEntryConfig extraEntries forceInstall useOSProber
extraEntriesBeforeNixOS extraPrepareConfig extraInitrd configurationLimit copyKernels
default fsIdentifier efiSupport efiInstallAsRemovable gfxmodeEfi gfxmodeBios;
- path = (makeBinPath ([
- pkgs.coreutils pkgs.gnused pkgs.gnugrep pkgs.findutils pkgs.diffutils pkgs.btrfs-progs
- pkgs.utillinux ]
- ++ (optional (cfg.efiSupport && (cfg.version == 2)) pkgs.efibootmgr)
- ++ (optionals cfg.useOSProber [pkgs.busybox pkgs.os-prober])
- )) + ":" + (makeSearchPathOutput "bin" "sbin" [
- pkgs.mdadm pkgs.utillinux
- ]);
+ path = with pkgs; makeBinPath (
+ [ coreutils gnused gnugrep findutils diffutils btrfs-progs utillinux mdadm ]
+ ++ optional (cfg.efiSupport && (cfg.version == 2)) efibootmgr
+ ++ optionals cfg.useOSProber [ busybox os-prober ]);
font = if cfg.font == null then ""
else (if lib.last (lib.splitString "." cfg.font) == "pf2"
then cfg.font
@@ -512,6 +512,15 @@ in
'';
};
+ forcei686 = mkOption {
+ default = false;
+ type = types.bool;
+ description = ''
+ Whether to force the use of a ia32 boot loader on x64 systems. Required
+ to install and run NixOS on 64bit x86 systems with 32bit (U)EFI.
+ '';
+ };
+
trustedBoot = {
enable = mkOption {