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をいじったりする必要があるなど骨が折れそう。

This page is powered by Blogger. Isn't yours?