将服务器上的一个真实NVMe SSD硬盘通过PCIe Passthrough方式透传给该虚拟机,要求在虚拟机里边可以看到并正常读写该NVMe SSD硬盘。
- 创建虚拟机并安装ubuntu20.04系统
·使用QEMU命令行工具创建一个虚拟机。为虚拟机配置CPU、内存、虚拟硬盘(如QCOW2格式)以及网络等基本资源。加载Ubuntu安装镜像(ISO),并通过该镜像在虚拟机内安装操作系统
1、创建虚拟机磁盘镜像
qemu-img create -f qcow2 ubuntu20.04.img 60G
2、创建虚拟机
qemu-system-x86_64 --enable-kvm -m 8048 -smp 4 \
-hda ubuntu20.04.img \
-cdrom ubuntu-20.04-desktop-amd64.iso \
-boot d \
-net nic \
-net tap,ifname=tap0,script=no,downscript=no
- NVMe SSD透传到虚拟机
- 启用IOMMU(允许虚拟机通过透传的方式直接高效访问物理设备)
(1)设置启动参数(本机处理器为Intel,若为AMD开机启动参数有所差异):
vim /etc/default/grub
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"
(2)保存文件并更新 grub
grub2-mkconfig -o /boot/grub2/grub.cfg
(3)系统重启
reboot
- 透传准备
在虚拟机已经创建并且安装了操作系统后,将主机的物理硬件资源(如NVMe硬盘)直通到虚拟机。通过VFIO绑定设备到虚拟机,使得虚拟机中的操作系统能够直接使用主机上的物理硬件。
- 驱动加载
modprobe vfio-pci
确认是否加载成功
lsmod | grep vfio
(2)找到要透传的NVMe设备的PCI地址
lspci | grep -i Non-Volatile
(3)找到NVMe 设备的所在IOMMU 组
find /sys/kernel/iommu_groups/ -type l | grep NVMe设备的PCI地址
在进行PCI直通时,所有需要直通到虚拟机的设备必须在同一个IOMMU组中。这是因为IOMMU组中的设备共享相同的地址空间,如果它们不在同一个组中,无法保证数据的隔离性,可能会导致系统不稳定或安全问题。
(4)设备解绑
"0000:46:00.0" | tee /sys/bus/pci/devices/0000:46:00.0/driver/unbind
(5)驱动覆盖
echo "vfio-pci" | tee /sys/bus/pci/devices/0000:46:00.0/driver_override
(6)设备绑定
echo "0000:46:00.0" | tee /sys/bus/pci/drivers/vfio-pci/bind
(7)验证设备绑定状态
lspci -vvv -s pci地址
Kernel driver in use: vfio-pci
- 设备透传到虚拟机
qemu-system-x86_64 --enable-kvm -m 8048 -smp 4 \
-hda ubuntu20.04.img \
-net nic \
-net tap,ifname=tap0,script=no,downscript=no \
-device vfio-pci,host=46:00.0
4、虚拟机中验证NVMe设备
- 检查NVMe设备
lsblk
(2)测试读写性能
创建文件系统
sudo mkfs.ext4 /dev/nvme0n1
挂载NVMe SSD
sudo mkdir /mnt/nvme
sudo mount /dev/nvme0n1 /mnt/nvme
读写文件
echo "Hello, NVMe SSD!" | sudo tee /mnt/nvme/greeting.txt
cat /mnt/nvme/greeting.txt
写入测试
dd if=/dev/zero of=/mnt/nvme/testfile bs=1G count=1 oflag=sync
读取测试
dd if=/mnt/nvme/testfile of=/dev/null bs=1G
QEMU网络配置:网桥模式
软件:bridge-utils 用于创建和管理网桥接口
一、创建虚拟网桥:
brctl addbr br0
二、启用虚拟网桥:
ip link set dev br0 up
启用网桥接口,使其可以接受流量。
三、创建 TAP 接口:
ip tuntap add dev tap0 mode tap
brctl addif br0 tap0
创建一个 TAP 设备 tap0 并将其添加到网桥 br0 中。
四、启用 TAP 接口:
ip link set dev tap0 up
启用 TAP 接口,使其可以发送和接收数据包。
五、配置 IP 地址:
ip addr add 192.168.100.1/24 dev br0
注销虚拟网桥br0以及tap端口tap0
一、注销 tap0 端口
首先,确保虚拟机已经关闭,然后可以将 tap0 接口从 br0 网桥中移除,并将其关闭。
删除 tap0 端口:
ip link set tap0 down
brctl delif br0 tap0
删除 tap0 接口
ip link delete tap0
二、 注销 br0 网桥
关闭 br0 接口
ip link set br0 down
删除 br0 网桥
brctl delbr br0