虚拟机设备直通的两种方式(Working in Progress)

声明:

本博客欢迎转发,但请保留原作者信息!

博客地址:http://blog.csdn.net/halcyonbaby

内容系本人学习、研究和总结,如有雷同,实属荣幸!

pci passthrough

  • 概念

    • 允许guest排他使用host上的某个PCI设备,就像将该设备物理连接到guest上一样。
  • 使用场景
    • 提升性能(如直通网卡和显卡)
    • 降低延迟(避免数据丢失或丢祯)
    • 直接利用bare-metal上设备的驱动
  • 用法1

    需要CPU支持VT-d。主板也支持该技术。

    • 预先配置:

      • 打开bios中的VT-d设置。
      • 激活kernel中参数配置kernel /vmlinuz-2.6.18-190.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet intel_iommu=on
    • 直通配置方法
      • libvirt
      1. 识别设备
      # virsh nodedev-list --tree |grep pci
      2. 获取设备xml
      ```# virsh nodedev-dumpxml pci_8086_3a6c```
      3. detach设备
      ```# virsh nodedev-dettach pci_8086_3a6c```
      4. 修改虚拟机xml文件(将dumpxml查询到的bus,slot,function填入)
      <devices>
      ......
      <hostdev mode=‘subsystem‘ type=‘pci‘ managed=‘yes‘>
       <source>
         <address domain=‘0x0000‘ bus=‘0x03‘ slot=‘0x00‘ function=‘0x0‘/>
       </source>
      </hostdev>
      ......
      </devices>
      5. 启动虚拟机
      
      • qemu
      1. unbind pci设备
        modprobe pci_stub
        lspci -D -nn查询pci设备(domain,slot,bus,function)和(vendor id, device id )
        以设备(01:00.0, vendor & device ID 8086:10b9)为例:
        echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
        echo 0000:01:00.0 > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
        echo 0000:01:00.0 > /sys/bus/pci/drivers/pci-stub/bind
      2. 启动虚拟机
        -device pci-assign,host=01:00.0
      
  • 如何将直通设备对应

    host上直通设备与虚拟机中设备对应关系确定方法。

    可以通过hostdev中增加address(不是source中的address)确定设备在虚拟机中的挂载路径。

    虚拟机种通过lspci查看即可对应起来。

http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM

pci passthrough(VFIO)2

VFIO在kernel3.6/qemu1.4以后支持,目前只支持PCI设备。

VFIO是一套用户态驱动框架,提供两种基本服务:

  • 向用户态提供设备访问接口
  • 向用户态提供配置IOMMU接口

VFIO可以用于实现高效的用户态驱动。在虚拟化场景可以用于device passthrough。

通过用户态配置IOMMU接口,可以将DMA地址空间映射限制在进程虚拟空间中。

这对高性能驱动和虚拟化场景device passthrough尤其重要。

相对于传统方式,VFIO对UEFI支持更好。

VFIO技术实现了用户空间直接访问设备。无须root特权,更安全,功能更多。

http://lwn.net/Articles/509153/http://lwn.net/Articles/474088/https://www.ibm.com/developerworks/community/blogs/5144904d-5d75-45ed-9d2b-cf1754ee936a/entry/vfio?lang=en

  • 操作方法

    • 安装kernel module

      sudo modprobe vfio

      sudo modprobe vfio-pci

    • 设备unbind
      1. 查看iommu_group及其下所有设备
      cd /sys/bus/pci/devices/0000:0d:00.0/
      readlink iommu_group    #查看iommu_group名字
      ll iommu_group/devices  #查看iommu_group下设备
      2. 需要将iommu_group下所有设备unbind并添加到iommu_group中
      echo 0000:0d:00.0 > /sys/bus/pci/devices/0000:0d:00.0/driver/unbind
      echo 1180 e823 > /sys/bus/pci/drivers/vfio-pci/new_id
    
    • 启动虚拟机
      -device vfio-pci,host=0000:03:00.0
    

    参考http://blog.csdn.net/richardysteven/article/details/9008971

IOMMU

IOMMU:input/output memory management unit。

