Proxmox VEにmacOS(BigSur)のインストールとmacVMの初期設定

24 min read読了の目安(約21900字

概要

せっかく仮想環境を用意したら色んなOS使いたいよねと思って、macOSをproxmox VE(以下pve)環境に乗せるまでの手順と、日本環境に合わせたmacの初期設定までを書いた。
意外と日本語で書かれている構築手順のブログが見当たらなかったのでそのまとめ。
あと日本語環境に合わせるまでがちょっと苦労したので、そのあたりも書いてある。

今回インストールするmacOSはBigSurだけど、Catalinaとか前のバージョンでも同じ手順でいける。

環境

Proxmox VE : 6.3
インストールするmacOS : BigSur
ブートローダー : OpenCore

前提

1. macOSのisoの用意方法

macOSのisoを用意する方法は2つある。
・手元のmacOSでisoを作成する。
・手元のUbuntuでisoを作成する。

今回はUbuntuでisoを作成した。macOSでisoを作成するのとUbuntuで作成するのは難易度はあまり変わらないと思う。
今さら思ったけど、日本語版macOSでisoを作成すればmacOSのインストーラーの中身日本語だったのかな...

2. OSK認証キーの出力

pveでmacOSを動かすためにはmacOSでOSK認証キーというのを出力する必要がある(やったことはないけど、vSphereやHackintoshはOSK認証キーはなくても良さそう)。
このOSK認証キーはmac純正ハード以外で動かす時に、そもそも純正mac持ってるよね?的な意味合いと解釈した(違うかも)。
じゃあ手元にmacOSがない人はどうすればいいかというと、思いつくのが3つくらいある。
・macやHackintoshを持ってる友達に協力してもらう
・AWSのEC2でmacOSが対応したから一瞬EC2を構築する
・別の仮想環境でmacOSを作成する

ただ、OSK認証キーは特徴があるのでmacなしでずるしようと思えばできる。それを自分から勧めるのは違うなと思うので、ずるしたい人は英語ブログとか探そう。

OSK認証キーの取得

macで操作。

参考
https://web.archive.org/web/20200603015401/http://www.osxbook.com/book/bonus/chapter7/tpmdrmmyth/
最初のボックスの部分をコピペする。

//smc_read.cの空ファイルの作成
# touch smc_read.c

//smc_read.cの編集
# vi smc_read.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);
}

//保存
:wq

//gccをmacにインストール(インストールしている場合はスキップ、インストールは数分待つ)
# xcode-select --install

インストールを選択

利用規約に同意する

インストール完了すればOK

//smc_read.cをコンパイル
smc_read.cがあるディレクトリで作業すること
# gcc -o smc_read smc_read.c -framework IOKit

//smc_readを実行してOSK認証キーを表示させる
# ./smc_read

ここで出てきた結果を控えておく

macOSのisoの作成

ubuntuで操作。

//必要なパッケージのインストール
# apt install g++ git qemu-utils libxml2-dev libssl-dev zlib1g-dev cmake libbz2-dev libfuse-dev fuse autoconf unzip

//OSX-KVM toolのダウンロード
# git clone --depth 1 https://github.com/kholia/OSX-KVM.git
Cloning into 'OSX-KVM'...
remote: Enumerating objects: 144, done.
remote: Counting objects: 100% (144/144), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 144 (delta 29), reused 143 (delta 29), pack-reused 0
Receiving objects: 100% (144/144), 71.18 MiB | 20.52 MiB/s, done.
Resolving deltas: 100% (29/29), done.

//OSX-KVMディレクトリに移動
# cd OSX-KVM/

//macOSインストーラーの取得
番号選択後、色々ダウンロードされるのでコマンド入力できるようになるまで結構待つ。
# ./fetch-macOS-v2.py
1. High Sierra (10.13)
2. Mojave (10.14)
3. Catalina (10.15) - RECOMMENDED
4. Latest (Big Sur - 11)

