From 55208cc2e18bf40a76e6c9ae7c16108d80fed666 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pa=C5=82ka?= Date: Fri, 12 May 2017 06:34:38 +0000 Subject: [PATCH] pvgrub_image: add package Add a package containing a pvgrub image for xen generated from grub2 --- pkgs/tools/misc/grub/2.0x.nix | 5 ++- .../pvgrub_image/configs/grub-bootstrap.cfg | 1 + .../misc/grub/pvgrub_image/configs/grub.cfg | 10 +++++ pkgs/tools/misc/grub/pvgrub_image/default.nix | 42 +++++++++++++++++++ pkgs/top-level/all-packages.nix | 6 +++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 pkgs/tools/misc/grub/pvgrub_image/configs/grub-bootstrap.cfg create mode 100644 pkgs/tools/misc/grub/pvgrub_image/configs/grub.cfg create mode 100644 pkgs/tools/misc/grub/pvgrub_image/default.nix diff --git a/pkgs/tools/misc/grub/2.0x.nix b/pkgs/tools/misc/grub/2.0x.nix index 7a70f2bdbff3..2bbeea8133e7 100644 --- a/pkgs/tools/misc/grub/2.0x.nix +++ b/pkgs/tools/misc/grub/2.0x.nix @@ -3,6 +3,7 @@ , zfs ? null , efiSupport ? false , zfsSupport ? true +, xenSupport ? false }: with stdenv.lib; @@ -46,6 +47,7 @@ in ( assert efiSupport -> canEfi; assert zfsSupport -> zfs != null; +assert !(efiSupport && xenSupport); stdenv.mkDerivation rec { name = "grub-${version}"; @@ -98,7 +100,8 @@ stdenv.mkDerivation rec { patches = [ ./fix-bash-completion.patch ]; configureFlags = optional zfsSupport "--enable-libzfs" - ++ optionals efiSupport [ "--with-platform=efi" "--target=${efiSystemsBuild.${stdenv.system}.target}" "--program-prefix=" ]; + ++ optionals efiSupport [ "--with-platform=efi" "--target=${efiSystemsBuild.${stdenv.system}.target}" "--program-prefix=" ] + ++ optionals xenSupport [ "--with-platform=xen" "--target=${efiSystemsBuild.${stdenv.system}.target}"]; # save target that grub is compiled for grubTarget = if efiSupport diff --git a/pkgs/tools/misc/grub/pvgrub_image/configs/grub-bootstrap.cfg b/pkgs/tools/misc/grub/pvgrub_image/configs/grub-bootstrap.cfg new file mode 100644 index 000000000000..e9883149ab5d --- /dev/null +++ b/pkgs/tools/misc/grub/pvgrub_image/configs/grub-bootstrap.cfg @@ -0,0 +1 @@ +normal (memdisk)/grub.cfg diff --git a/pkgs/tools/misc/grub/pvgrub_image/configs/grub.cfg b/pkgs/tools/misc/grub/pvgrub_image/configs/grub.cfg new file mode 100644 index 000000000000..69115b7101c9 --- /dev/null +++ b/pkgs/tools/misc/grub/pvgrub_image/configs/grub.cfg @@ -0,0 +1,10 @@ +# The parentheses around ${root} here to match Grub's config file syntax +if search -s -f /boot/grub/grub.cfg ; then + echo "Reading (${root})/boot/grub/grub.cfg" + configfile /boot/grub/grub.cfg +fi + +if search -s -f /grub/grub.cfg ; then + echo "Reading (${root})/grub/grub.cfg" + configfile /grub/grub.cfg +fi diff --git a/pkgs/tools/misc/grub/pvgrub_image/default.nix b/pkgs/tools/misc/grub/pvgrub_image/default.nix new file mode 100644 index 000000000000..ee6e5065f40b --- /dev/null +++ b/pkgs/tools/misc/grub/pvgrub_image/default.nix @@ -0,0 +1,42 @@ +{ stdenv, grub2_xen }: + +with stdenv.lib; +let + efiSystemsBuild = { + "i686-linux".target = "i386"; + "x86_64-linux".target = "x86_64"; + "aarch64-linux".target = "aarch64"; + }; + +in ( + +stdenv.mkDerivation rec { + name = "pvgrub-image"; + + configs = ./configs; + + buildInputs = [ grub2_xen ]; + + buildCommand = '' + cp "${configs}"/* . + tar -cf memdisk.tar grub.cfg + # We include all modules except all_video.mod as otherwise grub will fail printing "no symbol table" + # if we include it. + grub-mkimage -O "${efiSystemsBuild.${stdenv.system}.target}-xen" -c grub-bootstrap.cfg \ + -m memdisk.tar -o "grub-${efiSystemsBuild.${stdenv.system}.target}-xen.bin" \ + $(ls "${grub2_xen}/lib/grub/${efiSystemsBuild.${stdenv.system}.target}-xen/" |grep 'mod''$'|grep -v '^all_video\.mod''$') + mkdir -p "$out/lib/grub-xen" + cp "grub-${efiSystemsBuild.${stdenv.system}.target}-xen.bin" $out/lib/grub-xen/ + ''; + + meta = with stdenv.lib; { + description = "PvGrub image for use for booting PV Xen guests"; + + longDescription = + '' This package provides a PvGrub image for booting Para-Virtualized (PV) + Xen guests + ''; + + platforms = platforms.gnu; + }; +}) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index cd27aa51cd27..cadd799af3c6 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -2258,6 +2258,12 @@ with pkgs; zfsSupport = false; }; + grub2_xen = callPackage ../tools/misc/grub/2.0x.nix { + xenSupport = true; + }; + + grub2_pvgrub_image = callPackage ../tools/misc/grub/pvgrub_image { }; + grub4dos = callPackage ../tools/misc/grub4dos { stdenv = stdenv_32bit; };