---
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？我觉得理论上应该没问题，所以就尝试了一下。   
  我在这之前已经安装过了一个用了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的嘛，居然没有一个人尝试一下。   
  不过屏幕不能亮是真的没有驱动吗？我看了眼设备管理器，搜了一下那个没有安装驱动的视频控制器的设备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的更新，像这些非官方支持的办法估计也很有可能出问题，毕竟苹果并不对这些情况进行任何形式的保障，也许以后苹果的哪次更新这个方法就用不了了呢……   