[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#770039: unblock: grub2/2.02~beta2-16



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

grub2 2.02~beta2-16 finishes off Xen host/guest integration.  GRUB has
had most of this for a while, but the packaging work to make it possible
to install grub-xen-host in the host, grub-xen in the guest, and then
automatically boot GRUB in the guest wasn't present.

I know this is a bit more than your standard unblock request, and indeed
we're still waiting for this to pass through NEW.  But we're
anticipating this being *really* useful for administrators of Xen
hosting setups - it beats the messes that were PV-GRUB Legacy and
PyGrub, or even keeping track of kernel versions by hand - and it would
be fantastic to have this in jessie.

Here's a tidied-up version of the relevant git diff.

diff --git a/debian/changelog b/debian/changelog
index a75c97b..40db9e9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+grub2 (2.02~beta2-16) unstable; urgency=medium
+
+  [ Ian Campbell ]
+  * Provide prebuilt grub-xen binaries for host use in a new grub-xen-host
+    package.
+  * Build/Install binaries into /boot/xen when installing grub-xen.
+
+ -- Ian Campbell <ijc@debian.org>  Thu, 06 Nov 2014 13:32:01 +0000
+
 grub2 (2.02~beta2-15) unstable; urgency=medium
 
   * Disable nvram installation again on chrp_ibm machines that are emulated
diff --git a/debian/control b/debian/control
index 5563214..dedd1c5 100644
--- a/debian/control
+++ b/debian/control
@@ -634,6 +634,23 @@ Description: GRand Unified Bootloader, version 2 (Xen version)
  This package contains a version of GRUB that has been built for use with
  the Xen hypervisor (i.e. PV-GRUB).
 
+Package: grub-xen-host
+Architecture: i386 amd64
+Depends: ${shlibs:Depends}, ${misc:Depends}, grub-xen-bin (= ${binary:Version})
+Multi-Arch: foreign
+Description: GRand Unified Bootloader, version 2 (Xen host version)
+ GRUB is a portable, powerful bootloader.  This version of GRUB is based on a
+ cleaner design than its predecessors, and provides the following new features:
+ .
+  - Scripting in grub.cfg using BASH-like syntax.
+  - Support for modern partition maps such as GPT.
+  - Modular generation of grub.cfg via update-grub.  Packages providing GRUB
+    add-ons can plug in their own script rules and trigger updates by invoking
+    update-grub.
+ .
+ This package arranges for GRUB binary images which can be used to boot a Xen
+ guest (i.e. PV-GRUB) to be present in the control domain filesystem.
+
 Package: grub-yeeloong-bin
 Architecture: any-mipsel
 Depends: ${shlibs:Depends}, ${misc:Depends}, grub-common (= ${binary:Version})
diff --git a/debian/grub-xen-host.install b/debian/grub-xen-host.install
new file mode 100644
index 0000000..43c7506
--- /dev/null
+++ b/debian/grub-xen-host.install
@@ -0,0 +1,2 @@
+obj/grub-xen-host-i386/grub-i386-xen.bin usr/lib/grub-xen
+obj/grub-xen-host-amd64/grub-x86_64-xen.bin usr/lib/grub-xen
diff --git a/debian/grub-xen-host.lintian-overrides b/debian/grub-xen-host.lintian-overrides
new file mode 100644
index 0000000..4f482a1
--- /dev/null
+++ b/debian/grub-xen-host.lintian-overrides
@@ -0,0 +1,2 @@
+grub-xen-host: statically-linked-binary usr/lib/grub-xen/grub-i386-xen.bin
+grub-xen-host: statically-linked-binary usr/lib/grub-xen/grub-x86_64-xen.bin
diff --git a/debian/grub-xen-host_grub-bootstrap.cfg b/debian/grub-xen-host_grub-bootstrap.cfg
new file mode 100644
index 0000000..e988314
--- /dev/null
+++ b/debian/grub-xen-host_grub-bootstrap.cfg
@@ -0,0 +1 @@
+normal (memdisk)/grub.cfg
diff --git a/debian/grub-xen-host_grub.cfg b/debian/grub-xen-host_grub.cfg
new file mode 100644
index 0000000..319c3b3
--- /dev/null
+++ b/debian/grub-xen-host_grub.cfg
@@ -0,0 +1,24 @@
+# First search for a suitable grub to chainload
+if search -s -f /boot/xen/pvboot-@@PVBOOT_ARCH@@.elf ; then
+	echo "Chainloading (${root})/boot/xen/pvboot-@@PVBOOT_ARCH@@.elf"
+	multiboot /boot/xen/pvboot-@@PVBOOT_ARCH@@.elf"
+	boot
+fi
+
+if search -s -f /xen/pvboot-@@PVBOOT_ARCH@@.elf ; then
+	echo "Chainloading (${root})/xen/pvboot-@@PVBOOT_ARCH@@.elf"
+	multiboot /xen/pvboot-@@PVBOOT_ARCH@@.elf"
+	boot
+fi
+
+# Second try looking for grub.cfg
+
+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/debian/patches/grub-install-pvxen-paths.patch b/debian/patches/grub-install-pvxen-paths.patch
new file mode 100644
index 0000000..6fdeb64
--- /dev/null
+++ b/debian/patches/grub-install-pvxen-paths.patch
@@ -0,0 +1,71 @@
+From c211ee1c228bc978ffc4b399155ebfeb7524d2e0 Mon Sep 17 00:00:00 2001
+From: Ian Campbell <ijc@hellion.org.uk>
+Date: Sat, 6 Sep 2014 12:20:12 +0100
+Subject: grub-install: Install PV Xen binaries into the upstream specified
+ path
+
+Upstream have defined a specification for where guests ought to place their
+xenpv grub binaries in order to facilitate chainloading from a stage 1 grub
+loaded from dom0.
+
+http://xenbits.xen.org/docs/unstable-staging/misc/x86-xenpv-bootloader.html
+
+The spec calls for installation into /boot/xen/pvboot-i386.elf or
+/boot/xen/pvboot-x86_64.elf.
+
+Signed-off-by: Ian Campbell <ijc@hellion.org.uk>
+
+Bug-Debian: https://bugs.debian.org/762307
+Forwarded: http://lists.gnu.org/archive/html/grub-devel/2014-10/msg00041.html
+Last-Update: 2014-10-24
+
+Patch-Name: grub-install-pvxen-paths.patch
+
+---
+v2: Respect bootdir, create /boot/xen as needed.
+---
+ util/grub-install.c | 24 ++++++++++++++++++++++--
+ 1 file changed, 22 insertions(+), 2 deletions(-)
+
+diff --git a/util/grub-install.c b/util/grub-install.c
+index 70f514c..7a7734e 100644
+--- a/util/grub-install.c
++++ b/util/grub-install.c
+@@ -1979,6 +1979,28 @@ main (int argc, char *argv[])
+ 	}
+       break;
+ 
++    case GRUB_INSTALL_PLATFORM_I386_XEN:
++      {
++	char *path = grub_util_path_concat (2, bootdir, "xen");
++	char *dst = grub_util_path_concat (2, path, "pvboot-i386.elf");
++	grub_install_mkdir_p (path);
++	grub_install_copy_file (imgfile, dst, 1);
++	free (dst);
++	free (path);
++      }
++      break;
++
++    case GRUB_INSTALL_PLATFORM_X86_64_XEN:
++      {
++	char *path = grub_util_path_concat (2, bootdir, "xen");
++	char *dst = grub_util_path_concat (2, path, "pvboot-x86_64.elf");
++	grub_install_mkdir_p (path);
++	grub_install_copy_file (imgfile, dst, 1);
++	free (dst);
++	free (path);
++      }
++      break;
++
+     case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
+     case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
+     case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
+@@ -1987,8 +2009,6 @@ main (int argc, char *argv[])
+     case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
+     case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
+     case GRUB_INSTALL_PLATFORM_I386_QEMU:
+-    case GRUB_INSTALL_PLATFORM_I386_XEN:
+-    case GRUB_INSTALL_PLATFORM_X86_64_XEN:
+       grub_util_warn ("%s",
+ 		      _("WARNING: no platform-specific install was performed"));
+       break;
diff --git a/debian/patches/series b/debian/patches/series
index b68e230..e675322 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -60,3 +60,4 @@ platform-none.patch
 mips-abiflags.patch
 ieee1275-clear-reset.patch
 ppc64el-disable-vsx.patch
