3
0
Fork 0
forked from mirrors/nixpkgs

Enable building an efi-bootable ISO

svn path=/nixos/trunk/; revision=33140
This commit is contained in:
Shea Levy 2012-03-16 05:37:24 +00:00
parent b89a65e54c
commit 8efda48496
5 changed files with 61 additions and 5 deletions

View file

@ -19,9 +19,15 @@
, # Whether this should be an El-Torito bootable CD. , # Whether this should be an El-Torito bootable CD.
bootable ? false bootable ? false
, # Whether this should be an efi-bootable El-Torito CD.
efiBootable ? false
, # The path (in the ISO file system) of the boot image. , # The path (in the ISO file system) of the boot image.
bootImage ? "" bootImage ? ""
, # The path (in the ISO file system) of the efi boot image.
efiBootImage ? ""
, # Whether to compress the resulting ISO image with bzip2. , # Whether to compress the resulting ISO image with bzip2.
compressImage ? false compressImage ? false
@ -31,13 +37,14 @@
}: }:
assert bootable -> bootImage != ""; assert bootable -> bootImage != "";
assert efiBootable -> efiBootImage != "";
stdenv.mkDerivation { stdenv.mkDerivation {
name = "iso9660-image"; name = "iso9660-image";
builder = ./make-iso9660-image.sh; builder = ./make-iso9660-image.sh;
buildInputs = [perl cdrkit]; buildInputs = [perl cdrkit];
inherit isoName bootable bootImage compressImage volumeID pathsFromGraph; inherit isoName bootable bootImage compressImage volumeID pathsFromGraph efiBootImage efiBootable;
# !!! should use XML. # !!! should use XML.
sources = map (x: x.source) contents; sources = map (x: x.source) contents;

View file

@ -34,6 +34,9 @@ if test -n "$bootable"; then
bootFlags="-b $bootImage -c .boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table" bootFlags="-b $bootImage -c .boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table"
fi fi
if test -n "$efiBootable"; then
bootFlags="$bootFlags -eltorito-alt-boot -e $efiBootImage -no-emul-boot"
fi
touch pathlist touch pathlist

View file

@ -3,6 +3,20 @@
{ {
require = [ ./installation-cd-graphical.nix ]; require = [ ./installation-cd-graphical.nix ];
boot.kernelPackages = pkgs.linuxPackages_3_2; boot.kernelPackages = pkgs.linuxPackages_3_3;
boot.vesa = false; boot.vesa = false;
# What follows should probably move into base once the base kernel has the
# efi boot stub
# Get a console as soon as the initrd loads fbcon on EFI boot
boot.initrd.kernelModules = [ "fbcon" ];
# Enable reading EFI variables via sysfs
boot.kernelModules = [ "efivars" ];
# efi-related tools
environment.systemPackages = [ pkgs.efibootmgr ];
isoImage.makeEfiBootable = true;
} }

View file

@ -73,6 +73,14 @@ let
''; '';
}; };
isoImage.makeEfiBootable = mkOption {
default = false;
description = ''
Whether the ISO image should be an efi-bootable volume
'';
};
}; };
@ -110,6 +118,20 @@ let
${config.boot.loader.grub.extraEntries} ${config.boot.loader.grub.extraEntries}
''; '';
# The boot params for the efi boot stub
bootParams = pkgs.runCommand "boot-params_eltorito" {}
''
echo "\\boot\\bzImage initrd=\\boot\\initrd init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}" | iconv -f utf-8 -t UCS-2 > $out
'';
targetArch = if pkgs.stdenv.isi686 then
"IA32"
else if pkgs.stdenv.isx86_64 then
"x64"
else
throw "Unsupported architecture";
in in
{ {
@ -220,6 +242,13 @@ in
source = pkgs.runCommand "empty" {} "ensureDir $out"; source = pkgs.runCommand "empty" {} "ensureDir $out";
target = "/nix/store"; target = "/nix/store";
} }
] ++ pkgs.stdenv.lib.optionals config.isoImage.makeEfiBootable [
{ source = bootParams;
target = "/efi/nixos/boot-params";
}
{ source = "${pkgs.NixosBootPkg}/*/NixosBoot.efi";
target = "/efi/boot/boot${targetArch}.efi";
}
]; ];
# The Grub menu. # The Grub menu.
@ -239,14 +268,17 @@ in
boot.loader.grub.timeout = 10; boot.loader.grub.timeout = 10;
# Create the ISO image. # Create the ISO image.
system.build.isoImage = import ../../../lib/make-iso9660-image.nix { system.build.isoImage = import ../../../lib/make-iso9660-image.nix ({
inherit (pkgs) stdenv perl cdrkit pathsFromGraph; inherit (pkgs) stdenv perl cdrkit pathsFromGraph;
inherit (config.isoImage) isoName compressImage volumeID contents; inherit (config.isoImage) isoName compressImage volumeID contents;
bootable = true; bootable = true;
bootImage = "/boot/grub/grub_eltorito"; bootImage = "/boot/grub/grub_eltorito";
}; } // pkgs.stdenv.lib.optionalAttrs config.isoImage.makeEfiBootable {
efiBootable = true;
efiBootImage = "efi/boot/boot${targetArch}.efi";
});
boot.postBootCommands = boot.postBootCommands =
'' ''

View file

@ -88,7 +88,7 @@ let
inherit (config.boot.loader.efiBootStub) efiSysMountPoint runEfibootmgr installStartupNsh efiDisk efiPartition installRemovableMediaImage; inherit (config.boot.loader.efiBootStub) efiSysMountPoint runEfibootmgr installStartupNsh efiDisk efiPartition installRemovableMediaImage;
kernelFile = platform.kernelTarget; kernelFile = platform.kernelTarget;
} // pkgs.stdenv.lib.optionalAttrs config.boot.loader.efiBootStub.installRemovableMediaImage { } // pkgs.stdenv.lib.optionalAttrs config.boot.loader.efiBootStub.installRemovableMediaImage {
removableMediaImage = "${pkgs.NixosBootPkg}/X64/NixosBoot.efi"; removableMediaImage = "${pkgs.NixosBootPkg}/*/NixosBoot.efi";
targetArch = if pkgs.stdenv.isi686 then targetArch = if pkgs.stdenv.isi686 then
"IA32" "IA32"
else if pkgs.stdenv.isx86_64 then else if pkgs.stdenv.isx86_64 then