將雙系統塞入A4主機:OSX-KVM 顯卡直通教程

KVM 是 Linux 上最成熟的虛擬化框架, 結合了 qemu 的虛擬化功能並且充分利用半虛擬化技術, 提供了很強的 IO 性能.常見的用法有直接調用 qemu commnad, 基於 libvirt(virt manager)/Proxmox 等虛擬化框架即可實現對 KVM 虛擬機的管理.而常見的黑蘋果方法基本都是基於物理硬件進行安裝, 這種方案好在原生級別的性能, 但是缺點是對於個別主板硬件的兼容性不佳, 如板載網卡, 聲卡等. 特別如果是 CPU 特性存在不兼容情況, 如 ryzen 和 SLK-X 系列, 則需要修改內核, 存在諸多麻煩. 並且目前安裝方法教程繁多而且不是很統一, 特別是調教固件這一步問題非常多.而傳統虛擬機黑蘋果僅僅只是用了 CPU 虛擬化而未使用 IO 虛擬化, 這就意味著無法在虛擬機中獲得顯卡加速, 這就讓 macOS 的實用性大打折扣.而隨著 vt-d 技術的普及, 外加 Apple 對於 AMD GPU 越來越好的支持(當然也有 eGPU 的更好支持), 並且由於最近兩年礦潮大量湧入市場的 Polaris 10/11 和 Vega 顯卡, 這就讓基於顯卡直通的虛擬化特別有性價比.當然 vt-d 的一個宗旨就是 iommu group 越多越好, 翻譯成硬件玩家的術語就是最好有更多的獨立 PCIe 接口. 傳統的 IO 軟件虛擬化, 如 PS/2 USB 鍵盤和音頻這種模擬效率較低, 需要在用戶態進行系統調用讀取數據, 再通過系統調用輸入到 guest OS. 這種缺點就是效率低, 實時性差, 同理基於 libusb 的 USB 重定向也是一樣的. 如果你有了獨立的 PCIe USB 擴展卡, 那麼就能將這整個 PCIe 設備丟進虛擬機, 能獲得最高的效率和避開一些問題(如 Hub 是不能被重定向的, 或者 PCH 集成的幾個控制器不能被拆分).所以我的配置如下:

  • Intel Core i7-4860HQ(配置 eDRAM 和 iris pro 5200, 能夠緩解 DDR3 帶寬較低的影響)
  • 藍寶石 Z87 Pure Black(有特殊的 mPCIe 的設計, 稍後再提)
  • 藍寶石 RX470D 4GB ITX (性能基本夠用, 主要是能塞進機箱而且便宜)
  • DDR3 1600 8GB2(SODIMM 16GB 單條試過了, 轉接不靠譜;專用條上不了, 更不用說 16GB 專用條的穩定性了, 千萬別買, 只能說湊合用了)
  • 臺達 500W Flex 電源
  • iMac 原裝 BCM 3x3 1300Mbps ac 網卡(支持 BT4.1 和 Hand Off)

前期準備

a.準備安裝介質

所謂安裝介質, 就是安裝 U 盤或者光盤, 更抽象的說是安裝用的塊設備文件. 通常情況下最好是通過現有的 macOS 進行準備, 在 App Store 下載當前版本的 Installer.app 即可進行安裝. 參考腳本

準備完成後會獲得一個塊設備文件, 通常為 .iso/.cdr, 均為 CD 標準的塊設備文件. 將這個文件保存下來.

b.準備安裝平臺

很顯然你不能裝在空氣上. macOS Mojave 的最低需求是 SSE4.2, 這個對於目前到 AVX512 的平臺來說已經是十年前的事情了. 一般來說 SNB 之後的 CPU 平臺都沒問題.

第二個事情是需要主板和 CPU 支持 vt-d(IOMMU) 技術. 雖然99%平臺都支持 vt-x, 但是由於芯片組或者固件的原因, vt-d 可能未被啟用. 請務必檢查平臺兼容性, 不然無法做到 PCIe 設備穿透.

將雙系統塞入A4主機:OSX-KVM 顯卡直通教程

內存大於 4GB 即可, 推薦 16GB-32GB.

顯卡由於一波礦潮下來, 目前有大量支持良好的 A 卡. 雖然一些 N 卡能夠免驅使用, 但是我這裡還是強烈不建議使用 N 卡, 實用性和麻煩太多, 即便能用也比 A 卡麻煩. 最新的 Radeon RX590 和 Radeon VII 同樣支持. 但是 Ryzen APU 的 Vega 8/10 等不被支持.

