仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Rosetta for Linuxを触ってみた

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も対応したようなので、今後触ってみたいと思っています。

docs.docker.com