快轉到主要內容

免Mac電腦,OSX-KVM讓你在Linux系統安裝macOS的QEMU虛擬機

Linux系統 虛擬機與容器技術 MacOS QEMU Libvirt Xcode
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

因為想要用Xcode編譯一些東西,所以有了在Linux電腦裝MacOS虛擬機的念頭。

過去Ivon會採用Virtualbox或VMware裝虛擬機,不過對新版macOS的支援度都不太好。最近幾年Ivon改採用Github上一個很受歡迎的解決方案:Dhiru Kholia開發的 OSX-KVM,簡單易用。

OSX-KVM提供多種版本的macOS映像檔,目前支援到macOS Sonoma (14.3)。虛擬機系統除依賴硬體的功能以外一切正常運作,可以跑Xcode,也可以連接iPhone/iPad進行偵錯。

macOS Ventura virtual machine running on Arch Linux
macOS Ventura virtual machine running on Arch Linux

OSX-KVM方案好處在於,不需要Mac電腦製作ISO也能安裝虛擬機,利用Apple內部的機制就可以從macOS Base System還原安裝完整macOS。

如果嫌圖形性能不佳的,還可以直通顯示卡給虛擬機。

就合法性而言,其實這就是虛擬機版的「黑蘋果」(hackintosh),作者宣稱虛擬機的Apple-OSK金鑰網路上到處都找得到,因此不保證合法性。

1. 安裝前置依賴套件
#

  1. 電腦主機板要進入BIOS啟用CPU虛擬化支援。用以下指令檢查CPU是否支援虛擬化,回傳值不為0。
sudo grep -E -c '(vmx|svm)' /proc/cpuinfo
  1. 用以下指令確認CPU是否支援KVM,還有KVM核心模組是否有載入:
sudo lsmod | grep kvm
  1. 安裝QEMU和Virt Manager。Ubuntu 22.04參考 這篇,Arch Linux則參考 這篇

  2. 再安裝剩下的套件

sudo apt-get install qemu uml-utilities virt-manager git wget libguestfs-tools p7zip-full make dmg2img tesseract-ocr tesseract-ocr-eng genisoimage -y
  1. 將使用者加入KVM群組
sudo usermod -aG kvm $(whoami)
sudo usermod -aG libvirt $(whoami)
sudo usermod -aG input $(whoami)

2. 複製OSX-KVM儲存庫
#

  1. 複製OSX-KVM儲存庫
cd ~
git clone --depth 1 --recursive https://github.com/kholia/OSX-KVM.git
cd OSX-KVM
  1. 執行下載指令稿,選擇macOS版本,輸入6,下載最新版macOS Ventura。此階段只會下載600MB的macOS Base System。
./fetch-macOS-v2.py
  1. 將DMG轉成IMG:
dmg2img -i BaseSystem.dmg BaseSystem.img
  1. 建立一個虛擬硬碟,建議至少128GB。
qemu-img create -f qcow2 mac_hdd_ng.img 128G

3. 開始安裝macOS虛擬機
#

  1. OpenCore-Boot.sh指令稿開機
./OpenCore-Boot.sh
  1. 如果QEMU視窗沒跳出來,只看到(qemu) VNC server running on ::1:5900訊息的話,請安裝遠端軟體 Remmina,並在地址欄位選取VNC,輸入localhost:5900存取桌面。

  2. 點一下方向鍵移動到Base System,按下Enter

  3. 點選磁碟工具(Disk Utility),Continue。

  4. 選取剛剛建立的虛擬硬碟,點選Erase開始格式化

  5. 給硬碟取名,Format選擇macOS Extended (Journal),虛擬機不要選APFS

  6. 關閉磁碟工具,回到主畫面,點選"Reinstall macOS Ventura",按Continue。

  7. 接著按照螢幕指示完成安裝,下載檔案和安裝系統要2小時以上,慢慢等吧。

  8. 安裝期間可能需要反覆重開虛擬機才能順利裝完,之後會進到以下畫面。

  9. 設定好時間、語言、使用者帳號。進入桌面之後點選系統設定 → 系統更新,讓系統跑完更新。

  10. macOS虛擬機沒聲音是正常的,建議準備一個支援macOS的USB音效卡,將其手動直通給虛擬機。

  11. 日後要開機請執行OpenCore-Boot.sh指令稿並選取macOS硬碟開機。

4. 將iPhone連接到macOS虛擬機
#

參考 xcode and usb iphone passthrough #25 iPhone passthrough #221

