たけまるの日記

たけまるの日記です。web関係の技術ネタが多いですが、好きなことを適当に書いています。

VirtualBoxのLinux(x86_64)をApple Silicon QEMUで動かす方法

はじめに

お恥ずかしい話ですが、どうしてもレガシーな開発環境(CentOS 6)が一部残っていて、Intel MacからApple Silicon(M4)に移行する大きな障害になっていました。

この環境だけ別のマシンにするとか、Dockerに移行するとか考えましたが、どうしても内容と工数が見合わないので力技でいくことに。

アーキテクチャの全然違うx86_64のVMApple 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ファイルを接続(複数ある場合はすべて接続)

ネットワーク設定

  • NIC: virtio-net-pci を選択
  • 共有ネットワーク

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側の設定

  1. NFSエクスポートの設定:
sudo vim /etc/exports

以下の内容を追加(パスとユーザーIDは環境に合わせて変更):

/Users/username/Projects/myproject -alldirs -mapall=501:20 -network 192.168.64.0 -mask 255.255.255.0
  1. NFSサービスの起動:
sudo nfsd enable
sudo nfsd start
sudo nfsd update
sudo nfsd status
showmount -e localhost

VM側の設定

  1. 必要なパッケージのインストール:
yum install nfs-utils rpcbind
  1. サービスの起動:
service rpcbind start
service nfs start
  1. 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で、AppleRosetta 2のサポートを段階的に終了することを発表しました。macOS 27(2027年リリース予定)が完全なRosetta 2サポートを提供する最後のバージョンとなり、macOS 28以降では大幅に機能が制限される予定です。

QEMUは影響を受けない

幸い、今回紹介したQEMU/UTMを使ったx86_64エミュレーションは、Rosetta 2とは独立して動作しているため、この変更の影響を受けないと考えられます。

QEMUは独自のx86エミュレーション機能を持っており、Rosetta 2を使用せずにx86命令をエミュレートしています。ただし、その代償として、Rosetta 2と比較してパフォーマンスは大幅に劣ります(実測値で約4-5倍遅いらしい)。

参考: Why can't QEMU get even close to Rosetta 2's performance when translating x86 to M1? - Stack Overflow

つまり、Rosetta 2のサポートが終了しても、QEMUを使ったx86_64 VMの実行は引き続き可能と思われます。せっかく頑張って移行したのに1年か2年後にはこの手法も潰されるとか心折れるわ。

まとめ

x86_64のVMApple Siliconで動かすのは、正直パフォーマンス的にもあまりお勧めできません。しかし、どうしても移行期間中に必要な場合や、レガシー環境を一時的に動かす必要がある場合には、この方法で対応可能です。

ポイントのまとめ

  1. Parallels Desktop: UEFIのみサポートのため、古いBIOSベースのVMは動かない
  2. UTM (QEMU): x86_64エミュレーションで動作可能
  3. ファイル共有: CentOS 6では9pが使えないため、NFSで代替
  4. ネットワーク: udevの設定削除が必要

可能であれば、長期的にはDockerへの移行や、Apple Silicon対応のLinuxディストリビューションへの移行を検討することをお勧めします。

参考リンク