快轉到主要內容

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

分類   資訊科技 虛擬機與容器技術
標籤   MacOS QEMU-KVM 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。

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

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

註解:雖然OSX-KVM是開源專案,但是作者可能嫌垃圾issue太多,關閉了Github的issue功能,僅接受付費諮詢。如果你想要更開放的專案,可以考慮改用基於OSX-KVM改進的專案 ultimate-macOS-KVM

1. 安裝前置依賴套件
#

QEMU會將你的電腦偽裝成一部iMac Pro,在Apple放棄支援x86架構之前應該都還能用。

OSX-KVM專案需要x86架構的CPU,且macOS Ventura以上的版本需要CPU支援AVX2指令集才能跑。

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

  2. 再安裝剩下的套件

sudo apt-get install qemu-system uml-utilities virt-manager git \
    wget libguestfs-tools p7zip-full make dmg2img tesseract-ocr \
    tesseract-ocr-eng genisoimage vim net-tools screen -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 GTK視窗沒跳出來,只看到(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有啟用SSH通訊埠轉發,所以你可以從Linux宿主機輸入ssh localhost -p 2222連線到macOS。

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

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

  1. 安裝 libimobiledevice套件,將iPhone插到Linux電腦,嘗試能否連線。

  2. 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的位址,通常都是固定05ac開頭
Bus 001 Device 020: ID 05ac:12a8 Apple, Inc. iPhone 5/5C/5S/6/SE
  1. 新增udev規則
sudo vim /etc/udev/rules.d/97-iphone.rules
  1. 填入以下內容
SUBSYSTEMS=="usb", ATTRS{idVendor}=="05ac", ATTRS{idProduct}=="*",GROUP="users", MODE="0660"
  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 udevadm control -R
  1. 編輯OpenCore-Boot.sh,找到args=()這段,在末端將iOS的裝置位址加進去。vendorid是lsusb所列出的數值前面加上0x
-usb -device usb-host,bus=ehci.0,vendorid=0x05ac,productid=0x12a8,guest-reset=false,id=iphone
  1. 啟動虛擬機,之後Mac的Finder應該就會看到iPhone。

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硬體檢查比較嚴格,在改虛擬機參數前請先閱讀作者的文件。

V點irt Manager選單列表的虛擬機 → USB重導向,就可以將iPhone接到虛擬機。

6. GPU直通
#

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

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

顯示卡推薦AMD或Intel的,Nvidia驅動在新版本macOS幾乎不能用了。如果您的螢幕有HDMI輸出,也能順便解決虛擬機沒音效的問題。

  1. 請看開發者的 Note

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

  3. 調整權限

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

sudo udevadm control --reload

sudo udevadm trigger
  1. 編輯/etc/security/limits.conf,加入以下內容:
@kvm            soft    memlock         unlimited
@kvm            hard    memlock         unlimited
@libvirt        soft    memlock         unlimited
@libvirt        hard    memlock         unlimited
  1. 編輯OpenCore-Boot.sh或用boot-passthrough.sh,加上QEMU參數。host=00:02.0即Intel硬體的代號,可以從Virt Manager → 新增PCI裝置觀察
-usb -device vfio-pci,host=00:02.0,multifunction=on,x-no-kvm-intx=on
  1. 接著參考 Dortania’s Guide WhateverGreen,修補OSX-KVM目錄下的OpenCore/config.plist,在DeviceProperties加入對應的顯示卡數值。 ProperTree有提供Linux版本。

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

cd OpenCore
rm OpenCore.qcow2
sudo ./opencore-image-ng.sh --cfg config.plist --img OpenCore.qcow2
  1. 之後嘗試啟動虛擬機。

參考資料
#

相關文章

QEMU/KVM虛擬機設定靜態IP + 透過SSHFS與Host OS共享資料夾
分類   資訊科技 虛擬機與容器技術
標籤   QEMU-KVM Libvirt OpenSSH
在Linux安装Windows 11 QEMU虛擬機時啟用Secure Boot和TPM 2.0
分類   資訊科技 虛擬機與容器技術
標籤   Windows QEMU-KVM Libvirt
Linux用Docker容器跑黑蘋果macOS ~ Docker-OSX安裝教學
分類   資訊科技 虛擬機與容器技術
標籤   MacOS Docker QEMU-KVM

留言板

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

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

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。