连接DMA io bus和主存,完成从设备虚拟地址到物理地址的映射。以及提供对故障设备的内存保护的功能。

  • 优点

    • 由于IOMMU的映射,可以将多个不连续的物理地址映射为大块连续的地址供设备使用,便于简化驱动设计
    • 使旧设备(32bit设备)可以使用高位地址。(可以改善内存使用,提高性能)
    • 内存保护,避免设备使用不属于它的地址
    • 提供硬件中断remapping功能
  • 缺点
    • 地址转换和管理开销带来的性能降级
    • 消耗物理内存
  • 虚拟化中的应用

    一般来说,由于内存地址不同,虚拟机中的操作系统无法直接访问host上的设备。

    通过IOMMU,可以将设备地址在虚拟机中和host中映射为相同的支持,供虚拟机使用。这种做法也可以缓解IO delay。

虚拟机设备直通的两种方式(Working in Progress),布布扣,bubuko.com

时间: 2024-10-23 11:19:41

虚拟机设备直通的两种方式(Working in Progress)的相关文章

Simics虚拟机Solaris 8操作系统获取host 系统win7上的文件的两种方式

1 介绍 本文基于的环境设置如下: ? 宿主操作系统:Windows 7 Ultimate ? 寄生操作系统:Solaris 8 SPARC (SunOS 5.8) ? 虚拟环境:Simics 3.0.4 本文假定已在Simics 上安装好Solaris 8 SPARC 操作系统. 动机:一个Unix下可以运行的二进制文件GraphGen,在单独的一台装有Ubuntu的电脑上不能运行,因为该电脑的硬件架构是基于X86的,而GraphGen是SPARC架构下才能运行的程序:在我的笔记本Win7系统

实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/sys

对Java代码加密的两种方式,防止反编译

使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的java.exe,并且可以实现项目源码绑定制定设备,防止部署到客户服务器的项目被整体拷贝. 两种加密方式 War 包加密 当你的项目在没有完成竣工的时候,不适合使用 war 文件,因为你的类会由于调试之类的经常改,这样来回删除.创建 war 文件很不爽,最好是你的项目已经完成了,不改了,那么就打个 w

生成二维码的两种方式

利用qrcode生成二维码,(qrcode矩形二维码符号) 基于jquery的二维码生成插件qrcode,在页面中调用该插件就能生成对应的二维码.qrcode其实是通过使用jQuery实现图形渲染,画图,支持canvas(HTML5)和table两种方式: 使用插件时 1.首先在页面中加入jquery库文件和qrcode插件. <script type="text/javascript" src="jquery.js"></script> &

《连载 | 物联网框架ServerSuperIO教程》- 10持续传输大块数据流的两种方式(如:文件)

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架ServerSuperIO教程>2.服务实例的配置参数说明 <连载 | 物联网框架ServerSuperIO教程>- 3.设备驱动介绍 <连载 | 物联网框架ServerSuperIO教程>-4.如开发一套设备驱动,同时支持串口和网络通讯. <连载 | 物联网框架ServerSupe

Mac OS 10.12 - 在VMwear Workstation12.5.2中以两种方式进入恢复模式(Recovery)!!!

注意:如果你打算安装Mac OS10.12 到虚拟机里面学习,那么我强烈建议你在没有安装任何其它软件之气,按照我这篇博客来进入恢复模式(Recovery),禁用Rootless机制!!!这样处理后,你就可以任意使用Mac OS了,否则你最终会发现,你必须进入恢复模式(Recovery),必须禁用Rootless机制才能达到随心所欲使用Mac OS10.12!!!! Mac OS :10.12 VMwear Workstation:12.5.2 我为什么要进入恢复模式?因为Mac OS10.12出

《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 目       录 10.持续传输大块数据流的两种方式(如:文件)... 2 10.1        概述... 2 10.2        大块数据流的两种传输方式... 2 10.2.1       协议数据包的方式... 2 10.2.2       请求长度.确认的方式... 3 10.3        实现持续传输大块数据... 4 10.3.1       设计请求发送数据协议... 4 10

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端

Android开发之使用sqlite3工具操作数据库的两种方式

使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/fengyuzhengfan/article/details/40193123 在Android SDK的tools目录下提供了一"sqlite3.exe工具,它是一个简单的SQLite数据库管理工具,类似于MySQL提供的命令行窗口在有些时候,开发者利用该工具来査询. 管理数据库. 下面介绍两种方式: 第