之前使用 Proxmox VE 虚拟化过 Proxmox VE KVM 虚拟化 macOS (Catalina)和 Proxmox VE 虚拟化 macOS Big Sur (Big Sur),但都是一年前的文章了,不知道是否还具有参考性(懒得更新)
最近 Proxmox VE 发布了 7.0,macOS 也发布了 Monterey,Nicholas Sherlock 也发布了新的 Monterey 教程,现在重新记录一下如何使用最新版 PVE 虚拟化最新版 macOS(反正之前的步骤也忘得差不多了)
下文将展示如何在 Proxmox VE 7(PVE) 安装 macOS Monterey 虚拟机
准备
- 一台正常运行的 Mac 或者 Linux 机器
- 或者之前的 macOS 虚拟机
- 用于获取 OSK,没有现成 macOS 的话搜索一下应该会有(所有 OSK 都是一样的,macOS 启动时会检查)
- 正常运行的 Proxmox VE 7
- 没有测试之前版本的兼容性
- CPU 必须支持 SSE 4.2
参考
步骤
创建安装镜像
安装构建工具
在 macOS 终端执行
xcode-select --install
如果使用的是 Linux,则执行
sudo apt install qemu-utils make
获取构建源码
终端执行
git clone https://github.com/thenickdude/OSX-KVM.git
构建安装镜像
执行
cd OSX-KVM/scripts/monterey # macOS make Monterey-full.img # Linux make Monterey-recovery.img
Linux 下 构建的 Monterey-recovery.img 不包含系统安装文件,安装时需要连接互联网在线下载文件
macOS 下 构建的 Monterey-full.img 大小大约在 15 GB
获取 OpenCore 镜像
在 nickthedude 源的 Release 页面 下载 OpenCore 的 .iso.gz 文件(注意需要 v15 以上版本),然后解压出 OpenCore.iso 文件
Although it has a .iso file extension, this is actually a hard disk image
虽然后缀是 iso,OpenCore.iso 实际上是硬盘镜像
上传镜像
将构建好的 Monterey.img 以及下载的 OpenCore.img 上传到 Proxmox VE
注意:macOS 下构建的 Monterey-full.img 有 15 GB,通过 Promox 的 WebUI 上传可能会因为 tmp 目录不够大而提示
Error '0' occurred while receiving the document
推荐使用 scp 或其他方式直接上传到 Proxmox 的 /var/lib/vz/template/iso 目录
获取 OSK
此步骤只能在 macOS 下进行
新建 C 语言源代码 smc_read.c,写入以下内容
#include <stdio.h> #include <IOKit/IOKitLib.h> typedef struct { uint32_t key; uint8_t __d0[22]; uint32_t datasize; uint8_t __d1[10]; uint8_t cmd; uint32_t __d2; uint8_t data[32]; } AppleSMCBuffer_t; int main(void) { io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleSMC")); if (!service) return -1; io_connect_t port = (io_connect_t)0; kern_return_t kr = IOServiceOpen(service, mach_task_self(), 0, &port); IOObjectRelease(service); if (kr != kIOReturnSuccess) return kr; AppleSMCBuffer_t inputStruct = { 'OSK0', {0}, 32, {0}, 5, }, outputStruct; size_t outputStructCnt = sizeof(outputStruct); kr = IOConnectCallStructMethod((mach_port_t)port, (uint32_t)2, (const void*)&inputStruct, sizeof(inputStruct), (void*)&outputStruct, &outputStructCnt); if (kr != kIOReturnSuccess) return kr; int i = 0; for (i = 0; i < 32; i++) printf("%c", outputStruct.data[i]); inputStruct.key = 'OSK1'; kr = IOConnectCallStructMethod((mach_port_t)port, (uint32_t)2, (const void*)&inputStruct, sizeof(inputStruct), (void*)&outputStruct, &outputStructCnt); if (kr == kIOReturnSuccess) for (i = 0; i < 32; i++) printf("%c", outputStruct.data[i]); printf("\n"); return IOServiceClose(port); }
执行编译指令
gcc -o smc_read smc_read.c -framework IOKit
执行 smc_read 获取 OSK
./smc_read
记录输出的 OSK(大小写敏感)
新建虚拟机
以防图片加载缓慢,配上文字说明
操作系统设置
使用镜像选择 OpenCore.iso 镜像
系统设置
显卡选择 VMware compatible,勾选 Qemu Agent。打开高级设置,BIOS 选择 OVMF,机器选择 q35,勾选 Add EDI Disk 并选择存储磁盘,取消勾选 Pre-Enroll keys
硬盘设置
总线选择 VirtIO Block,ID 为 0,大小至少设置 64G 以上,缓存选择 Write back (unsafe),勾选 Discard 以支持 TRIM
CPU 设置
核心数设置为 2 的倍数,类型选择 Penryn。打开高级设置,勾选 Enable NUMA
内存设置
设置内存后打开高级设置,取消勾选 Ballooning Device
网络设置
网卡型号选择 VirtIO (paravirtualized)
完成新建虚拟机后先不要运行虚拟机
虚拟机设置
开启 Use tablet for pointer
进入虚拟机选项,打开 Use tablet for pointer
挂载安装镜像
进入硬件设置,添加 CD/DVD 设备,总线选择 IDE,ID 设置为 0,然后选择上传的 Monterey.img 镜像
更改启动顺序
进入选项页面,更改启动顺序,将 OpenCore 设置为首选项
编辑虚拟机配置文件
进入 Proxmox 的 shell,编辑 /etc/pve/qemu-server 目录下的 macOS 虚拟机文件 [VM ID].conf
在第一行添加启动参数(注意要写在一行)
args: -device isa-applesmc,osk="这里填写 OSK" -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -global nec-usb-xhci.msi=off -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off
注意:如果在启动 VM 时遇到了如下错误
can't apply global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off
尝试删除参数
-global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off
接下来,如果使用的是 Intel CPU,则在启动参数一行的末尾添加
-cpu host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc
如果使用 AMD CPU,则添加(未测试)
-cpu Penryn,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+avx2,+aes,+fma,+fma4,+bmi1,+bmi2,+xsave,+xsaveopt,check
之后找到挂载 OpenCore 和 Monterey 安装镜像的一行,删除 “media=cdrom”,替换为 “cache=unsafe”
保存配置文件,最终的配置文件类似下图
设置 Proxmox VE
在 shell 执行
echo "options kvm ignore_msrs=Y" >> /etc/modprobe.d/kvm.conf && update-initramfs -k all -u
上述指令会更新内核,防止 macOS 虚拟机无限重启
安装 Monterey
开启虚拟机,进入 OpenCore 启动选项后选择 Install macOS Monterey 开始安装
擦除磁盘
进入磁盘工具,将 VirtIO 磁盘擦除为 APFS 格式
开始安装
退出磁盘工具,进入 Monterey 安装选项
安装过程中会自动重启几次,重启后不会自动进入安装程序,需要手动在启动选项界面选择 macOS Installer
等待安装完毕
安装完毕后选择启动已经装有 Monterey 的磁盘,此时可能还会自动重启一次,重启后再次选择即可进入系统
EFI 写入磁盘
虚拟机启动,进入系统后打开终端,执行
diskutil list
找到 OpenCore.iso(150M 左右大小) 中 EFI 分区的 ID,以及 macOS 磁盘 EFI 分区的ID,使用 dd 指令写入 EFI
sudo dd if=[OpenCore EFI 路径] of=[Monterey 磁盘 EFI 分区路径]
之后关闭系统,在 Proxmox 硬件设置中删除 OpenCore 和 Monterey 安装镜像
macOS Monterey 虚拟机安装完毕
设置自动启动
打开 macOS 的终端,挂载磁盘的 EFI 分区
sudo mkdir /Volumes/EFI sudo mount -t msdos [EFI 分区的路径] /Volumes/EFI
使用文本编辑器打开 EFI 分区下的 EFI/OC/config.plist 文件,找到 Misc - Boot - Timeout 选项,将 Timeout 的值设置为任意非零数字,OpenCore 会在对应秒后自动进入第一个启动选项
由于本人只是简单地将 macOS 虚拟机作为测试机,没有其他需求,所以没有介绍更多的配置方法
如果需要更多相关教程(例如:显卡直通、OpenCore 的一些 tweak/hack)可以查看 nick 的原文
效果
请问你用PVE安装的macos monterey使用QQ会崩溃吗,我用unraid安装的不会,但是PVE安装的会,在Bigsur也会崩溃
之前在PVE安装的Catalina里用过QQ,不会崩溃。Big Sur 和 Monterey里没有用过QQ,不清楚