+grub-install-pvxen-paths.patch
diff --git a/debian/postinst.in b/debian/postinst.in
index 94c200c..30e6947 100644
--- a/debian/postinst.in
+++ b/debian/postinst.in
@@ -722,6 +722,17 @@ case "$1" in
       grub-yeeloong)
         grub-install --target=mipsel-loongson
       ;;
+
+      grub-xen)
+        # Install for x86_64 regardless of arch, since a 32-bit userspace can still boot with a 64-bit kernel.
+	mkdir -p /boot/xen
+        grub-install --target=x86_64-xen
+        case $(dpkg --print-architecture) in
+          i386)
+            grub-install --target=i386-xen
+          ;;
+        esac
+      ;;
     esac
 
     # If grub.cfg has been generated, update it.
diff --git a/debian/rules b/debian/rules
index f6daa0c..5264310 100755
--- a/debian/rules
+++ b/debian/rules
@@ -36,7 +36,11 @@ substvars =
 AUTOGEN_DEB_FILES = config templates preinst postinst postrm dirs install links maintscript
 
 BUILD_PACKAGES := $(strip $(shell dh_listpackages))
+# REAL_PACKAGES build an actual grub variant (and therefore have both configure
+# and build stages). EXTRA_PACKAGES do not build grub but may depend on a
+# REAL_PACKAGE (and therefore only have a build stage)
 REAL_PACKAGES = grub-common grub-emu grub-pc grub-coreboot grub-efi-ia32 grub-efi-amd64 grub-efi-ia64 grub-efi-arm grub-efi-arm64 grub-ieee1275 grub-firmware-qemu grub-uboot grub-xen grub-yeeloong
