prootとqemu-arm-staticを使ってARM用ディスクイメージをカスタマイズする
ASICのカスタムファーム作りのためにメーカーが配布しているFWを編集することがあります。設定を予め終えた状態のFWを作る等。
普通にマウントして作業しても良いんですが、内部のライブラリをアップデートしたい場合があります。そんな時にproot
とqemu-arm-static
を組み合わせて作業すると便利でした。
環境
- Host:
Linux 4.18.4-arch1-1-ARCH #1 SMP PREEMPT Wed Aug 22 07:33:26 UTC 2018 x86_64 GNU/Linux
- 対象のFW:
Linux Baikal 3.4.39 #2 SMP PREEMPT Mon Nov 21 16:23:11 CST 2016 armv7l armv7l armv7l GNU/Linux
アーキテクチャが違うのでそのままchrootしてもうまくコマンドが使えませんのでダメです。
prootとQEMU(qemu-arm-static)を使う
prootとQEMUを組み合わせて使うことでアーキテクチャが違うOSであってもライブラリのアップデートなどが行なえます。 prootはchrootを実現し、qemu-arm-staticは異なるアーキテクチャをエミュレーションしてくれます。どちらもユーザー空間で動きます。
prootのインストール
PRoot — chroot, mount --bind, and binfmt_misc without privilege/setupに入手法が書いてありますが、ArchLinuxではAURからインストールできるので、yayを使って入れます。
yay -S proot
qemu-arm-staticのインストール
詳しくは QemuUserEmulation - Debian Wiki を参照。
qemu-arm-static
はqemu-user-static
というパッケージに含まれています。
yay -S qemu-user-static
イメージファイルをマウント
まず、fdiskでディスクイメージ上のパーティションの区切り位置を確認します。
$ fdisk -l ./PiZero_GX10_180410_V1.2.img Disk /home/k2/tmp/PiZero_GX10_180410_V1.2.img: 3.7 GiB, 3904897024 bytes, 7626752 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x0007a4f5 Device Boot Start End Sectors Size Id Type /home/k2/tmp/PiZero_GX10_180410_V1.2.img1 40960 172031 131072 64M b W95 FAT32 /home/k2/tmp/PiZero_GX10_180410_V1.2.img2 172032 7544831 7372800 3.5G 83 Linux
次にmountコマンドでそれぞれをマウントします。オプションでSector sizeとSectorの位置とサイズを元にoffsetとsizelimitを指定します。
$ su - # mkdir -p /mnt/pizero_boot # mkdir -p /mnt/pizero # mount -t vfat -o loop,offset=$((40960*512)),sizelimit=$((131072*512)) /home/k2/tmp/PiZero_GX10_180410_V1.2.img /mnt/pizero_boot # mount -t ext4 -o loop,offset=$((172032*512)),sizelimit=$((7372800*512)) /home/k2/tmp/PiZero_GX10_180410_V1.2.img /mnt/pizero
prootでchrootする
以下のようにしてprootコマンドとqemu-arm-staticを組み合わせてchrootします。
# export PROOT_NO_SECCOMP=1 # ホストマシンのカーネルによっては必要 # cp $(which qemu-arm-static) /mnt/pizero/bin/qemu-arm-static # arm64ならqemu-aarch64-static # proot -S /mnt/pizero -b /mnt/pizero_boot:/boot -q qemu-arm-static /bin/bash root # root # export PATH=/bin:/usr/bin # PATHを設定