本文關鍵字:處理雲主機上大鏡像安裝問題,編譯 enoch 變色龍
在《雲機裝黑果實踐系列》1-3中,我們完成了直到生成鏡像的所有準備工作,現在要上機測試了,進入最困難的boot-機型適配調試了,這也是黑果技術最典型的實踐密集點,結合搜索引擎從最最小依賴一點一點添加配置是唯一的流程(基本上,變色龍是appleboot+fake efi as bios發展來的,具體機型千千W,雲主機又特點,這種適配和調試工作變數和坑很多),我選的是一臺阿里雲輕量雲主機,第一步是把鏡像傳上去。對於一個7G展開20G的打包鏡像,moeclub的installnet.sh其內部使用的是wget gunzip輸出到stdout再dd的管道,gzip版本太低,解壓到前面很少一部分就會hang,腳本自動重啟,找到那句將其改成wget -qO- '$DDURL' |tar zOx |/bin/dd of=\$(list-devices disk |head -n1);Tar 不要加f和其它參數,版本不夠。正常邊untar邊dd在我這(港區oss與輕量)要50來分鐘,鏡像正常啟動grub2,進入tinycorelinux virtiope,fdisk /dev/vda,p顯出正常hfs+分區,或者直接grub2 insmod hfs hfsplus part_apple,ls (hd0,msdos2)/ 也可以看到osx分區上的文件。之後迅速做一個快照,以防接下來的調試破壞系統。
如果說上面解決installnet.sh的腳本問題是小問題,那麼大boss來了,r2922的cdboot在實機和kvmqemu機上可以運行,在雲主機上根本無法運行(grub2進進入tinycorelinux virtiope,sudo mount /dev/vda1,sudo wget生成的iso,重啟進入),不能顯示引導界面,也是自動重啟。(除了cdboot,按教程直接boot0h,hfs啟動hfs分區的硬盤系統不行,用mbr+boot1f32也不行。)
問題可能在哪?這就是前面提到的ignore_msrs,我從memdisk版本問題開始排除,最後聚焦在boot本身上(cdboot這個stage2基本是一個boot+2560kib),猜想可能是版本問題導致的,利用排除法,先在網上海找了一通,能找到的最流行的低版本,就是v5.0.132 enoch r2839,,其cdboot寫iso可以啟動主機。最大r2841也可以,2842開始就不行。
翻看http://forge.voodooprojects.org/p/chameleon/source/changes/2842/,發現經過了三個commit,重點是源碼上的變化:
Commit 2842, by ErmaC : General update
Commit 2841, by Bungo : 1) Dropping DMAR (DMA Remapping table) to use stock AppleACPIplatform.kext - resolves stuck on "waitForSystemMapper" or "[PCI configuration begin]" 2) Added "ACPI" (all capitals) path 3) Small cosmetics
Commit 2840, by Bungo : Sync
剩下就是實際編譯出cdboot判斷問題到底出在哪個commit了
從enoch的源碼中找出變化,實際編譯
編譯環境是pd上的xcode 8.2.1 for EL CAPTAN 10.11,這套配置可以編譯2841->2922,其它的都會有問題。蘋果的開發鏈都很封閉自由度不高。只能選擇這個配置了。
下載一個10.11,把它作成pd能安裝用的鏡像,原理跟mbrpatch打包類似,適合在PD安裝老版本osx使用。
(以下差不多任意版本都適用)
hdiutil attach /Applications/Install\ macOS\ Sierra.app/Contents/SharedSupport/InstallESD.dmg -noverify -nobrowse -mountpoint /Volumes/install_app
hdiutil create -o /tmp/Sierra.cdr -size 7316m -layout SPUD -fs HFS+J
hdiutil attach /tmp/Sierra.cdr.dmg -noverify -nobrowse -mountpoint /Volumes/install_build
asr restore -source /Volumes/install_app/BaseSystem.dmg -target /Volumes/install_build -noprompt -noverify -erase
rm /Volumes/OS\ X\ Base\ System/System/Installation/Packages
cp -rp /Volumes/install_app/Packages /Volumes/OS\ X\ Base\ System/System/Installation/
cp -rp /Volumes/install_app/BaseSystem.chunklist /Volumes/OS\ X\ Base\ System/BaseSystem.chunklist
cp -rp /Volumes/install_app/BaseSystem.dmg /Volumes/OS\ X\ Base\ System/BaseSystem.dmg
hdiutil detach /Volumes/install_app
hdiutil detach /Volumes/OS\ X\ Base\ System/
hdiutil convert /tmp/Sierra.cdr.dmg -format UDTO -o /tmp/Sierra.iso
再https://developer.apple.com/download/more/下載Command_Line_Tools_macOS_10.11_for_Xcode_8.2.dmg裝上。
最後下載源碼:svn co -r 2841 http://forge.voodooprojects.org/svn/chameleon/trunk/,svn co -r 2842 http://forge.voodooprojects.org/svn/chameleon/trunk/,svn co -r 2922 http://forge.voodooprojects.org/svn/chameleon/trunk/
它們的編譯都是cd trunk,然後直接make,經過幾次嘗試,從最初直接替換libsaio/cpu.c,cpu.h,platform.c,platform.h,到最後僅在2842 src中libsaio/cpu.c找到以下二句並註釋掉
// case CPUID_MODEL_SKYLAKE_AVX:
// case CPUID_MODEL_CANNONLAKE:
Re make clean
Re make
其產出的cdboot都是可以用在雲主機上作正常啟動的。這也可以被用在2922上。
再一步步調試出能啟動雲主機的變色龍配置:
到現在為止,終於進入對類似現實機器調試變色龍的流程來處理針對雲主機安變色龍的問題了,這就是在上述一次次的“修改參數+打包iso+tinycorelinux上傳”的循環(這也是我們當初使用grub2+memdisk的基本考慮)重複調試參數了:雲主機較特別,可能會因為一個問題無法最終成功,但至少希望就在眼前。因為我們解決了大量關鍵問題。
注:碰到上傳了正確的cdboot打包的iso,也啟不動雲主機到界面的問題,但有一個workarouds:2841和2922的wowpc.iso都上傳,發現2922不能啟動到界面,先啟次一次2841,之後2922總可以成功。猜是loader改變了相關mbr參數,是殘留的硬件作用。啟動一次2841可以將其復位。(或許整個替換cpu和platform編譯會根本解決)
最小配置是這樣的:
org.chamalon.boot.plist
<key>Kernel Flags</key>
<string>-v -f</string>
<key>Timeout</key>
<string>30</string>
下文繼續詳解。
(此處不設回覆,掃碼到微信參與留言,或直接點擊到原文)