Choose a product to download (1-4): 4 (Big Surがほしいので4を選択)
Downloading 694-24485...
Saving http://oscdn.apple.com/content/downloads/19/05/001-28530/f5eukmvtgjyblrf2af2clohxt4mba7g2pn/RecoveryImage/BaseSystem.dmg to BaseSystem.dmg...
Note: The total download size is 633.79 MB
Download complete!
Saving http://oscdn.apple.com/content/downloads/19/05/001-28530/f5eukmvtgjyblrf2af2clohxt4mba7g2pn/RecoveryImage/BaseSystem.chunklist to BaseSystem.chunklist...
Note: The total download size is 2596 bytes
Download complete!

//BaseSystem.dmgファイルが存在していることを確認(ダウンロードされたやつ)
# ls | grep BaseSystem.
BaseSystem.chunklist
BaseSystem.dmg

//BaseSystem.dmgをiso形式に変換
(BaseSystem.isoでもよかったが、名前がわかりやすいようにmac_BigSur11.isoにした)
# qemu-img convert BaseSystem.dmg -O raw mac_BigSur11.iso

作成したisoをpveにアップロード。
自分はGUIでアップロード。
データセンター > pve01 > local(pve01) > ISO Images
アップロードから、作成したisoを選択しアップロードする。

OpenCoreのダウンロード

ブートローダーとしてOpenCoreをダウンロードする。
これはwindowsでもlinuxでもどのマシンで実施しても良い(gzを解凍できればいい)。
https://github.com/thenickdude/KVM-Opencore/releases にアクセス。
最新のOpenCoreのgzファイルをダウンロード。

ダウンロードしたファイルを7zipなどで解凍し、中のisoをpveにアップロード
データセンター > pve01 > local(pve01) > ISO Images
アップロードから、作成したisoを選択しアップロードする。

macVMの作成

1. VMの作成

VMの作成を選択。

・全般タブ
名前 : 好きな名前

・OSタブ
isoイメージ : OpenCore-v12.iso (BigSur11のisoは選ばないこと。BigSur選んでもいいけど後のconfファイルの変更はいい感じに読み替えてください。)
種類 : Other

・システムタブ
グラフィックカード : VMWare互換
BIOS : OVMF(UEFI)
ストレージ : 自分の使いたいところ
Machine : q35

・ハードディスクタブ
バス/デバイス : SATA or VirtlO Block (というかどれでもいいような気がするけど、今回はSATAにした)
ディスクサイズ : 64GiB以上を入力(64以下はだめらしい)
キャッシュ : Write back (unsafe)
Discard : 有効

・CPUタブ
ソケット : 1
コア : 好きな値
種別 : Penryn

・メモリータブ
メモリー : 好きな値
Ballooning Device : 無効

・ネットワーク
ブリッジ : 使いたいnic
モデル : VMware vmxnet3

・確認タブ
確認画面で問題なければ完了を選択。
この後設定変更をするので、作成後に起動は有効にしないこと。

対象マシンのオプションのUse tablet for pointerが有効になっていることを確認

対象マシンのハードウェアからCD/DVDドライブの追加を行う。

バス/デバイス : IDE
CD/DVDイメージファイル(iso)を使用する : 有効
ストレージ : 使いたいところ
isoイメージ : mac_BigSr11.iso

ここまででGUIでの準備は終了。
対象VMのVM番号を確認しておくこと。

2. VMのconfファイルの設定変更

pveにSSHする。

//作成したmacVMの設定ファイルの編集
# nano /etc/pve/qemu-server/VMID.conf

//先頭に以下を追加(構文)
args: -device isa-applesmc,osk="THE-OSK-YOU-EXTRACTED-GOES-HERE" -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 “CPU別説明”

"THE-OSK-YOU-EXTRACTED-GOES-HERE"にOSK認証キーを入力する。
この際、""は必要。

"CPU別説明"はintelとAMDで異なる。今回pveがintelのCPUなので、今回はintelの説明を入力する。
この際、""は不必要。
・intelの場合
-cpu host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc
・AMDの場合
-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

まとめると、自分が入力したのは以下の1行になる。
args: -device isa-applesmc,osk="THE-OSK-YOU-EXTRACTED-GOES-HERE" -smbios type=2 -device usb-kbd,bus=ehci.0,port=2 -cpu host,kvm=on,vendor=GenuineIntel,+kvm_pv_unhalt,+kvm_pv_eoi,+hypervisor,+invtsc


