Macで動くmacOS 13(Ventura)以降とApple Siliconチップ(執筆時点だとM1やM2)の組み合わせを使うと、「Rosetta for Linux」を使えるようになります。ここでいうRosettaとはApple Siliconチップの上でIntel CPU向けアプリを動かすことが可能なRosetta 2のことを指しており、この機能はそれをVMで使ってしまう技術です。
Macでもフリーで使えるVirtualBoxは活躍してくれていましたが、VirtualBoxはx86をエミュレートするソフトウェアであり、Apple Siliconチップには対応していませんでした(現在はM1/M2で動くVirtualBoxが開発中だったりします)。
とはいえ、安定して動くまではまだかかるため、その代替として候補に上がったのがUTM.app でした。名前から誤解される可能性があるのですが、間違いなく仮想化ソフトウェアです。
UTM.appのMac版は元々はQEMUをエンジンとしてMacの上でmacOS、Windows、LinuxなどのOSを動かすソフトウェアでしたが、Apple Virtualizationフレームワークへの対応を行い、QEMUで動かすよりも高速にゲストOSを動かせるようになりました。
動かしかた
Debian
UTM.appでRosetta for Linuxを使う方法は次にまとめられています。Debian 11以降を使えば、手順通り実行するだけで、aarch64(arm64)の上でamd64なソフトウェアを再ビルドせずに実行できます。
docs.getutm.app docs.getutm.app
Ubuntu
Ubuntuの場合も基本的には上で貼ったリンクと同様ですが、唯一違うのはAptリポジトリーの設定をちょっと変更する必要がある点でしょうか。
Ubuntuのパッケージ配布リポジトリーは「archive.ubuntu.com」と「ports.ubuntu.com」があって、アーキテクチャによって参照されるリポジトリーが異なります。したがって次のように記述しないとうまく動きません。
まず、次のようにリポジトリーを追記します。念のため補足しておくと、これはUbuntu 22.04で試したので、リポジトリーにはコードネームのjammyが書かれています。
#amd64 deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy main restricted deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy universe deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates universe deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy multiverse deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse deb [arch=amd64] http://security.ubuntu.com/ubuntu jammy-security main restricted deb [arch=amd64] http://security.ubuntu.com/ubuntu jammy-security universe deb [arch=amd64] http://security.ubuntu.com/ubuntu jammy-security multiverse
そして追記する上にはaarch64アーキテクチャー用のリポジトリーが記述されていますので、全てのURLに同じように[arch=arm64]を追加してください(aarch64ではないのがポイントです)。一行だけ例としてあげますが、全ての行に追記します。コメントアウトしている行は特に書かないでも良いです。
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy main restricted
追記
ちょっとここらへんがわかりにくいので補足をいれます。このときのテストではApple Siliconチップ搭載のMacでUTM.appを使ってarm64のUbuntu Server 22.04をインストールしました。リポジトリーファイルに最初に書かれているdebとリポジトリーURLのあいだにアーキテクチャーとして前後にスペースを入れて、[arch=arm64]
を記述します。それに追加して[arch=amd64]
を含むリポジトリー設定を書き加えることで、パッケージ名にアーキテクチャーを指定するとそのパッケージをインストールできます。amd64向けのバイナリーはRosetta for Linuxを介して実行されます。
ちなみにarm64の方は元々 Apple Siliconチップ搭載のMacはarm64として認識されるので、アーキテクチャーを指定してもしなくても問題なくパッケージ導入、アップデートができます。
動かしてみましょう
sudo apt install golang:amd64
などでx86_64版のGolangを導入して、適当に書いたGoのコードをgo build
でビルドしたものを試しに動かしてみます。
早速hello world
アプリをaarch64の上で実行してみましょう。問題なく動作します。
ytooyama@ubuntu1:~$ arch aarch64 ytooyama@ubuntu1:~$ file hello hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=2-ekUtbwwmHyfb8Kbq5w/4fdqUaMhilC2C1xYzir3/mdO3rSDz98mV72utd75x/JDsMJKJwWY4SE8e3ymga, not stripped ytooyama@ubuntu1:~$ ./hello Hello, World!
まとめ
アプリによっては思ったように動かない場合もありますが、割とすんなり動いたので拍子抜けしました。 Rosetta for LinuxはDocker Desktopも対応したようなので、今後触ってみたいと思っています。