ハードリンクの数が0になると、ディレクトリは削除されますか?


10

ハードリンクの数が0になると、ディレクトリは削除されますか?

のため、ディレクトリには常にハードリンクの数として少なくとも2があり.ます。rm -rディレクトリの場合、ハードリンクの数を1から2に2から0に減らしますか?

ディレクトリのハードリンクの数を1にすることはできますか?

ありがとう。

回答:


9

まずいないすべてのファイルシステムが使用.し、..ハードリンクなど。これはgnu findマニュアルに記載されています。それらのファイルシステムはunix向けに設計されておらず、明快さを追加せずに物事を複雑にするだけなので、残りの回答では無視します。同じ理由で、ルートディレクトリとマウントポイントも無視します。

.およびのため、ディレクトリへのリンクの数は2より少なくなることはありません..。サブディレクトリの数は、リンクの数から2を引いた数に等しくなります。このため、あなたは、リンクやディレクトリのリンクを解除、そうすることはできませんrm -rでしょうstat削除し、使用する前に、ファイルrmdirの代わりにunlinkディレクトリのでは。2つのシステムコールは、カーネルで完全に異なるコードパスを使用します。


ありがとう。ディレクトリにハードリンク..があります。サブディレクトリがある場合のみですよね?それで..、常にディレクトリに存在するとは限りませんよね?
Tim

..各ディレクトリに存在しているサブディレクトリ。これはすべて/1つだけなので、すべてのディレクトリです。
2015年

1
(1)ディレクトリにサブディレクトリがない場合、そのディレクトリには..それ自体へのハードリンクがありません。ディレクトリへのハードリンクは何ですか?パス名を持つファイル、および.?(2)なぜマウントポイントを無視するのですか?
Tim

ディレクトリがサブディレクトリの場合。エントリ..は親を指します。特殊なケースとして、ルートディレクトリリンクはそれ自体を指します。これによりcd ..\..、どこにいても同様のコマンドが期待どおりに機能するようになります。statコマンドでテストできます。
BillThor

1
リンク数が2未満になることはありませんが、それはが原因ではありません..。それ.は、それを指す親ディレクトリ内の名前のためです。唯一の例外は、親を持たないルートです。しかし、それはしている..、それはまた、リンク数= 2持っているので、自分自身を指す
Barmar

11

参照カウント(たとえば、ハードリンクカウント開いているファイルハンドルの数* の合計)が0に達する、従来の設計のUNIXファイルシステム上のファイルはすべて削除されます。ただし、最近のUNIXシステムでは、rmdirシステムコールは空のディレクトリ...1つずつ削除するのではなく、1回の操作で削除します。

ただし、歴史的なUNIXシステムでは、このシステムコールは存在しませんでした。代わりに、rmdir コマンドはsetuidプログラム(ソースコードはここにあります)であり、ディレクトリが空であること(特別なエントリ以外)をチェックし、次に削除...、次にその順序で削除し、さらにディレクトリ自体を削除しました。unlinkrootのみがディレクトリでの使用を許可されたシステムコール(そのため、コマンドがsetuidされた理由)。したがって、これらのシステムでは、.削除された後、ディレクトリが親ディレクトリから削除される前に、ディレクトリのリンク数は一時的に1になります。その後、0になります。

rmちなみに、このコマンドはrootでさえディレクトリを削除できませんでした。そして、その内容を空にした後、ディレクトリを削除rm -rするrmdirコマンドを呼び出します。

これらの歴史的なシステムでは、unlinkルートとして実行されているプログラムからの呼び出しを誤用しrmdirたりmv、またはで競合状態になったり、現在のディレクトリが削除されているプロセスでファイルを作成したりすると(最新のシステムではこれを防止)、ファイルまたはディレクトリがぶら下がる可能性がありますハードリンク数が0を超えているが、ディレクトリツリーには存在しない。この状態はによって検出されましたがdcheckfsckほとんどのファイルシステムで物理的に可能であるため、依然としてチェックインの1つです。


ちなみに、ファイルシステムは、ハードリンクを持つ通常のファイルとしてディレクトリ(.およびを含む..)を実装する必要はありません。これらのファイルシステムでは、ディレクトリのハードリンク数は常に次のように報告されます0(もちろん、親ディレクトリ内のその存在は「参照カウント」1に該当します)。


削除されたディレクトリの動作(たとえば、すでに開いているか、現在のディレクトリとして持っているプロセスで調べた場合)と、ディレクトリの「リンク数」の正確な意味は規定されていません。たとえばMac OS Xでは、実際のハードリンクはありませんが、ハードリンク数は2と報告されます。にもかかわらず、.および..リストには表示されません、ディレクトリを開くことができ、stat名前で呼ばれることも...。Linuxでは、リンク数は0ですが...同様に機能します。

Mac OS X は、サブディレクトリの数だけでなく、ディレクトリ内のすべてのファイルの数をリンク数として報告します。しかし、それは場合でも、2である...なくなっています。


*これには、通常のオープン記述子、メモリマップセクション(バイナリの実行や共有ライブラリなど)、および現在のディレクトリの処理が含まれます。


2
strcpysetuid実行可能ファイルの固定サイズ配列に...これらは良い時でした!
Andrea Corbellini、2015年

@AndreaCorbellini mkdir同じことを逆に行わなければならないという事実に基づいて、実際に公開されたエクスプロイトがあります。
Random832

1
私はそれを見つけたと思います:securityfocus.com/archive/1/365038/2004-05-31/2004-06-06/0 :)
Andrea Corbellini

について尋ねるとrmdir、removin ..は親ディレクトリを削除しませんか?
エドワードトーバルズ

@edwardtorvaldsいいえ、私はそれが指す親ディレクトリではなく、「..」リンク自体の削除について言及していました。
Random832
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.