73 lines
2.5 KiB
Diff
73 lines
2.5 KiB
Diff
|
# HG changeset patch
|
||
|
# User Philipp Hahn <hahn@univention.de>
|
||
|
# Date 1320251337 0
|
||
|
# Node ID 2d741388060df5bd2545f38a25278fb9a7fbb127
|
||
|
# Parent 6868855b6651639f02004a7e313fe7aaba522821
|
||
|
pygrub: Add HybridISO support for PyGrub2
|
||
|
|
||
|
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 only
|
||
|
the DOS partition table and uses the first partition instead of the
|
||
|
complete ISO file.
|
||
|
|
||
|
Add a check to detect HybridISO files and use offset 0 in addition to
|
||
|
partition table parsing.
|
||
|
|
||
|
Signed-off-by: Philipp Hahn <hahn@univention.de>
|
||
|
Acked-by: Ian Campbell <ian.campbell@citrix.com>
|
||
|
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
||
|
|
||
|
diff -r 6868855b6651 -r 2d741388060d tools/pygrub/src/pygrub
|
||
|
--- a/tools/pygrub/src/pygrub Wed Nov 02 16:25:18 2011 +0000
|
||
|
+++ b/tools/pygrub/src/pygrub Wed Nov 02 16:28:57 2011 +0000
|
||
|
@@ -40,15 +40,20 @@
|
||
|
except _curses.error:
|
||
|
pass
|
||
|
|
||
|
-def is_disk_image(file):
|
||
|
+DISK_TYPE_RAW, DISK_TYPE_HYBRIDISO, DISK_TYPE_DOS = range(3)
|
||
|
+def identify_disk_image(file):
|
||
|
+ """Detect DOS partition table or HybridISO format."""
|
||
|
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,):
|
||
|
- return True
|
||
|
- return False
|
||
|
+ # 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 DISK_TYPE_HYBRIDISO
|
||
|
+ return DISK_TYPE_DOS
|
||
|
+ return DISK_TYPE_RAW
|
||
|
|
||
|
SECTOR_SIZE=512
|
||
|
DK_LABEL_LOC=1
|
||
|
@@ -94,12 +99,19 @@
|
||
|
FDISK_PART_GPT=0xee
|
||
|
|
||
|
def get_partition_offsets(file):
|
||
|
- if not is_disk_image(file):
|
||
|
+ image_type = identify_disk_image(file)
|
||
|
+ if image_type == DISK_TYPE_RAW:
|
||
|
# No MBR: assume whole disk filesystem, which is like a
|
||
|
# single partition starting at 0
|
||
|
return [0]
|
||
|
-
|
||
|
- part_offs = []
|
||
|
+ elif image_type == DISK_TYPE_HYBRIDISO:
|
||
|
+ # A HybridISO contains an ISO filesystem at 0 in addition
|
||
|
+ # to the DOS partition table
|
||
|
+ part_offs = [0]
|
||
|
+ elif image_type == DISK_TYPE_DOS:
|
||
|
+ part_offs = []
|
||
|
+ else:
|
||
|
+ raise ValueError('Unhandled image type returnd by identify_disk_image(): %d' % (image_type,))
|
||
|
|
||
|
fd = os.open(file, os.O_RDONLY)
|
||
|
buf = os.read(fd, 512)
|