ubuntu18.04下pass-through直通realteck PCI设备到qemu-kvm虚拟机实践

news2024/9/24 1:18:42

设备直通是一种虚拟化资源分配方式,通过将物理设备直通给虚拟机环境,达到虚拟机可以直接访问物理设备的目的,直通功能对设备的要求不高,不需要设备支持PF/VF,18年后的普通家用PC的PCI设备都支持设备直通模式,今天来探索一下它的玩法。

实践平台

环境安装

1.安装QEMU虚拟机环境以及虚拟机管理工具环境:

sudo apt-get install qemu-kvm qemu-system libvirt-bin  bridge-utils virt-manager

2.默认BIOS中已经ENABLE了CPU虚拟化和设备虚拟化能力,所以这一步操作忽略。

3.Enable PCI IOMMU,参考如下文章:

Linux ion&dma-buf&iommu的原理_papaofdoudou的博客-CSDN博客

4.确认需要穿透的pci设备和设备号,我们透传的设备如下图所示,Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller。

透传设备的地址BDF为:00000:03:00.0,设备ID为168c:0036.

设置HOST机上的PCI设备

HOST端通过如下命令查看PCI设备信息

virsh nodedev-list --tree

首先在HOST端将PCI以太网卡设备解绑,将其驱动从默认的r8169切换为vfio-pci,这个过程中,主机的以太网络连接会中断,不过没有关系,主机上还有另外一个集成的无线网卡。

 执行如下命令查看当前设备信息:

$ virsh nodedev-dumpxml pci_0000_02_00_0

从设备信息中看到,设备驱动是r8169,设备的IOMMU分组是9。

查看IOMMU分组信息确实如此,分组为9

 下一步在HOST对设备解绑

$ virsh nodedev-detach pci_0000_02_00_0

解绑后,主机以太网卡功能已经失能,需要连接无线网卡。

此时我们需要加载内核的VFIO模块,由于默认UBUNTU18.04内核已经将vfio.ko,vfio-pci.ko两个模块builtin到内核中,所以这一步操作系统已经帮我们做了,不需要其它操作。

针对以太网卡设备使能VFIO驱动

执行如下命令,将系统的VENDOR和PRODUCT ID作为输入,写入vfio-pci/new_id节点,使能VFIO驱动,bind to vfio-pci Driver.

echo 10ec 8168 > /sys/bus/pci/drivers/vfio-pci/new_id

 执行后,再次查看设备信息,会发现其驱动已经从r8196切换为vfio-pci:

确认IOMMU分组,在没有加载vfio-pci驱动时,/dev/vfio/9是不存在的。

至此,HOST端的配置已经结束,可以安装虚拟机了。

安装虚拟机

虚拟机的安装除了要注意下图上的操作之外,其它无需多讲,参考这篇博客即可:

CPU虚拟化技术及QEMU/KVM虚拟机安装实践_qemu集群_papaofdoudou的博客-CSDN博客

虚拟机中透传PCI设备

同时可以看到主机上的以太网被WIFI网络代替,而虚拟机中可以直接使用透传后的以太网,网卡设备和HOST时的设备完全相同,因为本身它们就是同一个设备。

qemu可以脱离virt-manager GUI使用,我们看一下实际的QEMU命令是怎样的,以及透传参数有哪些?在HOST机上查看:

核心的参数有下面几个:

-smp 4 -m 2048
-enable-kvm -name guest=ubuntu18.04-2
-drive file=/var/lib/libvirt/images/ubuntu18.04-2.qcow2
-device vfio-pci,host=02:00.0,id=hostdev0,bus=pci.0,addr=0x8 
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x9

我们手动启动一下:

-device vfio-pci,host=02:00.0,id=hostdev0,bus=pci.0,addr=0x8 表示将HOST机上BDF为02:00.0的PCI设备(网卡)透传给虚拟机,并且分配设备号为8,BUS为0,同时在虚拟机上创建一个balloon0设备,设备BUS为0,SLOT为9。

