2013-08-12 11 views
8

Linuxで特定のiNodeにリンクするファイルを作成する方法はありますか? このシナリオを取ってください:書き込み中のファイル(ログが多分)があり、特定のファイルが削除されていますしかし dir/procのリンクがまだそれを指しています。この場合はのベアコピーではなくハードリンクが必要ですので、プロセスを終了してシステムを削除する前に、今後の変更や最新の変更を行うことができます。Linuxファイルのリカバリ

iNode番号がある場合は、この目標を達成する方法がありますか?

答えて

4

あなたは私のようなMavericない限り

> lsof | grep testing.txt 
less 4607 juliet 4r REG 254,4 21 
     8880214 /home/juliet/testing.txt (deleted) 

は、これを試みる前に、完全な詳細については、元の記事を必ずお読みください...削除されたファイル(時々)を回収するためにlsofを使用することができます。

> ls -l /proc/4607/fd/4 
lr-x------ 1 juliet juliet 64 Apr 7 03:19 
     /proc/4607/fd/4 -> /home/juliet/testing.txt (deleted) 
> cp /proc/4607/fd/4 testing.txt.bk 

http://www.linuxplanet.com/linuxplanet/tips/6767/1

自信を持って否定して「私にできること」のようにそれは質問に答えることは常に難しい

+1

Gasp。あなたが正しい。私はちょうどそれをテストしたと思って、それは動作しませんでした。 NTL:OPは、特にコピーではなくハードリンクを求めました。 –

3

をお楽しみください。しかし、私が見ている限り、/ sys/nor/procは、シンボリックリンクではないオープンファイル記述子のマッピングを提供していません。私は "しかし、ディレクトリ/ procのリンクはまだそれを指している"と仮定すると、/ proc // fd /エントリがシンボリックリンクのように見えるということですか?元のファイルを元に戻すことはできません。

私はこれを取り返します:ユーザーuser2676075が指摘しているように、コピーは機能します。ちょうどハードリンクはしません...

更新日::あなたはそれについて考えるなら、それはかなり論理的です。

  • /procと/ sysは、ハードディスクとは異なるファイルシステムです。したがって、ハードディスク上の宛先にハードリンクできるディレクトリエントリのようなファイルを提供することはできません。
  • /proc/*/fd /エントリはシンボリックリンクのふりをしていますが、実際は異なっています。そうでなければコピーは機能しません。意味のある情報を'ln -l 'で提供するためのシンボリックリンクのふりをしていると思います。これは、次のような理由から、カーネルやVFS-インタフェースの一部にすることはできません:

    • いくつかのiノードへのハードリンクする(行方不明)機能を(のは、いくつかのシステムコールをしましょう)について

    • それはファイルシステムの完全性に違反します。ファイルシステムは、完全に削除されたファイルのディスクブロックを、永続するファイルと同じ方法で保持することは想定されていません。

    • inodeは、「データストリームが格納されているスロット」を識別するための完全に仮想的な概念である可能性があります。リファレンスがないスロットを参照先のスロットに変換する際に問題が発生することがありますファイルシステム内の名前で。

    私は、このようなシステムコールの可能性に対するケースは防水ではありません。しかし、AFAIRがために用意されていませんVFSインタフェース(の現在の状態を与えられ認めますそのような呼び出し)、それはどんなファイルシステムの実装にも重い負担になります。分散ファイルシステム)を使用して、ファイルをiノードによってディレクトリにリンクする呼び出しを提供します。

あるので、inodeを必要とする一切、システムコールが存在しないので、前と最後の参照を削除した後にfstat呼び出しかしらATMは、実際に トン

+0

ハードリンクがinodeに存在しない理由は、人が必要としないファイルにアクセスできるようにするためです。 700番のディレクトリは、link(2)の引数としてinode番号を使ってそれをバイパスすることができない限り、その下のすべてをプライベートにします。この状況では、リンク(2)が開いているファイルディスクリプタを取っているといいでしょう。たとえアクセスできないファイルでオープンfdで起動した場合や、自分で開くことができなかったファイルでもプロセスができる新しいことが開かれます。また、削除のセマンティクスは次のとおりです。ディスクスペースは最後のリンクまで残存し、最後に開いたfdと最後のmmapは消えます。 –

14

...同じiノード情報を返すために必要とされますextX fsのコンセプトではありませんが、ストーブパイプを作るのは良い習慣ではありませんが、それは責任の連鎖を作ることです(MELが示唆しているように)。NO答えはVFSレベルでファイルのパスと名前他の内部表現ではありません。

PIDが削除されたファイルを持っているプロセスのpidである
tail -c+1 -f --pid=PID /proc/PID/fd/FD > /path/to/the/copy 

:我々はを連続監視し、重複を使用することができ、ほとんどの最後の変更を追跡するという目標を達成するために

しかし依然としてオープンされており、FDはそのファイル記述子番号である。 -f tailを開いてファイルを保持して、さらに修正を表示します。最初のバイトから-c + 1が「tail」に始まり、--pid = PID末尾にpidが終了すると終了するよう通知されます。

+0

inodeはext2/3/4に固有のものではありません。これらは、stat(2)のようなシステムコールがどのように動作するか、そしてハードリンクを見つける方法についてのPOSIX仕様の一部です。しかし、残念ながら、/ proc/PID/fd/FDから実際のファイルへのリンクを作成する方法はないと思われます。読み書き用にオープンするだけです。 link(2)のようなシステムコールがあっただけで、パスではなくオープンファイル記述子をソースとして取った場合。 –

関連する問題