[Xen-devel] [PATCH] Add HybridISO support for PyGrub2

Philipp Hahn
Tue, 25 Oct 2011 08:56:58 -0000

grub-mkrescue internally uses xorriso, which generates a
so-called "hybrid ISO": The ISO images also contains a DOS partition
table,
which allows the identical ISO file to be stored on an USB stick for booting
from it. This breaks PyGrub, since it (wrongly) detects the DOS partition
table and uses the first partition instead of the complete ISO file.

Add a check to detech HybridISO files and fall back to unpartitioned
operation.

Signed-off-by: Philipp Hahn <hahn@univention.de>
--- a/tools/pygrub/src/pygrub
+++ b/tools/pygrub/src/pygrub
@@ -41,12 +41,16 @@ def enable_cursor(ison):
         pass

 def is_disk_image(file):
+    """Detect DOS partition table."""
     fd = os.open(file, os.O_RDONLY)
-    buf = os.read(fd, 512)
+    buf = os.read(fd, 0x8006)
     os.close(fd)

     if len(buf) >= 512 and \
            struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
+        # HybridISO contains a DOS partition table for booting from USB
devices, but really is an ISO image
+        if len(buf) >= 0x8006 and buf[0x8001:0x8006] ==
''CD001'':
+            return False
         return True
     return False

--
Philipp Hahn           Open Source Software Engineer      hahn@univention.de
Univention GmbH        Linux for Your Business        fon: +49 421 22 232- 0
Mary-Somerville-Str.1  D-28359 Bremen                 fax: +49 421 22 232-99