diff --git a/nixos/modules/installer/cd-dvd/iso-image.nix b/nixos/modules/installer/cd-dvd/iso-image.nix index 9475da23b1f..2d41370e8ae 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 < $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 a1537ad3ced..d3cf8b29bb4 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 {