KVM和Libvirt – 如何热插拔一个新的virtio磁盘?

我正尝试将基于文件的磁盘热添加到正在运行的KVM虚拟服务器。 我已经使用该命令从头创build了一个新的磁盘

dd of=/home/cloud/vps_59/test.img bs=1 seek=5G count=0 

我希望通过在virsh shell中做到这一点,让它成为热门话题:

 virsh # attach-disk vps_59 /home/cloud/vps_59/test.img \ vdd --driver=file --subdriver=raw 

该域的XML定义成为:

 <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/home/cloud/vps_59/root.img'/> <target dev='vda' bus='virtio'/> </disk> <disk type='file' device='disk'> <driver name='file' type='raw'/> <source file='/home/cloud/vps_59/test.img'/> <target dev='vdd' bus='virtio'/> </disk> 

如您所见,驱动程序名称变为错误,应将driver name='qemu'作为现有的vda磁盘。 我曾尝试使用--drive=qemu但表示它不受支持。

其次,一旦我重新启动运行Ubuntu 10.04.4 LTS的虚拟机,我只能“看见”新添加的驱动器。 我怎样才能使驱动器“热插拔”? 我希望虚拟机立即“看到”新驱动器,而不用重新启动。

我想从一个笔记开始,你应该避免使用virsh attach-disk及其有限的选项。 相反,我build议在单独的临时XML文件中指定确切的磁盘格式,或使用virt-manager GUI应用程序(对于后者,跳过第一步)指定确切的磁盘格式。

  1. 使用下面的磁盘定义创build一个临时文件。

    调整属性以适应您的情况

     <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/path/to/disk-image.img'/> <target dev='vdb' bus='virtio'/> </disk> 

    提示:查看当前的XML域configuration,并从那里复制<disk>部分。

     virsh dumpxml <domainname> 
  2. 现在,在将磁盘添加到当前域之前,请确保所需的hotplug内核模块已加载到guest虚拟机中。

    像最近的CentOS / RHEL / Fedora这样的一些Linux发行版在内核中内置了这个function。 在这种情况下,检查CONFIG_HOTPLUG_PCI_ACPI 。 如果是,那么你就全部设置好了,你可以跳过这一步。

     modprobe acpiphp modprobe pci_hotplug 

    考虑将这两个模块添加到/etc/modules如果您希望默认启动时加载它们。

  3. 使用它将磁盘添加到正在运行的VM

     virsh attach-device <domain name> /path/to/disk.xml 

    或者,添加--persistent选项,让Libvirt将域XML定义更新为“persistent”。

  4. 最后,如果磁盘确实是热插拔的,请检查guest虚拟机内部。 内核应该被触发,可以用dmesg检查:

     [ 321.946440] virtio-pci 0000:00:06.0: using default PCI settings [...] [ 321.952782] vdb: vdb1 vdb2 

    在上面的例子中,我添加了一个磁盘作为分区表中有两个分区的vdb

参考

  • Linux-KVM维基 – 使用PCI热插拔支持
  • 类似的问题“在Libvirt KVM运行时添加Virtio块设备”