2025-03-25 14:47:17 +00:00
---
layout: post
title: 在UTM中使用苹果虚拟化的各种尝试
tags: [虚拟化, 苹果, UTM]
---
用官方的方式做非官方的事!<!-- more -->
# 起因
在几年前刚[收到MacBook Pro ](/2023/02/03/mbp.html )的时候,我曾安装过虚拟机软件[UTM ](https://github.com/utmapp/UTM )。但是因为我的Mac内存很小, 用虚拟机的体验很差, 所以就把UTM卸载掉了。不过以前还我还[装过一台黑苹果 ](/2024/06/16/hackintosh.html ), 在上面也安装了UTM。
最近正好由于某些原因我需要在macOS上安装虚拟机, 既然有UTM用就继续用UTM了。当然正常情况就是按正常的方式安装系统然后正常的用, 这并没有什么意思。所以我想整点有意思的事情, 想试试不太正常的使用UTM😝。
# 在UTM中使用苹果虚拟化框架安装Windows
如果用过UTM的话应该知道, UTM有很多选项, 比如底层的虚拟化框架可以用QEMU或者[Virtualization.framework ](https://developer.apple.com/documentation/Virtualization )( VZ) , 而QEMU的后端可以选TCG或者是[Hypervisor.framework ](https://developer.apple.com/documentation/hypervisor )( HVF) 。它们有很多特色, 像TCG的兼容性最好, 可以模拟任何架构的CPU, 但是性能最差, HVF使用硬件虚拟化加速, 只能运行宿主机架构的程序, 但是性能比较好, 而VZ经过了苹果官方优化, 性能最好。
那么现在我想安装Windows, 又想有最好的性能, 那我应该选择VZ吧? 可是UTM不允许我这样选择, 如果选择安装Windows就会强制使用QEMU……只有Linux或者macOS( 在ARM处理器) 才能使用VZ……那我应该如何绕过这个限制呢?
我想起来之前[让没用的主机感染木马 ](/2024/11/02/trojan.html )的文章中使用了[一键DD/重装脚本 ](https://github.com/bin456789/reinstall )把我服务器的Linux系统重装成了Windows系统, 那么我能不能用相同的方式先按照正常的方式用VZ安装一个Linux系统然后使用这个脚本重装成Windows? 我觉得理论上应该没问题, 所以就尝试了一下。
2025-03-25 15:05:01 +00:00
我在这之前已经安装过了一个用了VZ的Ubuntu虚拟机, 新建比较费时间所以就直接把这个虚拟机复制了一份。然后下载了重装脚本准备重装系统, 但是看说明现在不能让脚本自己查找系统镜像安装了, 不过没关系, 前段时间我下了一份Windows 10的镜像, 接下来我只需要在镜像所在目录执行
```bash
python3 -m http.server
```
开启一个文件服务器,然后在虚拟机中执行
```bash
bash reinstall.sh windows --image-name "Windows 10 Pro" --iso "http://192.168.64.1:8000/windows.iso"
```
就可以了, 执行后重启就可以在UTM的虚拟机界面中看到脚本执行的一系列操作。在这期间都很顺利, 然而在它执行完之后, 虚拟机的屏幕就黑了, 而且重启也没有任何变化, 看来是实验失败了? 不过也可能是因为苹果整的虚拟显示器在Windows中识别不出来, 所以显示不出东西, 因为我看活动监视器中CPU的占用率也在跳变, 虚拟机应该仍然在运行, 于是我下载了[Windows App ](https://apps.apple.com/us/app/windows-app/id1295203466 )( 以前的远程桌面) , 使用虚拟机之前的IP进行连接, 结果连接成功了😆。看来苹果的虚拟化框架是能运行Windows的嘛, 居然没有一个人尝试一下。
2025-03-25 14:47:17 +00:00
不过屏幕不能亮是真的没有驱动吗? 我看了眼设备管理器, 搜了一下那个没有安装驱动的视频控制器的设备ID“1af4:1050”, 好像是Virtio GPU, 这个驱动我记得在[virtio-win ](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/ )里是有的, 而且重装脚本也会自动下载这个驱动, 为什么会没有自动安装呢? 可能是设备ID和驱动不一致吧……不过不影响, 我选择更新驱动, 在列表中选择“Red Hat VirtIO GPU DOD controller”之后UTM的虚拟屏幕中就可以看到画面了, 虽然分辨率只能是1024*768……不过能用就很不错了。
再接下来我就需要验证一下它的性能是不是最好的, 我把这个虚拟机的硬盘复制了一份, 新建了一个使用HVF后端的QEMU虚拟机, 把这个硬盘挂载上, 然后使用国际象棋跑分, 看了一下VZ的跑分相比HVF的跑分高了大概5%-10%,还是挺厉害的。
至于其他方面, 我看了一眼用HVF的QEMU虚拟机CPU不能显示正确的型号, 而VZ是可以的, 另外VZ的 SMBIOS信息中也可以看到Apple的字样, 证明这个Windows确确实实是跑在了苹果的虚拟化框架。不过以上的测试都是基于x86架构的macOS, 等回头我的Mac Studio到了之后再在ARM架构的macOS上再测一下, 看看能不能用相同的方式安装, 如果可以的话, 说明VZ的虚拟机没什么兼容性的问题, UTM应该放开使用VZ安装Windows的选项, 让我们测测苹果的技术才对。
# 在macOS 12中的UTM使用苹果虚拟化框架安装Linux
虽然在刚刚的测试中, 用VZ安装Linux就和其他普通的虚拟机安装Linux一样简单, 但是之前的测试是在macOS 15上测的。现在我遇到了一个新问题, 我现在有一台2016年的Mac, 上面运行着macOS 12, 而且不能用OCLP升级到macOS 15( 因为不是我的电脑) 。现在我想在这台电脑上用苹果虚拟化框架安装Linux, 虽然用QEMU更简单, 但是感觉没意思。在macOS 12中不支持UEFI bootloader, 所以我需要手工准备内核镜像之类的东西。
当然从零开始有点难, 我打算先用QEMU安装一遍Ubuntu Server。在创建虚拟机之后需要注意, 要把刚创建好的虚拟机的硬盘删掉, 因为那是qcow2格式的, 在VZ中只支持img格式的硬盘, 所以删掉之后需要创建一个“RAW映像”, 然后按照正常的方式安装系统。
安装好之后从“/boot”目录中把“vmlinuz”和“initrd.img”复制出来, 作为Linux内核和初始Ramdisk, 我看说明上要未经压缩的Linux内核映像, 但是好像是压缩的也能用🤔。随后关机把在QEMU中的硬盘映像复制出来, 作为根文件系统映像。
至于启动参数,可以看“/boot/grub/grub.cfg”中内核后面跟的那串, 然后再加上“console=hvc0”, 因为macOS 12中使用VZ没有虚拟屏幕, 只能用虚拟串口连接。在一切准备好之后就可以开机了, 在一串内核信息不停滚动后, 显示出了登录的提示符, 实验就成功结束了。
不过这样启动的话在系统中所有对内核以及对initramfs的更新就全都不会生效了, 毕竟虚拟机根本读不到内核了……这倒是影响不大, 反正不更新也不是不能用, 更何况macOS都不打算更新, 虚拟机不更新又能怎样呢🤣。
# 感想
看来苹果的“不支持”不代表真的不支持, 想想既然是虚拟机, 当然就不应该限制系统类型啊, 毕竟虚拟机虚拟的是硬件, 又不是软件。不过倒是也能理解苹果不需要声明支持自己的竞品, 所以也没必要做相应的兼容和测试, 但居然没见到有人尝试一下, 也挺奇怪, 明明用Mac的人也有不少对技术很有探索精神的人啊……
不过随着macOS的更新, 像这些非官方支持的办法估计也很有可能出问题, 毕竟苹果并不对这些情况进行任何形式的保障, 也许以后苹果的哪次更新这个方法就用不了了呢……