Zaurus破損ファイルの復旧

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

12 Responses to “Zaurus破損ファイルの復旧”

  1. サム Says:

    復旧出来て何よりです。
    私の場合はteraさまのように復旧する知識がないのでおそらく泣き寝入り(笑)
    こうゆうときに普段のバックアップのありがたみがわかるんですよね。
    かくゆう私もしばらくザウルスのほうをバックアップしていなかったので今週末あたりやっておこうと思います。

  2. ちゃび Says:

    >teraさま
    復旧、ご苦労様です。復旧できるなんてさすがですね。

    >サムさま
    私もバックアップしたほうがいいような気がしてきましたが、バックアップの仕方が・・・
    スペシャルカーネルを入れるときに行ったことがあるような・・・
    ちょっと調べてみます。

  3. tera Says:

    > サムさま
    コメントありがとうございます。
    私も破損直後に即バックアップを取ったことは言うまでもなく。
    普段は何ともないので、バックアップの重要性をついつい忘れてしまうんですよね。
    しかし、毎日更新するようなファイルだと、やはり1週間前のバックアップより最後の状態が欲しいところ。
    サムさまもいざというときにはお試しください。

    > ちゃびさま
    コメントありがとうございます。
    ちなみに私はコマンド一発でssh+rsyncの増分バックアップを取るようにしています。
    やはりバックアップは手間がかからないことが第一ですよ。
    他にもいろいろあったと思うので、まぁ探してみて下さい。

  4. ミキロウ Says:

    バックアップお疲れ様です。
    データ復旧は難しいよね。

    とりあえず自分だったらあきらめます。(笑)

    一応パソコンにSSHで操作してもらったPCにコミュニティサイト
    制作しました。

    以下のメールアドレスから受け取れるよう配慮願います。
    csu@utase-ns.ddo.jp

    よろしくね。

  5. tera Says:

    > ミキロウさま
    おぉ、コメントありがとうございます!
    毎日忙しい中CSUもとうとう完成したようで、おめでとうございます。

    クラッシュしたPCのデータ復旧ならある程度までは簡単だし、もしかしたら商売になるかも?
    まぁ復旧を専門にしている所は専用の機材とか使ってて太刀打ちは難しいかもしれませんが、クラッシュしたPCの再セットアップについてくるオプションとしてなら十分アピールポイントになるかも。

    > 以下のメールアドレスから受け取れるよう配慮願います。
    はて、メールは特に拒否とかはしてませんが、もし届かないということであればサーバ側でフィルタされているのかと。
    これまで通りのアドレスからであれば問題ないと思うので、宜しくお願いします。
    あとCSUのアカウントplz…。

  6. まる Says:

    teraさん、ブログにコメント頂きありがとうございます。

    今回はzaurusそのものが起動できなくなってしまったのでメーカー頼みです。
    # スケジュールのメモが復旧できれば本当にありがたいのですが。。。。

    zaurusのバックアップイメージのお陰でそれでも大分復旧が楽でした。

    teraさんのこの記事は参考になりました。ありがとうございます。
    zaurusのメモリ管理の一端を垣間見る事が出来ました。

    定期的にスクリプトを走らせて書き出せれば良いのでしょうがSL-C860の発売開始からの時期等を考えるとフラッシュメモリに負荷をかけずにどうしたら日々のバックアップが取れるのか、悩んでしまいます。
    # ちょっと考えすぎですが。
    # しかし、今回の様な事があると気になってしまいます。

    所で、nandフラッシュメモリの劣化を事前に知るような事は出来るのでしょうか。
    事前に劣化度合いが分かるようなロジックがあればありがたいと思うのですがこのような事って難しいんでしょうね。。。。

  7. tera Says:

    > まるさま
    早速コメントありがとうございます。
    Zaurusの障害は他人事では無かったので、ついついお邪魔してしまいました。

    うーむ、NANDバックアップも取れないとなると流石に難しいですね…。
    わざわざおいで頂いたのにお役に立てず、大変申し訳ないです。

    やはり日々のバックアップは大事ですよね。
    フラッシュメモリに負荷がかかるのは書き込み時だけだと思いますので、通常のバックアップで大丈夫だと思います。
    もしくは重要なデータをCF/SDに移動し、内蔵フラッシュからはシンボリックリンクを張ってやるのも一つの手ではないかと。
    まぁCF/SDのデータも壊れるときは壊れるので、今度はこちらのバックアップが必要になってしまいますが、CF/SDなら代わりがきくので負荷の心配は不要なのが利点です。

    劣化の度合いの調べ方はちょっと分かりません。
    本来劣化したブロックは使わないようハードウェアかファイルシステムが扱ってくれるはずなのですが、Zaurusでは少し怪しい所です。

    こんなところでしょうか。
    また、暇々にでもおいで頂ければ幸いです。

  8. まる Says:

    teraさん、

    コメントありがとうございます。

    そうなんです。そもそもフラッシュメモリにアクセスする手段がなかったのです。

    自分もフラッシュメモリの研究に携わっていた事もあり、teraさんの説明を読んで少しその時の事などを思い出しました。

    バックアップ出来る独立したファイルならSDに逃がすのは問題ないと思いますがアプリケーションのデータ、例えばメモ帳、カレンダーのデータのバックアップなどは定期的にzdbatで抜かないといかんかな、と感じております。
    # もちろん標準のバックアップであればまるまるバックアップしてもらえるので問題ないわけですが。

    ありがとうございます。

    また、お邪魔します。

  9. tera Says:

    > まるさま
    コメントありがとうございます。

    > 自分もフラッシュメモリの研究に携わっていた事もあり、teraさんの説明を読んで少しその時の事などを思い出しました。
    うぇえ!?
    偉そうにいろいろ書いてしまいましたが、まさかお釈迦様だったとは。
    いろいろ失礼しました!

    そうですね、特にカレンダーのデータはZaurusが壊れたら二度と読み出せなくなってしまいますからね。
    まぁ開発環境を揃えてPCで無理やり読み出す手も無いこともないですが…。

    ありがとうございます。
    また、お暇な時にでも来てやって下さい。

  10. まる Says:

    teraさん、

    フラッシュメモリの研究とは言ってもメモリそのものの開発ではなくてPCカードメモリの開発の為の基礎研究をやっていた位で。。。。。
    メモリへの書き込み、読み込みの回路の検証位しかしていませんでしたので。。。。

    ですのでお釈迦様ではありません、残念ながら。

    最近メーカーから回答が届きました。
    やはりデータ復旧は無理だったようです。

    メモリイメージ自体の吸い出しはしたようなのですがファイルへの書き込み自身が出来なかったようでフラッシュだけの問題ではなかったようです。

    残念でしたが、基板交換で16000円位との事でしたので“ぜひ!”と修理をお願いしました。

    データ復旧はできませんでしたが予備機(中身は新品同様)なのでいろいろ試せるかも知れません。

    コメントありがとうございます。

  11. tera Says:

    > まるさま
    コメントありがとうございます。
    返信が遅くなってしまい大変申し訳ないです。

    そうですか…。
    それではやむを得ないところでしたでしょうか。
    やはり内蔵フラッシュが壊れてしまうのは痛恨ですね。
    逆にそれさえ修理してしまえばまだまだ行けますし、もう一台あるのは何をするにも心強いです。
    私の予備機もNANDのリストアに失敗するようになってきましたし、これを機会に基盤交換してもらうことにします。

    わざわざお知らせ下さいましてありがとうございました。
    また暇々にでもおいで頂けましたら幸いです。

  12. Kh Says:

    はじめまして。Khと申します。
    jff2reader(windows)をダウンロードしてjff2イメージファイルから
    ファイルを展開しようとしましたが、ファイル情報しか出力されません。
    何がいけないのでしょうか?
    下記のとおり実行しました。
    >jffs2reader app.jff2 -f init.dat > init.dat

    Jffs2reader.exeとapp.jff2は同じフォルダで、init.datは
    存在しています。
    linux版のjffs2readerでは問題なく展開出来ています。
    ご教示お願いいたします。
    以上

Leave a Reply