Public Theta Blog

x86_64のUbuntuでqemu-aarch64-staticする

x86_64のUbuntu(環境はGitHub ActionsのUbuntu 22.04のランナー)で、qemu-aarch64-staticを使ってaarch64のバイナリを実行する際に、少しハマったのでメモ。

単純に、qemu-user-staticをインストールして実行しようとすると、次のようなエラーが出る。

sudo apt-get update
sudo apt-get install qemu-user-static
qemu-aarch64-static bin
/lib/ld-linux-aarch64.so.1: No such file or directory

これはaarch64向けのlibcないために起こるためで、このunix.stackexchange.comにある通りarm64のアークテクチャを追加して、libc6:arm6をインストールすればよい。

ただし、ただ追加してapt-get updateしても404エラーが出る。

sudo dpkg --add-architecture arm64
sudo apt-get update
E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/multiverse/binary-arm64/Packages  404  Not Found [IP: 91.189.91.81 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-updates/multiverse/binary-arm64/Packages  404  Not Found [IP: 91.189.91.81 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/dists/focal-security/main/binary-arm64/Packages  404  Not Found [IP: 91.189.91.83 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal-backports/main/binary-arm64/Packages  404  Not Found [IP: 91.189.91.81 80]
E: Some index files failed to download. They have been ignored, or old ones used instead.

これはそのままlibc6:arm6がリポジトリに見つからないことを指すエラーなので、このaskubuntu.comにある通り、ソースを追加すると解決できる。

つまり例えば、/etc/apt/sources.list.d/arm64.listを作成して、次のように記述する。

deb [arch=arm64] http://ports.ubuntu.com/ focal main restricted
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates main restricted
deb [arch=arm64] http://ports.ubuntu.com/ focal universe
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates universe
deb [arch=arm64] http://ports.ubuntu.com/ focal multiverse
deb [arch=arm64] http://ports.ubuntu.com/ focal-updates multiverse
deb [arch=arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse

これをコマンドで行う場合は例えばこう。

UBUNTU=$(lsb_release -cs)

sudo tee /etc/apt/sources.list.d/arm64.list <<EOF
deb [arch=arm64] http://ports.ubuntu.com/ $UBUNTU main restricted
deb [arch=arm64] http://ports.ubuntu.com/ $UBUNTU-updates main restricted
deb [arch=arm64] http://ports.ubuntu.com/ $UBUNTU universe
deb [arch=arm64] http://ports.ubuntu.com/ $UBUNTU-updates universe
deb [arch=arm64] http://ports.ubuntu.com/ $UBUNTU multiverse
deb [arch=arm64] http://ports.ubuntu.com/ $UBUNTU-updates multiverse
deb [arch=arm64] http://ports.ubuntu.com/ $UBUNTU-backports main restricted universe multiverse
EOF

加えて、デフォルトの/etc/apt/sources.listを現在のアーキテクチャ専用に書き換えておく必要がある。

# 念の為バックアップ
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 例えばamd64
ARCH=$(dpkg --print-architecture)

# 置換
sudo sed -i "s/deb /deb [arch=$ARCH] /g" /etc/apt/sources.list

これで、libc6:arm6をインストールでき、qemu-aarch64-staticによるaarch64バイナリの実行が可能になるはず。

sudo apt-get install libc6:arm6
qemu-aarch64-static bin