聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

Ubuntu20.04上进行qemu透传网卡

2022-02-27 11:35 浏览: 3113676 次 我要评论(0 条) 字号:

一,环境
1,机器:HP246 G6笔记本
2,操作系统:$ cat /etc/issue
Ubuntu 20.04.2 LTS n l
3,软件:都是Ubuntu仓库里的qemu相关软件,比如qemu,virt-manager等
4,透传设备:这个HP笔记本有两个网卡,一个无线网卡,一个有线网卡,如下:
$ lspci

02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
03:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8723DE 802.11b/g/n PCIe Adapter
下面这张带有802.11b字符的无线网卡由宿主机(也就是Ubuntu 20.04.2)使用,而上面那张Realtek有线网卡一直空闲,准备捣鼓一下,把它透传给qemu虚拟机使用。
备注:qemu虚拟机试了win7,没有成功,虚拟机里一直安装驱动不成功,导致win7的设备管理器里该网卡显示驱动不正常。转而试了下centos8.2的虚拟机,搞成了,下面记录下。

二,开启IOMMU/VT-d
PCI透传也就是Pci Passthrough,本文没有搞SR-IOV这些,因为SR-IOV一般只有高端外设才有支持,而Pci Passthrough则要求不高,主机PCI总线上的外部设备一般都可以进行。
IOMMU是AMD的叫法,Intel叫VT-d,不管怎么样,在操作系统里就是按如下方式检查IOMMU是否已开启:

$ dmesg | grep IOMMU
[    0.039296] DMAR: IOMMU enabled
[    0.103508] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1

上面就是开启了的,如果什么都没grep出来,那就是没有开启。开启的方法如下:
1,给grub加上对应参数
$ vim /etc/default/grub
$ cat /etc/default/grub | grep intel_iommu
GRUB_CMDLINE_LINUX_DEFAULT=”intel_iommu=on iommu=pt”
上面是Intel的cpu,如果是amd的,则改为:amd_iommu=on。后面的iommu=pt是通用的,是Redhat建议加的。
执行sudo update-grub更新grub,重启机器。

2,重启机器,进入BIOS,把对应的虚拟化功能开启,比如Intel的VT-d。我这台设备的BIOS很简单,就一个虚拟化技术的选项,不管有没有用,直接打开,总之,反复检查dmesg是否有输出IOMMU enabled,多试几次。试到放弃都不行,那就只能换机器了。

三,给虚拟机设备添加透传网卡
1,利用图形界面:虚拟系统管理器,也就是virt-manager
给Centos8.2虚拟机添加新虚拟硬件:
添加硬件(A)->PCI主机设备->0000:02:00.0 Realtek网卡
xml如下:

<hostdev mode="subsystem" type="pci" managed="yes">
  <source>
    <address domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
  </source>
  <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
</hostdev>

启动虚拟机,用ps可以看到qemu命令里多了参数:-device vfio-pci,host=0000:02:00.0,id=hostdev0,bus=pci.7,addr=0x0
备注:其他的unbind/new_id操作都不用做,应该是这个virt-manager图形界面自动做了,包括启动虚拟机自动绑定PCI,关闭虚拟机自动释放PCI。

2,在Centos8.2虚拟机里正常看到透传的网卡:
# lspci

07:00.0 Ethernet controller: Realtek Semiconductor Co.,…
用ifconfig看下,判断是对应的enp7s0网口。
加上对应的配置文件:
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-enp1s0 ifcfg-enp7s0
其中ifcfg-enp1s0是虚拟机之前的虚拟网卡。
# vi ifcfg-enp7s0
主要修改如下配置:
BOOTPROTO=dhcp
NAME=enp7s0
UUID=cb98cd4e-63b5-4a58-a539-288080f842a2
DEVICE=enp7s0
ONBOOT=yes
其中IP地址通过dhcp获取,UUID可以使用命令:uuidgen enp7s0生成。
再利用nmcli命令,确保配置OK,正常运行。
nmcli c reload
nmclie device status

3,测试
通过透传网卡enp7s0的网络一切正常。ok~

参考:

https://pve.proxmox.com/wiki/Pci_passthrough

https://blog.csdn.net/qq_37960324/article/details/103007035



网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复