Libvirt的功能调查
尝试了以下有几种方法,为虚拟机加载光盘文件:
使用ide方式挂载
1 2
| virsh attach-disk {instance_name} {iso_path} hda --sourcetype block \ --driver qemu --subdriver raw --type cdrom
|
xml
格式如下:
1 2 3 4 5
| <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='{iso_path}'/> <target dev='hda'/> </disk>
|
使用scsi方式挂载
1 2
| virsh attach-disk {instance_name} {iso_path} sda --sourcetype block \ --driver qemu --subdriver raw --type cdrom
|
xml
格式如下:
1 2 3 4 5
| <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/var/lib/nova/instances/virtio-win-0.1-100.iso'/> <target dev='sda'/> </disk>
|
以上两种方法的区别就在于设备的驱动类型,使用hd×
盘符挂载,挂载之后的设备会默认认为是ide
设备,而使用sd×
盘符挂载,会默认认为是scsi
设备。
由于有些windows镜像缺少scsi
驱动无法识别使用sd×
盘符挂载的光驱设备,所以选择了hd×
盘符来挂载光驱设备。
然后ide
同样存在问题,ide
设备是不支持热拔插的:
1 2 3
| virsh attach-disk {instance_name} {iso_path} hda error: Failed to attach disk error: Operation not supported: disk bus 'ide' cannot be hotplugged.
|
研究了一番发现如果给这个光驱设备写一个空的source_path
,挂载时只要替换这个source_path
的值,它就不会认为这是一个拔插动作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| virsh domblklist {instance_name} Target Source ------------------------------------------------ vda {volume_path} vdb {volume_path} hdb -
virsh attach-disk {instance_name} {iso_path} hdb --sourcetype block --driver qemu --subdriver raw --type cdrom Disk attached successfully
virsh domblklist {instance_name} Target Source ------------------------------------------------ vda {volume_path} vdb {volume_path} hdb {iso_path}
|
在Nova中开发出实际功能
在nova
里要做的就是给虚拟机添加一个光驱设备,并给予这个光驱设备一个空的默认路径。虚拟机磁盘设备的xml
加工是在nova.virt.libvirt.driver.py
中完成的。
磁盘设备的xml
类是nova.virt.libvirt.config.py
中的LibvirtConfigGuestDisk
类,可以根据它的属性来创建一个新的实例。
这里加入了一个判定条件用于更灵活地控制这个设备是否开启,判定的依据是flavor
的extra_specs
中的hw_set_cdrom
属性。
在nova.virt.libvirt.driver.py
的get_guest_storage_config
函数中加入以下代码(注意,盘符必须为hda
):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| for vol in block_device_mapping: connection_info = vol['connection_info'] vol_dev = block_device.prepend_dev(vol['mount_device']) info = disk_mapping[vol_dev] cfg = self.volume_driver_method('connect_volume', connection_info, info) devices.append(cfg)
if inst_type['extra_specs'].get('hw_set_cdrom', False): LOG.info("** setting cdrom **") cd_cfg = vconfig.LibvirtConfigGuestDisk() cd_cfg.driver_name = 'qemu' cd_cfg.source_device = 'cdrom' cd_cfg.driver_format = 'raw' cd_cfg.driver_cache = 'none' cd_cfg.target_bus = 'ide' cd_cfg.target_dev = 'hda' cd_cfg.root_name = 'disk' cd_cfg.source_type = 'block' cd_cfg.source_path = ''
devices.append(cd_cfg)
|
功能出炉的样子
挂载操作不用多说,方法多种多样的。看看效果:
挂载前:
windows 2003:
windows 2008:
挂载后:
windows 2003:
windows 2008:
linux:
怎么卸载
给光驱更新一个空的source_path
就可以了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| virsh domblklist {instance_name} Target Source ------------------------------------------------ vda {volume_path} vdb {volume_path} hda {iso_path}
virsh attach-disk {instance_name} "" hda --sourcetype block --driver qemu --subdriver raw --type cdrom Disk attached successfully
virsh domblklist {instance_name} Target Source ------------------------------------------------ vda {volume_path} vdb {volume_path} hda -
|