On 14 Jun 2019, at 7:43, Gerd Hoffmann kraxel@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