特定のiノードへのリンク


14

削除されたファイルがありますが、プログラムによって開かれたままです。lsofを使用してiノード番号を見つけました。そのiノードに戻るハードリンクを作成するにはどうすればよいですか?

回答:


31

リンクを作成することはできませんが、元に戻すことはできます。実験してみましょう:

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

myfile.txtは削除されましたが、iノードはtailコマンドによって保持されます。ファイルを元に戻すには、まずiノードを保持しているプロセスのPIDを見つけます。

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

PIDは409です。/dir/proc/409/fd/にchdirし、内容をリストします。

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

/ proc / [PID] / fd /ディレクトリには、プロセスが使用するすべてのファイルのファイル記述子へのシンボリックリンクが含まれています。この場合、シンボリックリンク「3」は削除されたファイルを指します。そのため、ファイルを復元するには、内容を新しいファイルにコピーします。

$ cat 3 >/home/mydir/saved_file.txt

私はこれを遠い過去のファイルシステムデバッガ(例: "debugfs dump")で行いましたが、概念は同じです。
ジェラルドコームズ

1
いい答え、+ 1
asdmin 2009

これは私にはうまくいきません。「3」が「実際の」ファイル記述子ではなく、ぶら下がっているシンボリックリンクであることを考えると、常に空のファイルを作成するだけです。
ロブチャンター

4
@ロブ:いいえ、そうではありません。ファイル記述子が使用中の場合、シンボリックリンクは有効なデータを指します。そうでない場合、そもそもシンボリックリンクは存在しません。ファイルが閉じられると、シンボリックリンクは消えます。「3」の後にスペースがありましたよね?そうでない場合は、出力電流のシェルでのファイルディスクリプタ3の内容ではなく、かつますのは、ということだろう空にします。
sunny256 09

1
これに関する唯一の問題は、ファイルがまだ書き込まれている場合、作成したコピーが切り捨てられることです。書き込みが停止してからファイルが閉じられて完全なファイルが取得されるまでにはおそらく時間がありません。
KayEss


-8

Linuxでこれを実行する移植可能な方法はありません。最善の方法は、おそらくファイルシステム上のすべてのアクティビティを停止し、ファイルを開いたままにするプログラムを強制終了し、ファイルシステムをアンマウントし、ファイルシステムデバッガーを使用してディレクトリに再接続することです。NFSを介してファイルシステムをエクスポートしている場合、NFSの少なくとも一部のバージョンでは、NFS全体でファイルデータを読み取ることができます。


2
プログラムを
強制
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.