@ka2n

Technology and beer

prootとqemu-arm-staticを使ってARM用ディスクイメージをカスタマイズする

ASICのカスタムファーム作りのためにメーカーが配布しているFWを編集することがあります。設定を予め終えた状態のFWを作る等。 普通にマウントして作業しても良いんですが、内部のライブラリをアップデートしたい場合があります。そんな時にprootqemu-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-staticqemu-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を設定

あとは自由に設定変更 & パッケージのインストールを行う

参考