Openstack中为虚拟机使用CDROM光驱设备

在Libvirt里处理

尝试了以下有几种方法,为虚拟机加载光盘文件:

1.使用ide方式挂载:

virsh attach-disk {instance_name} {iso_path} hda --sourcetype block --driver qemu --subdriver raw  --type cdrom


xml格式如下:

<disk type='block' device='cdrom'>  

<driver name='qemu' type='raw'/>  

<source dev='{iso_path}'/>  

<target dev='hda'/></disk>


2.使用scsi方式挂载:

virsh attach-disk {instance_name} {iso_path} sda --sourcetype block --driver qemu --subdriver raw  --type cdrom

xml格式如下:

<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设备是不支持热拔插的:

virsh attach-disk {instance_name} {iso_path} hdaerror: Failed to attach diskerror: Operation not supported: disk bus 'ide' cannot be hotplugged.

研究了一番发现如果给这个光驱设备写一个空的source_path,挂载时只要替换这个source_path的值,它就不会认为这是一个拔插动作。


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 cdromDisk 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):

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)


                # new code begin


                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)

                # new code end



怎么卸载

给光驱更新一个空的source_path就可以了:

virsh attach-disk {instance_name} "" hda --sourcetype block --driver qemu --subdriver raw --type cdromDisk attached successfully



原文链接:https://blog.csdn.net/tpiperatgod/article/details/46459929


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值