Proxmox VE 7 虚拟化 macOS Monterey

之前使用 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 的原文

效果

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据