//CDROMの設定変更
ide0とide2の行から、media=cdromを削除し、cache=unsafeを追加。これによりハードディスクとして認識する。
OpenCoreの方にサイズを追加

- ide0: local:iso/mac_BigSur11.iso,media=cdrom,size=2096060K
- ide2: local:iso/OpenCore-v12.iso,media=cdrom
+ ide0: local:iso/mac_BigSur11.iso,cache=unsafe,size=2096060K
+ ide2: local:iso/OpenCore-v12.iso,cache=unsafe,size=150M

//bootの設定を変更する
ここは諸説あり、デフォルトでboot行やbootdisk行が存在しているしていないがあるっぽい。
おそらくどの環境であってもデフォルト状態のままで良いと思われる。
VM起動したときに動かないようであれば、以下の行を追加したり変更する。
今回自分の環境ではboot行はあるが、bootdisk行は存在しなかった。のでこの変更はしなかった。

+ bootdisk: ide2

//保存
ctrl + X

OSのインストール

VM起動する。
macOS Base Systemを選択(ブートローダーのこの画面だけはマウスは使えないのでキーボードで選択する)。

Disk Utilityを選択。

Externalのディスクを選択し、Eraseを選択。

Name : 適当な値
Format : APFS

Disk Utilityを閉じて、Reinstall macOS Big Surを選択。

Continueを選択。

利用規約に同意する。

フォーマットしたディスクを選択。

結構待つ。インストールが終わるとVMが自動で再起動される。

再起動後はmacOS Installerを選択。インストールが始まるので結構待つ。

インストールしたディスクを選択して起動。

ここで起動されないトラブルが発生。
オチはVMのconfファイルの追加した行に謎のスペースが入っていたことが原因。なので謎スペースを削除したら普通に起動できた。
これに気付いたのは、pve上でqm start "VMID"でmacVMを起動したときに、警告が出たから気付いた。警告はGUIのタスクには出てこないんだなと思った。

ただ、起動ループという症状も存在しているらしくそのコマンドを入力した。
基本的にはこのコマンドなしでも動くとは思うんだけど、もし動かない場合はこのコマンドをpveで入力すると解決するかもしれない。

//起動ループ対策コマンド
# echo 1 > /sys/module/kvm/parameters/ignore_msrs

//永続的に実行するコマンド
# echo "options kvm ignore_msrs=Y" >> /etc/modprobe.d/kvm.conf && update-initramfs -k all -u
update-initramfs: Generating /boot/initrd.img-5.4.106-1-pve
Running hook script 'zz-pve-efiboot'..
Re-executing '/etc/kernel/postinst.d/zz-pve-efiboot' in new private mount namespace..
Copying and configuring kernels on /dev/disk/by-uuid/A6F3-7E83
	Copying kernel and creating boot-entry for 5.4.106-1-pve
	Copying kernel and creating boot-entry for 5.4.73-1-pve
Copying and configuring kernels on /dev/disk/by-uuid/A6F4-7158
	Copying kernel and creating boot-entry for 5.4.106-1-pve
	Copying kernel and creating boot-entry for 5.4.73-1-pve
update-initramfs: Generating /boot/initrd.img-5.4.73-1-pve
Running hook script 'zz-pve-efiboot'..
Re-executing '/etc/kernel/postinst.d/zz-pve-efiboot' in new private mount namespace..
Copying and configuring kernels on /dev/disk/by-uuid/A6F3-7E83
	Copying kernel and creating boot-entry for 5.4.106-1-pve
	Copying kernel and creating boot-entry for 5.4.73-1-pve
Copying and configuring kernels on /dev/disk/by-uuid/A6F4-7158
	Copying kernel and creating boot-entry for 5.4.106-1-pve
	Copying kernel and creating boot-entry for 5.4.73-1-pve

地域 : Japan

Customize Settingsを選択し、すべての項目をJapaneseにする。
Japaneseが存在していなかったら、+ボタンから探して追加する。


何も選ばず進む。

macやwindowsにバックアップデータがあればこのマシンに情報を転送できるということ。
今回は情報はないし、あってもクリーンインストールにしたいので、Not Nowを選択。

