声明:

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

博客地址: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)的更多相关文章

  1. VMware 设置虚拟机Centos 上网的两种方式

    能在VMware上面安装虚拟机,不可能说是不让链接外网,只是在自己电脑上玩玩就可以了.因为学习需要,经常在自己笔记本上面搭建虚拟机,我经常使用的两种上网方式 一 NET方式上网 设置VMware Ne ...

  2. VMware虚拟机直连物理网络的两种方式

    VMware虚拟机直连物理网络的两种方式   使用VMware构建虚拟机,通常虚拟机都使用NAT模式.这时,虚拟机有独立的网段.使用NAT模式,虚拟机之间数据都通过虚拟网络传输,不会影响实体机所在的实 ...

  3. 设备程序远程升级采用两种方式(优先采用IP方式)

    设备程序远程升级采用两种方式(优先采用IP方式): 采用应急广播TS流传输技术规范的消息内容表携带升级包数据.当辅助数据类型值为44时,消息内容表传输的数据为程序升级包. 采用IP方式传输升级包数据. ...

  4. 利用adb查看手机设备ip和连接手机的两种方式

    电脑安装adb(查看菜鸟adb教程) [cmd]->输入adb devices (设置了path,否则需要 ./路径/adb devices)如图: 查看ip两种方法(可能有更多,目前我还没看到 ...

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

    使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...

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

    使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...

  7. LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...

  8. 两种方式测试 GNS3 环境

    GNS3已经部署好了,怎么测试环境呢?两种方式,一是使用自带的VPC连接交换机互联互通,二是配合VMware连接GNS3中的交换机互联互通. 自带 VPC 测试 使用两台VPC与一台二层交换机相连,测 ...

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

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

随机推荐

  1. IOS Layer的使用

    CALayer(层)是屏幕上的一个矩形区域,在每一个UIView中都包含一个根CALayer,在UIView上的所有视觉效果都是在这个Layer上进行的. CALayer外形特征主要包括: 1.层的大 ...

  2. Android UI开发详解之ActionBar .

    在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果. 一.添加A ...

  3. ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_909_0.MYI' (Errcode: 13)

    mysql> desc tablename; ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_909_0.MYI' (Errcode ...

  4. DEV PivotGridControl 全选行或列

    foreach (string item in fieldProductName.FilterValues.Values) { pivotGridControl.Cells.SetSelectionB ...

  5. 《第一行代码》学习笔记28-内容提供器Content Provider(1)

    1.内容提供器:用于在不同的应用程序之间实现数据共享的功能,提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问 数据的安全性.使用内容提供器是Android实现跨程序共享数据 ...

  6. 关于发布DIPS的MVC项目的IIS 7.0环境配置的方法

    本人技术笨拙,今天在发布DIPS的MVC4.0项目,并部署到IIS上,遇到各种问题.在查询相关资料后,最终得以解决,所以想把这个过程记录下来. 注:DIPS为一种非关系型数据库 首先,需要安装和注册D ...

  7. 发送trim值

    发送寄存器和地址上的所有值 uart_send(0xa1); uart_send(*((char code*)0x2001)); uart_send(*((char code*)0x2002)); u ...

  8. 转载:CPU的位数和操作系统的位数

    1. 32位系统最大只能使用3.5G的内存,而64位系统最大能够使用128G内存. 2. 32位CPU只能安装和使用32位.16位的系统和软件,无法使用64位系统及软件. 3. 64位可以安装64位系 ...

  9. [模拟炉石](一)让游戏过程显示到cocos2d中

    在上篇中,如果运行了fireplace的tests/full_game.py,这个程序将一个游戏过程在终端上运行完成,可以看到整个过程,那么第一步要做的就是将这个过程显示到cocos2d创建的场景中去 ...

  10. 关于String s = new String("xyz"); 创建几个对象的问题

    引用自这位朋友:http://blog.sina.com.cn/s/blog_6a6b14100100zn6r.html 你知道在java中除了8中基本类型外,其他的都是类对象以及其引用.所以 &qu ...