KVM虚拟机添加设备

KVM虚拟机可以在线(运行时)添加磁盘、CDROM、USB设备,这对在线维护非常有用,可以不停机修改设备。

备注

案例使用的虚拟机名字 dev7 ,添加的磁盘文件命名为 dev7-data.qcow2

添加磁盘文件

  • 创建虚拟磁盘文件(qcow2类型):

    cd /var/lib/libvirt/images
    qemu-img create -f qcow2 dev7-data.qcow2 20G
    
  • 虚拟磁盘文件添加到虚拟机

qemu 可以映射物理存储磁盘(例如 /dev/sdb ),或者虚拟磁盘文件到KVM虚拟机的虚拟磁盘( vdb )

virsh attach-disk dev7 --source /var/lib/libvirt/images/dev7-data.qcow2 --target vdb --persistent --drive qemu --subdriver qcow2

警告

一定要明确使用 --driver qemu --subdriver qcow2 :

libvirtd 出于安全因素默认关闭了虚拟磁盘类型自动检测功能,并且默认使用的磁盘格式是 raw ,如果不指定磁盘驱动类型会导致被识别成 raw 格式,就会在虚拟机内部看到非常奇怪的极小的磁盘。

添加iso光盘

cdrom/floppy 不支持热插拔,所以和上面动态插入一个磁盘设备不同,如果直接使用以下命令插入设备( 虚拟机名字是 sles12-sp3 )映射:

virsh attach-disk sles12-sp3 SLE-12-SP3-Server-DVD-x86_64-GM-DVD1.iso --target hdc --type cdrom --mode readonly

会提示错误:

error: Failed to attach disk
error: Operation not supported: cdrom/floppy device hotplug isn't supported
  • 但是,如果虚拟机定义时候已经定义过cdrom设备,则使用 virsh dumpxml sles12-sp3 可以看到如下设备:

    <disk type='file' device='cdrom'>
      <driver name='qemu'/>
      <target dev='sda' bus='sata'/>
      <readonly/>
      <alias name='sata0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    

则我们可以通过指定将iso文件插入到虚拟机中的 sda CDROM中:

virsh attach-disk sles12-sp3 /var/lib/libvirt/images/SLE-12-SP3-Server-DVD-x86_64-GM-DVD1.iso sda --type cdrom --mode readonly

就会提示成功插入:

Disk attached successfully
  • 再次使用 virsh dumpxml sles12-sp3 可以看到iso文件加载:

    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/var/lib/libvirt/images/SLE-12-SP3-Server-DVD-x86_64-GM-DVD1.iso' index='3'/>
      <backingStore/>
      <target dev='sda' bus='sata'/>
      <readonly/>
      <alias name='sata0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    
  • 如果要卸载这个iso文件,则创建一个相同结构的xml文件 detach_iso.xml ,但是保持 <source/> 行删除:

    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <backingStore/>
      <target dev='sda' bus='sata'/>
      <readonly/>
      <alias name='sata0-0-0'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    
  • 然后执行设备更新:

    virsh update-device sles12-sp3 detach_iso.xml
    

此时提示:

Device updated successfully

再检查虚拟机配置,就看到iso文件已经卸载了。

参考