ホストとターゲットがアーキテクチャ違いの環境で、ダウンロードしたubuntuのtgzなrootfsにパッケージを追加したいという課題。こういう面倒な問題が出るから、開発はクロスじゃなくてネイティブ環境が好きなのだけど。

老害がいまさら何を言っているの? という記事になってしまったな...
ホストはamd64でターゲットはaarch64。PC側で、Ubuntuのbaseイメージをダウンロードしてきて展開する。展開したのはこれ。
http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04.5-base-arm64.tar.gz
chroot環境には、proc, sys, dev, dev/ptsあたりがないと何かと動かないものもあるので、bindマウントしておく。
$ sudo mount --bind /proc rootfs/proc
$ sudo mount --bind /sys rootfs/sys
$ sudo mount --bind /dev rootfs/dev
$ sudo mount --bind /dev/pts rootfs/dev/pts
もちろん、chrootしても、アーキテクチャ違うので、コマンドが動作しない... のかと思ったらなんか動くな... なんでだ?
$ sudo chroot ./rootfs
root@llmbuild:/# ls
bin dev home media opt root sbin srv tmp var
boot etc lib mnt proc run soc sys usr
root@llmbuild:/#
qemu-user-staticをセットアップしておくと、Linuxカーネルのbinfmt_miscが異なるアーキテクチャのバイナリをQEMUで自動的に実行してくれるそうな。
いつのまには、便利な世界になったのね...
確かに、ホスト側にqemu-user-staticはインストールされている。
$ dpkg -l | grep qemu-user-static
ii qemu-user-static 1:6.2+dfsg-2ubuntu6.24 amd64 QEMU user mode emulation binaries (static version)
ホスト側で対応しているアーキテクチャは、/proc/sys/fs/binfmt_misc/で見ることができる。
$ ls /proc/sys/fs/binfmt_misc/
python3.10 qemu-hppa qemu-mipsn32 qemu-s390x qemu-xtensaeb
qemu-aarch64 qemu-m68k qemu-mipsn32el qemu-sh4 register
qemu-alpha qemu-microblaze qemu-ppc qemu-sh4eb status
qemu-arm qemu-mips qemu-ppc64 qemu-sparc
qemu-armeb qemu-mips64 qemu-ppc64le qemu-sparc32plus
qemu-cris qemu-mips64el qemu-riscv32 qemu-sparc64
qemu-hexagon qemu-mipsel qemu-riscv64 qemu-xtensa
これ以外にも、ターゲットに対応したqemu-*-staticを、chroot環境に内に配置して、これを呼び出してchrootするという方法でも、qemuがchroot内のバイナリをホスト側で実行することで動作するそうな。
今回は、aarch64なので、それ用のqemu-aarch64-staticをchroot内にコピーしておいて、chrootのコマンドでそれを経由して起動する。
$ sudo cp /usr/bin/qemu-aarch64-static ./rootfs/usr/bin/
$ sudo chroot ./rootfs /usr/bin/qemu-aarch64-static /bin/bash
ちなみに、この環境にはresolv.confが設定されていないので、ネットワークが使えない。viもsudoも入っていないので、echoで書き込む。
root@llmbuild:/# echo "nameserver 8.8.8.8" > /etc/resolv.conf
root@llmbuild:/# apt-get update
Hit:1 http://ports.ubuntu.com/ubuntu-ports jammy InRelease
Hit:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease
Hit:3 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease
Hit:4 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease
Reading package lists... Done
年寄りには、アーキテクチャ透過的すぎてビビるわ... 昔の苦労はなんだったんだ...
いつ頃サポートされたのか、Debianで調べてみる。
binfmt-supportパッケージがリリースされたのは、2019年2月10日が最初のようだ。これは、たぶんtestingに入った日付だろうから、正式に対応したのは、2019年7月6日にリリースされたDebian 10(buster)からかな。
Ubuntuでは、2018年4月26日リリースの18.04 LTS(Bionic Beaver)には入っていた感じ。
7年も世間から遅れていたかw そんくらい、アーキ違いの作業はしてこなかったとうことか。ずっとクラウドばっかりだったし、pi-genは基本同じアーキでやるものな。
たまには、こういうこともやってみて、技術の変化に追いつくのもだいじねw

100円投げ銭 https://kinneko.booth.pm/items/1963720
オリジナル投稿:
qemu-user-static便利やわ...|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/9361860



