[syslinux] isohybrid and ISO images whose size is not a multiple of 2048 bytes vs. VirtualBox

intrigeri intrigeri at boum.org
Thu May 7 10:15:20 PDT 2015


Hi,

Thomas Schmitt via Syslinux wrote (20 Feb 2015 10:29:37 GMT) :
> This is a patch against
>   http://git.kernel.org/cgit/boot/syslinux/syslinux.git/plain/utils/isohybrid.c

Just to be clear, is what follows the patch that we at Tails are
supposed to try?

> It roughly compiles here. (Up to missing uuid_generate.)
> ------------------------------------------------------------------------

> --- isohybrid.c 2015-02-20 10:43:49.000000000 +0100
> +++ isohybrid_test.c    2015-02-20 11:01:33.000000000 +0100
> @@ -947,7 +947,7 @@ main(int argc, char *argv[])
>      int i = 0;
>      FILE *fp = NULL;
>      uint8_t *buf = NULL, *bufz = NULL;
> -    int cylsize = 0, frac = 0;
> +    int cylsize = 0, frac = 0, align_factor, align_cylsize;
>      size_t orig_gpt_size, free_space, gpt_size;
>      struct iso_primary_descriptor descriptor;

> @@ -1058,9 +1058,20 @@ main(int argc, char *argv[])
>      isosize = lendian_int(descriptor.size) * lendian_short(descriptor.block_size);
>      free_space = isostat.st_size - isosize;

> +    /* Making sure that the resulting image size is divisible by 2048.
> +       (Can waste nearly 32 MB. Should be done on user request only.)
> +    */
> +    if ((head * sector) % 4 == 0)
> +        align_factor = 1;
> +    else if ((head * sector) % 2 == 0)
> +        align_factor = 2;
> +    else
> +        align_factor = 4;
> +
>      cylsize = head * sector * 512;
> -    frac = isostat.st_size % cylsize;
> -    padding = (frac > 0) ? cylsize - frac : 0;
> +    align_cylsize = cylsize * align_factor;
> +    frac = isostat.st_size % align_cylsize;
> +    padding = (frac > 0) ? align_cylsize - frac : 0;

>      if (mode & VERBOSE)
>          printf("imgsize: %zu, padding: %d\n", (size_t)isostat.st_size, padding);

> ------------------------------------------------------------------------

> I wrapped the essential code into a standalone program for
> playing with a few numbers:

> -h 255 -s 63 , ISO size 1085739008 :
>   align_factor= 4 , padding= 32899072 , image size= 136.000000 cylinders

> -h 252 -s 63 , ISO size 1085739008 :
>   align_factor= 1 , padding= 3481600 , image size= 134.000000 cylinders

> -h 128 -s 32  , ISO size 1085739008 :
>   align_factor= 1 , padding= 585728 , image size= 518.000000 cylinders

> "padding" is the actual waste.
> Well, ISO size 1085739008 was designed to let -h 255 -s 63 look bad.
> Let's choose some random size around 1.5 GB: 2048 * 723452 

> -h 255 -s 63 , ISO size 1481629696 :
>   align_factor= 4 , padding= 31821824 , image size= 184.000000 cylinders

> -h 252 -s 63 , ISO size 1481629696 :
>   align_factor= 1 , padding= 5888000 , image size= 183.000000 cylinders

> -h 128 -s 32 , ISO size 1481629696 :
>   align_factor= 1 , padding= 1056768 , image size= 707.000000 cylinders

> Bad luck again.
> I swear i just toggled a 7 and then blindly 5 digits
> for the "random" number.
> More tries

> -h 255 -s 63 , ISO size 1478760448 :
>   align_factor= 4 , padding= 1789952 , image size= 180.000000 cylinders

> -h 255 -s 63 , ISO size 1630908416 :
>   align_factor= 4 , padding= 14147584 , image size= 200.000000 cylinders

> I expect the average waste to be a bit less than 16 MB.

> Have a nice day :)

> Thomas

--
intrigeri


More information about the Syslinux mailing list