你也可以參考「無線」方案: usbflux

  1. 重新導向iOS裝置給虛擬機之前,用lsusb -t指令列出裝置,查看電腦上的USB孔,以及載入的驅動
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
    |__ Port 1: Dev 20, If 0, Class=Imaging, Driver=, 480M
    |__ Port 1: Dev 20, If 1, Class=Vendor Specific Class, Driver=usbfs, 480M
    |__ Port 1: Dev 20, If 2, Class=Vendor Specific Class, Driver=ipheth, 480M
  1. 再用lsusb指令查看iPhone的位址
Bus 001 Device 020: ID 05ac:12a8 Apple, Inc. iPhone 5/5C/5S/6/SE
  1. 防止宿主機搶走iPhone連線,暫時移除usbmuxd的udev規則
sudo vim /etc/udev/rules.d/39-usbmuxd.rules
  1. 填入以下內容
# filename is chosen to overwrite /usr/lib/udev/rules.d/39-usbmuxd.rules
# see RULES FILES section in udev(7)
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ENV{PRODUCT}=="5ac/12[9a][0-9a-f]/*|5ac/8600/*", MODE="0666", TAG+="systemd"
  1. 重新啟動udevd服務
sudo systemctl reload systemd-udevd
  1. 編輯OpenCore-Boot.sh,找到args=()這段,在末端將iOS的裝置位址加進去。vendorid是lsusb所列出的數值前面加上0x
-device usb-host,vendorid=0x05ac,productid=0x12a8,guest-reset=false
  1. 啟動虛擬機。

5. 將macOS虛擬機加到Virt Manager
#

(選擇性)將macOS虛擬機資訊匯入到Virt Manager,就不需要用指令稿開機了。

  1. 安裝完虛擬機後,將macOS關機。

  2. 修改XML,並用virt-xml工具驗證是否合法

sed "s/CHANGEME/$USER/g" macOS-libvirt-Catalina.xml > macOS.xml
virt-xml-validate macOS.xml
  1. 用macOS的XML建立虛擬機
virsh --connect qemu:///system define macOS.xml
  1. 設定目錄權限
sudo setfacl -m u:libvirt-qemu:rx /home/$USER
sudo setfacl -R -m u:libvirt-qemu:rx /home/$USER/OSX-KVM
  1. 這樣macOS就會出現在Virt Manager列表了,可以直接從這裡開機。注意macOS硬體檢查比較嚴格,在改虛擬機參數前請先閱讀作者的文件。

如果使用Virt Manager,點選單列表的虛擬機 → USB重導向,就可以將iPhone接到虛擬機裡面。

6. 顯示卡直通
#

以下內容需要您對黑蘋果有點概念。

雖然QEMU/KVM技術執行虛擬機算快了,可是圖形效能低落,只能勉強編譯些程式,不能做圖形設計。條件允許的用戶可以考慮顯示卡直通(GPU Passthrough)給虛擬機強化3D性能。

顯示卡推薦AMD或Intel的,Nvidia驅動在新版本macOS幾乎不能用了。

請看開發者的 Note

如果您的螢幕有HDMI輸出,也能順便解決虛擬機沒音效的問題。

以Intel UHD Graphics 630為例,可以參考我之前寫的 直通教學將GPU綁給VFIO。

調整權限

sudo cp vfio-kvm.rules /etc/udev/rules.d/vfio-kvm.rules

sudo udevadm control --reload
sudo udevadm trigger

編輯/etc/security/limits.conf,加入以下內容:

@kvm            soft    memlock         unlimited
@kvm            hard    memlock         unlimited
@libvirt        soft    memlock         unlimited
@libvirt        hard    memlock         unlimited

編輯OpenCore-Boot.sh或用boot-passthrough.sh,QEMU參數直接加上去。host=00:02.0即Intel硬體的代號,可以從Virt Manager → 新增PCI裝置觀察

-device vfio-pci,host=00:02.0,multifunction=on,x-no-kvm-intx=on

接著參考 Dortania’s Guide WhateverGreen修補OSX-KVM目錄下的OpenCore/config.plist,在DeviceProperties加入對應的顯示卡數值。 ProperTree有提供Linux版本。

修改config.plist後要重新生成qcow2

cd OpenCore
rm OpenCore.qcow2
sudo ./opencore-image-ng.sh --cfg config.plist --img OpenCore.qcow2

之後嘗試啟動虛擬機。

相關文章

Linux用Docker容器跑黑蘋果macOS ~ Docker-OSX安裝教學
Linux系統 虛擬機與容器技術 MacOS Docker QEMU
在Linux安装Windows 11 QEMU虛擬機時啟用Secure Boot和TPM 2.0
Linux系統 虛擬機與容器技術 Windows QEMU Libvirt
Gentoo Linux安裝QEMU/KVM和Virt Manager虛擬機軟體
Linux系統 虛擬機與容器技術 Gentoo QEMU Libvirt

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。