所需环境:
- Proxmox VE
- 一台正常运行的MAC或者Linux(可以是虚拟机,建议使用MAC来完成打包任务)
- Git
创建安装镜像
暂未尝试直接使用网上流传的黑苹果镜像,在pve中暂时仅支持ISO、IMG格式的镜像文件。
建议直接在mac实体机或者虚拟机中完成下面的操作,因为在linux环境下打包的镜像并不是完整的镜像,它只是一个recovery镜像,在安装的过程中再下载完成的镜像,这种情况下对网络有一定的要求。
安装构建工具并打包镜像
- For Mac端:
xcode-select --install
git clone https://github.com/thenickdude/OSX-KVM.git
cd OSX-KVM/scripts/ventura
make Ventura-full.img
- For Linux端:
apt install qemu-utils make qemu-block-extra -y
git clone https://github.com/thenickdude/OSX-KVM.git
cd OSX-KVM/scripts/ventura
make Ventura-recovery.img
下载OpenCore镜像
前往github的releases页下载打包好的镜像文件
然后将下载完成的压缩包解压。
将镜像上传到PVE
可以直接在web中上传,或者使用scp上传到pve服务器的/var/lib/vz/template/iso
路径下。
获取OSK
MacOS会检测它是否在真正的MAC官方硬件上运行,OSK则是它用于判断的主要依据,不过OSK在同一版本上是一致的,因此可以在一台mac机器上执行osk读取操作,然后使用获取到的osk来绕过认证。
以下操作仅能在mac系统中操作!!!
- 创建名为smc_read.c的C源文件
/*
* smc_read.c: Written for Mac OS X 10.5. Compile as follows:
*
* gcc -Wall -o smc_read smc_read.c -framework IOKit
*/
#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:ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc
PVE中新建虚拟机
创建虚拟机
按照下图的顺序操作。
记住图中的VM ID。
选择刚刚下载并上传的OpenCore镜像并将操作系统设置为其他
为了避免遇到奇奇怪怪的问题,建议严格按照图中设置参数来。
除了存储位置以及磁盘大小外,请保持一致。磁盘空间看着给,别小于64G。
cpu数量看着给,但是注意得是2的n次方(如2,4,8,16....)CPU类型选择Haswell,启用NUMA。
内存也是根据自己需求设置
网卡模型使用半虚拟化。
创建完成后先不急着启动,需要做一些其他的配置。
首先找到选项,确保开启了使用平板指针。然后设置OpenCore为第一启动项。
接着到硬件中添加第二块DVD。
选择我们前面打包的镜像。
修改配置文件
接下来再对虚拟机的配置文件做一些修改。
- 连接pve的shell(可通过ssh或者web)
这里直接使用web版的shell。
- 修改配置文件
cd /etc/pve/qemu-server/
nano 116.conf ##[VM ID].conf
在第一行添加启动参数:
#For Intel CPU
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 -cpu host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc
#For AMD CPU
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 -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
找到挂载镜像的那两行,并替换media=cdrom
为cache=unsafe
.
设置Proxmox
echo "options kvm ignore_msrs=Y" >> /etc/modprobe.d/kvm.conf && update-initramfs -k all -u
安装MacOS 13
完成上面所有操作后开始启动虚拟机进行安装。
在这里按下回车键进入安装前界面。
进入磁盘工具,找到添加的磁盘,然后格式化磁盘。
然后回到上一级目录,选择安装macos。
选择安装到刚刚格式化的磁盘
等待安装进行,中途会重启几次,需要手动引导到安装进程。
使用键盘选择第二个,然后回车继续安装,直到安装完成。
另外,在初始化的时候不建议登陆apple id。如果需要登录apple ID的话请先移步到这里配置一个序列号之后再登陆。
将OpenCore安装到硬盘
首先打开终端,使用diskutil列出所有分区
diskutil list
将opencore复制到硬盘
sudo dd if=[OpenCore EFI分区] of=[磁盘EFI分区]
然后关机并移除两个dvd驱动。
设置开机自动进入系统
sudo mkdir /Volumes/EFI
sudo mount -t msdos /dev/disk0s1 /Volumes/EFI
首先挂载EFI,然后编辑config.plist
cd /Volumes/EFI/EFI/OC
sudo vim config.plist
将MISC->Boot->Timeout改成任意非0数字。
至此大功告成