qemu-user-static便利やわ...

 ホストとターゲットがアーキテクチャ違いの環境で、ダウンロードした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