在 KVM 虛擬機中運行 macOS 系統

之前介紹過如何在 Ubuntu 系統和 KVM 中安裝 Windows 系統,當時就說了,希望有機會能把 macOS 也給虛擬化了,這樣就完美了。今天這篇文章就是解決這個問題的。

準備工作

開始之前,你需要做好以下的準備工作:

  • 一台可以正常工作的 Mac 電腦
  • 一台裝好了 KVM 的 Linux 主機
  • 下載好了的 macOS 安裝包
  • 一顆不怕折騰的心

首先參考 Dhiru Kholia) 的方式,獲取一份代碼先:

$ git clone git@github.com:kholia/OSX-KVM.gitCloning into OSX-KVM...remote: Counting objects: 28, done.remote: Total 28 (delta 0), reused 0 (delta 0), pack-reused 28Receiving objects: 100% (28/28), 2.62 MiB | 98.00 KiB/s, done.Resolving deltas: 100% (1/1), done.

當然,如果你沒有 Git 也可以直接下載 ZIP 壓縮包。

創建 ISO 鏡像

虛擬機是無法識別 Apple 的 DMG 文件的,所以我們需要在 Mac App Store 獲取的 macOS Installer 的基礎上,生成一個可以在虛擬機中啟動的 ISO 鏡像。

如果 macOS Sierra 已經下載好了的話,我們直接執行下面的命令就可以生成一個安裝光碟鏡像了。

$ sudo ./create_install_iso.sh

運行截圖如上,程序結束後,會在當前目錄生成了一個名為 Install_macOS_Sierra_(OS_X_10.12.2).iso 的光碟鏡像文件。

把這個文件複製到 KVM 伺服器,這一步就算是完成了。

rsync -avP Install_macOS_Sierra_(OS_X_10.12.2).iso server:/path/to/iso/

啟動虛擬機

這裡就是大坑了,之前折騰了 2 天都是卡在這裡,用網上的各種方法一啟動,就顯示一個 boot: 就沒有然後了。

我們先創建好需要的磁碟鏡像 sierra.qcow2:

$ cd /path/to/kvm$ qemu-img create -f qcow2 sierra.qcow2 64GFormatting sierra.qcow2, fmt=qcow2 size=68719476736 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16

參考倉庫裡面的 boot.sh 和 boot-macOS.sh,整理了如下的命令用於首次啟動虛擬機:

kvm-spice -enable-kvm -m 4096 -cpu core2duo,kvm=off -machine pc-q35-2.4 -smp 4,cores=2 -usb -device usb-kbd -device usb-mouse -device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc" -kernel ./enoch_rev2839_boot -smbios type=2 -device ide-drive,bus=ide.2,drive=MacHDD -drive id=MacHDD,if=none,file=./sierra.qcow2 -vnc 0.0.0.0:0 -k en-us -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000-82545em,netdev=net0,id=net0,mac=52:54:00:c9:18:27 -device ide-drive,bus=ide.0,drive=MacDVD -drive id=MacDVD,if=none,snapshot=on,file=/path/to/iso/Install_OS_X_10.11.6_El_Capitan.iso

注意:這裡我使用了 OS X El Capitan 的安裝鏡像,因為直接使用 macOS Sierra 無法調出「磁碟工具」,就算在「語言選擇」界面等了多久都無法正常操作。所以最終選擇了一個折中的辦法,用老版本的鏡像啟動來初始化硬碟,然後再用新版本的鏡像來安裝系統。

OS X El Capitan 安裝光碟的製作方法與 macOS Sierra 類似,請參考「創建 ISO 鏡像」部分。

初始化磁碟

執行過上述命令後,命令行會一直處於等待狀態,這個時候我們需要使用 VNC 遠程桌面來完成剩下的操作。

注意:系統自帶的 VNC 客戶端還有 RealVNC Viewer 都無法正常訪問沒有密碼保護的遠程桌面。只有 TigerVNC 才能正常訪問,這裡也浪費了不少的時間。

正常連接後,可以看到 El Capitan 的歡迎界面:

接著像正常安裝一樣,開啟「磁碟工具」,初始化磁碟:

這樣,初始化磁碟的工作就完成了。

準備啟動文件

其實,雖然是虛擬化 macOS,其實本質上還是運行一個 Hackintosh (黑蘋果)。所以,必要的啟動文件配置還是需要的。

