本文關鍵字:fakecpuid apple logo stuck,變色龍fakecpuid,Cascadelake fakecpuid,qemu define cpu model,Skylake-Server qemu hackintosh
我們知道,雲上能啟動黑果是上下一條路徑上包括硬件,bios,boot,os在內合力的效果,硬件上的CPU又是這條路徑上產生變數最多的因素,變色龍處理cpu兼容是一關,kernel處理cpu兼容是它獨立的一關,這二個都存在這樣的過程。而變色龍與kernel對cpu的定義不一樣,存在不一樣的處理過程,所以可能導致不能把cpu信息傳給kernel最終發生黑屏這樣的過程(更何況硬件/模擬器上,qemu對指令集和CPU支持也不一樣),因此我們需要重新全盤統籌。
新的qemu和新加的boot
如何判斷阿里雲上qemu的版本?除了搜索引擎,也許只有實測靠譜,如何在guest體內判斷host的qemu版本。好在阿里會把qemu版本信息寫在系統裡,我們在輕量上執行dmidecode,出來BIOS Information Vendor: SeaBIOS Version: 8c24b4c Release Date: 04/01/2014,System Information:Manufacturer: Alibaba Cloud Product Name: Alibaba Cloud ECS Version: pc-i440fx-2.1。
因此我們重新編譯qemu with deepin1511中的gcc630:
wget http://wiki.qemu-project.org/download/qemu-2.1.0.tar.bz2
sudo apt install libpixman-1-dev bison flex libsdl-dev autoconf automake libtool
(不加sdl會卡在vnc server,注意這裡是sdl不是sdl2)
(不加auttools會autoreconf: not found,不加flex bison在install時會出錯)
./configure --prefix=/usr --target-list=x86_64-softmmu --enable-sdl
make install
這個出來的bios是BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org,離20140401很接近了。就這樣吧。這樣qemu版本就適配了
除了qemu,enoch2922本身就是個問題,因為其中根本就沒有對最新cascadelake的定義和支持,查看src/libsaio/platform.c,platform.h我們看到它支持的CPU和指令集,三src驅動高重我們的調試思路是確保這三者從上而下,都有同樣的關於cpu正確邏輯的繼承實現或屏蔽(或者像Penryn一樣能啟動就行,可能僅僅因為cpu的問題在這這三者不衝突)。但另一個有名的boot:clover可能有:
Clover is a later revision of Tianocore. Both are 'firmware in RAM' replacements for UEFI firmware.
It allows you to boot in MBRCSM mode and then run Clover which acts as a 'pseudo-UEFI boot manager', allowing you to boot to a UEFI OS from an MBRCSM boot.2015-10-16 Rev 3289 新增 Skylake CPU 及 核顯 及 SMBIOS 支持。而且,clover更強大有更先進的gui wizard,高於mbrpatch指定的Clover r4514+ boot 10.14 fine的版本選擇也多,clover下也有直接把log保存在第一個分區的功能(而變色龍僅能得到bdmdg,Bdmsg其實是僅直到變色龍啟動完就停止的。/var/log/system.log下有kernel啟動的log)。不妨再添加一個boot同時測試?
嘗試再添加一個boot為四葉草,直接從http://sourceforge.net/projects/cloverefiboot/files/Bootable_ISO/下載以wowpc.iso同樣的方式啟動。我們知道clover同時支持引導bios和uefi,也可以在實機或qemu(+pc-i440fx)下啟動https://passthroughpo.st/hackintosh-kvm-guide-high-sierra-using-qemus-i440fx-chipset/,一般地,我們使用grub2+memdisk+clover.iso這種乾淨的老方案(網上還有把clover做成dmg,或grub chainloader boot0ss文件或chainloader pbr文件的方案),然而最新的clover.iso在qemu(+pc-i440fx+hd or virtio)時,會在引導clover時進入一個頭部帶有上述dmidecode部分信息的圖形化虛擬UEFI BIOS 啟動界面(這實際上是沒有發現盤,因此無法加載EFI文件夾,因此無法加載/EFI/BOOT/BOOTX64.efi這個bios啟動文件,在圖形化efi界面文件瀏覽,你也根本看不到盤符),這實際上跟clover iso版本採用的boot也有關係(clover iso有一個cdboot,這相當於clover install較舊版本的默認boot,clover install較新版本沒有默認boot,只有多選方案,但也只有二個,一個boot6,一個boot7,Clover ISO cdboot集成的默認是boot6,boot6,7啟動效果不同),跟盤性質也有關係(一般clover更好支持bios+gpt+普通ide+fat32,當然它也承諾支持bios+mbr+hfs+),跟你的硬件/qemu也有關係(除非你編譯qemu2.1時加了CONFIG_VIRTIO_BLK_DATA_PLANE,否則virtio在bios下是無法識別的,grub2 insmod hfs hfsplus part_apple ->memdisk>clover.iso也不能把這種效果傳遞給clover。)
我們最終選擇是Clover-v2.4k-4630-X64.iso,分別在實機下測試和雲上測試,盤性質為普通ide hd,且EFI位於這個分區內,可以進入到clover選單界面,不受支持的virtio就只能停在圖形化efi界面,如何實現讓其在virtio或雲機上也能用呢?。
我們直接dd把文件弄出來,也不用去編譯clover的源碼了。
Cdboot:452,608-boot6:450,048=2560字節Byte,512Byte是1簇,是5簇
把cdboot與boot7放一起:然後 dd if=boot7 of=cdboot seek=5 bs=512 conv=notrunc
Fat32 BOOT根分區是不需要放BOOT文件的,只需要把EFI從ISO中複製到這裡來,其實移動也可。(對比變色龍,EFI就相當於其Extra)
然後mbrpatch cfg用變色龍那套Remaster Clover ISO
測試可以啟動。以後我們就變色龍和四葉草一起測試了。如果你想測試clover install pkg,或得到相關文件,在10.12,13虛擬機guest osx中進行,,複製過去osxkvm10146然後掛載這個raw image,安裝到虛擬出的boot區得到相關文件。,不要在host osx中安裝(有保護也裝不上)也不要在guest osx本機中安裝。如果你想替換clover.iso,直接在host osx端掛載raw image編輯boot區放入新調的clover.iso(修改完成不需要卸載,pd端就能反應出變化),用不著一臺具有網絡能力的qemu tcpe了。
新的libvirt xml和boot.plist
我們為什麼deprecate前文qemu4.2的思路,前面的增刪指令集思路沒用,因為一個CPU涉及到架構,不是簡單的指令集的疊加。因此我們從別的方向前進。我們用上了libvirt xml和vnc,我們使用libvirt是看中了它能自定義cpu,這樣我們可以堅守在2.1下,一步一步自定義cpu成skylake或Cascadelake:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>osxkvm</name>
<os>
<type arch='x86_64' machine='pc-i440fx-2.1’>hvm</type>
</os>
<features>
<acpi/>
<kvm>
<hidden state='on'/>
</kvm>
</features>
<cpu mode='custom' match='exact' check='none'>
<model fallback='allow'>Penryn</model>
</cpu>
<memory unit='KiB'>4194304</memory>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<input type='keyboard' bus='usb'/>
<input type='mouse' bus='usb'/>
<video>
<model type='cirrus'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<graphics type='vnc'/>
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='writeback'/>
<source file='/media/psf/DATA/aliyunosx/osxkvm10146'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
<interface type='bridge'>
<mac address='52:54:00:c9:18:27'/>
<source bridge='virbr0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x0' slot='0x03' function='0x0'/>
</interface>
</devices>
</domain>
網絡還是用迴文章1的tap0而不是使用helper,因為我們想免去boot.sh
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up promisc on
sudo brctl addif virbr0 tap0(這句跟xml中bridge chunk中的target作用重複,如果不刪掉<target dev='tap0'/>你每次都需要sudo brctl delif virbr0 tap0,PD一旦休眠或暫停,tap0會自動消失因此這個綁定作用失效需要重新執行然後把virbr0停止再開一下,所以測試過程中要把pd中deepin設為永不休眠,否則qemu tcpe網絡不穩定)
繼續作源碼修改強化變色龍的調試功能:
因為10.14開始已經不支持32 sdk了。所以最新可用的10.13,PD直接application下的安裝app直接做成鏡像,過程中要產生一個cdr,這個原理就是我們在文4中提到的,其實可以手動直接createinstallmedia產生供pd使用的可安裝鏡像,只是在10.15不能執行32位createinstallmedia,製作好的安裝程序已損壞,暫時更改主系統的time,例如date 102516242016回車,並禁網絡直到安裝完成(guest中這樣做比較麻煩第一階段可以過去,但第二階段選不到菜單調不出命令行,過不去)
10.13支持的是Command Line Tools (macOS 10.13) for Xcode 9.2.dmg,它也沒有10.11 command tools下不支持c99 vsscanf等函數發生“ld vsscanf : symbol(s) not found for architecture i386”等的問題:
graphics.c中Bouncing ball .oOo.把動畫圖標換成文字小棍。prompt.c中加個by 自己的標識
前面說到變色龍的bdmsg就是信息內容複雜點的-v + pause(),它其實是#define DBG(x...) msglog(x),可以改動把它保存在可訪問的fat32 boot分區內。
sys.c long GetFileInfo,可以得到文件名,用於hfs.c中提取更簡單的文件名,你也可以在hfs.c中用vsscanf正規提取*.kext的部分,-v最後出現的加載drive,只要在啟動時命令行中同時指定UseKernelCache=No才出現,變色龍默認使用prelinkedkernel,也就是usekernelcache=yes(-f=Yes),此時不加載s/l/e,一定要指定usekernelcache=no才加載
在qemu src的pcbios下,我們找到acpi-dsdt.aml(i440fx),q35-acpi-dsdt.aml,變色龍也支持DSDT,因為變色龍邏輯中只寫了bt(0,0)而我們的dsdt.aml在en(0,0)中,所以丟到extras還不夠,還要在boot.plist中寫一條key DDST,string dsdt.aml
其實變色龍也支持和clover一樣的自定義kernel patch。在kernel.plist中寫KernelPatches,blaaa..
二個boot,調試cpu嘗試讓mojave在Skylake-Server下運行解決黑屏問題
Clover和變色龍下,cpu設為Penryn可進入我們前面做好的鏡像。但換cpu就進不去。這也在意料之中,cpu不兼容。繼續看一段關於處理CPU兼容的問題,你可以三者全實現也可以保持不衝突部分實現,只要能最終啟動mojave:
Why Penryn is recommanded beforehttps://forums.unraid.net/topic/84430-hackintosh-tips-to-make-a-bare-metal-macos/:
After digging a lot of code, I have some conclusions why they recommanded Penryn as prefered CPU Model:
-
Penryn is classic, and it missing some features compared to newer generation, which lead to a similar situation with VM.
- Penryn do not have a msr 0x00000198 leaf to read the perfstatus (like bus ratio, cpu frequency) which the same as a VM.
- Penryn do not have a msr 0x35 leaf to read topology structure, which also most hypervisors haven't implemented yet.Instead, the MacOS will try to get the topology from acpi when it detect a Penryn process, which the same as a VM.
- Some bootloaders do have some compatibility issues when using a newer generation in a VM, some causing dividing by zero errors(They can't get correct frequency from acpi or msr, so they may be zero).
-
Some articles have outdated so long from now.
- It don't have some cpuid features like avx/avx2/bmi/fma so MacOS won't recognized those features even thought you just passed through.
osx下的cat /proc/cpuinfo:sysctl machdep.cpu,sysctl -a | grep machdep.cpu,sysctl -a | grep hw.optional
更多在clover和變色龍下patch cpu的選項和功能:https://github.com/AMD-OSX/AMD_Vanilla/blob/master/17h/patches.plist:
<string>algrey - commpage_populate -remove rdmsr</string>
<string>algrey - cpu_topology_sort -disable _x86_validate_topology (10.14.4+)</string>
<string>algrey - cpuid_set_generic_info - disable check to allow leaf7</string>
<string>algrey - cpuid_set_cpufamily - force CPUFAMILY_INTEL_PENRYN</string>
<string>xlnc - cpuid_set_cpufamily - force CPUFAMILY_INTEL_PENRYN</string>
<string>algrey - i386_init - remove rdmsr (x3)</string>
<string>algrey - tsc_init - remove Penryn check to execute default case</string>
<string>algrey - tsc_init - grab DID and VID from MSR</string>
<string>xlnc - tsc_init - grab DID and VID from MSR</string>
<string>algrey - tsc_init - skip test and go get FSBFrequency</string>
<string>xlnc - tsc_init - skip test and go get FSBFrequency</string>
<string>algrey - lapic_init - remove version check and panic</string>
<string>algrey - lapic_interrupt - skip checks and prevent panic</string>
<string>xlnc - lapic_interrupt - skip checks and prevent panic</string>
<string>algrey - mtrr_update_action - fix PAT (x2) (10.14.4+)</string>
很不幸,這篇文章依然不是《最終實現在雲機上運行黑果》,依然是前文的繼續,我們的目的只是把osx裝上雲當個nas,代替《聰明的Mac osx本地雲》文使之成為iphone,osx的nas mate os,可能這種嘗試有點付出太多了。但無論如何,讀到這裡的小夥伴都贏了:目標已經十分接近了。
(此處不設回覆,掃碼到微信參與留言,或直接點擊到原文)