Archive for 9 月 5th, 2008

Zaurus破損ファイルの復旧

金曜日, 9 月 5th, 2008

wznotes.txtが壊れました。

今まであらゆるメモを書き溜めてきたwznotes.txtが壊れました。

ちまちまブログの文章を考えて、たまたまZaurusに再起動をかけて、いざ記事にしようとして開いてみたら、後ろから1/4程度が吹き飛んでました。

流石に、血の気が引きました。

そろそろ年季も入ってきて再起動がかかる度にファイルシステムのエラーが蓄積してはいましたが、こうも大きなダメージを受けたのは初めてです。

というわけで、今回は破損したwznotes.txtの復旧手順の紹介です。

まず、前知識です。ZaurusにはNAND型フラッシュが搭載してあり、それを論理的に区分けして/dev/mtdblock[1-3]としてアクセスしています。このmtdblock3が/homeとなるわけですが、ファイルシステムには組み込み向けのjffs2を使っています。このファイルシステムは少々特殊でして、ファイルを書き換える際には「上書き」ではなく「変更部分のみ追加、参照」します。どういうことかというと、

のn3に相当する部分を書き換えると、

こうなります。なお、オフセット2000を参照するノードが2つになってしまいますが、これはバージョンの新しい方が優先されます。つまり、n5が破損してもn3を参照することが出来れば、ある程度ファイルを復旧できる可能性があるということです。

ということで、上記の方針に沿ってファイルの復旧を試みました。jffs2ファイルシステムを直に読み取るのにはmtd-toolsのjffs2readerがありますので、バージョン20061007をベースに以前のノードも参照できるよう変更を加えて利用しました。以下、手順です。

  1. /dev/mtdblock3が書き換えられてしまう前にイメージファイル化する
    $ dd if=/dev/mtdblock3 of=/mnt/cf/mtdblock3.dat
  2. PC上に持ってきて、内容を確認
    $ jffs2reader -d / mtdblock3.dat
    drwxr-xr-x 1  0    500   0 Jan  1  2004 root/
    drwxr-xr-x 1  0    500   0 Jan  1  2004 samba/
    drwxr-xr-x 1  0    500   0 Jan  1  2004 sharp/
    drwx------ 1  500  500   0 Jun 24 11:27 zaurus/
    drwxr-xr-x 1  0    0     0 Jan  1  2004 userdata/
    drwxrwxrwt 1  0    0     0 Jun 24 08:59 tmp/
    drwxr-x--- 1  0    500   0 Jan  8  2004 QtPalmtop/
    drwxr-xr-x 1  0    0     0 Jan  1  2004 system/
    drwxr-sr-x 1  0    0     0 Jun 24 09:07 etc/
  3. 破損したファイルの内容を確認
    $ jffs2reader -f /path/to/wznotes.txt mtdblock3.dat > wznotes.txt
  4. 破損したファイルのノードのバージョンと対応するオフセットを表示
    $ jffs2reader -f /path/to/wznotes.txt -v mtdblock3.dat
      Inode version   Inode offset
                  1              0
                  2              0
                 19              0
                  .              .
                  .              .
                  .              .
               2637              0
               2672           4096
               2673           8192
               2676              0
               2763              0
               2764           4096
               2765           8192
               2766          11690
  5. wznotes.txtの例えば4096-11689バイトの部分が破損したとすると、該当個所の最新版の一つ前のバージョンは2672と2673なので、それを参照
    $ jffs2reader -f /path/to/wznotes.txt -V 2672,2763 mtdblock3.dat > wznotes.txt
  6. 復旧したファイルの内容を確認

これで、運がよければ復旧できるはずです。ちなみに、私は無事元通りにすることができました。本当にやれやれです。jffs2readerの実行ファイルはこちら。

Windows上でご利用の際は、作業フォルダを実行ファイルと同じにしてご利用ください。なにかご質問等ありましたらお気軽にどうぞ。