installer: Adds AArch64 UEFI installer support.

This commit is contained in:
Samuel Dionne-Riel 2018-12-02 00:34:58 -05:00
parent e85c1f5868
commit ad27b068d7
2 changed files with 55 additions and 28 deletions

View file

@ -47,7 +47,8 @@ if test -n "$bootable"; then
isoBootFlags="-eltorito-boot ${bootImage} isoBootFlags="-eltorito-boot ${bootImage}
-eltorito-catalog .boot.cat -eltorito-catalog .boot.cat
-no-emul-boot -boot-load-size 4 -boot-info-table" -no-emul-boot -boot-load-size 4 -boot-info-table
--sort-weight 1 /isolinux" # Make sure isolinux is near the beginning of the ISO
fi fi
if test -n "$usbBootable"; then if test -n "$usbBootable"; then
@ -112,7 +113,7 @@ xorriso="xorriso
-r -r
-path-list pathlist -path-list pathlist
--sort-weight 0 / --sort-weight 0 /
--sort-weight 1 /isolinux" # Make sure isolinux is near the beginning of the ISO "
$xorriso -output $out/iso/$isoName $xorriso -output $out/iso/$isoName

View file

@ -50,7 +50,7 @@ let
finalCfg = { finalCfg = {
name = "NixOS ${config.system.nixos.label}${config.isoImage.appendToMenuLabel}"; name = "NixOS ${config.system.nixos.label}${config.isoImage.appendToMenuLabel}";
params = "init=${config.system.build.toplevel}/init ${additional} ${toString config.boot.kernelParams}"; params = "init=${config.system.build.toplevel}/init ${additional} ${toString config.boot.kernelParams}";
image = "/boot/bzImage"; image = "/boot/${config.system.boot.loader.kernelFile}";
initrd = "/boot/initrd"; initrd = "/boot/initrd";
}; };
in in
@ -163,7 +163,7 @@ let
cp -v ${pkgs.refind}/share/refind/refind_x64.efi $out/EFI/boot/ cp -v ${pkgs.refind}/share/refind/refind_x64.efi $out/EFI/boot/
'' ''
else else
"# No refind for ia32" "# No refind for ${targetArch}"
; ;
grubMenuCfg = '' grubMenuCfg = ''
@ -222,18 +222,34 @@ let
efiDir = pkgs.runCommand "efi-directory" {} '' efiDir = pkgs.runCommand "efi-directory" {} ''
mkdir -p $out/EFI/boot/ mkdir -p $out/EFI/boot/
# ALWAYS required modules.
MODULES="fat iso9660 part_gpt part_msdos \ MODULES="fat iso9660 part_gpt part_msdos \
normal boot linux configfile loopback chain halt \ normal boot linux configfile loopback chain halt \
efifwsetup efi_gop efi_uga \ efifwsetup efi_gop \
ls search search_label search_fs_uuid search_fs_file \ ls search search_label search_fs_uuid search_fs_file \
gfxmenu gfxterm gfxterm_background gfxterm_menu test all_video loadenv \ gfxmenu gfxterm gfxterm_background gfxterm_menu test all_video loadenv \
exfat ext2 ntfs btrfs hfsplus udf \ exfat ext2 ntfs btrfs hfsplus udf \
videoinfo png \ videoinfo png \
echo serial \ echo serial \
" "
echo "Building GRUB with modules:"
for mod in $MODULES; do
echo " - $mod"
done
# 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
echo " - $mod"
MODULES+=" $mod"
fi
done
# Make our own efi program, we can't rely on "grub-install" since it seems to # Make our own efi program, we can't rely on "grub-install" since it seems to
# probe for devices, even with --skip-fs-probe. # probe for devices, even with --skip-fs-probe.
${pkgs.grub2_efi}/bin/grub-mkimage -o $out/EFI/boot/${if targetArch == "x64" then "bootx64" else "bootia32"}.efi -p /EFI/boot -O ${if targetArch == "x64" then "x86_64" else "i386"}-efi \ ${pkgs.grub2_efi}/bin/grub-mkimage -o $out/EFI/boot/boot${targetArch}.efi -p /EFI/boot -O ${pkgs.grub2_efi.grubTarget} \
$MODULES $MODULES
cp ${pkgs.grub2_efi}/share/grub/unicode.pf2 $out/EFI/boot/ cp ${pkgs.grub2_efi}/share/grub/unicode.pf2 $out/EFI/boot/
@ -344,12 +360,19 @@ let
${pkgs.dosfstools}/sbin/fsck.vfat -vn "$out" ${pkgs.dosfstools}/sbin/fsck.vfat -vn "$out"
''; # */ ''; # */
targetArch = if pkgs.stdenv.isi686 then # Name used by UEFI for architectures.
"ia32" targetArch =
else if pkgs.stdenv.isx86_64 then if pkgs.stdenv.isi686 then
"x64" "ia32"
else else if pkgs.stdenv.isx86_64 then
throw "Unsupported architecture"; "x64"
else if pkgs.stdenv.isAarch64 then
"aa64"
else
throw "Unsupported architecture";
# Syslinux (and isolinux) only supports x86-based architectures.
canx86BiosBoot = pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64;
in in
@ -483,9 +506,9 @@ in
# here and it causes a cyclic dependency. # here and it causes a cyclic dependency.
boot.loader.grub.enable = false; boot.loader.grub.enable = false;
# !!! Hack - attributes expected by other modules. environment.systemPackages = [ pkgs.grub2 pkgs.grub2_efi ]
system.boot.loader.kernelFile = "bzImage"; ++ optional canx86BiosBoot pkgs.syslinux
environment.systemPackages = [ pkgs.grub2 pkgs.grub2_efi pkgs.syslinux ]; ;
# In stage 1 of the boot, mount the CD as the root FS by label so # In stage 1 of the boot, mount the CD as the root FS by label so
# that we don't need to know its device. We pass the label of the # that we don't need to know its device. We pass the label of the
@ -556,13 +579,7 @@ in
# Individual files to be included on the CD, outside of the Nix # Individual files to be included on the CD, outside of the Nix
# store on the CD. # store on the CD.
isoImage.contents = isoImage.contents =
[ { source = pkgs.substituteAll { [
name = "isolinux.cfg";
src = pkgs.writeText "isolinux.cfg-in" isolinuxCfg;
bootRoot = "/boot";
};
target = "/isolinux/isolinux.cfg";
}
{ source = config.boot.kernelPackages.kernel + "/" + config.system.boot.loader.kernelFile; { source = config.boot.kernelPackages.kernel + "/" + config.system.boot.loader.kernelFile;
target = "/boot/" + config.system.boot.loader.kernelFile; target = "/boot/" + config.system.boot.loader.kernelFile;
} }
@ -572,9 +589,6 @@ in
{ source = config.system.build.squashfsStore; { source = config.system.build.squashfsStore;
target = "/nix-store.squashfs"; target = "/nix-store.squashfs";
} }
{ source = "${pkgs.syslinux}/share/syslinux";
target = "/isolinux";
}
{ source = config.isoImage.efiSplashImage; { source = config.isoImage.efiSplashImage;
target = "/EFI/boot/efi-background.png"; target = "/EFI/boot/efi-background.png";
} }
@ -584,6 +598,17 @@ in
{ source = pkgs.writeText "version" config.system.nixos.label; { source = pkgs.writeText "version" config.system.nixos.label;
target = "/version.txt"; target = "/version.txt";
} }
] ++ optionals canx86BiosBoot [
{ source = pkgs.substituteAll {
name = "isolinux.cfg";
src = pkgs.writeText "isolinux.cfg-in" isolinuxCfg;
bootRoot = "/boot";
};
target = "/isolinux/isolinux.cfg";
}
{ source = "${pkgs.syslinux}/share/syslinux";
target = "/isolinux";
}
] ++ optionals config.isoImage.makeEfiBootable [ ] ++ optionals config.isoImage.makeEfiBootable [
{ source = efiImg; { source = efiImg;
target = "/boot/efi.img"; target = "/boot/efi.img";
@ -591,7 +616,7 @@ in
{ source = "${efiDir}/EFI"; { source = "${efiDir}/EFI";
target = "/EFI"; target = "/EFI";
} }
] ++ optionals config.boot.loader.grub.memtest86.enable [ ] ++ optionals (config.boot.loader.grub.memtest86.enable && canx86BiosBoot) [
{ source = "${pkgs.memtest86plus}/memtest.bin"; { source = "${pkgs.memtest86plus}/memtest.bin";
target = "/boot/memtest.bin"; target = "/boot/memtest.bin";
} }
@ -606,9 +631,10 @@ in
# Create the ISO image. # Create the ISO image.
system.build.isoImage = pkgs.callPackage ../../../lib/make-iso9660-image.nix ({ system.build.isoImage = pkgs.callPackage ../../../lib/make-iso9660-image.nix ({
inherit (config.isoImage) isoName compressImage volumeID contents; inherit (config.isoImage) isoName compressImage volumeID contents;
bootable = true; bootable = canx86BiosBoot;
bootImage = "/isolinux/isolinux.bin"; bootImage = "/isolinux/isolinux.bin";
} // optionalAttrs config.isoImage.makeUsbBootable { syslinux = if canx86BiosBoot then pkgs.syslinux else null;
} // optionalAttrs (config.isoImage.makeUsbBootable && canx86BiosBoot) {
usbBootable = true; usbBootable = true;
isohybridMbrImage = "${pkgs.syslinux}/share/syslinux/isohdpfx.bin"; isohybridMbrImage = "${pkgs.syslinux}/share/syslinux/isohdpfx.bin";
} // optionalAttrs config.isoImage.makeEfiBootable { } // optionalAttrs config.isoImage.makeEfiBootable {