Apple IDでのサインインは後今やっても後でやってもいい。
今回はSet Up Laterを選択。

ライセンス規約に同意する。

ローカルユーザー作成
Full name : 使いたい名前
Account name : 使いたい名前
Password : 使いたいパスワード

追加設定はしないのでContinueを選択(Customize Settingsを選択すると設定できる)。
位置情報サービスと統計データの送信っぽい。

統計情報の送信。必要なら有効にする。

スクリーンタイムは必要なら設定する。
今回はSet Up Laterでスキップする。

必要ならSiriを有効にする(音声送れないから有効にする必要はないと思うけど)。

好みのカラーテーマを選択する。

デスクトップが表示されればインストール完了。
インストール完了した時点でqemuエージェントがインストールされているようで、pveのGUI上でIPアドレスの確認ができる。
(qemuエージェントが入っているかどうかの確認方法がわからなかった。)

OSの初期設定

1. 画面共有設定

システム環境設定 > 共有
画面共有を有効にする。これでvncで接続ができるようになる。必要があれば他の項目も有効にする。

2. ホスト名設定

システム環境設定 > 共有
コンピュータ名を変更する。

3. ブートローダーをハードディスクに追加

今はOpenCore.isoがないとmacを起動することができない。OpenCoreをハードディスクに追加してOpenCore.isoをVMのデバイスから削除する。これによりOpenCore.isoを必要とせずmacOSをハードディスクから自動起動させることが可能。

やり方は2通りある。
・ターミナルを起動しコマンドで実行する。
・EFIをマウントできるソフト(Clover Configurator)をmacにインストールしてGUIで操作する。

今回はコマンドで実施した。

//ディスク状態の確認
% diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *2.1 GB     disk0
   1:                  Apple_HFS ⁨macOS Base System⁩       2.0 GB     disk0s1

/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *157.3 MB   disk1
   1:                        EFI ⁨EFI⁩                     157.2 MB   disk1s1

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *68.7 GB    disk2
   1:                        EFI ⁨EFI⁩                     209.7 MB   disk2s1
   2:                 Apple_APFS ⁨Container disk3⁩         68.5 GB    disk2s2

/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +68.5 GB    disk3
                                 Physical Store disk2s2
   1:                APFS Volume ⁨main - Data⁩             3.3 GB     disk3s1
   2:                APFS Volume ⁨Preboot⁩                 284.5 MB   disk3s2
   3:                APFS Volume ⁨Recovery⁩                622.1 MB   disk3s3
   4:                APFS Volume ⁨VM⁩                      1.1 MB     disk3s4
   5:                APFS Volume ⁨main⁩                    15.3 GB    disk3s5
   6:              APFS Snapshot ⁨com.apple.os.update-...⁩ 15.3 GB    disk3s5s1

disk1s1がOpenCoreのデータになる。
これをメインハードディスクである、Apple_APFSが存在しているdisk2s1にコピーする。

//disk1s1のデータをdisk2s1にコピーする
構文は、sudo dd if=”送信元” of=/”宛先”

% sudo dd if=/dev/disk1s1 of=/dev/disk2s1
307120+0 records in
307120+0 records out
157245440 bytes transferred in 15.457359 secs (10172853 bytes/sec)

OSシャットダウンし、VMの設定変更。
ide0とide2をデタッチする。

デタッチ後

macVMを起動する。
ブートローダーが起動して、mainを選択しデスクトップが表示されればOK。

4. ブートローダーでのmacの自動起動

今の状態だと、VM起動したときに自動でmacOSが入っているディスクで起動してくれないため、毎回pveにアクセスしてコンソールを開く必要がある。
それが面倒なのでブートローダーの設定変更をしてmacが自動で起動するようにする。

ProperTreeをmacにダウンロードする。
テキストエディタより、ProperTreeのようなplistエディタを使う方が安全。

https://github.com/corpnewt/ProperTree
Download ZIPからダウンロードする。

ProperTree.commandを起動する。

セキュリティで開けないので許可する。

システム環境設定 > セキュリティとプライバシー > 一般タブ

許可する。

EFIがマウントされていないため何も表示されていない。
そのためEFIマウントをする。

