本文关键字: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,可能这种尝试有点付出太多了。但无论如何,读到这里的小伙伴都赢了:目标已经十分接近了。
(此处不设回复,扫码到微信参与留言,或直接点击到原文)