M1 / M2 Mac で VM を動かすために、UTM を使用しています。
基本的には ARM64 で動作しますが、x86_64 なバイナリを動かしたい場合、
- QEMU で x86_64 エミュレーションをするか
- Apple 仮想化で Rosetta for Linux を使う方法
があります。
QEMU で x86_64 エミュレーションの場合、カーネルなどもエミュレーションされるため、完全に仮想化されるメリットはありますが、起動にも時間がかかってしまいます。
Rosetta for Linux であれば、必要なバイナリエミュレーションされるため、起動などは高速です。
環境情報
この記事は下記のバージョンで確認しています。
将来的なバージョンアップにより挙動が変わる可能性があります。
- MacBook Air M1, 2020
- macOS Sonoma 14.1
- UTM 4.4.4
VM 環境準備
まずは、Rosetta for Linux を動作する環境を用意します。
# cat /etc/redhat-release
CentOS Stream release 9
# arch
aarch64
aarch64 な CentOS Stream 9 であることがわかります。
ここで、あえて x86_64 版 curl を落としてきます。
ここのリンクから、「Linux x86_64」のものを選びます。
# wget https://github.com/stunnel/static-curl/releases/download/8.4.0/curl-static-amd64-8.4.0.tar.xz
# tar -Jxvf curl-static-amd64-8.4.0.tar.xz
# ./curl
-bash: ./curl: cannot execute binary file: Exec format error
アーキテクチャが異なるため、当然動作しません。
CentOS Stream 等 RHEL 系で使う場合の課題
Rosetta for Linux を使うためには、VM 作成時の設定と、VM 内で行う設定があります。
より
# mkdir /media/rosetta
# mount -t virtiofs rosetta /media/rosetta
ここまでは問題ないのですが、次の「/usr/sbin/update-binfmts」のコマンドが存在せず、dnf などでも見つかりません。
CentOS Stream 等 RHEL 系での手順
UTM の GitHub に情報がありました。
このページでは単独で実行する手順が書かれていますが、再起動しても都度実行されるように下記のスクリプトを作成します。
/opt/rosettaforlinux/register.sh
echo ":rosetta:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00:\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/media/rosetta/rosetta:CF" > /proc/sys/fs/binfmt_misc/register
/etc/systemd/system/rosettaforlinux.service
[Unit]
Description=Rosetta for Linux
[Service]
Type=simple
ExecStart=bash /opt/rosettaforlinux/register.sh
[Install]
WantedBy=default.target
作成したサービスを起動時に実行します。
systemctl daemon-reload
systemctl enable rosettaforlinux.service
systemctl reboot
これで再起動しても、x86_64 のバイナリが直接実行されるようになります。
# ./curl --version
curl 8.4.0 (x86_64-pc-linux-gnu) libcurl/8.4.0 OpenSSL/3.1.2 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.4 libssh2/1.11.0 nghttp2/1.57.0 ngtcp2/0.19.1 nghttp3/0.15.0
Release-Date: 2023-10-11
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli HSTS HTTP2 HTTP3 HTTPS-proxy IDN IPv6 Largefile libz NTLM SSL threadsafe TLS-SRP TrackMemory UnixSockets zstd
x86_64 版 curl が実行できたことがわかります。
まとめ
Rosetta for Linux の利用方法について、UTM の公式ドキュメントでは、Debian しか書かれていませんでしたが、「CentOS Stream 9」で使う方法を紹介しました。
RedHat Enterprise Linux 9、Rocky Linux 9、AlmaLinux 9 などはもちろん、Fedora でも同様に動作するのではないかと思います。