🍎

Proxmox 7.2 に macOS Ventura をインストール

2022/10/26に公開

注: この記事は Installing macOS 13 Ventura on Proxmox 7.2 を和訳し、変更を加えたものです。

必要条件

  • Proxmox 7.2 がインストール済み
  • Proxmox をホストしているCPUがIntelの場合、 Haswell 以上新しい必要がある。

1. インストール IMG の作成

macOS (VM でもOK) もしくは Linux で操作する。
OSX-KVM リポジトリ をクローンし、 scripts/ventura に移動する。

git clone https://github.com/thenickdude/OSX-KVM
cd OSX-KVM/scripts/ventura

macOS で操作している場合、 XCode ツールをインストールする。(すでにインストールしていた場合は必要ない)

xcode-select --install

Linux で操作している場合、 make と qemu-utils をインストールする。

sudo apt install make qemu-utils
# full
make Ventura-full.img
# recovery
make Ventura-recovery.img

正常に終了したら、そのディレクトリにできたVentura-full.img (もしくは Ventura-recovery.img) をProxmoxにアップロードする。

2. OpenCore の準備

OpenCore リリース から OpenCore をダウンロードする。(v18 以上が必要)
これは .gz が解凍できるPCであれば何でやってもよい。
解凍したら、OpenCore-v〇〇.isoをProxmoxにアップロードする。

3. OSK Auth Key の取得

macOS で操作。
以下のCコードを smc_read.cという名前で保存する。[1]

