虚拟机设备直通的两种方式(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
- 安装kernel module
IOMMU
IOMMU:input/output memory management unit。
连接DMA io bus和主存。完毕从设备虚拟地址到物理地址的映射。
以及提供对故障设备的内存保护的功能。
- 长处
- 因为IOMMU的映射。能够将多个不连续的物理地址映射为大块连续的地址供设备使用,便于简化驱动设计
- 使旧设备(32bit设备)能够使用高位地址。
(能够改善内存使用。提高性能)
- 内存保护。避免设备使用不属于它的地址
- 提供硬件中断remapping功能
- 缺点
- 地址转换和管理开销带来的性能降级
- 消耗物理内存
- 虚拟化中的应用
一般来说。因为内存地址不同,虚拟机中的操作系统无法直接訪问host上的设备。
通过IOMMU,能够将设备地址在虚拟机中和host中映射为同样的支持。供虚拟机使用。这样的做法也能够缓解IO delay。
虚拟机设备直通的两种方式(Working in Progress)的更多相关文章
- VMware 设置虚拟机Centos 上网的两种方式
能在VMware上面安装虚拟机,不可能说是不让链接外网,只是在自己电脑上玩玩就可以了.因为学习需要,经常在自己笔记本上面搭建虚拟机,我经常使用的两种上网方式 一 NET方式上网 设置VMware Ne ...
- VMware虚拟机直连物理网络的两种方式
VMware虚拟机直连物理网络的两种方式 使用VMware构建虚拟机,通常虚拟机都使用NAT模式.这时,虚拟机有独立的网段.使用NAT模式,虚拟机之间数据都通过虚拟网络传输,不会影响实体机所在的实 ...
- 设备程序远程升级采用两种方式(优先采用IP方式)
设备程序远程升级采用两种方式(优先采用IP方式): 采用应急广播TS流传输技术规范的消息内容表携带升级包数据.当辅助数据类型值为44时,消息内容表传输的数据为程序升级包. 采用IP方式传输升级包数据. ...
- 利用adb查看手机设备ip和连接手机的两种方式
电脑安装adb(查看菜鸟adb教程) [cmd]->输入adb devices (设置了path,否则需要 ./路径/adb devices)如图: 查看ip两种方法(可能有更多,目前我还没看到 ...
- 对Java代码加密的两种方式,防止反编译
使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...
- 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- 两种方式测试 GNS3 环境
GNS3已经部署好了,怎么测试环境呢?两种方式,一是使用自带的VPC连接交换机互联互通,二是配合VMware连接GNS3中的交换机互联互通. 自带 VPC 测试 使用两台VPC与一台二层交换机相连,测 ...
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
随机推荐
- JMeter Building a Database Test Plan
Building a Database Test Plan In this section, you will learn how to create a basic Test Planto test ...
- [Javascript] How to use JavaScript's String.replace
In JavaScript, you can change the content of a string using the replace method. This method signatur ...
- IOS-沙盒机制(一 简述)
一 IOS沙盒机制 出于安全的目的,应用程序仅仅能将自己的数据和偏好设置写入到几个特定的位置上.当应用程序被安装到设备上时,系统会为其创建一个家文件夹,这个家文件夹就是应用程序的沙盒.所以 ...
- the process cannot access the file because it is being used by another process
当在IIS中改动绑定的port号后启动时遇到例如以下错误,表明你的port号已经被占用了 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmljMDIyOA ...
- c++11 NULL、0、nullptr
C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL;foo_t *f = NULL; 实际上在C语言中,NULL通常被定义为如下: #de ...
- 文本框按键事件onkeydown、onkeypress、onkeyup区别
当我们在搜索时,会用到这几个事件 onkeydown 是指鼠标按下的那一刻,此时用户不知道按了什么,文本框也不会显示,首先触发的事件 onkeypress 是指鼠标按下然后松开的瞬间,此时仍然获取不到 ...
- html游戏引擎,createJs框架
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! createJs网上的中文教程挺少的,以前UC有个Xcanvas的论坛有createJs的详细教程,但是随着XCanvas团队的解散,那个 ...
- TravelCMS旅游网站系统诞生记
本人就是一纯粹码农,没什么学历,更没什么技术,但是自认为学习能力还不错,近期有一个旅游网站系统项目正在进行中,在此以贴图记录这个项目的诞生过程,本是一个定制系统,但是不想把系统做死,以通用产品的标准来 ...
- Docker中的一些命令
可以交互的方式启动container $ sudo docker run -t -i ubuntu:14.04 /bin/bash 当这个Bash shell进程终止时,这个容器也停止了. docke ...
- 《第一行代码》学习笔记7-活动Activity(5)
1.Intent中只能指定一个action,但却能指定多个category. 2.使用隐式Intent,不仅可以启动自己程序内的活动,还可以启动其他程序的活动,使得Android应用程序之间 的功能共 ...