KVM and Libvirt - How do I hotplug a new virtio disk?
Solution 1:
I'd like to start with a note that you should avoid using virsh attach-disk
with its limited amount of options. Instead, I'd suggest to specify the exact disk format you prefer in a separate, temporary XML file or by using the virt-manager GUI application (for the latter, skip the first step).
-
Create a temporary file with a disk definition like this one below.
adjust the properties to fit your situation
<disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/path/to/disk-image.img'/> <target dev='vdb' bus='virtio'/> </disk>
Tip: Peek into your current XML domain configuration and copy a
<disk>
section from there.virsh dumpxml <domainname>
-
Now, before adding the disk to a current domain, make sure the required hotplug kernel modules are loaded in the guest.
Some Linux distributions like recent CentOS/RHEL/Fedora have this built-in in the kernel. In this case, check for
CONFIG_HOTPLUG_PCI_ACPI
. If it'sy
, then you're all set and you can skip this step.modprobe acpiphp modprobe pci_hotplug
Consider adding these two modules to
/etc/modules
if you want them to be loaded on boot by default. -
Add the disk it to the running VM using
virsh attach-device <domain name> /path/to/disk.xml
Optionally, add the
--persistent
option to let Libvirt update the domain XML definition 'persistent'. -
Finally, check inside the guest if the disk was indeed hotplug-inserted. The kernel should be triggered, as can be checked with
dmesg
:[ 321.946440] virtio-pci 0000:00:06.0: using default PCI settings [...] [ 321.952782] vdb: vdb1 vdb2
In the above example I've added a disk as
vdb
with two partitions in the partition table.
References
- Linux-KVM wiki - Using PCI Hotplug Support
- similar question "Adding Virtio block devices at runtime in Libvirt KVM"