存儲方面, 如果你的主板支持 NVMe, 那麼最好, 這就意味著通過 IOMMU 你的 macOS 虛擬機就獲得了一個真實的 PCIe 存儲設備, 完全繞過了 Linux 內核, 不過務必要注意 NVMe 設備兼容性, 常見支持最好的是 Samsung 970 Pro/EVO(注意步進). 如果沒有, 那麼也建議上SATA SSD, 畢竟 SATA SSD 如此便宜.

Handoff/AirDrop 強烈依賴於 BCM 特定(Apple 定製)的網卡, 特別是 Apple Watch 解鎖功能. 因此主板上需要一個 mini PCIe/M.2 接口. 注意接口上一定要有 PCIe 鏈路, mSATA 是不被支持的;其二是最好有 USB(來自 PCIe 1x 的 mPCIe 是沒有 USB 的)支持, 通常現在的主板 M.2 x4 接口只有 SATA 和 PCIe. M.2 普通網卡接口/mPCIe 網卡接口一般能正常使用. 特別注意 Z390 等 Intel 最新平臺的網卡 M.2 接口採用了 CNVi 鏈路層, 雖然接口與普通網卡兼容, 但是不能支持普通 PCIe 網卡, 這種設備只能走 PCIe 轉接板+USB連線啟動. 如果你的主板有獨立於網卡且不可拆卸的藍牙 USB dongle, 請在固件設置中禁用, 不然會讓 BCM 藍牙被禁用.

如果你不在意 handoff, macOS 能驅動一大堆 BCM 網卡和 BCM 芯片的藍牙, 包括一些 BCM 芯片的萬兆網卡. macOS 有標準藍牙 dongle 驅動的支持, 不過即便能用也有一些問題.

有線網卡上默認的 e1000 就能自動驅動, Realtek 的網卡則需要 patch. 不建議直通千兆網卡. macOS 曾經在 Sierra 之前有 virtio 的支持, 但是現在已經不可用. 萬兆網卡務必檢查兼容性, 包括對於 SR-IOV 的支持.

同時為了最好的性能, 強烈建議直通 USB 控制器而不是 USB 設備重定向(延遲會大很多). 但是要注意 Intel 平臺的 XHCI/EHCI 雖然可以分在不同 IOMMU, 但是實際上都是牽一髮動全身, 你為了網卡上的藍牙(特別是 ITX 平臺), 就可能得將所有 USB 接口通入虛擬機中. AMD 的 Ryzen 和 PCH 都有 USB, 所以能夠獨立轉發. 這裡的解決方案是通過 PCIe 增加網卡, 比如 PCIe/mPCIe 轉 USB 3.0. 但是 mPCIe 轉 USB 2.0 和 M.2 轉 USB 3.0 均依賴於 PCH 的 USB Bus. 如果需要同時接多個虛擬機可以考慮再添加 USB 擴展卡, 如 ASMedia 的 USB 3.1 gen2 PCIe 擴展卡(USB 3.1 bus 可以直通進 macOS).

聲卡上如果你有正常的 A/N/I 卡, 進入系統打 kext patch 就能夠獲得不錯的 HDMI/DP 音頻. VoodoHDA 可以用來支持基於 qemu 虛擬的 ich9-hda 聲卡, 或者是來自 PCIe 直通的聲卡設備. USB redirect 的音頻質量比較一般, 和 qemu 模擬的聲卡同樣有延遲較大的問題. 有的較新的主板配置了 PCIe to PCI bridge, 可以直通以通過 PCI 接入 USB/1394(Firewire)設備, 從而兼容老音頻介面.

雷電直通我暫未嘗試, 這個需要後續探索.

安裝宿主系統

參考教程

宿主系統選擇上儘可能選擇內核新, 軟件包新, 且比較穩定的發行版, 如 Arch Linux(文檔多), OpenSUSE, Ubuntu. 一般不建議安裝圖形界面, 因為當你 USB 設備全部直通, 顯卡直通了之後宿主的操作性就差很多.

配置完畢系統後就要安裝 qemu 和 vfio(用於穿透), 以及 qemu 的管理框架 libvirt(virt-manager), Proxmox 理論上也是可用的, 但是我不是特別想用.

啟用 IOMMU

首先確保在固件設置中開啟 IOMMU. 由於一般情況下直通的是 A/N 卡, 將默認顯卡設置為 IGD(iGPU), 並開啟 igdmultimonitor. 這通常在 chipset 選項:


然後修改 /etc/default/grub, 找到 GRUB_CMDLINE_LINUX_DEFAULT 或者 GRUB_CMDLINE_LINUX, 加入 intel_iommu=on 或者 amd_iommu=on. 保存文件, 並通過 update-grub 或者 grub2-mkconfig -o 保存.

配置 vfio