sudo qemu-system-x86_64 -smp 4 -m 2048 -enable-kvm -name guest=ubuntu18.04-2 -drive file=/var/lib/libvirt/images/ubuntu18.04-2.qcow2 -device vfio-pci,host=02:00.0,id=hostdev0,bus=pci.0,addr=0x8 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x9

可以看到,和使用virt-manager界面启动虚拟机类似,用纯粹的QEMU命令行启动的虚拟机同样包含了透传进来的网卡设备,BUS为0,SLOT为8,同时存在一个虚拟设备 balloon,BUS为0,SLOT为9,和命令行参数设置吻合。

HOST机的DMESG输出

其它

如果两台虚拟机透传同一个PCI设备,则在安装第二台虚拟机的时候,会提示设备冲突,这说明PASS-THROUGH的设备是一个独占资源,无法在多个虚拟机之间共享。

vfio.ko/vfio-pci.ko

默认情况下,vfio和vfio-pci两个模块是builtin进内核的,也可以选择编译成模块的形式安装:

安装:

用自定义的内核将VFIO编译成模块进行上面的实验:

参考文章

linux iommu group分析&整理_papaofdoudou的博客-CSDN博客

CPU虚拟化技术及QEMU/KVM虚拟机安装实践_qemu集群_papaofdoudou的博客-CSDN博客

ubuntu以passthrough方式直通pci设备(fpga)到kvm虚拟机(华硕主板)_virsh nodedev-dumpxml_sbbbbbbbbbbbbb的博客-CSDN博客

提升KVM异构虚拟机启动效率:透传(pass-through)、DMA映射(VFIO、PCI、IOMMU)、virtio-balloon、异步DMA映射、预处理

结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/498694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】Java对象的比较

Java对象的比较 PriorityQueue中插入对象元素的比较基本数据类型的比较对象的比较重写基类的equals方法基于Comparble接口类的比较基于比较器进行比较 PriorityQueue中插入对象 优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较…

Redis持久化之AOF日志高频问题

1、如何采用AOF日志避免宕机丢失数据? Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。 MySQL数据库的写前日志(Write Ahead Log, WAL),在实际写数据前,…

PWLCM分段线性混沌映射

混沌映射是生成混沌序列的一种方法,常见的混沌映射方式有 Logistic映射、Tent映射、Lorenz映射,而PWLCM(Piecewise Linear Chaotic Map,分段线性混沌映射)作为混沌映射的典型代表,数学形式简单,具有遍历性和随机性。其…

智能优化算法:基于减法平均的优化算法-附代码

智能优化算法:基于减法平均的优化算法 文章目录 智能优化算法:基于减法平均的优化算法1.基于减法平均优化算法1.1 初始化1.2 SABO的数学建模 2.实验结果3.参考文献4.Matlab 摘要:基于减法平均的优化算法(Subtraction-Average-Base…

[数据结构] 二叉搜索树的详解实现

文章目录 概念实现架构BSTreeNodea(节点)BSTree框架 增删查 -- 循环写法insert(尾插)inOrder(遍历)Find(查找)Erase(删除)默认成员函数构造拷贝构造析构函数赋…

哈夫曼编码文件压缩和解压

哈夫曼编码&文件压缩和解压 文章目录 哈夫曼编码&文件压缩和解压哈夫曼编码基本介绍原理解析代码实现 文件的压缩文件的解压完整代码 哈夫曼编码 基本介绍 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于…

实现c++轻量级别websocket协议客户端

1 websocket 轻量客户端 因以前发过这个代码,但是一直没有整理,这次整理了一下,持续修改,主要是要使用在arm的linux上,发送接收的数据压缩成图片发送出去。 要达到轻量websocket 使用,必须要达到几个方面…

MySQL:数学函数和字符串函数

目录 前言: 数学函数: 求绝对值: 求PI: 求平方根: 求余数: 取整: 随机数: 四舍五入: 只舍不入: 返回参数符号: 幂运算: …

Illustrator如何编辑图形对象之实例演示?

文章目录 0.引言1.绘制海浪插画2.绘制时尚波浪发型3.绘制一条鲸鱼 0.引言 因科研等多场景需要进行绘图处理,笔者对Illustrator进行了学习,本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结,本文对图形…

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM 本项目采用HuggingFace提供的工具实现BERT模型案例,并在BERT后接CNN、LSTM等 HuggingFace官网 一、实现BERT(后接线性层) 1.引用案例源码: from transformers impo…

开关电源基础01:电源变换器基础(2)

说在开头:关于德布罗意的电子波(3) 1923年,德布罗意在求出他的相波之前,康普顿刚好用光子说解释了康普顿效应(记性好的胖友们应该还记得:散射波的波长变长问题),从而带领…

开关电源基础02:基本开关电源拓扑(2)-BOOST-BUCKBOOST拓扑

说在开头:关于海森堡的矩阵(2) 海森堡写完论文就回到了哥廷根大学,他一看见玻恩就把这份论文拿出来请老师把关,还说要趁着假期去趟英国剑桥大学讲课交流。玻恩拿过论文一看,海森堡画的这个表格是啥玩意啊&…

【操作系统】高性能网络模式:Reactor 和 Proactor

【操作系统】高性能网络模式:Reactor 和 Proactor 参考资料: 高性能 RPC 通信的实现- 巧用 reactor 模式 高性能网络模式:Reactor 和 Proactor NIO Reactor模型 Netty「基石」之Reactor模式 高性能IO模型分析-Reactor模式和Proactor模式 【…

【服务器】无公网IP,异地远程连接威联通NAS

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 前言 1. 威联通安装cpolar内网穿透 2. 内网穿透 2.1 创建隧道 2.2 测试公网远程访问 3. 配置固定二级子域名 3.1 保留二级子域名 3.2 配置二级子域名 4. 使用固定二级子…

Linux诊断原因:生产环境服务器变慢,诊断思路和性能评估

Linux诊断原因,生产环境服务器变慢,诊断思路和性能评估 1 整机:top,查看整机系统性能 使用top命令的话,重点关注的是 %CPU、%MEM 、load average 三个指标 load average三个指标:分别代表1、5、15时分钟系…

2022年NOC大赛编程马拉松赛道初赛图形化低年级A卷-正式卷,包含答案

目录 选择题: 下载文档打印做题: 2022年NOC大赛编程马拉松赛道【初赛】图形化低年级A卷-正式卷 2022NOC-图形化初赛低年级A卷正式卷 选择题: 1、答案:B 禾木是一个军事迷,他打算利用业余时间制作一款射击游戏。在游戏中,玩家可以通过鼠标控制手枪移动。请问,给手枪…

springboot+vue体质测试数据分析及可视化设计(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的体质测试数据分析及可视化设计。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者&a…

[svg-icon]引入vue项目后,use标签为0,已解决

这个bug我之前遇到过一次,解决了也就没记录 但是好记性不如烂笔头,这次重新遇到,又重新排查bug花了1个多小时 svg引入vue项目,需要依赖svg-sprite-loader npm install svg-sprite-loader在vue.config.js中 chainWebpack(conf…

NOC大赛·核桃编程马拉松赛道知识点大纲(高年级及初中组)

NOC核桃编程马拉松知识点大纲(高年级及初中组) (一)基础语法 1.掌握运动积木的用法。 包括“移动 10 步”、“左/右转 X 度”、“面向 X 方向/鼠标指针/ 角色”、“移到 XY 坐标/鼠标/角色”、“X/Y 坐标的设定和增加”、 “滑行到 XY/鼠标/角色”等积木用法,详细如下。 1…

【数据结构】链表OJ:力扣160. 相交链表

最近这几篇内容都有关链表,接下来几篇内容会分享一些链表的OJ题,希望对你有所帮助。 今天要分享的内容是力扣160. 相交链表:160. 相交链表 - 力扣(LeetCode) 目录 题目: 题解 题目: 给你…