VirtualBox是一套開源免費且跨平台的虛擬機器軟體,可以在一個作業系統中建立多台的虛擬電腦,且獨立運行不同的作業系統。macOS Mojave是蘋果公司在2018年發佈的作業系統,通常蘋果的作業系統都需要購買蘋果電腦才可以使用,然而就算不去購買昂貴的蘋果電腦硬體,我們還是可以藉由VirtualBox,在任意的電腦和作業系統上模擬運行macOS Mojave!
Clover EFI Bootloader
在VirtualBox內運行macOS Mojave會有一些準備工作要做,首先就是要在Linux作業系統中製作一個屬於自己的「Clover EFI Bootloader」開機引導程式,如果您沒有Linux作業系統,可以直接在這個小節之後下載現成的開機引導程式。為什麼會需要Clover EFI Bootloader呢?因為macOS Mojave預設使用蘋果自己開發的檔案系統─APFS,由於這個檔案系統沒有被VirtualBox直接支援,因此會造成無法正常開機的問題。網路上有些人會在macOS Mojave安裝完後,將APFS再透過其它的macOS轉回傳統的HFS來用,本站提供的是另一種比較乾淨的方式。Clover EFI Bootloader是開源的開機引導程式,可以用來對不同作業系統做開機引導,可以啟動使用APFS的macOS。
至於為什麼要製作屬於自己的Clover EFI Bootloader呢?這是因為使用VirtualBox來模擬macOS時,並無法隨心所欲地改變螢幕解析度。虛擬機器使用的解析度必須寫死在Clover EFI Bootloader的設定檔(此設定檔稍候會提到)中,如果設定檔中設定的解析度和虛擬機器所設定的解析度不同,開機時就會直接花屏。
Clover EFI Bootloader的開源專案可以在SourceForge上找到,網址如下:
透過以上連結可以取得Clover EFI Bootloader的可開機ISO映像檔。
由於我們等等需要「qemu」的相關虛擬硬碟工具和「7z」壓縮工具,因此要先安裝一下。基於Debian的Linux發行版可以使用以下指令來安裝:
RedHat系的Linux發行版可以使用以下指令來安裝:
使用以下指令,來產生一個100MB的空白檔案,命名為「clover.raw」,存放在目前的工作目錄下。
接著使用以下指令替這個檔案切出EFI分割區。
然後使用以下指令啟用「nbd」核心模組,讓我們可以使用qemu來掛載虛擬硬碟檔。
使用以下指令將「/dev/nbd1」這個裝置去使用「clover.raw」這個檔案。
接著用以下指令將「/dev/nbd1」這個裝置的的一個分割區(/dev/nbd1p1),也就是剛才建立好的EFI分割區,格式化成FAT32。
接著使用以下指令在目前的工作目錄下建立「efi」目錄。
再用以下指令將「/dev/nbd1p1」這個分割區掛載到「efi」目錄上。
透過「7z」指令將剛才下載下來的Clover EFI Bootloader解開至「efi」目錄中。
Clover EFI Bootloader預設並沒有啟用APFS支援,因此需要執行以下指令來啟用「ApfsDriverLoader-64.efi」這支EFI程式。
然後用文字編輯器編輯Clover EFI Bootloader的設定檔「efi/EFI/CLOVER/config.plist」。以「vim」這個文字編輯器為例,指令如下:
將以下設定檔的內容覆蓋至「efi/EFI/CLOVER/config.plist」中。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ACPI</key>
<dict>
<key>DSDT</key>
<dict>
<key>Debug</key>
<false/>
<key>DropOEM_DSM</key>
<false/>
<key>Name</key>
<string>DSDT.aml</string>
<key>ReuseFFFF</key>
<false/>
</dict>
<key>SSDT</key>
<dict>
<key>DropOem</key>
<false/>
<key>Generate</key>
<dict>
<key>CStates</key>
<false/>
<key>PStates</key>
<false/>
</dict>
</dict>
</dict>
<key>Boot</key>
<dict>
<key>Arguments</key>
<string>-v</string>
<key>Debug</key>
<false/>
<key>DefaultVolume</key>
<string>Mojave</string>
<key>Legacy</key>
<string>PBR</string>
<key>Secure</key>
<false/>
<key>Timeout</key>
<integer>3</integer>
<key>XMPDetection</key>
<false/>
</dict>
<key>Devices</key>
<dict>
<key>Audio</key>
<dict>
<key>Inject</key>
<integer>1</integer>
</dict>
<key>FakeID</key>
<dict>
<key>ATI</key>
<string>0x0</string>
<key>IMEI</key>
<string>0x0</string>
<key>IntelGFX</key>
<string>0x0</string>
<key>LAN</key>
<string>0x0</string>
<key>NVidia</key>
<string>0x0</string>
<key>SATA</key>
<string>0x0</string>
<key>WIFI</key>
<string>0x0</string>
<key>XHCI</key>
<string>0x0</string>
</dict>
<key>USB</key>
<dict>
<key>FixOwnership</key>
<false/>
<key>Inject</key>
<false/>
</dict>
</dict>
<key>DisableDrivers</key>
<array>
<string>Nothing</string>
</array>
<key>GUI</key>
<dict>
<key>Language</key>
<string>en:0</string>
<key>Mouse</key>
<dict>
<key>DoubleClick</key>
<integer>500</integer>
<key>Enabled</key>
<true/>
<key>Mirror</key>
<false/>
<key>Speed</key>
<integer>8</integer>
</dict>
<key>Scan</key>
<dict>
<key>Entries</key>
<true/>
<key>Legacy</key>
<string>First</string>
<key>Linux</key>
<false/>
<key>Tool</key>
<true/>
</dict>
<key>ScreenResolution</key>
<string>1600x900</string>
<key>Theme</key>
<string>Clovy</string>
<key>EmbeddedThemeType</key>
<string>Daytime</string>
<key>VRAM</key>
<integer>128</integer>
</dict>
<key>Graphics</key>
<dict>
<key>DualLink</key>
<integer>0</integer>
<key>EDID</key>
<dict>
<key>Inject</key>
<false/>
</dict>
<key>Inject</key>
<dict>
<key>ATI</key>
<false/>
<key>Intel</key>
<false/>
<key>NVidia</key>
<false/>
</dict>
<key>NvidiaSingle</key>
<false/>
</dict>
<key>KernelAndKextPatches</key>
<dict>
<key>AppleIntelCPUPM</key>
<false/>
<key>AppleRTC</key>
<false/>
<key>Debug</key>
<false/>
<key>FakeCPUID</key>
<string>0x0106E0</string>
<key>KernelCpu</key>
<false/>
<key>KernelLapic</key>
<false/>
<key>KernelPm</key>
<false/>
<key>KernelXCPM</key>
<false/>
</dict>
<key>RtVariables</key>
<dict>
<key>BooterConfig</key>
<string>0x28</string>
<key>CsrActiveConfig</key>
<string>0x67</string>
<key>ROM</key>
<string>UseMacAddr0</string>
</dict>
<key>SMBIOS</key>
<dict>
<key>BiosReleaseDate</key>
<string>06/25/2017</string>
<key>BiosVendor</key>
<string>Apple Inc.</string>
<key>BiosVersion</key>
<string>IM183.88Z.0145.B07.1705082121</string>
<key>Board-ID</key>
<string>Mac-BE088AF8C5EB4FA2</string>
<key>BoardManufacturer</key>
<string>Apple Inc.</string>
<key>BoardSerialNumber</key>
<string>C02726902J9DM668C</string>
<key>BoardType</key>
<integer>10</integer>
<key>BoardVersion</key>
<string>iMac18,3</string>
<key>ChassisAssetTag</key>
<string></string>
<key>ChassisManufacturer</key>
<string>Apple Inc.</string>
<key>ChassisType</key>
<string>13</string>
<key>Family</key>
<string>iMac</string>
<key>LocationInChassis</key>
<string>Part Component</string>
<key>Manufacturer</key>
<string>Apple Inc.</string>
<key>ProductName</key>
<string>iMac18,3</string>
<key>SerialNumber</key>
<string>C02TX1HUJ1GJ</string>
<key>SmUUID</key>
<string>04498BB9-9908-47B3-A9EB-C3CDC7BEE4AE</string>
<key>Trust</key>
<false/>
<key>Version</key>
<string>1.0</string>
</dict>
<key>SystemParameters</key>
<dict>
<key>InjectKexts</key>
<string>Yes</string>
<key>InjectSystemID</key>
<true/>
</dict>
</dict>
</plist>
注意「ScreenResolution」這項設定值,這個就是我們想要讓macOS運作的螢幕解析度。以Full HD的螢幕解析度來說,將虛擬機器設成「1600x900」的話,可以讓macOS的虛擬機器在畫面中以「視窗化」的方式完整顯示出來,不會出現捲軸。本文之後提供的Clover EFI Bootloader成品也是使用「1600x900」。
儲存設定檔後,執行以下指令來卸載虛擬硬碟目錄。
接著再執行以下指令,將「clover.raw」這個虛擬硬碟檔轉成VirtualBox可以使用的vmdk格式,命名為「clover.vmdk」。
如果不想自己做這個「clover.vmdk」,或是因為沒有Linux作業系統而無法製作的話,可以直接使用本站提供的「clover.vmdk」,解析度為「1600x900」。下載連結:
macOS 10.14 Mojave的可開機安裝映像檔
參考這篇文章來製作或取得macOS 10.14 Mojave的可開機安裝映像檔:
安裝VirtualBox
如果您還沒有安裝VirtualBox的話,可以透過以下連結,到VirtualBox的官網來取得並安裝最新的VirtualBox。
建立VirtualBox虛擬機器
在VirtualBox內新增macOS的虛擬機器時,需注意類型要選擇「Mac OS X」,且版本要選擇「macOS 10.13 High Sierra」(或「macOS 10.14 Mojave」,如果有的話)。虛擬機器名稱在此筆者直接取名為「macOS」,這個不太重要。
記憶體建議給4GB以上。
接著要建立新的虛擬硬碟,格式選VDI,硬碟大小建議32GB以上。至於虛擬硬碟是否要固定大小,就看使用者自己的需求了。建議選動態分配就好。
將macOS的虛擬電腦建立出來後,先不要開機,再去對它調整一下。首先是處理器的部份,預設可能只有一個核心,建議可以多給一點。
接著是顯示記憶體的部份,也可以多給一點。至於顯示加速的部份基本上對模擬的macOS是沒有什麼影響的。
USB的部份要選「USB 3.0(xHCI) 控制器」,否則無法成功開機。
接著要在命令列模式(Windows)或終端機模式(Unix-like)下,使用以下指令來調整剛才建立的macOS虛擬機器。
VM_RES="1600x900"
VM_NAME="macOS"
VBoxManage setextradata "$VM_NAME" "CustomVideoMode1" "${VM_RES}x32"
VBoxManage setextradata "$VM_NAME" VBoxInternal2/EfiGraphicsResolution "$VM_RES"
VBoxManage modifyvm "$VM_NAME" --cpuidset 00000001 000106e5 00100800 0098e3fd bfebfbff
VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "iMac18,3"
VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"
VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "Iloveapple"
VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
VBoxManage setextradata "$VM_NAME" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1
以上環境變數「VM_RES」為虛擬電腦要使用的螢幕解析度,「VM_NAME」為虛擬電腦的名稱。Windows使用者可能需要自行去尋找VirtualBox提供的「VBoxManage.exe」的位置來執行。
若您使用非Intel Core i系列的CPU,可能還需要再加上以下指令才能夠使虛擬電腦正常執行macOS Mojave:
VBoxManage modifyvm "$VM_NAME" --cpu-profile "Intel Core i7-6700K"
在虛擬機器安裝macOS 10.14 Mojave
啟動剛才建立並設定完成的macOS虛擬機器,使用macOS Mojave的可開機映像檔來開機。
成功開機後,稍等一下即可進入macOS Mojave的安裝程式。一開始要選擇語言,在此以繁體中文為例。
接著會進入macOS的工具程式選單,先選擇「磁碟工具程式」。
在左邊邊欄選到我們建立的虛擬硬碟後,按下「清除」可以重新建立硬碟分割表和格式化硬碟。
虛擬硬碟的名稱輸入「Mojave」。如果想要用不同名稱的話,Clover EFI Bootloader設定檔中的「DefaultVolume」這個設定項目也建議要跟著改,不然macOS在開機的時候都需要先使用鍵盤來選擇開機方式。格式的話選擇「APFS」,不建議選擇「Mac OS 擴充格式」(就是HFS),因為它會讓之後的開機方法變得不同,就不在本篇文章的適用範圍了。架構選擇「GUID 分割驅配置表」。
格式化好虛擬硬碟後,就可以關閉磁碟工具程式,回到macOS的工具程式選單。此時就可以開始「安裝 macOS」啦!
一開始要先同意macOS的合約。
接著選擇macOS要安裝上去的硬碟。
然後就是等候安裝。
進度條跑完後,虛擬電腦就會重新開機,但重新開機的過程中可能在以下畫面中卡住。
不過也別擔心,此時可以放心地強制對虛擬電腦做重新開機的動作。如果VirtualBox不是使用6.1以上的版本,在重新開機時可以發現VirtualBox又會去使用macOS的可開機安裝程式來開機,這是因為Mojave使用APFS,而舊版VirtualBox本身無法使用APFS來開機,所以才必須要使用剛才準備好的Clover EFI Bootloader。
先把macOS虛擬機器關機,然後將Clover EFI Bootloader的虛擬硬碟也掛到macOS的虛擬機器下,SATA埠的順序建議可以調整成「Clover EFI Bootloader」→「Mojave」→「光碟機」。
再次開啟macOS虛擬機器後,就可以進入到Clover EFI Bootloader的畫面,用鍵盤選擇「Boot macOS install from xxx」(xxx為硬碟名稱),來打開安裝到一半的macOS。
然後繼續等候安裝程式完成安裝。
macOS完成安裝後,會自動重新開機。當然,重新開機的時候可能也會跟前面提到的狀況一樣,卡在黑底白字的畫面,此時直接強制重新開機即可。
macOS虛擬機器重新開機後,同樣在Clover EFI Bootloader的畫面,用鍵盤選擇「Boot macOS install from xxx」(xxx為硬碟名稱),來打開安裝完成的macOS。
第一次進入安裝完成的macOS,會需要進行地區、鍵盤、Apple ID的設定。
然後要同意使用macOS的合約。
再完成macOS使用者的帳號設定。
接著是macOS Mojave的新功能,選擇要使用淺色還是深色的佈景主題。
等候設定完成。
然後就會進入macOS的桌面,一開始要先設定鍵盤。
macOS會要求使用者按下左邊Shift鍵的右邊的按鍵,和右邊Shift鍵的左邊的按鍵。以一般鍵盤(ANSI)來說的話就是「Z」和「/」啦!
確認鍵盤設定。
至此macOS Mojave就在虛擬機器內安裝並設定完成啦!
如果使用了Clover EFI Bootloader來完成後一半的安裝程式,即便在最一開始我們有選擇「繁體中文」,語言在重開機之後還是會被固定為英文。如果要修改成中文,可以到macOS Mojave的系統設定中的語言和地區,將繁體中文和中文輸入法加回來。
重新開機後就可以套用設定。
另外,若有使用Clover EFI Bootloader的虛擬硬碟的話,macOS通常會在開機之後跳出「電腦讀不到您放入的磁碟」的提示。這個提示可以直接「忽略」,並不影響使用。
在macOS內安裝VirtualBox Guest Additions
為了讓VirtualBox虛擬機器中的macOS運行的更好,我們需要安裝VirtualBox Guest Additions,來驅動模擬的硬體。要替虛擬機器的客體作業系統安裝VirtualBox Guest Additions時,可以直接在VirtualBox虛擬機器的功能表中找到Guest Additions的項目,VirtualBox虛擬機器就會自動插入VirtualBox Guest Additions的安裝映像檔。
執行映像檔中的VBoxDarwinAdditions.pkg
,就可以開始安裝VirtualBox Guest Additions。
在安裝過程中,會出現「已阻擋系統延伸功能」的訊息,此時可以「打開安全性偏好設定」,然後「允許」我們要加入的延伸功能。
成功安裝完VirtualBox Guest Additions後,就重新開機吧!