好在在製作光碟鏡像的時候,一些需要的文件就已經被打包在 ISO 光碟鏡像裡面了。

我們只需要打開 Terminal 把需要的文件複製到剛才初始化過的磁碟裡面就可以了。

# cp -avP /Extra /Volumes/Macintosh/

然後我們就可以把虛擬機關閉了。

安裝 macOS Sierra

虛擬機關閉以後,我們換一個命令來執行剛才的啟動步驟:

kvm-spice -enable-kvm -m 4092 -cpu Penryn,kvm=off,vendor=GenuineIntel -machine pc-q35-2.4 -smp 4,cores=2 -usb -device usb-kbd -device usb-mouse -device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc" -kernel ./enoch_rev2839_boot -smbios type=2 -vnc 0.0.0.0:0 -k en-us -device ide-drive,bus=ide.2,drive=MacHDD -drive id=MacHDD,if=none,file=./sierra.qcow2 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000-82545em,netdev=net0,id=net0,mac=52:54:00:c9:18:27 -device ide-drive,bus=ide.0,drive=MacDVD -drive id=MacDVD,if=none,snapshot=on,file=/path/to/iso/Install_macOS_Sierra_(OS_X_10.12.2).iso

其實跟第一次啟動虛擬機沒有太多的不同,主要的變化是 CPU 的配置還有安裝鏡像不一樣而已。

安裝完成以後提示 Restart 到這裡基本的安裝就算完成了,我們需要關閉虛擬主機,然後再進行下一步。

用 Virsh 配置虛擬主機

參考 libvirt-macOS.xml 生成了如下的 XML 配置文件:

http://libvirt.org/schemas/domain/qemu/1.0"> <name>sierra</name> <description># echo 1 > /sys/module/kvm/parameters/ignore_msrs</description> <memory unit=KiB>4194304</memory> <currentMemory unit=KiB>4194304</currentMemory> <vcpu placement=static>2</vcpu> <os> <type arch=x86_64 machine=pc-q35-2.4>hvm</type> <kernel>/path/to/kvm/enoch_rev2839_boot</kernel> </os> <features> <acpi/> <kvm> <hidden state=on/> </kvm> </features> <cpu mode=custom match=exact> <model fallback=allow>Penryn</model> </cpu> <devices> <emulator>/usr/bin/kvm-spice</emulator> <disk type=file device=disk> <driver name=qemu type=qcow2/> <source file=/path/to/kvm/sierra.qcow2/> <target dev=sda bus=sata/> <boot order=1/> <address type=drive controller=0 bus=0 target=0 unit=0/> </disk> <interface type=bridge> <source bridge=br0/> <model type=e1000-82545em/> <address type=pci domain=0x0000 bus=0x00 slot=0x03 function=0x0/> </interface> <input type=mouse bus=usb/> <input type=keyboard bus=usb/> <graphics type=vnc port=5911 autoport=no/> <video> <model type=vmvga vram=16384 heads=1/> <address type=pci domain=0x0000 bus=0x00 slot=0x02 function=0x0/> </video> <memballoon model=none/> </devices> <qemu:commandline> <qemu:arg value=-device/> <qemu:arg value=isa-applesmc,osk=ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc/> <qemu:arg value=-smbios/> <qemu:arg value=type=2/> <qemu:arg value=-k/> <qemu:arg value=en-us/> <qemu:arg value=-cpu/> <qemu:arg value=Penryn,vendor=GenuineIntel/> </qemu:commandline></domain>

上面這個是配置文件,比如保存為 sierra.xml,然後用 virsh 註冊一個新的虛擬機:

$ virsh define sierra.xmlDomain sierra defined from sierra.xml$ virsh start sierraDomain sierra started$ virsh list Id Name State---------------------------------------------------- 1 sierra running

接下來,用老方法映射一個本地埠來 VNC:

ssh -L 5911:127.0.0.1:5911 server

重新啟動以後的效果如下圖:

最後,我們再把虛擬機設置為開啟自動啟動:

$ virsh autostart sierraDomain sierra marked as autostarted

設置好遠程桌面和遠程登錄以後,就再也不用使用 VNC 了,完美!收工!

?
推薦閱讀:

如何學習好 Keynote?
OS X 文本編輯等應用為何會自動轉換引號,如何解決?
網頁使用哪些字體方案能讓其在 macOS 和 Windows 下都良好呈現?

TAG:macOS | KVMKernelbasedVirtualMachine | 虛擬化 |