ダンプしたイメージの、ある1つのパーティションにfsckをかける

どうも、ファイルシステム破損と思われるデバイスがある。
このイメージの特定のパーティションfsckをかけたい。


まずは、dump_rom.binとして、ddでフルダンプする。
ダンプしたイメージの構造をfdiskで見る。

$ sudo fdisk -l dump_rom.bin

Disk dump_rom.bin: 3832 MB, 3832545280 bytes
4 heads, 16 sectors/track, 116960 cylinders, total 7485440 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
Disk identifier: 0x45f4a095

      Device Boot      Start         End      Blocks   Id  System
dump_rom.bin1   *          16        1855         920   83  Linux
dump_rom.bin2            1856       18239        8192   83  Linux
dump_rom.bin3           18240       34623        8192   83  Linux
dump_rom.bin4           34624     7462911     3714144    5  Extended
dump_rom.bin5           34640      280447      122904   83  Linux
dump_rom.bin6          280464      485311      102424   83  Linux
dump_rom.bin7          485328      649215       81944   83  Linux
dump_rom.bin8          649232     7462911     3406840   83  Linux

壊れているのはbin8であると思われる。


オフセット計算。

649232x512=332406784

マウントして破損報告のあったファイルを見る。

$ sudo mount -o loop,offset=332406784 dump_rom.bin /media

$ cat /proc/mounts
/dev/loop0 /media ext4 ro,relatime,user_xattr,acl,barrier=1,data=ordered 0 0

$ sudo cat /media/data/data/jp.test.app/cache/682944627
cat: /media/data/data/jp.test.app/cache/682944627: Input/output error

ファイルが壊れているのを確認できた。


マウントしたままではfsckはかけられない。
しかし、fsckするには、デバイスが生で見えないといけないのだが、これはパーティションイメージである。
しょうがないのでbin8を一回losetupでloopにつなげ、fsckをかける。

$ sudo losetup --offset 332406784 /dev/loop0
$ sudo fsck.ext4 -y /dev/loop0 > fsck.log

大量のログが出た。
インデックスの大半が死んでいたので、fsとしては復旧しても元にはもどらないことがわかった。


loopにつないだのを解除しておく。

$ sudo losetup -a
/dev/loop0: [0802]:27528856 (/home/kinneko/dump_rom.bin), offset 332406784
$ sudo losetup -d /dev/loop0

合掌。
eMMCなので、bin8のパートだけROM上書きしたら直るよ。