🐡

UBI ファイルおよび UBIFS ファイルの確認、展開

2022/08/07に公開

UBI ファイルおよび UBIFS ファイルの確認、展開

MTD(=Memory Technology Devices) Subsystem 上に、UBI の layer があり、UBI の layer の上に UBI Filesystem のレイヤーがある。

Can UBIFS mount loop-back devices? の FAQ にあるように、loopback デバイスはブロックデバイスなので、UBI device 上に構築された UBIFS はマウントすることはできない。

通常ループバックマウントできない UBI/UBIFS ファイルではあるが、
ubi_reader というツールを使うことで UBI/UBIFS のファイルの中身を確認、展開することができる。

参考

ubi_reader のインストール方法 (Ubuntu 22.04 で確認)

sudo apt-get install -y liblzo2-dev
sudo apt-get install -y python3-pip
sudo pip3 install python-lzo ubi_reader

ubi_reader の使い方

基本的に https://github.com/jrspruitt/ubi_reader に記載の通りだが、
展開するコマンドを実行する際には -o オプションを指定して展開先を指定する必要がある。

UBIイメージを展開する場合

UBI ファイルは複数の UBI Filesystem を含むことができる。
このため UBI Image を展開すると、UBIFS を取得することができる。

UBIイメージを展開すると、UBIFSファイルが出力される。

ubireader_extract_images  -o OUT/ custom-test-image-rootfs.ubi

UBI/UBIFSをファイル展開する場合

UBIFSファイルを展開すると、内部のファイルが展開される。

ubireader_extract_files  -o OUT/ custom-test-image-rootfs.ubifs

UBIファイルを指定しても、内部のファイルを一括で展開することもできる。

ubireader_extract_files  -o OUT/ custom-test-image-rootfs.ubi

UBIイメージの中身のファイルリストを取得する場合

ディレクトリの中身を確認するときは ls コマンドを使うように UBIファイルあるいはUBIFSファイルの中身も ls コマンドのように確認することができる。

例えば ubi ファイルのトップディレクトリをリストアップしたい場合 -P / を指定して実行する。

$ ubireader_list_files -P / custom-test-image-rootfs.ubi
 40755  2 0 0       0 Jul 18 01:41 bin
 40755  2 0 0       0 Jul 18 00:24 dev
 40755  8 0 0       0 Jul 18 01:41 etc
 40755  3 0 0       0 Jul 18 00:51 lib
 40755  2 0 0       0 Jul 18 00:24 mnt
 40755  2 0 0       0 Jul 18 00:24 run
 41777  2 0 0       0 Jul 18 00:24 tmp
 40555  2 0 0       0 Jul 18 00:24 sys
 40755  8 0 0       0 Jul 18 01:41 var
 40755  9 0 0       0 Jul 18 01:36 usr
 40755  2 0 0       0 Jul 18 01:41 boot
 40755  3 0 0       0 Jul 18 01:41 home
 40555  2 0 0       0 Jul 18 00:24 proc
 40755  2 0 0       0 Jul 18 01:41 sbin
 40755  2 0 0       0 Jul 18 00:24 media

ubi ファイルの /bin ディレクトリをリストアップしたい場合 -P /bin を指定して実行する。

$ ubireader_list_files -P /bin custom-test-image-rootfs.ubi
20777  1 0 0       0 Jul 18 01:41 dd -> /bin/dd.coreutils
120777  1 0 0       0 Jul 18 01:41 cp -> /bin/cp.coreutils
120777  1 0 0       0 Jul 18 01:41 df -> /usr/bin/df.coreutils
120777  1 0 0       0 Jul 18 01:41 ln -> /bin/ln.coreutils
                 ... 中略 ...
120777  1 0 0       0 Jul 18 01:41 base64 -> /usr/bin/base64.coreutils
100755  1 0 0  190660 Jul 18 01:12 ls.coreutils
100755  1 0 0   50920 Jul 18 01:12 cat.coreutils
100755  1 0 0  108396 Jul 18 01:12 stat.coreutils
100755  1 0 0  141312 Jul 18 01:12 cp.coreutils
100755  1 0 0   50880 Jul 18 01:12 mknod.coreutils
120777  1 0 0       0 Jul 18 01:41 printenv -> /usr/bin/printenv.coreutils
100755  1 0 0   42676 Jul 18 01:12 hostname.coreutils
100755  1 0 0   50940 Jul 18 01:12 mkdir.coreutils
100755  1 0 0 1395772 Jul 18 01:07 bash.bash
100755  1 0 0   34436 Jul 18 01:12 true.coreutils
100755  1 0 0   91884 Jul 18 01:12 stty.coreutils
100755  1 0 0   42672 Jul 18 01:12 uname.coreutils

UBIイメージの中身の取り出しを行う場合

UBIファイルまたはUBIFSファイルから指定したパスのファイルを取り出すことができる。

以下のように -C でコピー元パスを指定して -D でコピー先ディレクトリを指定する。

ubireader_list_files -C  /bin/ls.coreutils -D . custom-test-image-rootfs.ubi

これによりコピー先ディレクトリで使用したディレクトリに対して UBIファイルあるいはUBIFSファイルからファイルを取り出す (ファイルとしてコピーすることができる)

Discussion