sdカードイメージファイルの特定のパーティションをマウントするツールを作成した。
作ろうと思った背景
ラズパイOSイメージなどのイメージファイル内のパーティションをマウントする方法は以下などがある。
これらでも問題なくマウントできるのだが、毎回losetupでloopデバイスを割り当てて使い終わったらloopデバイスを開放したり、offset位置を調べてmountコマンドを実行するのは億劫だった。
そこで、ツールを作成し何も考えずにイメージファイルのパーティションをマウントできるようにした。
ツール概要
ソースコードは以下。勉強も兼ねてrustで作成した。
https://github.com/aimdevel/part-mount
ビルド方法はgithubにあるREADME.mdに書いてあるので割愛する。
マウント方法
例としてラズパイのOSイメージファイルをマウントする。
OSイメージをダウンロードする。
$ wget https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf-lite.img.xz
xzを解凍する。
$ xz -d 2023-05-03-raspios-bullseye-armhf-lite.img.xz
マウントする。
パーティション1と2をそれぞれ、bootとrootfsという名前のディレクトリにマウントする。マウント操作なのでroot権限が必要。
$ mkdir boot && mkdir rootfs $ sudo ./part-mount -p 1 2023-05-03-raspios-bullseye-armhf-lite.img boot $ sudo ./part-mount -p 2 2023-05-03-raspios-bullseye-armhf-lite.img rootfs
結果を確認する。
マウントしたディレクトリを確認するとOSイメージの中身が見えていることを確認できる。
$ ls boot bcm2708-rpi-b.dtb bcm2710-rpi-3-b-plus.dtb cmdline.txt fixup_x.dat start4.elf bcm2708-rpi-b-plus.dtb bcm2710-rpi-cm3.dtb config.txt issue.txt start4x.elf bcm2708-rpi-b-rev1.dtb bcm2710-rpi-zero-2.dtb COPYING.linux kernel7.img start_cd.elf bcm2708-rpi-cm.dtb bcm2710-rpi-zero-2-w.dtb fixup4cd.dat kernel7l.img start_db.elf bcm2708-rpi-zero.dtb bcm2711-rpi-400.dtb fixup4.dat kernel8.img start.elf bcm2708-rpi-zero-w.dtb bcm2711-rpi-4-b.dtb fixup4db.dat kernel.img start_x.elf bcm2709-rpi-2-b.dtb bcm2711-rpi-cm4.dtb fixup4x.dat LICENCE.broadcom bcm2709-rpi-cm2.dtb bcm2711-rpi-cm4-io.dtb fixup_cd.dat overlays bcm2710-rpi-2-b.dtb bcm2711-rpi-cm4s.dtb fixup.dat start4cd.elf bcm2710-rpi-3-b.dtb bootcode.bin fixup_db.dat start4db.elf $ ls rootfs bin dev home lost+found mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
アンマウントする。
アンマウントは通常の方法でマウントした時と同じでumountコマンドを使用する。
2023/9/9 追記:この方法でアンマウントには成功するが、使用したloopbackデバイスはデタッチされないので、losetupコマンドでデタッチを行う必要がある。ツール自体を近いうちに修正予定。
$ sudo umount boot $ sudo umount rootfs
まとめ
イメージファイル内の特定のパーティションをマウントするツールを作成した。
これでラズパイOSイメージファイルや、yoctoで作成したイメージファイルの中身を簡単に書き換えられるようになった(はず)。
また、勉強も兼ねてrustで作成したが、rust特有の仕様にはまってしまい少し苦戦した。ツールの構造自体はシンプルなのだが。。。
はまった部分については別途調べ直そうと思う。