本文关键字:用ubi在osx上打造一分区一安装启动U盘,deepin上qemu+kvm装黑果
在上文《云主机装黑果》中,我们讨论了其可能性,或许这里面的坑远远不止那文提到的,甚至最终不能成功。—— 但不管如何,实践总要先行。在理论与实践组成的一对学习矛盾中,先见独到的理论思考,与慢悠盲目的实践,都必不可少。现在让我们开始正式的实践。
我们在前面说到,现在最新的流行OS,如windows,ubt发行,osx,都是基于uefi机考虑的。同一个系统,安装在同一台pc的mbr或uefi模式下,表现结果和所需驱动都是不一样的,比如你会发现有些驱动不能工作而有些可以,有些都有驱动的表现也不尽相同,这是因为bios和uefi定义了同一硬件的不同规范。之所以再次提到这个,是因为继续云机装黑果前,我们需要制作一套实践环境。需要在PC上制作一套省事的,统一的osx,windows,linux多系统安装和启动法 ——— 这些同样与uefi相关:
我们知道,uefi提供了将固件放在磁盘上的方式(与OS同一处理方式),这带来的好处就是,所有的启动,不必再mbr式写启动动到磁盘结构了,也不必动到整盘,大家只需要在gpt的efi分区中写入uefi文件即可安装,也可运行,而且这对U盘硬盘,(写入安装)和(启动系统)都是一样的。在各OS运用不同磁盘格式的现实情况下,这也许是是在PC上u盘安装启动多系统的最省事方法。—— 但是历史上,有些os,如Windows uefi的安装程序不安分(会创造额外分区,msr,等等),osx uefi和deepin uefi之类的os倒是十分安分,苹果是支持installmedia 刻录到分区安装和启动的(你可能不知道,osx最初的标语是打造一个人性化的os,从note,日历,到icloud,个人认为日常都离不开这些,都是很人性的。所以就连它的createinstallmedia安装盘方式和本地盘方式也是基于分区的。),deepin也可以分区安装。这二者共存就是我们想要的结果:你会在一个装有多OS的GPT盘的efi分区发现多个系统的efi文件夹。至于windows,你可以pass使用它的安装程序,用winpe代替,集成wim安装包,pe里面会有一个nt6setup工具选择efi分区和系统分区的选项,从而达成我们要的结果。
1)用ubi在osx上打造一分区一安装启动U盘,一分区一系统的本地盘格局
下面介绍在osx下运用unetbootin677来制作这样的安装U盘的的方法:Unetbootin的特别之处在于它将安装镜像写入分区而不是整盘,有别于市面其它产品,原理就是syslinux+uefi+fat32,使用时选择镜像后对应分区要事先格式为fat32。但fat32的缺点就是一旦文件有超过4g。就不能使用ubi,但是dvd也有容量限制呢,所以这只是一种折中。
在osx的图形化磁盘工具中,我们将一个32gU盘分成3个10g(或osx 10g,deepin15 4g,windows 10 2019 ltsc 6g,10G作exfat data区放点其它东西 ),每一个分区写入一个安装iso,efi分区是自然生成的,,Ubi是不支持windows的仅支持linux,但是实测也可以按同样对linux的方式强行将windows pe带安装包wim iso刷入,至于安装到的本地多系统,我们也将本地盘分为三到四个区(osx留大一点,最后一个区可以是exfat data放点东西,我是256g,80g给osx,2x40分别给deepin15和windows,90g做data),这样,我们可以把OS X主系统下图形硬盘工具作出的这套结构作为主要的日常视图。日后在finder->位置->下看到清爽的磁盘结构结果,也方便我们接下来的工作(我们需要在这些系统间切来切去而不能使用pd虚拟机来完成以下测试)。
注意,只有osx系统才有开机按alt(option)显示U盘各分区的启动。也许未来在没有这种支持的电脑上也可实现,比如我们可以做个智能U盘,当某系统所属的分区需要被当前使用到,就设置一个把这个分区推出来的功能。来代替平果机的这种功能,而不用使用mbr统一菜单在分区间chain来chain去的那种。(除非某天所有系统都能安装到同一个分区使用同一种格式)
好了,下面继续我们的重点工作,在deepin15中安装qemu+kvm测试安装黑果。
2)deepin上qemu+kvm装黑果:准备工作
由于我的macbookpro是一台2015,cpu是支持虚拟化特性的,所以直接:
Sudo apt-get update
Sudo apt-get install virt-manager bridge-utils libvirt-clients qemu qemu-kvm
发现我的deepin-15.11-amd64在uefi下屏幕开机高亮的问题得到了解决,但是无线网卡没用,弄了个360usb wifi插好对付着用,发现下载到的qemu是2.81的。它的中心是一个libvirt加qemu,加一些类似管理机控制台的命令行和GUI工具,Qemu就是类似osx上bvyve一样的东西。后者也可以直接运行kernel。打开控制台,它里面有一系列虚拟的存储池,网络沲(配置文件和硬盘文件都在/var/lib/libvirt/image,/var/lib/libvirt/network/default.xml,/etc/libvirt/qemu/networks/default.xml)),你可以在GUI里新建一般复杂度配置的vm,但gui功能有限,更多更专业的参数需要命令行完成,如今天谈到的黑果。
根据前文《在阿里云上装黑苹果(1):黑苹果基础 ,在阿里云上安装黑苹果(2):本地虚拟机方案研究和可行资源参考》,https://www.contrib.andrew.cmu.edu/~somlo/OSXKVM/index_old.html和http://www.contrib.andrew.cmu.edu/~somlo/OSXKVM/ 这二文基本是有关在kvm上装黑果的技术起源。后者都是别人基于这些研究的一些脚本工具集成。这二文中,old那文是直接用apple boot-132->变色龙(停更)->enoch对变色龙的修改,后来那文是正儿八经地统盘修改ovmf(更干净和接近uefi定制),,再后来,别人就用clover这个更强大免编译的uefi来代替ovmf的编译了作出更简单的osxkvm方案(如https://www.kraxel.org/blog/2017/09/running-macos-as-guest-in-kvm/的kraxel和https://github.com/kholia/OSX-KVM的kholia)。
PS:Boot-132 is a bootloader provided by Apple for loading the XNU kernel,但是它并不用在真正的Mac上。而Chameleon is a Darwin/XNU boot loader based on Apple's boot-132.Enoch对变化龙的增强可以启动早期osx,甚至到10.11,10.12为止的osx,说到底,enoch与clover做的工作是一样的,也都是efi的,(但enoch是对seabios朝uefi的过渡层,与普通bios机和云主机的bios接近,云主机是seabios),具体到kvm,enoch是kernel方式喂给qemu的,是bios上浅浅的一层。对Qemu/kvm guest方要求的更改最小,vs clover对uefi的要求最低。可能更适合我们未来将其用受限方式集成到受限的kvm环境如利用linuxboot等方式将其喂给普通阿里云ecs,以上是固件上的,其它工作方面,pc上黑平果的工作就像黑群,从loader着手,必要的时候,也重新打包安装包(vs synology upgrade pat)。因为这里要处理固件驱动注入,修改原包中正常启动参数到适合特定硬件启动,kvm guest机器其实可以类比通用pc上黑果技术的一组硬件特例处理,cloud kvm更是仅明确使用virtio驱动。
所以enoch这种,最接近pc黑果技术的起点,所以我们选择从它开始而不是clover
由于kholia在他的仓库中中把somlo的old文中的前期方案的相关脚本和工具也做了进来,所以这里为了方便我干脆采用它的一并说明,网上搜索kvmqemu osx出来的教程多用enoch_rev2839_boot和Install_OS_X_10.11.3_El_Capitan,所以这里也准备这样做。我clone到的2019.10.25的https://github.com/kholia/OSX-KVM/commit/64fcc1ef4d800197e8f4fc1421dd0f7060a72166,在整个脚本的backup文件夹内(backup之外的则对应最新利用clover的那些工具和脚本)。先看这个https://github.com/kholia/OSX-KVM/blob/master/notes.md,Enoch Bootloader (obsolete)是宣称过时的,意料之中,继续,1)脚本第一步,是create_install_iso.sh(for 10.11.0-10.11.4 and 10.12.0-10.12.5,只能在osx bash下运行),它将从appstore下载到application/install OS X xxx app中的安装程序进行再打包,使之成为qemu适用的iso。如果你下载的OS X离线安装包,可以手动释放到application,这个过程中,一些必要的驱动和变动,也将被加进去,也就是破解kernel的方式。(这也是常见制作懒人包的方式 under pc黑果s),在安装过程中会用到。2)我下载到的是OS_X_10.11.3 El Capitan,运行,会出错,说tar 解压不到正确的格式包,下载安装Pacifist,用它打开install osx ei capitan.app/contents/sharesupport中的InstallESD.dmg,切换到”软件包内容”“资源”的“资源”,把Essentials.pkg释放到backup下,然后修改create_install.iso.sh中的对应处,成为python "$script_dir/parse_pbzx.py" "$script_dir/Payload" | cpio -idmu ./System/Library/Kernels || exit_with_error "Extraction of kernel failed”,重新运行脚本,得到Install_OS_X_10.11.3_El_Capitan.iso —— 与此同时,发现backup中,没有enoch_rev2839_boot,我从网上搜索下载到这个文件,放到backup中,值得注意的是网上下载到宣称2839的不一定就是对应版本.3)再在backup下创建一个40g硬盘,用来安装,qemu-img create -f qcow2 osxkvm.qcow2 40G。
3)deepin上qemu+kvm装黑果:启动
三大件准备完毕,我们需要先执行一些准备工作:
打开kvm参数:echo 1 > /sys/module/kvm/parameters/ignore_msrs,不这样,就会显示boot:不断重复重启。
网卡和网络设置部分:
Kvm会自己创建一个virbr0和br0(见控制台虚拟网卡default栏),为nat(Installing "virt-manager" automagically creates the "virbr0" local private bridge :-) )。我们把osx网络与主机网络组成tap:
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up promisc on
sudo brctl addif virbr0 tap0
仓库脚本最后一般是用复杂命令行定义的VM和启动逻辑,这也是网上的教程常讲的主体部分(除了命令行,也有libvirt.xml版,但我们讲命令行版方便说明):
qemu-system-x86_64 -enable-kvm -machine pc-q35-2.4 -smp 4,cores=2 \
-cpu Penryn,kvm=off,vendor=GenuineIntel \
-m 4096 \
-smbios type=2 \
-kernel ./enoch_rev2902_boot \
-device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc" \
-usb -device usb-kbd -device usb-mouse \
-device ich9-intel-hda -device hda-duplex \
-device ide-drive,bus=ide.2,drive=MacHDD \
-drive id=MacHDD,if=none,file=./osxkvm.qcow2 \
-device ide-drive,bus=ide.0,drive=MacDVD \
-drive id=MacDVD,if=none,snapshot=on,file=./'Install_OS_X_10.11.3_El_Capitan.iso'
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000-82545em,netdev=net0,id=net0,mac=52:54:00:c9:18:27 \
-monitor stdio
kvm=off,并没有使用kvm半虚拟化加速。
penryn,pc-q35-2.4,这是qemu虚拟出来尽量按近mac的cpu和主板机型,q35使用osx硬件采用的ich9芯片组。
-smbios type=2 seabios patch,required for booting [Mountain]Lion
我们注意到device isa-applesmc,osk=“”这行,对应somlo old文,这是Mac专属硬件,用程序算出来的
urhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc这是固定的。
修改好boot,qcow2,iso各文件对应位置。
如果是-usb -device usb-kbd -device usb-tablet要改成-usb -device usb-kbd -device usb-mouse,否则moniter stdio下没有鼠标(usb-tablet后期在系统运行时可以有另外的开源驱动用)。
Ich9-intel-hda声卡
注意到虚拟网卡-netdev 开始的部分,这是最大的坑,作为黑果特例,网卡单一e1000是osx普遍内置的,net0是osx内部用的名字。52:54:00是osx合法的开头,见https://github.com/kholia/OSX-KVM/blob/master/networking-qemu-kvm-howto.txt,你还可给osx guest设置更复杂的bridge网络。
(也可以后期装virtio net pkg)
-monitor stdio使用原生kvm窗口。也可以spice或vnc
(这是整个osxkvm黑果的技术主体,也是pc黑果的技术主体https://www.insanelymac.com/forum/topic/278638-enoch-bootloader/,之所以以上都能轻描淡写做进命令行,是因为它们被解决了,从中我们看到somlo old文对应所提到的大大小小的坑,还有日渐功能丰富的qemu也会将它们整合包含(somlo文中一些对kvm本身编译更改的在qemu更新版中不必再做了),故,以上在考虑将osx移到云主机时就需要逐个攻破,从qemu重新转到guest内,让kvm guest自包含而不是外部喂给,或依赖host qemu)
启动脚本boot-macOS.sh,显示虚拟机启动窗口。开头显示r2839字样,ehci warning: guest requested more bytes than allowed,接processing error - resetting ehci HC,但可以继续。如果不是r2839就启动不了。显示osx的recovery安装界面,进去,格式化磁盘,取个名,cp -av /Extra /Volumes/磁盘名(这个时候我们处在iso的文件系统中,extra就是写入的那些扩展,其实也就org.chameleon.boot.plist一个文件Chameleon configuration:timeout,To automatically boot into OS X without needing to press enter at the prompt,The EthernetBuiltIn and PCIRootUID keys fix the “Your device or computer could not be verified. Contact support for assistance.” error when logging in to the App Store.,主要是配置一些启动参数,没有kexts注入),继续安装。
如果在这里碰到No packages were eligible for install,一种解法是网上说的修改时间,如果点选左下角定制的时候,注意到osinstallsciprt为0kb,应试是镜像做错了,再次做好镜像即可。
——
至于加速的和硬件直通的kvm osx。你需要更深入。这样的方式使用黑果是不是违法的,因为硬件就是 apple规约中的那些,apple并没有规约硬件的外层或外延。
(此处不设回复,扫码到微信参与留言,或直接点击到原文)