はじめに
rm
コマンドでうっかり意図しないファイルを削除してしまった、何てことはいくら気をつけていてもよくある事です。私もつい先日、先輩のアカウントを借りて作業をしている時に.ssh/known_hosts
を消去しようとして.ssh/config
をうっかり消してしまいお詫びの電話をしたばかりです。
そこでふと思ったのですが、rm
コマンドで消したファイルを復元する方法はないのでしょうか。
特殊な条件下なら可能?
調べてみたところ特定の条件下であれば復元可能だという事がわかりました。その条件とは消去したファイルを開いているプロセスが存在している事です。そもそもrm
はinodeへのリンクを削除しているだけであってinodeそのものを消しているわけではないのです。inodeへの全てのリンクが失われない限りinodeとデータそのものは失くならないので、ファイルを開いているプロセスが存在していればそこから/proc/【プロセスID】/fd/
を辿り復元する事が出来ます。
適当なファイルを作成する
$ touch test.txt
$ vi test.txt
hoge
moge
hoge
moge
ファイルを開く
$ less test.txt
ジョブを中断する
Ctrl + z
ファイルを削除する
$ rm test.txt
プロセスIDを取得する
$ lsof | grep "test.txt"
less 24455 centos 4r REG 202,1 20 12592058 /home/centos/test.txt (deleted)
cpコマンドで復元する
$ cp /proc/【プロセスID】/fd/4 ./
$ cat 4
hoge
moge
hoge
moge
全ての状況で通用する手段ではないですが、誤ってrm
コマンドでファイルを削除してしまった時にはまずlsof
で該当のファイルを開いているプロセスが存在していないかを確認するようにしましょう。
また前回lsof
コマンドについて軽く触れましたが、他にも便利な使い方がたくさんあるみたいなので更に学習したいと思います。
その他
こちらにそもそもrm
コマンドでファイルを消さないようにした記事も書いてみました。興味がありましたら合わせてお読み下さい。