Linuxでうっかりrm -rfしちゃったけど復活出来たよー\(^o^)/

サーバのファイル整理作業をしていたところ…、
間違えてrm -rfしてしまった!
ぎゃーバックアップもねー!


長いこと生きてたらこんな経験の1度や2度はありますよね?
えぇ、ついさっきやらかしちゃいましたwwオワタwww


速攻「rm 復活」とか「rm 取り消し」とかでググッたねw、したらmcってプログラムのUndelete機能使えばよいって情報が出てくるが、どうやらこれext2じゃないと使えないっぽいぞ…、うちext4だ。
混乱。以下ターミナルのヒストリーより実況。

## こーいうときはまずあれだ、現場保存!
## まずは今いるパーティションを確認
# df -hT
Filesystem    Type  サイズ  使用  残り 使用% マウント位置
/dev/sdb2     ext4    193G  6.9G  176G   4% /
/dev/sdb1     ext3    194M   22M  163M  12% /boot
/dev/sdb5     ext4    1.2T  752G  371G  67% /home  ←イマココ
tmpfs        tmpfs    999M     0  999M   0% /dev/shm


## とりあえず読み込み専用にしておこう!
# mount -o remount,ro /dev/sdb5
# touch /home/hoge
touch: cannot touch `/home/hoge': 読み込み専用ファイルシステムです
## うし、ちゃんとリードオンリーになったな


## あと何だ?とりあえず時間メモ!
# date
2011年  1月 23日 日曜日 18:15:22 JST


## ふぅ、さてひとまずこれでいいだろう、あとはext4の復元方法をググりまくるぞー…。
## どうやら extundelete ってのがext3/ext4対応の復活プログラムらしい。
## 藁にもすがる思いでインストール。とりあえず/tmpでいいや。
# cd /tmp
# mkdir a
# cd a
# curl -L http://sourceforge.net/projects/extundelete/files/extundelete/0.2.4/extundelete-0.2.4.tar.bz2/download | tar xj
# ls
extundelete-0.2.4
# cd extundelete-0.2.4
# ./configure --prefix=/tmp/a && make && make install
## ビルド待ち…、うしっなんか出来たっぽい!
## (↑ここでは既に入ってたからすんなりビルドできたけど最低このパッケージが必要>sudo yum install -y gcc-c++ e2fsprogs-devel


## んー何々…?
# /tmp/a/bin/extundelete 
No action specified; implying --superblock.

Usage: /tmp/a/bin/extundelete [options] [--] device-file
Options:
  --version, -[vV]       Print version and exit successfully.
  --help,                Print this help and exit successfully.
  --superblock           Print contents of superblock in addition to the rest.
                         If no action is specified then this option is implied.
  --journal              Show content of journal.
  --after dtime          Only process entries deleted on or after 'dtime'.
  --before dtime         Only process entries deleted before 'dtime'.
Actions:
  --inode ino            Show info on inode 'ino'.
  --block blk            Show info on block 'blk'.
  --restore-inode ino[,ino,...]
                         Restore the file(s) with known inode number 'ino'.
                         The restored files are created in ./RESTORED_FILES
                         with their inode number as extension (ie, file.12345).
  --restore-file 'path'  Will restore file 'path'. 'path' is relative to root
                         of the partition and does not start with a '/' (it
                         must be one of the paths returned by --dump-names).
                         The restored file is created in the current
                         directory as 'RECOVERED_FILES/path'.
  --restore-files 'path' Will restore files which are listed in the file 'path'.
                         Each filename should be in the same format as an option
                         to --restore-file, and there should be one per line.
  --restore-all          Attempts to restore everything.
  -j journal             Reads an external journal from the named file.
  -b blocknumber         Uses the backup superblock at blocknumber when opening
                         the file system.
  -B blocksize           Uses blocksize as the block size when opening the file
                         system.  The number should be the number of bytes.
Error parsing command-line options.


## ふむ、どうやらパーティション&時間指定で復元できるっぽいな?
## dtime って何だろ…、helpだと分からんかったのでサイトのマニュアル読む…
## エポック秒で指定すればいいんだな。
## 取ってて良かった時間メモ、18:15ってことは18:00以降くらいでいいだろ。
# date -d "18:00"
2011年  1月 23日 日曜日 18:00:00 JST
## うむ、じゃエポックは…、と
# date -d "18:00" +%s
1295773200


## うし、じゃこんな感じかな?
# /tmp/a/bin/extundelete --after 1295773200 --restore-all /dev/sdb5
Only show and process deleted entries if they are deleted on or after 1295773200 and before 2147483647.

WARNING: Extended attributes are not restored.
Loading filesystem metadata ... 9607 groups loaded.
Loading journal descriptors ... 28902 descriptors loaded.
Writing output to directory RECOVERED_FILES/
Searching for recoverable inodes in directory / ... 
327 recoverable inodes found.
Looking through the directory structure for deleted files ... 
Restored inode 3373 to file RECOVERED_FILES/share/家中共有/読み聞かせ/こころ441p.WAV
Restored inode 3374 to file RECOVERED_FILES/share/家中共有/読み聞かせ/お侍をだましたキツネ.WAV
Restored inode 3376 to file RECOVERED_FILES/share/家中共有/読み聞かせ/金色の馬.WAV
Restored inode 3377 to file RECOVERED_FILES/share/家中共有/読み聞かせ/梨の実 小山内薫.WAV
Restored inode 3378 to file RECOVERED_FILES/share/家中共有/読み聞かせ/カメとイノシシ.WAV
Restored inode 3379 to file RECOVERED_FILES/share/家中共有/読み聞かせ/こころ474P.WAV
Restored inode 3380 to file RECOVERED_FILES/share/家中共有/読み聞かせ/長者になりそこねた欲張り.WAV
Restored inode 3381 to file RECOVERED_FILES/share/家中共有/読み聞かせ/こころ515P.WAV
Restored inode 3382 to file RECOVERED_FILES/share/家中共有/読み聞かせ/大きな玉のサルと、ネコと、犬と、ニワトリ.WAV
Restored inode 3385 to file RECOVERED_FILES/share/家中共有/読み聞かせ/トカトントン 太宰治.WAV
Restored inode 3384 to file RECOVERED_FILES/share/家中共有/読み聞かせ/トビの鳴き声.WAV
Restored inode 3396 to file RECOVERED_FILES/share/家中共有/読み聞かせ/狢 芥川龍之介.WAV
Restored inode 3399 to file RECOVERED_FILES/share/家中共有/読み聞かせ/車 宮沢賢治.WAV
Restored inode 3400 to file RECOVERED_FILES/share/家中共有/読み聞かせ/カエルの泳ぎ自慢.WAV
Restored inode 3409 to file RECOVERED_FILES/share/家中共有/読み聞かせ/栗拾い.WAV
:

おぉおおおおお!?ls、find、内容チェック…、やったー復活出来てるっぽい!
というわけでコマンド実行したカレントディレクトリに RECOVERED_FILES/ ってディレクトリが出来てその中に、なんとファイル名やディレクトリ構造までそのままに復元できました!


ファイルの内容についてはお気になさらずw数年前から何となく毎日寝る前に1話ずつ、昔話とか青空文庫とかを朗読してiPhoneで録音して貯めてたデータが今回の事故対象。絵も文章もかけないし歌とかも微妙なのであんまし見たことないコンテンツってことで朗読はじめてみたんだが。蓄積で多分数百時間は溜まってたから駄ファイルだとしても消えるとショックだったので復活できて良かった(^-^)


ext4のファイル復活に付いてぐぐってたら、extundeleteの日本語情報無いっぽかったので、またやりそうな自分の為にもメモメモ。
ふぅ、焦ったー(^^;


追記)ブコメで何件か、rm -rf / とかやっちゃった場合は?てあるけど、多分そういう場合は別OS(別PCやKnoppix起動)からmountしてextundeleteすれば良いと思うよ。

追記2)この記事についての沢山のブクマとツイートとリファラ先とか見てたら、こうしてブクマが伸びてるたった1日か2日の間にも既に何人かやらかした人がいてここを見ながら復旧を試みてるようだwそれら内容見てるとやっぱ成功談と失敗談どっちもあるっぽくて参考になる、勝率7〜8割くらい?僕の場合はやらかしてすぐに読み込み専用にしたのが効いたのかほぼ全て取り戻せた、とりあえず運が良い方だったっぽいね。ちなみにファイル名が戻せない奴は files.{inode番号} みたいな名前でディレクトリ直下にズラーッと並ぶ。実は僕も幾つかのファイルはそうなってました。中身見たらちゃんとしたデータだったのでリネームで済んだけど。
しかし実践談の中には1年以上前にやらかしたHDDが失意のまま取ってあって、今回のを試みたら復旧できたって人も居るようで、すげーっ!て思ったよ。