2011/11/26
qemuのdrive indexとPCI address
vl.c DriveInfo *drive_init(QemuOpts *opts, void *opaque,
int *fatal_error)
から。
qemuのPCI addressing
PCIのaddressは、"[[:]:]"の形式で表現される。表記上の細かいことは、hw/pci.cのstatic int pci_parse_devaddr(const char *addr, int *domp, int *busp, unsigned *slotp)辺りに書いてある。
PCIの規格上、それぞれの上限値は、 if (dom > 0xffff || bus > 0xff || val > 0x1f) となっている。
qemuにおいては、domainは常に0のみとなるようになっている。
Host bridgeがひとつしか作れないようなので、PCI busを追加することができない。そのため、0x1f(=31)個 のPCI slot addressをやりくりしてdeviceの割り当てを行うことになる。
幾つかのdeviceは、自動的に作られる。-nodefconfig, -nodefaultsを加えることで、存在するデバイスを減らしPCI addressを節約することが出来る。
-drive
snapshotを指定すると、cache=writeback に変更される。
index値を指定すると、 unit_id = index % max_devs; bus_id = index / max_devs;の式で、unit_id, bus_id へ変換される。これは、IDEとSCSIに置いて適用され、virtioでは適用されない。
IF_IDE
1 IDE busのunit数: MAX_IDE_DEVS=2
readonlyを指定不可。
hotplug不可。
bus_idは、IDE busを示し、unitがIDE channelを表す。IDE bus x 2個分のdriveを追加することが可能になる。
Bus Driver: ich9-ahci (SATA controller), piix3-ide
ich9-ahci は、IDE busを5つ持っている。
dev: ich9-ahci, id ""
bus-prop: addr = 05.0
bus-prop: romfile =
bus-prop: rombar = 1
bus-prop: multifunction = off
bus-prop: command_serr_enable = on
class SATA controller, addr 00:05.0, pci id 8086:2922 (sub 1af4:1100)
bar 5: mem at 0xe2028000 [0xe2028fff]
bus: ide.5
type IDE
bus: ide.4
type IDE
bus: ide.3
type IDE
bus: ide.2
type IDE
bus: ide.1
type IDE
bus: ide.0
type IDE
piix3-ideは、IDE busを2つ持っている。
dev: piix3-ide, id ""
bus-prop: addr = 01.1
bus-prop: romfile =
bus-prop: rombar = 1
bus-prop: multifunction = off
bus-prop: command_serr_enable = on
class IDE controller, addr 00:01.1, pci id 8086:7010 (sub 1af4:1100)
bar 4: i/o at 0xc000 [0xc00f]
bus: ide.1
type IDE
dev: ide-drive, id ""
dev-prop: unit = 0
dev-prop: drive = ide1-cd0
dev-prop: logical_block_size = 512
dev-prop: physical_block_size = 512
dev-prop: min_io_size = 0
dev-prop: opt_io_size = 0
dev-prop: bootindex = -1
dev-prop: discard_granularity = 0
dev-prop: ver = "0.14.1"
dev-prop: serial = "QM00003"
bus: ide.0
type IDE
IF_SCSI
1 SCSI busのunit数: MAX_SCSI_DEVS=7
readonly指定可。
hotplug可。
bus_idは、SCSI controllerを示し、unitがそれにぶら下がるmediaを示す。SCSI controller x 7個分のdriveを追加することが可能になる。
Bus Driver: lsi53c895a
dev: lsi53c895a, id ""
bus-prop: addr = 03.0
bus-prop: romfile =
bus-prop: rombar = 1
bus-prop: multifunction = off
bus-prop: command_serr_enable = on
class SCSI controller, addr 00:03.0, pci id 1000:0012 (sub 1af4:1000)
bar 0: i/o at 0xc100 [0xc1ff]
bar 1: mem at 0xe2020000 [0xe20203ff]
bar 2: mem at 0xe2022000 [0xe2023fff]
bus: scsi.0
type SCSI
dev: scsi-disk, id ""
dev-prop: drive = scsi0-hd0
dev-prop: logical_block_size = 512
dev-prop: physical_block_size = 512
dev-prop: min_io_size = 0
dev-prop: opt_io_size = 0
dev-prop: bootindex = -1
dev-prop: discard_granularity = 0
dev-prop: ver = "0.14.1"
dev-prop: serial = "0"
dev-prop: removable = off
bus-prop: scsi-id = 0
IF_VIRTIO
unit_idを指定する形ではなく、PCI addressの形で指定する。addr option。driveがPCI slot addressと1対応するため、slot address個数分までしか作ることができない。
0.14.0だとなぜかaddr=20 で固まり、addr=21-22ではエラーを出してくる。addr=23以上では起動してくるがdriveが存在しないためbootに失敗する。
readonly指定可。
hotplug可。
Bus driver: virtio-blk-pci
dev: virtio-blk-pci, id ""
dev-prop: class = 0x100
dev-prop: drive = virtio0
dev-prop: logical_block_size = 512
dev-prop: physical_block_size = 512
dev-prop: min_io_size = 0
dev-prop: opt_io_size = 0
dev-prop: bootindex = -1
dev-prop: discard_granularity = 0
dev-prop: ioeventfd = off
dev-prop: vectors = 2
dev-prop: indirect_desc = off
dev-prop: scsi = on
bus-prop: addr = 04.0
bus-prop: romfile =
bus-prop: rombar = 1
bus-prop: multifunction = off
bus-prop: command_serr_enable = on
class SCSI controller, addr 00:04.0, pci id 1af4:1001 (sub 1af4:0002)
bar 0: i/o at 0xc040 [0xc07f]
bar 1: mem at 0xe2021000 [0xe2021fff]
addrとindexの関係
indexとそれと関連するbus_idとunit_idは、virtioでは関係がなさそう。addrを00-1fの間で指定した場合には、その位置へdeviceが割り当てられる。
addrと/dev/
addr=0x8 と addr=0x4 のdriveをつけたVMを起動すると、/dev/vda(=0x4) /dev/vdb(0x8) となった。PCI addressの順番がそのままdevice nameになっている様子。飛び順のdevice nameを付けさせるのは、udevをいじったりする必要があるなど骨が折れそう。