web-dev-qa-db-ja.com

rm filename.txtを呼び出すとどうなりますか?

インスピレーション this post、

rm insert_filenameを呼び出すと、より多くのディスク容量が得られますか?

リンクされたUNIXのstackexchangeの投稿には、「ファイルのリンクが解除されます。データはディスク上に残っていますが、リンクは削除されています。以前はデータを取得できましたが、現在はメタデータがクリアされ、何も回復できません。 「」

ディレクトリを調べて大きなファイルでrmを呼び出すと、後でビデオやより大きなファイルをシステムに保存できるようになりますか?アクセスできるすべてのディスク領域をいっぱいにすると、「rmed」ファイルは上書きされますか? (私はJavaのガベージコレクションのような、コンピュータの電源がオフ/オンになったときやユーザーが離れていたときに古いファイルをときどき一掃するシステムを想定しています。しばらくの間コンピュータ)

システムインフォメーション:

改装されたLenovoThinkPadT420ラップトップでUbuntu16.04LTSを実行しています。

1
Nathan

リンクされた質問はすでに問題のほとんどの側面をカバーしているので、簡単な答えです。

ディレクトリを調べて大きなファイルでrmを呼び出すと、後でビデオやより大きなファイルをシステムに保存できるようになりますか?

はい、rmの後のリンク数がゼロであれば、現在削除されているファイルが元々占めていたスペースを使用して、大きなファイルを含む他のデータをファイルシステムに保存できます(A.Bによるコメントによる)

詳述すると、実行中のプロセスによってrmが参照されているファイルが/proc/$PPID/fd/$fdである場合、$PPID$fdはプロセスIDとファイルハンドルです。それぞれnumberの場合、ファイルrmedのスペースは、プロセスが終了してリンク数がゼロになるまで使用できません。 (指摘してくれてありがとうA.B)

もう1つのケースは、ディスク内の別の場所に削除されたファイルへのハードリンクがある場合です。 rmを使用すると、リンク数が1つ減りますが、余分なスペースは解放されません。

つまり、rmedされたファイルが占めるスペースは、削除後にリンク数がゼロの場合にのみ再利用できます。この情報は、Linksコマンドの出力のstatフィールドで取得できます。 rmが実行される前にそのフィールドに1が表示された場合にのみ、削除されたファイルが占めるスペースが即座に使用可能になります。

アクセスできるすべてのディスク領域をいっぱいにすると、「rmed」ファイルは上書きされますか?

それらが上書きされるタイミングは、ディスク上の場所とファイルシステムの編成方法によって異なりますが、通常、「ファイル」は、すべてのディスク領域が使い果たされるずっと前に上書きされます。

2
Weijun Zhou

「ディスク容量がある」とはどういう意味か

それはあなたの主題の質問の根底にあるので、それは洞察に満ちたメタ質問です。

ファイルを「リンク解除」することの意味を理解するには、ファイルを「リンク」することの意味と「ファイル」とは何かを理解することが役立ちます。信じられないかもしれませんが、「ファイル」は、3人の盲人と象のように、人によって異なるものです。

答えはファイルシステムによって異なります。 Windowsでは、おそらくNTFSを使用しました。 Linuxでは、ext3を使用できます。私の答えはLinux側に限定し、さらに、ほとんどのネイティブファイルが行うファイルの記述に inodes を使用するファイルシステム(ext3など)に限定します。

これらのファイルシステムは、rawディスクスペースをブロックの観点から編成します。ブロック間に散在しているのは、iノードを含むものです。各iノードは、1つのファイルに関する情報(所有権、アクセス許可、および使用しているデータの場所とサイズ)を保持します。

ファイルシステムは、使用されるのを待っているだけのiノードでいっぱいです。昔は、ファイルシステムの作成時にiノードの数が修正されていました。iノードが不足すると、新しいファイルを作成できなかったために「スペースが不足」していました。今日では、それは通常動的に処理されます。

ファイルシステムは、すべてのiノードがどこにあるか、どのiノードが使用されているか、どのブロックが未割り当てのままであるかを追跡します。 「ディスクスペースを確保する」とは、どのiノードにも割り当てられていないブロックを用意することです。

新しいファイルを作成するときは、実際には2つのことを行います。

  1. 未使用のものからiノードを取得します
  2. 名前を付けます

最初のステップを個別に実行することはできません。 iノードを直接操作することはできません。オペレーティングシステムには、それを行う機能がありません。名前でファイルを作成して開きます。 iノードがカーネルにとどまる詳細。

2番目のステップはln(1)で繰り返すことができます。iノードには好きなだけ名前を割り当てることができます。名前をファイルにリンクするため、このステップを「リンク」と呼びます。 rm(1)でリンクを削除することにより、プロセスを逆にします。それにはさらに別の名前があります:unlink(1)。これで、「del」ではなく「rm」と呼ばれる理由がわかりました。ファイルを削除するのではなく、リンクを削除します。

では、ファイルはいつ削除されますか?ファイルを作成することの反対は何ですか?

  • iノードの名前へのリンクを削除します
  • iノードを放棄する

リンクの削除が最初に実行されます。ただし、iノードを未使用のパイルに配置する前に、次の2つの制限を満たす必要があります。

  • 多くのiノードには複数の名前があるため、名前がリンクされなくなるまで使用され続けます。それが意味することですリンクがゼロになったときいくつかのドキュメントで出くわすかもしれません。
  • Iノードが開いている可能性があるため(プログラムがiノードを使用している場合)、OSは、ファイル記述子がiノードを参照しない限り(ファイルが開いているプログラムがない場合)、iノードを未使用のパイルに配置しません。

Iノードに名前がリンクされていない場合、それが放棄されるのは時間の問題です。 iノードはリンクされた名前でしか参照できないため、新しいリンクを作成したり、名前のないファイルを開いたりすることはできません。同じ名前のファイルを開こうとすると、新しいファイルが作成されます。different iノードを割り当て、名前をそれにリンクします。

多くの人は、この動作に最初に遭遇したときに混乱し、実行中のプロセスで使用されている「大きなファイルを削除」してディスク領域を解放できないとイライラします。プログラムが使用していたファイルが突然消えた場合にプログラムがどうなるかを想像しようとすると、より理にかなっています。または、不可解なWindowsエラーが発生したことがある場合は、「ファイルは別のプログラムで開いているため、削除できません」。 iノードでは、別のプログラムで開いている間はファイルが削除されないため、そのメッセージが表示されることはありません。

1
James K. Lowden