間違えて rm -rf した場合のデータの復元方法について

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

(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^)/

extundeleteによる削除済みファイルの復元方法

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメント

  1. kstk より:

    初めまして。
    開発環境化にあるディレクトリ、ファイルを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

    1. kstk より:

      連続のコメント失礼いたします。
      インストールについてもなんとかできました。
      「RECOVERED_FILES 」のディレクトリ作成まで進めることができましたが、運悪く(?)復元することができませんでした。

      今回extundeleteについて勉強になりました。
      (それ以前にバックアップの大切さを痛感しました)
      ありがとうございます。
      荒らしてしまい申し訳ありませんでした。

      1. STM より:

        返信が遅くなりまして申し訳ありません。
        extundeleteを使っても復旧できない場合もあるので、バックアップは重要ですね。
        もしくは、間違えてコマンドが実行できないように、何らかの防止策を施しておくのがいいかもしれないですね。
        (rm -iをaliasにしておくとか?)
        また何かありましたらコメントください。

コメントを残す

*

CAPTCHA