KVM虛擬化之設備透傳
顯卡透傳
查看顯卡PCI地址
lspci | grep -i nvidia
會看到類似下面的輸出,其中包含顯卡的 PCI 地址,例如 0000:03:00.0:
03:00.0 VGA compatible controller: NVIDIA Corporation Device 1eb8 (rev a1)
03:00.1 Audio device: NVIDIA Corporation Device 10f7 (rev a1)
確認 IOMMU 支持
確保主機啟用了 IOMMU 支持。在 GRUB 配置中添加以下參數(shù):
- 對于 Intel CPU,在 /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX 添加 intel_iommu=on:
GRUB_CMDLINE_LINUX="... intel_iommu=on"
- 對于 AMD CPU,添加 amd_iommu=on:
GRUB_CMDLINE_LINUX="... amd_iommu=on"
然后更新 GRUB 配置:
update-grub
確認 IOMMU 組
確認顯卡在單獨的 IOMMU 組中:
dmesg | grep -e DMAR -e IOMMU
這里有一個腳本可以查看
#!/bin/bash
for d in /sys/kernel/iommu_groups/*; do
if [ -d "$d" ]; then
echo "IOMMU Group ${d##*/}:"
for f in $(ls $d/devices/); do
echo -e "\t$(lspci -nns $f)"
done;
fi;
done;
綁定設備到 VFIO 驅(qū)動
查找設備 ID:
使用 lspci -nn | grep -i nvidia找到顯卡設備 ID,例如 10de:1eb8 和 10de:10f7。
創(chuàng)建 VFIO 配置文件:
在 /etc/modprobe.d/vfio.conf 文件中添加以下內(nèi)容,將設備 ID 替換為找到的設備 ID:
options vfio-pci ids=10de:1eb8,10de:10f7
更新 initramfs 并重啟系統(tǒng):
更新 initramfs 以應用新的 VFIO 配置,并重啟系統(tǒng):
update-initramfs -u
reboot
編輯虛擬機xml文件
在部分添加顯卡設備配置,使用上面找到的 PCI 地址:
通常情況下,顯卡的audio可以不用透傳,只需要添加一個hostdev的塊就可以了
<devices>
...
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</source>
<rom bar='off'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
</source>
<rom bar='off'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</hostdev>
...
</devices>
之后啟動虛擬機。
網(wǎng)卡透傳
檢查宿主機是否支持 IOMMU
要進行網(wǎng)卡透傳,宿主機需要支持 IOMMU,并且BIOS中要開啟Intel vt-d。
grep -E "svm|vmx" /proc/cpuinfo
- AMD CPU 支持 svm
- Intel CPU 支持 vmx
啟用 IOMMU
在宿主機中啟用 IOMMU 功能:
修改 GRUB 配置:
編輯 /etc/default/grub 文件:
在 GRUB_CMDLINE_LINUX 中添加以下參數(shù):
- 對于 Intel CPU:
intel_iommu=on iommu=pt
- 對于 AMD CPU:
amd_iommu=on iommu=pt
更新 GRUB 并重啟:
sudo update-grub
sudo reboot
檢查 IOMMU 是否啟用
在宿主機重啟后,運行以下命令確認 IOMMU 是否啟用:
dmesg | grep -e DMAR -e IOMMU
如果輸出中顯示類似 IOMMU enabled,說明配置正確。
獲取網(wǎng)卡的 PCI ID
使用以下命令找到要透傳的網(wǎng)卡設備:
lspci -nn | grep -i network
示例輸出:
03:00.0 Ethernet controller [0200]: Intel Corporation Ethernet Controller X710 [8086:1572]
- 03:00.0 是網(wǎng)卡的 PCI 地址。
- [8086:1572] 是設備的廠商和設備 ID。
將網(wǎng)卡分配給虛擬機
在 libvirt 的虛擬機配置文件(XML)中,添加透傳的網(wǎng)卡:
獲取網(wǎng)卡的 PCI 地址:
lehw -C network -businfo
編輯虛擬機的 XML 配置文件:
virsh edit <VM-NAME>
添加以下內(nèi)容到 <devices> 節(jié)點中:
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</source>
</hostdev>
重啟虛擬機:
virsh shutdown <VM-NAME>
virsh start <VM-NAME>
驗證網(wǎng)卡透傳
在虛擬機中運行以下命令,查看網(wǎng)卡是否被識別:
lspci | grep -i ethernet
USB透傳
常要用于透傳usb存儲設備和加密狗設備給虛擬機
確認宿主機可以識別 USB 設備
查看所有連接的 USB 設備:
lsusb
示例輸出:
Bus 002 Device 005: ID 0781:5581 SanDisk Corp. Ultra
Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
- Bus 002 Device 005 表示設備的總線號和設備號。
- 0781:5581 是廠商和設備 ID。
將 USB 設備分配給虛擬機
使用 virsh 修改虛擬機配置:
編輯虛擬機的 XML 配置:
virsh edit <VM-NAME>
在 <devices> 節(jié)點中添加以下內(nèi)容:
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<vendor id='0x0781'/>
<product id='0x5581'/>
</source>
</hostdev>
參數(shù)說明:
- vendor id='0x0781':設備的廠商 ID。
- product id='0x5581':設備的產(chǎn)品 ID。
保存后退出。
重啟虛擬機
將 USB 設備透傳給虛擬機后,重啟虛擬機:
virsh shutdown <VM-NAME>
virsh start <VM-NAME>
在虛擬機中驗證設備
登錄到虛擬機后,使用以下命令查看 USB 設備是否可用:
lsusb
應該可以看到之前透傳的 USB 設備。
USB 設備熱插拔配置
在虛擬機運行時,可以使用以下命令將 USB 設備添加到虛擬機或者在虛擬機動態(tài)移除:
添加 USB 設備:
virsh attach-device <VM-NAME> --file usb.xml --live
其中 usb.xml 是描述 USB 設備的 XML 配置文件。
動態(tài)移除 USB 設備
如果需要從虛擬機中移除 USB 設備,使用以下命令:
virsh detach-device <VM-NAME> --file usb.xml --live
創(chuàng)建 USB 設備 XML:
創(chuàng)建一個名為 usb.xml 的文件,內(nèi)容如下:
<hostdev mode='subsystem' type='usb'>
<source>
<vendor id='0x0781'/>
<product id='0x5581'/>
</source>
</hostdev>
- **vendor id**** 和 ****product id**:使用 lsusb 或 virsh nodedev-dumpxml 提取的廠商和產(chǎn)品 ID。
HBA卡透傳到虛擬機
HBA卡用于FC-SAN存儲,可能原來服務器使用了FS-SCN存儲,當服務器遷移到超融合或者私有云上后,仍希望繼續(xù)使用FC-SAN存儲,可采購HBA卡插到超融合或者私有云服務器上,并將其透傳到對應的虛擬機上繼續(xù)使用
檢查宿主機支持 PCI 直通
HBA 卡透傳需要宿主機支持 IOMMU 功能。
檢查 CPU 是否支持虛擬化和 IOMMU:
grep -E "svm|vmx" /proc/cpuinfo
檢查是否啟用 IOMMU:
dmesg | grep -e DMAR -e IOMMU
如果未啟用,請參考以下步驟配置 IOMMU。
啟用 IOMMU
修改 GRUB 配置:
編輯 /etc/default/grub 文件:
vim /etc/default/grub
添加以下參數(shù)到 GRUB_CMDLINE_LINUX:
- 對于 Intel CPU:
intel_iommu=on iommu=pt
- 對于 AMD CPU:
amd_iommu=on iommu=pt
保存文件后更新 GRUB 配置并重啟系統(tǒng):
sudo update-grub
sudo reboot
確認 HBA 卡信息
使用以下命令列出宿主機的所有 PCI 設備:
lspci -nn
找到 HBA 卡對應的設備。例如:
04:00.0 Fibre Channel [0c04]: QLogic Corp. QLE2562 8Gb Fibre Channel Adapter [1077:2532] (rev 02)
記錄設備的 PCI 地址,例如 04:00.0。
將 HBA 卡分配給虛擬機
編輯虛擬機 XML 配置:
- 打開虛擬機的 XML 配置:
virsh edit <VM-NAME>
- 在 <devices> 節(jié)點中添加以下內(nèi)容:
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</source>
</hostdev>
- 保存并退出。
啟動虛擬機并驗證
啟動虛擬機:
virsh start <VM-NAME>
在虛擬機中驗證 HBA 卡
登錄虛擬機后,運行以下命令檢查是否識別到 HBA 卡:
lspci -nn | grep Fibre
如果一切正常,虛擬機應該能看到并使用透傳的 HBA 卡。