由於我們需要讓設備直通虛擬機, 那就不能讓宿主機的驅動去接管這些硬件, 我們需要一個 dummy 驅動模塊去接管這些要被直通的硬件.首先執行 lspci --nnk, 找到你想要直通的設備的 ID, 並且注意每個設備所在組的其他設備(編輯文件 /etc/modprobe.d/vfio.conf.

<code>options vfio-pci ids= disable_vga=1/<code>

但是為了避免 initrd 引入的內核模塊中 vfio 位於物理驅動的後面, 這裡有兩套方案:1.根據 lspci --nnk 的內容, 找到每個設備對應的驅動, 如 RX470D 及其 HDMI 音頻設備:

<code>01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:67df] (rev ff)  
Kernel driver in use: amdgpu
Kernel modules: amdgpu
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590] [1002:aaf0] (rev ff)
Kernel driver in use: snd_hda_intel
Kernel modules: snd_hda_intel/<code>

修改 /etc/blacklist.conf, 加入你不想要的驅動:

<code>blacklist i915  
blacklist amdgpu
.../<code>

2.修改 /etc/mkinitcpio.conf, 這裡參考 archliux wiki, 因為操作比較複雜, 但是相對於直接屏蔽, 能夠實現更復雜的配置.隨後執行 update-initramfs 或 mkinitrd, 重新生成 initrd, 隨後重啟.啟動後檢查配置lspci --nnk :

<code>01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:67df] (rev ff)  
Kernel driver in use: vfio-pci
Kernel modules: amdgpu
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590] [1002:aaf0] (rev ff)
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel/<code>

這說明被 vfio-pci 接管.隨後即可在 virt-manager/qemu 中穿透該設備.

macOS 系統安裝

在初步測試環境下, 不建議使用 libvirt 管理虛擬機.

此時建議透過 VNC 或者在有 XFoward 的環境下 ssh 到目標宿主機.通過 qemu-img create -f qcow2 mac_hdd.img 128G 創建一個 128GB 聲明容量的 qcow2 塊設備文件.將先前準備的安裝介質 ISO 複製到 OSX-KVM 的目錄. 修改 boot-macOS-Mojave.sh, 對應好各個塊設備的文件名:-drive id=MacDVD,if=none,snapshot=on,media=cdrom,file=./'' \\ 啟動這個腳本, 你就能看到 qemu 的視頻回傳窗口, 此時 USB 鼠標驅動能夠正常啟動. 進入 Clover 之後選擇進入 macOS installer. 進入安裝環境後先進入 disk utility 格式化剛才準備的 128GB 塊設備為 APFS 格式. 完成後完成系統安裝. 安裝之後重啟, 理論上正常能夠進入系統.

同樣的方法, 修改 boot-passthrough.sh, 注意 PCIe 設備的 ID 需要和你的顯卡和 HDMI 音頻設備一致. 由於這個 qemu 腳本中不包含 VGA 輸出設備, 所以不輸出到 qemu 窗口是正常的.如果你的顯卡並沒有輸出畫面到顯示器, Clover 固件階段可以通過提供的 serial console 進行操作. 正常情況下啟動的時候會出現 tianocore 的歡迎 logo.

很多 AMD 礦卡修改了 VBIOS, 這會在沒有 CSM 支持和強制 SecureBoot 的環境下無法在固件界面點亮. 在 Windows 系統下可能會碰到 error code 43 問題, 需要通過 patch driver 解決.
OVMF 沒有提供任何 CSM 支持, 所以修改 VBIOS 的礦卡是無輸出的. techpowerup 能找到很多 GPU 的 VBIOS, 但是刷入前一定要備份原有 VBIOS, 並注意顯存顆粒兼容情況.
Linux/macOS 系統內的驅動對於 mod VBIOS 能夠兼容

正常情況下能夠進入 macOS. 由於該腳本內沒有包含任何輸入設備(OSX-KVM 的 clover 塊設備內不包含 PS/2 驅動), 所以是無法進行操作的, 除非進行 USB 設備重定向或者穿透 PCIe 上的 USB 控制器. 前者性能較差, 後者通常會失去對於宿主的控制, 除非你的設備有多個完全獨立的 USB bus.成功進入 macOS 後可以開始根據之前的參數修改 macOS-libvirt.xml. 參考 核心綁定調整 vCPU 和 CPU 的對應關係, 並且正確的傳遞 CPU 的拓撲(即 socket/core/thread), 以達到最大性能.隨後: virsh --connect qemu:///system define macOS-libvirt.xml此時可以通過 virt-manager 啟動虛擬機. 注意此時在圖形界面下添加 PCIe 穿透更加方便. 需要添加的設備有:

  • AMD 顯卡及附屬音頻設備
  • BCM PCIe 無線網卡
  • USB 控制器(需要包含 PCIe 網卡的 USB 藍牙部分)
  • ...

進入系統後就是給一些驅動打 patch、洗白等操作, 這裡不再贅述.


分享到:


相關文章: