(2019年7月11日 更新)
1.はじめに
間違えて rm -rf を実行してしまった。。
きっと誰もが経験されることだと思います。
バックアップがあればいいのですが、バックアップがなければ
しばらく固まってしまいますね。
本記事では、間違えて rm -rf を実行してファイルを削除してしまった場合の復元方法について書きたいと思います。
2.準備
今回はファイルシステムがext3もしくはext4の場合について考えたいと思います。
また検証したOSはCentOS 6.7です。
使用するツールは「extundelete」です。
では、はじめに、ファイルシステムを確認しましょう。
>df -hT => Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 97G 2.5G 89G 3% / tmpfs tmpfs 499M 0 499M 0% /dev/shm /dev/sda1 ext4 239M 58M 168M 26% /boot
確認できたら、読み取り専用にします。
すぐに読み取り専用にしなければならない理由は、rm -rfを実行した後、そのまま放置しているとrmしたデータの場所に新たにデータが次々と書き込まれていきます。
そうなるとファイルの復元が難しくなるので、消えてしまったデータが上書きされないように、とりあえず読み取り専用にします。
mount -o remount,ro /dev/sda3
次に間違えてコマンドを実行した時間をメモしておきましょう
HISTTIMEFORMAT="%F %T " history => 267 2016-03-03 20:31:22 ls 268 2016-03-03 20:32:59 touch /tmp/hoge/hoge.txt 269 2016-03-03 20:48:22 rm -rf /tmp/hoge/hoge.txt 270 2016-03-03 21:02:12 HISTTIMEFORMAT="%F %T " history
上の例だとrm -rfしているのは、「2016-03-03 20:48:22」ということになりますね。
これで準備はOKですね。
3.extundeleteをインストールする
インストールしてみましょう
cd /tmp mkdir extundelete curl -L http://sourceforge.net/projects/extundelete/files/extundelete/0.2.4/extundelete-0.2.4.tar.bz2/ download | tar xj curl -L http://sourceforge.net/projects/extundelete/files/extundelete/0.2.4/extundelete-0.2.4.tar.bz2/download | tar xj cd extundelete-0.2.4 ./configure --prefix=/tmp/a && make && make install
インストールがうまくいかない時は、必要なパッケージがインストールされていないと思うので、
gccとext2fsをインストールしましょう。
sudo yum install -y gcc-c++ e2fsprogs-devel
インストールしたら、とりあえずhelpを確認しましょう。
extundelete --help ← ヘルプを表示
4.使用方法について
基本的には下記のコマンドでファイルを復元させます。
extundelete --restore-file (復元対象のファイル) (復元対象のファイルがあるデバイス)
たとえば、
- 復元対象のファイルが /tmp/hoge/hoge.txt
- 復元対象のファイルがあるデバイスが /dev/sda3
であるならコマンドは下記のようになります。
extundelete --restore-file /tmp/hoge/hoge.txt /dev/sda3
時間を指定して復元する場合
/tmp/bin/extundelete --restore-all --after $(date +%s -d '2016-03-03 20:48:22') /dev/sda3
1時間前までに削除してしまったファイルを全て復元する場合
extundelete --restore-all --after $(date +%s -d '1 hour ago') /dev/sda3
extundeleteコマンドを実行すると、コマンドを実行したディレクトリに 「RECOVERED_FILES 」というディレクトリが作成されます。
その中に復元されたファイルが入っているはずです。
参考
Linuxにて削除(rm)してしまったファイルを復元する【CentOS】
Linuxでうっかりrm -rfしちゃったけど復活出来たよー\(^o^)/
初めまして。
開発環境化にあるディレクトリ、ファイルをrm -rfで削除してしまい、こちらに辿りつきました。
現在、参考にさせていただき、復元作業に当たっております。
ただつまずいており、extundeleteはダウンロードできたのですが、インストールでつまずいております。
(sudo yum install -y gcc-c++ e2fsprogs-develは実行済みです)
解決策があればご教示いただければ幸いです。
-下記コマンドとエラー-
# pwd
/usr/local/src/extundelete-0.2.0
# ./configure –prefix=/tmp/a && make && make install
Configuring extundelete 0.2.0
Writing generated files to disk
make -s all-recursive
Making all in src
extundelete.cc: 関数 ‘int load_super_block(ext2_filsys)’ 内:
extundelete.cc:944:47: エラー: invalid use of incomplete type ‘struct opaque_ext2_group_desc’
group_descriptor_table[n] = fs->group_desc[n];
^
In file included from extundelete.cc:107:0:
/usr/include/ext2fs/ext2fs.h:208:8: エラー: forward declaration of ‘struct opaque_ext2_group_desc’
struct opaque_ext2_group_desc;
^
extundelete.cc:944:29: エラー: no match for ‘operator=’ (operand types are ‘ext2_group_desc’ and ‘opaque_ext2_group_desc’)
group_descriptor_table[n] = fs->group_desc[n];
^
extundelete.cc:944:29: 備考: 候補:
In file included from /usr/include/ext2fs/ext2fs.h:63:0,
from extundelete.cc:107:
/usr/include/ext2fs/ext2_fs.h:149:8: 備考: ext2_group_desc& ext2_group_desc::operator=(const ext2_group_desc&)
struct ext2_group_desc
^
/usr/include/ext2fs/ext2_fs.h:149:8: 備考: 第 1 引数を ‘opaque_ext2_group_desc’ から ‘const ext2_group_desc&’ へ変換する方法が不明です
extundelete.cc: 関数 ‘void parse_inode_block(ext2_inode*, const char*, ext2_ino_t)’ 内:
extundelete.cc:2614:21: エラー: ‘struct ext2_inode::::’ has no member named ‘l_i_reserved2’
inode->osd2.linux2.l_i_reserved2 = le32_to_cpu( (uint32_t *) &inodebuf[item*62] );
^
make[2]: *** [extundelete-extundelete.o] エラー 1
make[1]: *** [all-recursive] エラー 1
make: *** [all] エラー 2
連続のコメント失礼いたします。
インストールについてもなんとかできました。
「RECOVERED_FILES 」のディレクトリ作成まで進めることができましたが、運悪く(?)復元することができませんでした。
今回extundeleteについて勉強になりました。
(それ以前にバックアップの大切さを痛感しました)
ありがとうございます。
荒らしてしまい申し訳ありませんでした。
返信が遅くなりまして申し訳ありません。
extundeleteを使っても復旧できない場合もあるので、バックアップは重要ですね。
もしくは、間違えてコマンドが実行できないように、何らかの防止策を施しておくのがいいかもしれないですね。
(rm -iをaliasにしておくとか?)
また何かありましたらコメントください。