/*
 * 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 でコンパイルして実行する。

xcode-select --install # まだやってない場合
gcc -o smc_read smc_read.c -framework IOKit
./smc_read

./smc_read

64 文字のキーが出てくる。

4. VM の作成

コマンドを使う場合

あなたが楽をしたい場合、こちらを使うほうが良い。

Proxmoxのシェルにこのコマンドを入力し、実行する。
その時、置き換えるべき場所を置き換えること!

qm create <VMID> --name <VMの名前> --ide2 <OpenCore ISOの保存ディスクID>:iso/OpenCore-v<OpenCore バージョン>.iso,cache=unsafe,size=150M --ostype other --vga vmware --machine q35 --bios ovmf --scsihw virtio-scsi-pci --agent 1 --efidisk0 <EFIディスクを置きたい場所>:1,efitype=4m,pre-enrolled-keys=0 --sockets 1 --cores <コア数(2のべき乗)> --numa 0 --cpu Haswell --memory <メモリ(4096 以上)> --virtio0 <ディスクを置きたい場所>:<ディスクの容量(64 以上)>,discard=on,cache=unsafe --balloon 0 --net0 virtio,bridge=vmbr0,firewall=1 --ide0 <img の場所>:iso/Ventura-<full or recovery>.img,cache=unsafe,size=<recovery の場合:2481216K fullの場合:14G> --tablet 1 --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 Haswell,vendor=GenuineIntel,+kvm_pv_eoi,+kvm_pv_unhalt,+hypervisor,+invtsc,kvm=on' --boot order=ide2

例えば: 自分の場合こうなった。

qm create 500 --name ventura --ide2 hdd:iso/OpenCore-v18.iso,cache=unsafe,size=150M --ostype other --vga vmware --machine q35 --bios ovmf --scsihw virtio-scsi-pci --agent 1 --efidisk0 ssd:1,efitype=4m,pre-enrolled-keys=0 --sockets 1 --cores 4 --numa 0 --cpu Haswell --memory 4096 --virtio0 ssd:64,discard=on,cache=unsafe --balloon 0 --net0 virtio,bridge=vmbr0,firewall=1 --ide0 hdd:iso/Ventura-full.img,cache=unsafe,size=14G --tablet 1 --args '-device isa-applesmc,osk="SAMPLEOSKaaaaaaSAMPLEOSKaaaaaaSAMPLEOSKaaaaaaSAMPLEOSKaaaaaa" -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 Haswell,vendor=GenuineIntel,+kvm_pv_eoi,+kvm_pv_unhalt,+hypervisor,+invtsc,kvm=on' --boot order=ide2

エラーっぽい物が出てない場合成功。「Proxmoxの構成」に進む。

手動で作成する


VM IDとVMの名前を入力して、次へ


OpenCore-v○○.isoを選ぶ。OSの種類をOtherにする


グラフィックカードを VMware 互換にする。 マシンを q35 にする。 BIOSを OVMF(UEFI) にして、EFIディスクを選ぶ。 Pre-Enrolled keys のチェックを外す。 Qemuエージェントにチェックを付ける


パス/デバイス をVirtIO Blockにする。ストレージを選んで、サイズを64GB以上にする。 キャッシュをWrite back (unsafe)にする。中止のチェックを付ける。


コア数を2のべき乗にする。種別を Haswell にする。


メモリを4GB以上にする。Ballooning Deviceのチェックを外す。


モデルを VirtIO (準仮想化) にする。


作成後に起動のチェックをつけない。

作成後、オプションにて「ポインタ用にタブレットを使う」がオンになっていることを確認する。

ハードウェアオプションで、先程アップロードした Ventura の img ファイル(fullもしくはrecovery)を追加する。

まだ VM をスタートせず、Proxmox に SSH するかシェルに接続する。
好きなテキストエディタを使用して、/etc/pve/qemu-server/<VMID>.confを編集する。(筆者は vim を使った)

vim /etc/pve/qemu-server/600.conf # 筆者の場合

最初の行に、次の行を追加する。このとき、<OSK>を先ほどメモしたOSKに置き換える。(すべて1行であることを確認)

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 Haswell,vendor=GenuineIntel,+kvm_pv_eoi,+kvm_pv_unhalt,+hypervisor,+invtsc,kvm=on

次に、ISO と IMG の場所 (ide2ide0)を見つけて、ここの,media=cdrom,cache=unsafe置き換える。

- ide0: hdd:iso/Ventura-full.img,media=cdrom,size=14G
+ ide0: hdd:iso/Ventura-full.img,cache=unsafe,size=14G
- ide2: hdd:iso/OpenCore-v18.iso,media=cdrom,size=150M
+ ide2: hdd:iso/OpenCore-v18.iso,cacge=unsafe,size=150M

ここで保存してエディタを終了し、VM のオプションタブに行き、「ブート順」をide2にする。

お疲れさまでした。これで VM の設定は終わりです。

5. Proxmox の構成

Proxmox のシェルで次を実行することで、macOS のブートループを回避できるようになる。

echo "options kvm ignore_msrs=Y" >> /etc/modprobe.d/kvm.conf && update-initramfs -k all -u

6. Ventura のインストール

いよいよ、VM を起動する。

VM を起動すると、このような画面になる。(full の場合)

Install macOS Ventura(recovery の場合macOS Base System)をキーボードで選択して、進む。

進むと、りんごマークがしばらく出たあと、次のような画面になる。

この画面ではマウスが反応する

Disk Utilityを選んでContinueを押す。


Apple Inc. VirtIO Block Mediaを選んで、②Eraseを押す。

Nameにすきな名前を入れて(自分はmainにした)、FormatAPFSにして(デフォルト)、SchemeGUID Partition Mapにする(デフォルト)。そしてEraseを押して初期化する

完了したら、Disk Utilityを閉じて、Install macOS Venturaを選択し、Continueを押す。。


Continueを押す



Agreeを押したあとAgreeを押す。


先程初期化したディスクを選んで、Continueを押す。


インストールが終わるまで待つ。

インストールが終わると、自動的に再起動される。

再起動されたら、手動で「macOS Installer」を選ぶ。この操作を自動的に再起動されたあと「macOS Installer」がメニューから消えるまで繰り返す。

macOS Installerが消えたら、おそらくさっき初期化したときに決めたディスク名が出ているはずなので、これもさっきと同じように macOS が起動するまで選び続ける。

おそらく二回ほど選ぶと、ついにmacOSが起動した!!

7. macOS の初期設定

初期設定の作業


Japan を選択


Customize Settingsを選択


Japanese を選択


U.S. を削除


Japanese を追加し English(United States)を削除


Not Now


Continue


Not Now


Set Up Later


Agree → Agree


Full name, Account name, Password を決める


位置情報サービスを有効にするか選ぶ


クラッシュレポートなどを Apple に送信するか選ぶ


Screen Time を有効にするかどうか


ダーク/ライトテーマを選ぶ

初期設定を終わらせると、ようやく macOS のデスクトップが出てくる。

設定を終わらせた直後は、次のようなウィンドウが出てくる。Continueを押す。

Shift(左) の右にあるキー (=多くの場合 Z キー) を押したあとに、Shift(右)の左にあるキー (=多くの場合 アンダーバーキー) を押す。反応しない場合スラッシュキーを押す。


その後、JISを選ぶ

8. その他各種設定

日本語化

System Settings (Dock から開く) → General → Language & Region
Preferred Languages から English を削除する。

そのあと、macOS を再起動する。

OpenCore をハードディスクに移植する

macOS の中のターミナルを開き、コマンドを実行する。

diskutil list

このように出てくるので、

OpenCoreのEFIと、VirtIOディスクのEFIを特定する。

OpenCoreのディスクは、

  • サイズが150MB程度
  • 2つしかない
    という特徴がある。(つまり、この場合私の OpenCore EFI はdisk1s1)

VirtIOディスクは、

  • サイズが64GB以上
  • internalなディスク
  • Apple_APFSというパーティションがある
    という特徴がある。(つまり、この場合私の VirtIO EFI はdisk0s1)

これを、ddコマンドでコピーする。

sudo dd if=/dev/disk○s1 of=/dev/disk○s1
# 自分の場合
sudo dd if=/dev/disk1s1 of=/dev/disk0s1

できたら、一旦 macOS をシャットダウン(システム終了)し、ide0ide2をデタッチする。

そして、VM の「オプション」タブからブート順を変更する。

virtio0をアクティブにする

起動して、「main (自分で決めた名前)」のみになっていれば成功。

OpenCore メニューの自動選択

今のままだと、起動するたびに手動で Enter/Return キーを押してディスクを選択しないといけないので、数秒後に自動で選択されるよう変更する。

.plist ファイルを開くために、 ProperTree をダウンロードする。

https://github.com/corpnewt/ProperTree

右上の <> Code からZIPファイルをダウンロードし、展開する。


ProperTree.commandをダブルクリック

この時点では失敗するが、

設定から強制的に実行してやる。


このようになるので、yを入力してEnter/Return


このような画面が出てくる

ターミナルを開いて、

diskutil list

で、APPLE_APFSが存在しているディスクの、EFI ディスクを見つける。

筆者の場合、disk0s1

これを、マウントする。

sudo diskutil mount /dev/disk○s1
# 自分の場合: sudo diskutil mount /dev/disk0s1


正常にマウントできるとこうなる


Finder に、EFIが存在することが確認できる

マウントできたら、ProperTree でEFI/OC/config.plistを開く。


開けたら、Misc/Boot/Timeoutを探す。

このTimeoutの値が、OpenCore が起動してから自動的にメニューが選択されるまでの時間である。0だと無効になっている。

5あたりに変更する。

編集したら、⌘+C(Windowsキー+C)で保存し、ProperTreeを閉じる。

そして、EFI をアンマウントする。

sudo diskutil unmount /dev/disk○s1
脚注
  1. 出典: https://web.archive.org/web/20200603015401/http://www.osxbook.com/book/bonus/chapter7/tpmdrmmyth/ ↩︎

Discussion