削除されたファイルの再リンク

削除されたファイルの再リンク

時々、削除すべきでないファイルを削除してしまい、長時間実行中のプロセスでファイルがまだ開かれたままになり、cat によるデータの回復/proc/<pid>/fd/Nだけでは十分ではありません。ln に魔法のオプションを実行して削除を「元に戻す」ことができ、inode 番号 (lsof で回復) に再リンクできれば、十分素晴らしいでしょう。

少なくともざっと Google 検索した限りでは、これを行う Linux ツールは見つかりません。

serverfault さん、何ですか?

編集 1: ファイルの cat がそれほど優れていない理由/proc/<pid>/fd/Nは、ファイルを開いたままのプロセスがまだそのファイルに書き込み中だからです。削除すると、ファイルシステムの名前空間から inode への参照が削除されます。私が欲しいのは、参照を再作成する方法です。

編集2: 「debugfs ln」は動作しますが、ファイルシステムの生のデータを盗むため、リスクが高すぎます。回復されたファイルも非常に矛盾しています。リンク数はゼロで、リンクを追加できません。/proc/<pid>/fd/Nファイルシステムを破損させずにデータにアクセスできるため、この方法の方が悪いです。

答え1

ln に魔法のオプションを実行して削除を「元に戻す」ことができ、inode 番号 (lsof を通じて回復) に再リンクできれば、非常にすばらしいでしょう。

lnこの素晴らしさはバージョン8.0(GNU/coreutils) に、最初に参照解除する-L|--logicalオプションを付けます。つまり、単純なln/proc/<pid>/fd/<handle>

ln -L /proc/<pid>/fd/<handle> /path/to/deleted/file

削除されたファイルを再リンクするには十分です。

答え2

すでに多くのことを理解しているようなので、これ以上詳しく説明はしません。inodeを見つけるにはいくつかの方法があり、通常はcatを実行してSTDOUTをリダイレクトします。debugfsこのコマンドを以下内で実行します:

ln <$INODE> FILENAME

ファイルシステムのバックアップがあることを確認してください。後で fsck を実行する必要があるかもしれません。私はこれを、書き込み中の inode で正常にテストしました。また、逆参照された inode への新しいハード リンクの作成にも成功しました。

ファイルが ext3 で開かれていないファイルとリンク解除されると、データは失われます。これがどの程度一貫して当てはまるかはわかりませんが、私のデータ復旧経験のほとんどは ext2 に関するものです。ext3 FAQ より:

Q: ext3 パーティションから削除したファイルを復元 (削除を取り消す) するにはどうすればいいですか? 実は、それはできません! 開発者の 1 人である Andreas Dilger 氏は、この件について次のように述べています。

ext3 がクラッシュ後に安全にリンク解除を再開できるようにするため、実際には inode 内のブロック ポインターをゼロにしますが、ext2 はブロック ビットマップ内でこれらのブロックを未使用としてマークし、inode を「削除済み」としてマークし、ブロック ポインターをそのまま残します。

唯一の望みは、削除されたファイルの一部を「grep」で検索し、最善の結果を期待することです。

この質問には関連情報も含まれています:

Linux サーバー上の大きなファイルを空のファイルで上書きしました。既存のファイルを復元できますか?

答え3

ご覧のとおり、debugfs の方法は実際には機能せず、最良の場合でも、再起動後にファイルが自動的に削除され (ジャーナルのため)、最悪の場合、ファイルシステムが破壊されて「再起動による死のサイクル」が発生する可能性があります。正しい解決策 (TM) は、VFS レベルで削除の取り消しを実行することです (これには、実質的にすべての現在の Linux ファイルシステムで機能するという追加の利点もあります)。システム コールの方法 (flink) は、LKML に登場するたびに却下されているため、最善の方法はモジュール + ioctl を使用することです。

このアプローチを実装し、比較的小さくてクリーンなコードを持つプロジェクトはfdlink(https://github.com/pkt/fdlink.gitubuntu maverick のカーネルでテストされたバージョンの場合)。これを使用すると、モジュールを挿入した後 (sudo insmod flink_dev.ko)、"./flinkapp /proc//fd/X /my/link/path" を実行するだけで、必要な処理が正確に実行されます。

vfs-undelete.sourceforge.net の転送バージョンも使用できますが、これも同様に機能します (元の名前に自動的に再リンクすることもできます)。ただし、fdlink のコードはよりシンプルで、同様に機能するため、こちらを推奨します。

答え4

あなたが望んでいることを正確にどうすればよいかはわかりませんが、私なら次のようにします:

  • 別のプロセスからファイルROを開く
  • 元のプロセスが終了するまで待つ
  • 開いているFDからファイルにデータをコピーします

もちろん理想的ではありませんが、可能です。他のオプションは、debugfs (コマンドを使用) を試してみることですlinkが、実稼働マシンではちょっと怖いです。

関連情報