zoukankan      html  css  js  c++  java
  • 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} hda
    error: Failed to attach disk
    error: 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 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):

                    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

    实际效果

    挂载操作不用多说,方法多种多样的……

    看看效果

    挂载前:

    windows 2003:

    windows 2008:

    挂载后:

    windows 2003:



    windows 2008:


    linux:

    怎么卸载

    给光驱更新一个空的source_path就能够了:

    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        -
  • 相关阅读:
    Linux进程组调度机制分析【转】
    Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)【转】
    linux syscall 详解【转】
    Linux C 读取文件夹下所有文件(包括子文件夹)的文件名【转】
    Linux RTC驱动模型分析之rtc-sysfs.c【转】
    Linux的notifier机制在TP中的应用【转】
    Linux内存管理 (10)缺页中断处理【转】
    proc/net/dev实时网速统计实例【转】
    硬中断和软中断【转】
    Linux网络
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8932671.html
Copyright © 2011-2022 走看看