网卡

  • 热添加

    linux guest需要加载acpiphppci_hotplug这两个模块方能支持pci hotplug,对应的kernel options[1]

    GUEST
    CONFIG_HOTPLUG_PCI=y
    CONFIG_HOTPLUG_PCI_ACPI=y

    现有redhat/centos6+,ubuntu14.04+、debian8+都已经默认将这两个模块编译到内核中了。

    • 方法一、配置文件

      HOST
      host $ sudo vim /etc/libvirt/qemu/$domain-2nd-nic.xml
      -------8<--------
      <interface type='network'> (1)
          <mac address='52:54:00:d8:11:22'/>
          <source network='ovs-network' portgroup='vlan-112'/>
          <model type='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> (2)
      </interface>
      ------->8--------
      1 此处的network影响到后续detach-interface的操作,详见下文。
      2 slot值必须唯一,可使用virsh dumpxml来查看所有设备的slot值
      HOST
      $ sudo virsh attach-device $domain-2nd-nic.xml --persistent (1)
      1 --persistent表示vm重启后该网卡依然存在。
    • 方法二、命令行

    HOST
    $ sudo virsh attach-interface --domain d8-64-tester1 --type network \
      --source ovs-network --model virtio --mac 52:54:00:d8:11:22 \
      --target d8Test1-112 --config
    Interface attached successfully

    + .GUEST

    $ sudo dmesg
    ------->8--------
    [ 1262.177937] virtio-pci 0000:00:07.0: no hotplug settings from platform
    [ 1262.181735] virtio-pci 0000:00:07.0: using default PCI settings
    ------->8--------

    + 说明已经成功地将一块网卡热添加到guest中了。

  • 热删除

    HOST
    $ sudo virsh detach-interface $domain --type network --mac 52:54:00:d8:11:22
    error: No found interface whose type is network

    oops!

    HOST
    $ sudo virsh dumpxml $domain | less
    -------->8--------
        <interface type='bridge'>  (1)
          <mac address='52:54:00:d8:11:22'/>
          <source bridge='ovsbr1'/>
          <virtualport type='openvswitch'>
            <parameters interfaceid='bc1ca6e5-7c99-7607-1b32-fdac7e2346be'/>
          </virtualport>
          <target dev='d8Test1-112'/>
          <model type='virtio'/>
          <alias name='net2'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
        </interface>
    --------8<--------
    1 原来libvirt已经自动将type从network转换成了bridge

    将type换成bridge再试一下:

    HOST
    $ sudo virsh detach-interface d8-64-tester1 --type bridge --mac 52:54:00:d8:11:22
    Interface detached successfully

    这里还有个尾巴没有处理干净,由于detach-interface没有—​config选项,所以libvirt并未删除$domain配置文件中的<interface>,因而下次重启后该网卡仍然存在于vm中。

硬盘

添加和卸载的流程跟网卡类似

  • 热添加

    创建新硬盘的配置文件

    HOST
    cat /etc/libvirt/qemu/new-hd.xml
    <disk type='file' device='disk'>
        <driver name='qemu' type='qcow2' cache='none'/>
        <source file='/mnt/kvm/vm/d8Tester1-test.qcow2'/>
        <target dev='vdb' bus='virtio'/> (1)
        <alias name='virtio-disk1'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </disk>
    1 因为第一块硬盘占用了vda,所以第二块硬盘需从vdb开始。
    HOST
    $ sudo virsh attach-disk $domain $file --persistent

    在guest中使用dmesg验证一下:

    GUEST
    $ sudo dmesg
    [ 7455.322914] pci 0000:00:08.0: no hotplug settings from platform
    [ 7455.326497] pci 0000:00:08.0: using default PCI settings
    [ 7455.330247] virtio-pci 0000:00:08.0: enabling device (0000 -> 0003)
    [ 7455.366755] virtio-pci 0000:00:08.0: irq 51 for MSI/MSI-X
    [ 7455.366806] virtio-pci 0000:00:08.0: irq 52 for MSI/MSI-X
    [ 7455.391041]  vdb: unknown partition table
  • 热删除

    当然,卸载该硬盘也不在话下,不过需要确保guest已经成功umount了该硬盘的文件系统

    HOST
    $ virsh detach-disk $domain $target --config (1)
    1 此处的$target为vdb。
vm配置文件之间的关系

virsh dumpxml $domain 输出的是vm运行态的配置文件,热添加/卸载设备会影响到该配置文件,而无论是否使用了—​persistent或—​config这两个参数。

virsh edit $domain 这时看到是vm在libvirtd里的配置文件。热添加/卸载设备时,仅当使用了—​persistent或—​config这两个参数时才会影响到该文件。

内存

热添加、卸载内容是最近才实现的功能,对host中的qemu、libvirt以及guest kernel都有一定的要求。网上已有文档12,我尚无相应环境测试。

proxmox支持热添加/删除cpu、ram、disk和nic,非常方便。如果没有特别的需求的话,还是建议用proxmox来取代centos+kvm这个组合。


1. 可通过/boot/config-$version查看