> On 14 Jun 2019, at 7:43, Gerd Hoffmann <kra...@redhat.com> wrote:
>
> Hi,
>
>> Can there be a guest that will fail the MBR in such a way? Yes.
>> Look at the following MBR partition table of a Windows XP guest in our
>> production
>> environment:
>>
>> Disk size in sectors: 16777216
>>
>> Binary (only one partition 16 bytes): 80 01 01 00 07 fe ff ff 3f 00 00 00 d5
>> ea ff 00
>> Start: (0, 1, 1, 63)
>> End: (1023, 254, 63, 16771859)
>>
>> As can be easily seen, any MBR guessing algorithm should guess:
>>
>> 255 heads (since a value of 254 appears), 63 spt (since a value of 63
>> appears)
>>
>> Turns out that this image does not work with 255, 63 but actually requires
>>
>> 16 heads, 63 spt
>>
>> to boot.
>>
>> So relying on MBR partitions alone is not always enough and sometimes manual
>> intervention
>> is required.
>
> Ok, given that seabios has no setup any manual configuration needs to be done
> via qemu.
>
> But why do we need a new interface for that? IDE can pass the geometry
> to the guest. virtio-blk has support too (VIRTIO_BLK_F_GEOMETRY).
> Likewise scsi (MODE_PAGE_HD_GEOMETRY). So this should be doable without
> any qemu changes.
This was indeed considered (all 3 methods) but it has the following issues:
Physical geometries of devices must now also be logical geometries with
translation=none.
When the OS will query these devices - It will now see different physical
geometries, adapted to be logical geometries.
I’m not sure even how to implement this without breaking existing compatibility
- since we don’t want to affect logical geometries of currently used guests.
MODE_PAGE_HD_GEOMETRY does not contain the spts, only cylinders (as 3 byte
number) and heads (as 1 byte number) and computes the spts using:
number_of_total_sectors / (heads * cylinders), this means that qemu now must
report number_of_total_sectors as heads * cylinders * spt for SeaBIOS to
correctly receive the number of spts - this is not optimal since
number_of_total_sectors can not reflect the real amount of sectors in the disk
which should be reported from CDB_CMD_READ_CAPACITY.
Moving a scsi-hd/virtio-blk with 255 physical heads to ide-hd, we will still
need to report 255 heads - this is possible since a whole byte can be used in
the “ide identify” command, but goes against the spec of a maximum of 16 heads
for IDE.
Overall this approach is much more complicated.
Sam
>
> cheers,
> Gerd
>