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