kvm+qemu顯卡直通
版權聲明:轉載請標明來源 侵權必究
-
基礎知識
qemu 仿真軟件
kvm linux虛擬化模塊
qemu-kvm 是qemu和kvm結合的庫(這個不確定 看軟件名猜的)
libvirt 這個是virt-manager的庫(這個也是猜的)
virt-manager 是一個python寫的虛擬機管理軟件
我們用來直通的驅動是 vfio(Virtual Function IO) 驅動。
以下操作基於ubuntu系統。因為我是macbook用的是改版內核。但是大同小異。
我的顯卡是 AMD的。
對了 因為Apple T2固件。我直通並沒有成功。但也到了最后一步。如果介意可以直接關掉啦。 -
檢查vfio是否運行
檢查這個有幾種辦法可以參考(只要任何一項內容 說明vfio是啟用的可以直接跳過步驟3)
- lsmod | grep -i vfio (這個是vfio模塊化)
- cat /libs/modules/$(uname -r)/modules.builtin | grep -i vfio (這個是linux內核編譯的模塊 ubuntu20.04 vfio內核自帶了)
- dmesg | grep -i vfio
-
開啟vfio
nano /etc/modules 添加下面內容
softdep snd_hda_intel pre:vfio vfio_pci
softdep amdgpu pre:vfio vfio_pci #這個是一個排序可以讓vfio驅動優先加載
vfio
vfio_iommu_type1
vfio_virqfd -
查看pci設備
lspci -nnk
如上圖 我的顯卡是AMD Radeon RX 460 因為直通要把顯卡整個設備直通過去 所以音頻也需要記錄他們的PCI ID
1002:67ef
1002:aae0
這里需要注意的是整個設備它是按組分的。iommuamd.sh腳本可以檢查它是屬於哪個組。當然前提是你必須開啟IOMMU。 -
開啟IOMMU
nano /etc/default/grub 找到 GRUB_CMDLINE_LINUX_DEFAULT 添加以下內容
intel_iommu=on (如果你cpu是amd的 則需要改成 amd_iommu = on) iommu=pt pcie_aspm=off vfio_iommu_type1.allow_unsafe_interrupts=1 vfio_pci.disable_vga=1 vfio_pci.disable_idle_d3=1 kvm.ignore_msrs=1 vfio-pci.ids=1002:67ef, 1002:aae0(這塊要填寫你自己的pci設備ID)
保存后運行下面命令 更新grub
update-grub -
查看IOMMU分組
可以看到我的顯卡在 group 1組。那么如果要直通顯卡 這個組里的設備都要直通給虛擬機。顯然是不可能的。 或者 給顯卡換個插槽。這個更不可能。 我們只能使用ACS補丁來軟分組。使我們的顯卡為單獨一組。 至於這個現象為什么。因為顯卡在CPU的 PCI-E插槽里。顯卡插的位置有關系。
-
解決IOMMU分組問題 安裝linux zen-kernel
zen-kernel(https://github.com/zen-kernel/zen-kernel/wiki/FAQ)
- 因為我是ubuntu需要安裝Liquorix,其他系統大同小異 按教程安裝就可以了,安裝好后重啟,選擇對應內核
- nano /etc/default/grub 在 GRUB_CMDLINE_LINUX_DEFAULT 最后加入 pcie_acs_overrid=downstream 保存 並運行update-grub 重啟
- 重啟后運行 iommuamd.sh 再看
顯卡-聲卡驅動問題 (如果存在的話)
如上圖我們可以看到 VGA驅動已經是 vfio-pci 而Audio聲卡驅動還不是。 直通給虛擬機。 它們的驅動必須都是 vfio-pci 解決辦法就是將snd_hda_intel加入黑名單。
nano /etc/modprobe.d/blacklist.conf 添加 blacklist snd_hda_intel 保存退出重啟
就可以看到正常了
- 因為我是ubuntu需要安裝Liquorix,其他系統大同小異 按教程安裝就可以了,安裝好后重啟,選擇對應內核
-
開始配置我們的虛擬機
- sudo apt install qemu-kvm qemu-utils libvirt-daemon-system libvirt-clients bridge-utils virt-manager ovmf
- sudo usermod -aG libvirt $USER
- sudo systemctl restart libvirtd.service
如果打開顯示 Not Connection 建議重啟一下 - 建立虛擬機 可以參考視頻
https://www.bilibili.com/video/BV1by4y1s7bf?spm_id_from=333.1007.top_right_bar_window_history.content.click 如果失效了 可以用下面的網盤
https://www.aliyundrive.com/s/SzW7tKdyHhD 提取碼: fg83 - 相關錯誤
- 如果遇到了 BarX 錯誤 這可能是因為PCI-E造成的 那么我們需要再運行虛擬機之前輸入以下命令 或者 直接將下面命令加入 libvirt hook shell 里。virt_startup.sh 里。即可。
echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove
echo 1 > /sys/bus/pci/rescan
- 如果遇到了 BarX 錯誤 這可能是因為PCI-E造成的 那么我們需要再運行虛擬機之前輸入以下命令 或者 直接將下面命令加入 libvirt hook shell 里。virt_startup.sh 里。即可。
-
安裝TPM
sudo apt install gnutls-bin
sudo apt --fix-broken install
dpkg -i *.deb (https://github.com/stefanberger/swtpm 下載壓縮包) -
安裝samba
sudo apt install samba
nano /etc/samba/smb.conf加入下面內容
smbpasswd -a 用戶名 (用當前用戶的用戶名 密碼就可以 必須和force user=你的用戶
這個保持一致 加這個是為了讓 手機也可以訪問 手機匿名訪問不了 )[qemu] path=要共享的路徑 force user=你的用戶 browseable=yes read only=no guest ok = yes
-
相關日志位置
xxxx.log in /var/log/libvirt/qemu (虛擬機日志 雖然啟動 但沒正常運行 查看 xxx為你虛擬機名字)
custom_hooks.log in/var/log/libvirt (鈎子沒按預期運行 查看)
xlibvirtd.log in /var/log/libvirt/
journalctl 或者 dmesg (一般發生虛擬機無法啟動 查看)
參考資料:
https://mathiashueber.com/pci-passthrough-ubuntu-2004-virtual-machine/
https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF#Setting_up_an_OVMF-based_guest_VM
https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF_(簡體中文)#如果客戶機所用顯卡插在_CPU_提供的_PCI-E_插槽中
https://stackoverflow.com/questions/66491436/modprobe-vfio-pci-not-working-inside-vm-what-do-i-do-wrong
https://forum.level1techs.com/t/ubuntu-18-04-vfio-pcie-passthrough/127011
https://forum.level1techs.com/t/ubuntu-17-04-vfio-pcie-passthrough-kernel-update-4-14-rc1/119639
https://developer.ibm.com/tutorials/l-pci-passthrough/
https://github.com/pavolelsig/passthrough_helper_ubuntu/blob/master/tail.sh
https://liquorix.net/
https://passthroughpo.st/explaining-csm-efifboff-setting-boot-gpu-manually/
https://blog.csdn.net/alex_mianmian/article/details/118678510
https://www.v2ex.com/t/602942
https://ryan4yin.space/posts/qemu-kvm-usage/
https://www.codeplayer.org/Blog/雙顯卡筆記本獨顯直通.html