+EXTRA_PACKAGES = grub-rescue-pc grub-xen-host
 
 ifneq (,$(filter i386 amd64,$(DEB_HOST_ARCH_CPU)))
 COMMON_PLATFORM := pc
@@ -109,7 +113,7 @@ override_dh_auto_build: $(patsubst %,build/%,$(BUILD_PACKAGES))
 override_dh_auto_install: $(patsubst %,install/%,$(BUILD_PACKAGES))
 
 $(patsubst %,configure/%,$(REAL_PACKAGES)) :: configure/% : debian/stamps/configure-%
-$(patsubst %,build/%,$(REAL_PACKAGES) grub-rescue-pc) :: build/% : debian/stamps/build-%
+$(patsubst %,build/%,$(REAL_PACKAGES) $(EXTRA_PACKAGES)) :: build/% : debian/stamps/build-%
 
 debian/stamps/configure-%: package = $(subst debian/stamps/configure-,,$@)
 debian/stamps/configure-%: export DH_OPTIONS = -p$(package) -Bobj/$(package)
@@ -176,6 +180,32 @@ debian/stamps/build-grub-none debian/stamps/build-grub-efi-ia32 debian/stamps/bu
 	dh_auto_build
 	touch $@
 
+debian/stamps/build-grub-xen-host-i386: PVBOOT_ARCH := i386
+debian/stamps/build-grub-xen-host-amd64: PVBOOT_ARCH := x86_64
+debian/stamps/build-grub-xen-host-%: debian/stamps/build-grub-xen-%
+	target=$(subst debian/stamps/build-grub-xen-host-,,$@) ; \
+	obj_dir=$(CURDIR)/obj/grub-xen-$${target} ; \
+	grub_dir=`mktemp -d` ; \
+	grub_memdisk=`mktemp` ; \
+	trap "rm -rf $${grub_dir} $${grub_memdisk}" EXIT HUP INT QUIT TERM ; \
+	mkdir -p $${grub_dir}/boot/grub ; \
+	mkdir -p $(CURDIR)/obj/$(package) ; \
+	sed -e "s/@@PVBOOT_ARCH@@/$(PVBOOT_ARCH)/g" \
+	    <debian/grub-xen-host_grub.cfg \
+	    >$${grub_dir}/grub.cfg ; \
+	tar -cf - -C $${grub_dir} grub.cfg > $${grub_memdisk} ; \
+	$${obj_dir}/grub-mkimage \
+		-O $(PVBOOT_ARCH)-xen \
+		-c $(CURDIR)/debian/grub-xen-host_grub-bootstrap.cfg \
+		-d $${obj_dir}/grub-core \
+		$${obj_dir}/grub-core/*.mod \
+		-m $${grub_memdisk} \
+		-o $(CURDIR)/obj/$(package)/grub-$(PVBOOT_ARCH)-xen.bin
+	touch $@
+
+debian/stamps/build-grub-xen-host: debian/stamps/build-grub-xen-host-i386 debian/stamps/build-grub-xen-host-amd64
+	touch $@
+
 debian/stamps/build-grub-pc: debian/stamps/configure-grub-pc
 	dh_auto_build
 ifeq ($(with_check), yes)
@@ -371,7 +401,7 @@ ifeq (yes,$(shell dpkg-vendor --derives-from Ubuntu && echo yes))
 endif
 
 override_dh_install:
-	dh_install -pgrub2 -pgrub-linuxbios -pgrub-efi -pgrub-rescue-pc -pgrub-firmware-qemu
+	dh_install -pgrub2 -pgrub-linuxbios -pgrub-efi -pgrub-rescue-pc -pgrub-firmware-qemu -pgrub-xen-host
 	dh_install -pgrub-common -pgrub2-common -pgrub-theme-starfield -pgrub-mount-udeb --sourcedir=debian/tmp-grub-$(COMMON_PLATFORM)
 	rm -f debian/grub2-common/usr/share/info/dir*
 	rm -f debian/grub-theme-starfield/usr/share/grub/themes/starfield/COPYING.CC-BY-SA-3.0
@@ -400,8 +430,8 @@ endif
 endif
 
 override_dh_installdocs:
-	dh_installdocs -pgrub-common -pgrub-rescue-pc -pgrub-firmware-qemu -A AUTHORS NEWS README THANKS TODO
-	dh_installdocs -Ngrub-common -Ngrub-rescue-pc -Ngrub-firmware-qemu --link-doc=grub-common
+	dh_installdocs -pgrub-common -pgrub-rescue-pc -pgrub-firmware-qemu -pgrub-xen-host -A AUTHORS NEWS README THANKS TODO
+	dh_installdocs -Ngrub-common -Ngrub-rescue-pc -Ngrub-firmware-qemu -Ngrub-xen-host --link-doc=grub-common
 
 ifeq ($(FLICKER_FREE_BOOT),yes)
 override_dh_installinit:

unblock grub2/2.02~beta2-16

Thanks,

-- 
Colin Watson                                       [cjwatson@debian.org]


Reply to: