[libvirt] [PATCH 00/34] Add device addressing and disk controller support

Daniel P. Berrange berrange at redhat.com
Fri Jan 8 17:43:55 UTC 2010


On Fri, Jan 08, 2010 at 05:22:56PM +0000, Daniel P. Berrange wrote:
> This series is a merge of two previous series I posted
> 
>   http://www.redhat.com/archives/libvir-list/2009-December/msg00232.html
>   http://www.redhat.com/archives/libvir-list/2009-December/msg00392.html
> 
> It accomplishes quite a lot of things, having major impact on the QEMU
> driver, hopefully all in a postive way :-)
> 
> In particular it does
> 
>  * Add standard XML syntax for addressing of PCI devices, and disk drives
>  * Add support for disk controllers as a managed device in XML
>  * Add support for disk controller hotplug/unplug
>  * Convert everything over to use QEMU's -device flag where available
>  * Add PCI addressing when using -device
>  * Introduce a way to give every device a unique 'alias' name in
>    the XML format
> 
> I can't promise it works perfectly, but i've done quite alot of positive
> testing with it now & believe all the back comptability stuff is working
> right.

Since this is a long series, it might be helpful to see the results in
the XML and command line

Starting with this initial XML config which the application defines

<domain type='kvm' id='2'>
  <name>everything</name>
  <uuid>c7a1edbd-edaf-9455-926a-d65c36db1809</uuid>
  <memory>219200</memory>
  <currentMemory>219136</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='i686' machine='pc-0.11'>hvm</type>
    <kernel>/home/berrange/vmlinuz-PAE</kernel>
    <initrd>/home/berrange/initrd-PAE.img</initrd>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/home/berrange/usr/qemu-0.12/bin/qemu</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/berrange/VirtualMachines/plain.qcow'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <disk type='file' device='cdrom'>
      <source file='/home/berrange/gpxe.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/home/berrange/output.img'/>
      <target dev='sdb' bus='usb'/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/home/berrange/output.img'/>
      <target dev='sda' bus='scsi'/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/home/berrange/output.img'/>
      <target dev='sdz' bus='scsi'/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/home/berrange/output.img'/>
      <target dev='sdaf' bus='scsi'/>
    </disk>
    <interface type='user'>
      <mac address='52:54:00:5b:ef:21'/>
      <model type='ne2k_pci'/>
    </interface>
    <interface type='mcast'>
      <mac address='52:54:00:1c:dc:98'/>
      <source address='230.0.0.1' port='5558'/>
      <model type='virtio'/>
    </interface>
    <interface type='network'>
      <mac address='52:54:00:f7:c5:0e'/>
      <source network='default'/>
      <target dev='vnet0'/>
      <model type='e1000'/>
    </interface>
    <interface type='user'>
      <mac address='52:54:00:56:6c:55'/>
      <model type='pcnet'/>
    </interface>
    <interface type='user'>
      <mac address='52:54:00:ca:0d:58'/>
      <model type='rtl8139'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/10'/>
      <target port='0'/>
    </serial>
    <parallel type='pty'>
      <source path='/dev/pts/17'/>
      <target port='0'/>
    </parallel>
    <console type='pty' tty='/dev/pts/10'>
      <source path='/dev/pts/10'/>
      <target port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='yes'/>
    <sound model='ac97'/>
    <sound model='es1370'/>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
    </video>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x15' slot='0x00' function='0x0'/>
      </source>
    </hostdev>
    <hostdev mode='subsystem' type='usb' managed='yes'>
      <source>
        <address bus='4' device='2'/>
      </source>
    </hostdev>
    <watchdog model='i6300esb' action='reset'/>
  </devices>
</domain>   


With the latest QEMU we now generate command line that looks like this

LC_ALL=C
PATH=/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
HOME=/root
USER=root
LOGNAME=root
QEMU_AUDIO_DRV=none

/home/berrange/usr/qemu-0.12/bin/qemu
  -S
  -M pc-0.11
  -enable-kvm
  -m 214
  -smp 1

  -name everything
  -uuid c7a1edbd-edaf-9455-926a-d65c36db1809

  -nodefaults

  -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/everything.monitor,server,nowait
  -mon chardev=monitor,mode=readline

  -boot c
  -kernel /home/berrange/vmlinuz-PAE
  -initrd /home/berrange/initrd-PAE.img

  -device lsi,id=scsi0,addr=13
  -device lsi,id=scsi1,addr=14
  -device lsi,id=scsi2,addr=15
  -device lsi,id=scsi3,addr=16
  -device lsi,id=scsi4,addr=17

  -drive file=/home/berrange/VirtualMachines/plain.qcow,if=none,id=drive-virtio-disk0,format=qcow2
  -device virtio-blk-pci,addr=4,drive=drive-virtio-disk0,id=virtio-disk0

  -drive file=/home/berrange/gpxe.iso,if=none,media=cdrom,id=drive-ide0-1-0
  -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0

  -drive file=/home/berrange/output.img,if=none,id=drive-usb-disk1
  -device usb-storage,drive=drive-usb-disk1,id=usb-disk1

  -drive file=/home/berrange/output.img,if=none,id=drive-scsi0-0-0
  -device scsi-disk,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0

  -drive file=/home/berrange/output.img,if=none,id=drive-scsi3-0-4
  -device scsi-disk,bus=scsi3.0,scsi-id=4,drive=drive-scsi3-0-4,id=scsi3-0-4

  -drive file=/home/berrange/output.img,if=none,id=drive-scsi4-0-3
  -device scsi-disk,bus=scsi4.0,scsi-id=3,drive=drive-scsi4-0-3,id=scsi4-0-3

  -netdev user,id=netdev0
  -device ne2k_pci,netdev=netdev0,id=ne2k_pci-nic0,mac=52:54:00:5b:ef:21,addr=5

  -netdev socket,mcast=230.0.0.1:5558,id=netdev1
  -device virtio-net-pci,netdev=netdev1,id=virtio-nic1,mac=52:54:00:1c:dc:98,addr=6

  -netdev tap,fd=21,id=netdev2
  -device e1000,netdev=netdev2,id=e1000-nic2,mac=52:54:00:f7:c5:0e,addr=7

  -netdev user,id=netdev3
  -device pcnet,netdev=netdev3,id=pcnet-nic3,mac=52:54:00:56:6c:55,addr=8

  -netdev user,id=netdev4
  -device rtl8139,netdev=netdev4,id=rtl8139-nic4,mac=52:54:00:ca:0d:58,addr=9

  -chardev pty,id=serial0
  -device isa-serial,chardev=serial0

  -chardev pty,id=parallel0
  -device isa-parallel,chardev=parallel0

  -usb
  -device usb-tablet,id=input0

  -vnc 127.0.0.1:0
  -vga cirrus

  -device AC97,id=sound0,addr=10

  -device ES1370,id=sound1,addr=11

  -device i6300esb,id=watchdog0,addr=18
  -watchdog-action reset

  -device pci-assign,host=15:00.0,id=hostpci0,addr=12

  -device usb-host,hostbus=004,hostaddr=002,id=hostusb1 



If you query the XML dump while the VM is running, you'll see the extra
address information, alias names, and disk controller elements present.
eg like this


<domain type='kvm' id='2'>
  <name>everything</name>
  <uuid>c7a1edbd-edaf-9455-926a-d65c36db1809</uuid>
  <memory>219200</memory>
  <currentMemory>219136</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='i686' machine='pc-0.11'>hvm</type>
    <kernel>/home/berrange/vmlinuz-PAE</kernel>
    <initrd>/home/berrange/initrd-PAE.img</initrd>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/home/berrange/usr/qemu-0.12/bin/qemu</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/home/berrange/VirtualMachines/plain.qcow'/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <source file='/home/berrange/gpxe.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
      <alias name='ide0-1-0'/>
      <address type='drive' controller='0' bus='1' unit='0'/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/home/berrange/output.img'/>
      <target dev='sdb' bus='usb'/>
      <alias name='usb-disk1'/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/home/berrange/output.img'/>
      <target dev='sda' bus='scsi'/>
      <alias name='scsi0-0-0'/>
      <address type='drive' controller='0' bus='0' unit='0'/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/home/berrange/output.img'/>
      <target dev='sdz' bus='scsi'/>
      <alias name='scsi3-0-4'/>
      <address type='drive' controller='3' bus='0' unit='4'/>
    </disk>
    <disk type='file' device='disk'>
      <source file='/home/berrange/output.img'/>
      <target dev='sdaf' bus='scsi'/>
      <alias name='scsi4-0-3'/>
      <address type='drive' controller='4' bus='0' unit='3'/>
    </disk>
    <controller type='ide' index='0'>
      <alias name='ide0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='scsi' index='0'>
      <alias name='scsi1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0c' function='0x0'/>
    </controller>
    <controller type='scsi' index='1'>
      <alias name='scsi2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0d' function='0x0'/>
    </controller>
    <controller type='scsi' index='2'>
      <alias name='scsi3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0e' function='0x0'/>
    </controller>
    <controller type='scsi' index='3'>
      <alias name='scsi4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0f' function='0x0'/>
    </controller>
    <controller type='scsi' index='4'>
      <alias name='scsi5'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/>
    </controller>
    <interface type='user'>
      <mac address='52:54:00:5b:ef:21'/>
      <model type='ne2k_pci'/>
      <alias name='ne2k_pci-nic0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </interface>
    <interface type='mcast'>
      <mac address='52:54:00:1c:dc:98'/>
      <source address='230.0.0.1' port='5558'/>
      <model type='virtio'/>
      <alias name='virtio-nic1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </interface>
    <interface type='network'>
      <mac address='52:54:00:f7:c5:0e'/>
      <source network='default'/>
      <target dev='vnet0'/>
      <model type='e1000'/>
      <alias name='e1000-nic2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </interface>
    <interface type='user'>
      <mac address='52:54:00:56:6c:55'/>
      <model type='pcnet'/>
      <alias name='pcnet-nic3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </interface>
    <interface type='user'>
      <mac address='52:54:00:ca:0d:58'/>
      <model type='rtl8139'/>
      <alias name='rtl8139-nic4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/10'/>
      <target port='0'/>
      <alias name='serial0'/>
    </serial>
    <parallel type='pty'>
      <source path='/dev/pts/17'/>
      <target port='0'/>
      <alias name='parallel0'/>
    </parallel>
    <console type='pty' tty='/dev/pts/10'>
      <source path='/dev/pts/10'/>
      <target port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='yes'/>
    <sound model='ac97'>
      <alias name='sound0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    </sound>
    <sound model='es1370'>
      <alias name='sound1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/>
    </sound>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0000' bus='0x15' slot='0x00' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x12' function='0x0'/>
      <alias name='hostpci0'/>
    </hostdev>
    <hostdev mode='subsystem' type='usb' managed='yes'>
      <source>
        <address bus='4' device='2'/>
      </source>
      <alias name='hostusb1'/>
    </hostdev>
    <watchdog model='i6300esb' action='reset'>
      <alias name='watchdog0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x11' function='0x0'/>
    </watchdog>
  </devices>
  <seclabel type='dynamic' model='selinux'>
    <label>system_u:system_r:svirt_t:s0:c133,c417</label>
    <imagelabel>system_u:object_r:svirt_image_t:s0:c133,c417</imagelabel>
  </seclabel>
</domain>   


Regards,
Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list