aimdevel’s blog

勉強したことを書きます

sdカードイメージのパーティションをマウントするツール作った

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特有の仕様にはまってしまい少し苦戦した。ツールの構造自体はシンプルなのだが。。。
はまった部分については別途調べ直そうと思う。