//パーティション確認
% diskutil list
/dev/disk0 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *68.7 GB    disk0
   1:                        EFI ⁨EFI⁩                     209.7 MB   disk0s1
   2:                 Apple_APFS ⁨Container disk1⁩         68.5 GB    disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +68.5 GB    disk1
                                 Physical Store disk0s2
   1:                APFS Volume ⁨main - Data⁩             3.6 GB     disk1s1
   2:                APFS Volume ⁨Preboot⁩                 284.5 MB   disk1s2
   3:                APFS Volume ⁨Recovery⁩                622.1 MB   disk1s3
   4:                APFS Volume ⁨VM⁩                      1.1 MB     disk1s4
   5:                APFS Volume ⁨main⁩                    15.3 GB    disk1s5
   6:              APFS Snapshot ⁨com.apple.os.update-...⁩ 15.3 GB    disk1s5s1

//EFIのマウント
% sudo diskutil mount /dev/disk0s1
Password:
Volume EFI on /dev/disk0s1 mounted

FileからOpenを選択。

EFI > OC > config.plistを開く。

真ん中より下あたりのMisc > Boot > Timeoutの値を好きな値に変更する。
0は自動起動しないので、5にして5秒で起動するようにする。

設定を保存する。

//EFIをアンマウントする
% sudo diskutil unmount /dev/disk0s1
Password:
Volume EFI on disk0s1 unmounted

OS再起動して自動でmacが立ち上がることを確認。

参考
https://manjaro.site/how-to-install-macos-catalina-on-proxmox-using-opencore-boot-loader/
https://gaddet.com/propertree/

5. キーボードの日本語入力設定

色々手を尽くしたけど、OS標準の設定で日本語入力にすることができなかった。
JISキーボードにさせることはできたけど、入力モードはひらがな表示なのにずっと英字が入力される。
再起動後、入力ソースを見ると、US配列に戻ってる(表示上の問題かもしれない)。

ので、諦めてgoogle日本語入力をインストールした。

ダウンロードフォルダにある、Google.JapaneseInput.dmgを起動。

GoogleJapaneseInput.pkgを起動。

デフォルトでインストール。

インストール後、google日本語入力を有効にするにチェック。

キーボードの入力ソースをgoogle日本語入力のひらがなと英数のみにする。

これでメニューバーを選択すればキーの切り替えは可能。
ショートカットでは以下のように入力すれば切り替えられる(リモート元の物理キーボード入力)。
ちなみにmacのcommandキーはwindowsのaltキーに割り当てられている(vnc接続の場合、コンソールは知らん)
・日本語入力する時 : ctrl + shift + J
・英数入力する時 : ctrl + : (コロン)

もしくは以下を有効にして、ctrl + スペースで切り替えできるようにする。
システム環境設定 > キーボード > ショートカットタブ
前の入力ソースを選択 : 有効

6. 時刻設定

GMT-7が時刻になっているので、時間帯をTokyoに変更する。
システム環境設定 > 日付と時刻
時間帯をTokyoに変更する。

7. マウスホイールの逆向き設定

マウスホイールが上にスクロールすると下にスクロールして、下にスクロールすると上にスクロールするようになっている。これをwindowsと同じ上は上、下は下にする。これは好みの設定になると思う。

システム環境設定 > マウス
スクロールの方向 : 無効

参考

https://manjaro.site/install-macos-big-sur-11-on-proxmox-6-3/
https://manjaro.site/how-to-install-macos-catalina-on-proxmox-using-opencore-boot-loader/
https://www.nicksherlock.com/2020/04/installing-macos-catalina-on-proxmox-with-opencore/
https://www.youtube.com/watch?v=86XqF5dqjYc

所感

macOSでやりたいことがないため、どうしたものかなという感じ。
音声をmacからリモート元のクライアントPCから流すことができないため、CPUとメモリリソースを割り当ててメインPCにすることができないし。
macの音声をリモート元で再生するために、splashtop personalをインストールして接続してみたりしたが音声が流れなかった。1回だけ音声が流れたが、macの再起動をした後からは音声が流れなくなった(なんかmacの仕様が変わってsplashtop側が対応していないという可能性もある)。

さすがに2vCPU, 4GBメモリは瞬間的に動作が重いなと思った。