大數據

雲主機裝黑果實踐(7):繼續處理雲主機上黑果前後置問題,增加新boot

本文關鍵字: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:

  1. Penryn is classic, and it missing some features compared to newer generation, which lead to a similar situation with VM.

    1. Penryn do not have a msr 0x00000198 leaf to read the perfstatus (like bus ratio, cpu frequency) which the same as a VM.
    2. 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.
    3. 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).
  2. Some articles have outdated so long from now.

    1. 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,可能這種嘗試有點付出太多了。但無論如何,讀到這裡的小夥伴都贏了:目標已經十分接近了。


(此處不設回覆,掃碼到微信參與留言,或直接點擊到原文)

qrcode.png

Leave a Reply

Your email address will not be published. Required fields are marked *