2008年6月15日日曜日

間違ってMacOSX10.5(leopard)上で必要なファイルをrmコマンドで消してしまい ました

本当は「消しちゃったけど、こうやったらうまくいったよー」という記事にしたかったのですが、うまくいかなかったのでバッドノウハウ的にしょぼーんな記事にします。

実は今、rubyでrails向けのgemを作っているんですが、この中でrmコマンドを使うところがあったんですよ。

で、一通りコーディングを終えて、さあ動くかなーと走らせた瞬間に、(おそらくバグに起因して)他の自作アプリを含むソースコードディレクトリすべてをきれいに消してくれたんですね。(汗

まぁ、バグとかシュミレーションモード付けなかった自分が悪いんで、しょうがなくファイル復旧を試みてみました。

取り戻したいもの

  • Ruby on Railsのディレクトリ構成およびその中のファイル一式
  • Ruby on Railsではないrubyのスクリプト
  • ただし、ほとんどのものはsubversionで管理してあるので、commit前の最新状態のみ欲しい
  • 最新状態かどうかの判断に人的時間がかかるのであれば、復旧する必要は無い(もう一度作った方が早い)
  • 本当はアプリケーションのリソースとしての画像とか音声などもあったけど、プログラマとしてはあまり重要視してない。(無いならまた作ればいいやー。どうせ適当に作ったデモ用のものだし)

以下は自分が行った作業です。

1.とりあえず、wikipediaでMacOSX10.5のファイルシステムを調べてみました

Mac OS X v10.5

なんかよくわからん。

HFS Plus

流れは忘れたけど、MaxOSX 10.5で採用しているのはこれらしい。

2.google先生に、HFS+のファイル復旧の手段を聞いてみました

まとめると

  • HFS+? 知らないねぇ。
  • rmで消したら復旧は無理じゃね? ファイルシステムによるけど、一般的にwindowsと違って、Unix/Linux系でファイルを消した場合は、ディレクトリツリーやファイル名などの管理情報はその場で消してしまうから戻らないし。
  • ファイルシステムとしての管理情報が無い(壊れた|消した)場合は、ハードディスク全体をスキャンして、ファイルのフォーマットとかシグネチャからファイルの種類を予想して復旧するような方法は取れるけど、確実な方法ではないよね。(たとえばJpegならファイルのヘッダーはこういう構造になっているはずだから、このファイルはJpegだとか、Jpegではないとかが判断できる)
  • Ext2ならmcやdebugfsで復旧できる事もあるよ。→HFS+にはこのコマンドはありませんでした
  • フリーソフトの類ではあまり復旧ソフトは聞かないね。
  • PhotoRecというオープンソースの復旧ソフトはあるよ。
  • 製品版ならDataRescue2というのがMacと相性がいいよ。
  • ゴミ箱使えばいいのに…

みたいな感じでした。

たしかに、クライアントPCとしてのMacなんだから、ゴミ箱使えが正論な気がする。でも、GUIじゃなくCUI上の話だから、そう簡単な話ではないんだけど。

一瞬/bin/rmをエイリアスに変えて、ゴミ箱っぽい動作をするように変更しようかと思いましたが、ここまで低レベルなコマンドを変更すると、他の部分に影響が出そうなのでやめました。

3.PhotoRecを試してみました

まぁ、とりあえず試すのはこれでいいかな。

このソフト、名前が示す通り、元々は画像を復旧させるソフトみたい。(画像などは復旧させやすい)

さくっとインストールして、起動もすぐに出来たけど、スキャンが長い…。

250GBのHDDで8時間ぐらいかかりました。

しかも、復旧できたのはテキストファイル1つだけで、そのファイルは不要なものでした。

るるるー

4.google先生に、一般的なLinux上などでのファイル復旧の手段を聞いてみました

Linuxファイルとファイルシステムのリカバリ あたりの記事に、grepを使ってユニークなキー(特定の関数名とか)を元にディスク全体をスキャンして、引っかかった前後数行をテキストファイルにリダイレクトし、エディタを使って必要な部分だけを残して後は消す、という流れの復旧方法が載っていました。

具体的には、

grep -a -C 300 --line-buffered 'keyword' /dev/disk0 > /Volumes/USBHDD/rescue.txt

とかってやるんですけど、これも250GBのHDDをスキャンするのに3時間ぐらいかかって、しかもキーワードの選定が甘いとたくさん引っかかって、あとでチェックするのが大変+テキスト以外の制御コードが多くて編集も大変てな感じで、しかも欲しいファイルが見つからなかった(欲しくないファイルはテキストとして取り出せたので、方法としては正しいけど、キーワードの選定が甘かった?)ので、やはりしょぼーん。

あ、でも、コマンドラインから起動するものであれば、終了後にメールを送信して知らせてくれるように出来るので、別の事(読書とかWebで調査)ができて作業としては助かるなぁ。

# very-long-command[enter]

echo 'finished' | mail -s 'from your PC' your-mobile-address@example.com[enter]

date[enter]

とかね。コマンドプロンプトが帰ってきてないときに、先行入力しておくと、時間のかかるコマンドが終わった後に実行してくれるので、メールを送信したりとか、dateってやれば終了時刻(起動した時間を覚えておけば、かかった時間)がわかる。

5.DataRescue2を試してみました

DataRescue2ってデモ版(というかシリアル入れれば正規になるもの)がダウンロードできるんですね。

で、さすがに製品らしく、メニューもスキャンオプションも充実していて、今回のようにディスクは正常だけど、間違ってファイルを消した場合用のスキャン方法(空き領域のみスキャンしてくれる)があるので、それで試してみました。

ちなみに、250GBのHDDの内、空き容量は60GB程度。

で、デフォルトのスキャン設定のままだと、テキストモノは復旧してくれないようなので、設定メニューからテキスト系の復旧を有効にしてからスキャンする事2時間くらい。

さすがに商用ソフト、ちゃんとファイルを見つけてきてくれます。

これらからgrepでキーワード検索して、欲しいファイルのリスト(同じファイルでも上書き回数分すべて復旧される)を作り、どれが一番新しいのか開いて確認するのですが、これがなかなか見つからない。全容量で800MB弱あるので、1つ1つ見て回るのは現実的ではないし、一番欲しいファイル(ruby単体のスクリプトファイル)はgrepで引っかからなかったので惜しいところまで来たけど、これもダメ。

ちなみに、erbとかrailsのコントローラーやモデルは復旧できるみたいですが、ディレクトリ構造やファイル名を失っているのと、どれが最新のファイルかが判断付きにくいので、よほど根気よくやらないと、きちんとは直せないような感じでした。

6.あきらめてsubversionから戻したのものを再修正する

結局コレかよ、と。

いつもそうだけど、同じ修正を2度すると、コードとしてはよりきれいに書けるんだけど、テンションは下がるよね。特に、作業にかかるまでのテンションが。(作業にかかってしまうと、リファクタリングみたいな感じてやる気は出るんだけど)

で、教訓。

  • windowsと違って、Macのファイル復旧は難しい
  • プログラマならsubversionなりのソースコード管理システムを全案件で使って、細かく保存しよう
  • MacOSX10.5以降なら、ちょっとメンドクサでもTimeMachineを使おう。(近日中にハードディスクケース買ってくるかな)
  • お金をかけても取り戻したいデータがあるなら、100万円ぐらい握ってサルベージ屋さんにGo!(前の会社で「これは無理だろ」的なものでも、使い物になる程度まで直してくれました。お値段100万超えでしたが)

4 件のコメント:

百聞は一見に如かず さんのコメント...

こんにちは!類語辞典と申します。
トラコミュにトラバしてくださったのが嬉しくてやってまいりました。
マックの復旧は難しいですよね。特にOSXとかは。
私も、漢字Talkの時代はいろいろいじったりしてましたが、今はほとんどいじらなくなってしまいました。
ちゃんと勉強したいなあとは思ってはいるのですが。

また、来させていただきますね!
それでは、応援ぽちっ!

まいむぞう さんのコメント...

実はブログ関連の事情に疎かったので、トラコミュのトラバもこれでいいのかちょっと不安です。
こんなんでいいでしょうかね?

百聞は一見に如かず さんのコメント...

こんにちは、類語辞典です。
私はトラバ、嬉しかったですv

パソコンの復旧とかもトラコミュの説明書きに加えましょうかね?

匿名平社員 ヤマモト さんのコメント...

よけいなところはちょすな!
これにかぎります。

昨日、どっかの人が2003R2でユーザー権限イヂっちゃってさー
4時間ダウンっすよ

あー、イタイイタイ

相変わらずですな・・・