27

I am trying to hot-add a file-based disk to a running KVM virtual server. I've created a new disk from scratch using the command

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

and I was hoping to get it hot-added to the guest by doing this in the virsh shell:

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

The XML definition of the domain then becomes:

<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>

As you can see, the driver name becomes wrong, it should be driver name='qemu' as the existing vda disk. I have tried with --drive=qemu but it states it is unsupported.

Secondly, I only "see" the newly added drive once I reboot the virtual machine running Ubuntu 10.04.4 LTS. How can I make the drive "hotplug"? I want the virtual machine to "see" the new drive immediately without a reboot.

gertvdijk
  • 3,362
  • 4
  • 30
  • 46
Daniele Testa
  • 271
  • 1
  • 3
  • 3
  • 1
    Unrelated suggestion, use `qemu-img` instead of `dd` - its arguments come more natural and does the same thing: `qemu-img create test.img 5G` – chutz Dec 12 '12 at 00:05

1 Answers1

34

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).

  1. 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>
    
  2. 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's y, 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.

  3. 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'.

  4. 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

gertvdijk
  • 3,362
  • 4
  • 30
  • 46
  • 2
    Shouldn't you also add `--persistent` to make sure this configuration does not get lost when you power off the virtual machine? – chutz Dec 12 '12 at 00:06