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

Re: [Xen-devel] [PATCH v2] Add HybridISO support for PyGrub2



On Fri, 2011-10-28 at 08:46 +0100, Philipp Hahn wrote:
> Hello Ian,
> 
> On Thursday 27 October 2011 12:21:05 Ian Campbell wrote:
> > On Tue, 2011-10-25 at 11:33 +0100, Philipp Hahn wrote:
> > [...snip explanations...]
> >
> > Thanks Philipp, that all seems to make sense.
> >
> > Tim had some suggestions on how/where this functionality could be better
> > implemented though.
> 
> v2: For HybrisISOs use offset 0 in addition instead of replacement.
> 
> Signed-off-by: Philipp Hahn <hahn@xxxxxxxxxxxxx>
> ---
> 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.
> --- a/tools/pygrub/src/pygrub
> +++ b/tools/pygrub/src/pygrub
> @@ -40,15 +40,20 @@ def enable_cursor(ison):
>      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)

Can we avoid reading all that just for the 7 bytes we are interested in.
What about (just pseudo python, I didn't actually lookup seek etc):

        buf = os.read(fd, 512)
        if len(buf) >= 512 and \
             not struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
                return ...RAW

        os.seek(0x8000)
        buf = os.read(fd, 6)
        if len... and buf[0x8001...] == 'CD001':
                return ...HYBRID
        else:
                return ...DOS

on the other hand I suppose it's only 8k...

Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

Thanks.
Ian
.
>      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
> @@ -87,12 +92,19 @@ FDISK_PART_SOLARIS_OLD=0x82
>  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)
> 
> Sincerely
> Philipp



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.