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