はじめに
お恥ずかしい話ですが、どうしてもレガシーな開発環境(CentOS 6)が一部残っていて、Intel MacからApple Silicon(M4)に移行する大きな障害になっていました。
この環境だけ別のマシンにするとか、Dockerに移行するとか考えましたが、どうしても内容と工数が見合わないので力技でいくことに。
アーキテクチャの全然違うx86_64のVMをApple Siliconで動かせるとは思っていなかったのですが、ダメ元でトライしたところいけてしまいました。正直やらない方が良いのですが、どうしてもお困りの方もいらっしゃると信じて、バッドノウハウを共有します。
今回はCentOS 6を対象としていますが、x86_64のLinux VMであれば同じような方法が使えるのではないかと思います。
検討した選択肢
1. Parallels Desktop
最初に試したのはParallels Desktopの試供版です。最近x86エミュレート機能(中身はRosetta)がついたので期待していました。
しかし、以下の制限がありました: - UEFI起動のみサポート - BIOSはサポートしない
この制限のせいで、私の環境では動作しませんでした。
参考: Parallels KB - x86エミュレーション機能について
2. UTM(QEMU)
結論から言うと、UTMを使用してQEMUベースでx86_64のエミュレーションを行うことで成功しました。
UTMでの設定手順
1. VMDKファイルの変換
まず、VirtualBoxのディスクイメージをQEMUで使える形式に変換します:
VBoxManage clonehd source.vdi destination.vmdk --format VMDK
2. UTMでのVM作成
UTMで新規VMを作成し、以下の設定を行います:
システム設定
- アーキテクチャ: x86_64
- システム: Standard PC (Q35+ICH9,2009) (alias of pc-q35-9.1) (q35)
- CPU: デフォルト
- メモリ: 1GB(必要に応じて調整)
- UEFI起動: 無効(重要!)
ストレージ設定
- 変換したVMDKファイルを接続(複数ある場合はすべて接続)
ネットワーク設定
3. ゲストOS側の設定
ネットワークの調整
CentOS 6の場合、udevの設定を削除する必要があります:
rm -f /etc/udev/rules.d/70-persistent-net.rules
その後、再起動してネットワークを認識させます。
ファイル共有の設定
もともとVagrantを使用していて、Mac側のIDEで書いたコードをそのままVM側に反映させて動作確認する開発フローを維持したかったため、ファイル共有は必須要件でした。
9pファイルシステムについて
最初は9pファイルシステムを使おうとしましたが、CentOS 6では対応できませんでした(CentOS 7以降なら可能とのこと)。
NFSによる解決策
9pが使えないため、NFSでファイル共有を実現しました。
Mac側の設定
- NFSエクスポートの設定:
sudo vim /etc/exports
以下の内容を追加(パスとユーザーIDは環境に合わせて変更):
/Users/username/Projects/myproject -alldirs -mapall=501:20 -network 192.168.64.0 -mask 255.255.255.0
- NFSサービスの起動:
sudo nfsd enable sudo nfsd start sudo nfsd update sudo nfsd status showmount -e localhost
VM側の設定
- 必要なパッケージのインストール:
yum install nfs-utils rpcbind
- サービスの起動:
service rpcbind start service nfs start
- NFSマウント:
mount -t nfs -o vers=3,nolock,noatime,nodiratime,rsize=32768,wsize=32768 192.168.64.1:/Users/username/Projects/myproject /vagrant
自動マウントが必要な場合は、/etc/fstabに追記します。
ネットワーク設定の補足
UTMの共有ネットワークは以下のような構成になります
Rosetta 2の終了予定とQEMUへの影響
Rosetta 2のサポート終了について
2025年6月のWWDCで、AppleはRosetta 2のサポートを段階的に終了することを発表しました。macOS 27(2027年リリース予定)が完全なRosetta 2サポートを提供する最後のバージョンとなり、macOS 28以降では大幅に機能が制限される予定です。
QEMUは影響を受けない
幸い、今回紹介したQEMU/UTMを使ったx86_64エミュレーションは、Rosetta 2とは独立して動作しているため、この変更の影響を受けないと考えられます。
QEMUは独自のx86エミュレーション機能を持っており、Rosetta 2を使用せずにx86命令をエミュレートしています。ただし、その代償として、Rosetta 2と比較してパフォーマンスは大幅に劣ります(実測値で約4-5倍遅いらしい)。
つまり、Rosetta 2のサポートが終了しても、QEMUを使ったx86_64 VMの実行は引き続き可能と思われます。せっかく頑張って移行したのに1年か2年後にはこの手法も潰されるとか心折れるわ。
まとめ
x86_64のVMをApple Siliconで動かすのは、正直パフォーマンス的にもあまりお勧めできません。しかし、どうしても移行期間中に必要な場合や、レガシー環境を一時的に動かす必要がある場合には、この方法で対応可能です。
ポイントのまとめ
- Parallels Desktop: UEFIのみサポートのため、古いBIOSベースのVMは動かない
- UTM (QEMU): x86_64エミュレーションで動作可能
- ファイル共有: CentOS 6では9pが使えないため、NFSで代替
- ネットワーク: udevの設定削除が必要
可能であれば、長期的にはDockerへの移行や、Apple Silicon対応のLinuxディストリビューションへの移行を検討することをお勧めします。