kvm+qemu顯卡直通


kvm+qemu顯卡直通

版權聲明:轉載請標明來源 侵權必究

  1. 基礎知識

    qemu 仿真軟件
    kvm linux虛擬化模塊
    qemu-kvm 是qemu和kvm結合的庫(這個不確定 看軟件名猜的)
    libvirt 這個是virt-manager的庫(這個也是猜的)
    virt-manager 是一個python寫的虛擬機管理軟件
    我們用來直通的驅動是 vfio(Virtual Function IO) 驅動。
    以下操作基於ubuntu系統。因為我是macbook用的是改版內核。但是大同小異。
    我的顯卡是 AMD的。
    對了 因為Apple T2固件。我直通並沒有成功。但也到了最后一步。如果介意可以直接關掉啦。

  2. 檢查vfio是否運行

    檢查這個有幾種辦法可以參考(只要任何一項內容 說明vfio是啟用的可以直接跳過步驟3)

    1. lsmod | grep -i vfio (這個是vfio模塊化)
    2. cat /libs/modules/$(uname -r)/modules.builtin | grep -i vfio (這個是linux內核編譯的模塊 ubuntu20.04 vfio內核自帶了)
    3. dmesg | grep -i vfio
  3. 開啟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

  4. 查看pci設備

    lspci -nnk
    image

    如上圖 我的顯卡是AMD Radeon RX 460 因為直通要把顯卡整個設備直通過去 所以音頻也需要記錄他們的PCI ID
    1002:67ef
    1002:aae0
    這里需要注意的是整個設備它是按組分的。iommuamd.sh腳本可以檢查它是屬於哪個組。當然前提是你必須開啟IOMMU。

  5. 開啟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

  6. 查看IOMMU分組

    image

    可以看到我的顯卡在 group 1組。那么如果要直通顯卡 這個組里的設備都要直通給虛擬機。顯然是不可能的。 或者 給顯卡換個插槽。這個更不可能。 我們只能使用ACS補丁來軟分組。使我們的顯卡為單獨一組。 至於這個現象為什么。因為顯卡在CPU的 PCI-E插槽里。顯卡插的位置有關系。

  7. 解決IOMMU分組問題 安裝linux zen-kernel

    zen-kernel(https://github.com/zen-kernel/zen-kernel/wiki/FAQ)

    1. 因為我是ubuntu需要安裝Liquorix,其他系統大同小異 按教程安裝就可以了,安裝好后重啟,選擇對應內核image
    2. nano /etc/default/grub 在 GRUB_CMDLINE_LINUX_DEFAULT 最后加入 pcie_acs_overrid=downstream 保存 並運行update-grub 重啟
      image
    3. 重啟后運行 iommuamd.sh 再看
      image

    顯卡-聲卡驅動問題 (如果存在的話)

    如上圖我們可以看到 VGA驅動已經是 vfio-pci 而Audio聲卡驅動還不是。 直通給虛擬機。 它們的驅動必須都是 vfio-pci 解決辦法就是將snd_hda_intel加入黑名單。
    nano /etc/modprobe.d/blacklist.conf 添加 blacklist snd_hda_intel 保存退出重啟
    就可以看到正常了
    image

  8. 開始配置我們的虛擬機

    1. sudo apt install qemu-kvm qemu-utils libvirt-daemon-system libvirt-clients bridge-utils virt-manager ovmf
    2. sudo usermod -aG libvirt $USER
    3. sudo systemctl restart libvirtd.service
      如果打開顯示 Not Connection 建議重啟一下
    4. 建立虛擬機 可以參考視頻
      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
    5. 相關錯誤
      1. 如果遇到了 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
  9. 安裝TPM

    sudo apt install gnutls-bin
    sudo apt --fix-broken install
    dpkg -i *.deb (https://github.com/stefanberger/swtpm 下載壓縮包)

  10. 安裝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
    
  11. 相關日志位置

    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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM