rm削除したファイルをlsofで復元する

はじめに

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コマンドでファイルを消さないようにした記事も書いてみました。興味がありましたら合わせてお読み下さい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA