ハードリンクとファイルの違いは何ですか?


37

ハードリンクは、 iノードへのポインタとして定義されています。ソフトリンクとしても知られ、シンボリックリンクは、ハードリンクの制限を受けることなく、別のリンクを指している独立したファイルとして定義されます。

ファイルとハードリンクの違いは何ですか?ハードリンクはiノードを指しているので、ファイルとは何ですか?iノードエントリ自体ですか?または、ハードリンクのあるiノードですか?

タッチでファイルを作成するとしましょう。次に、inodeエントリがinodeテーブルに作成されます。そして、ファイルと同じiノード番号を持つハードリンクを作成します。新しいファイルを作成しましたか?または、ファイルはinodeとして定義されていますか?



7
@infixedまったく違います。ファイルとハードリンクの違いを尋ねています。
レベントDivilioglu

そのため、リンクされた質問への回答にも含まれていると思われる元の回答を元に戻しました。それで、それはまだ「まったく違う」のでしょうか?
修正

7
ファイルとハードリンクの違いは、あなたと電話帳の名前のある行の違いと同じです。
ヨルグWミットタグ

回答:


61

非常に短い答えは次のとおりです。

  • ファイルはデータの匿名のblobです
  • ハードリンクはファイルの名前です
  • シンボリックリンクは、コンテンツがパス名である特別なファイルです

Unixのファイルとディレクトリが動作し、正確に(およびファイルやディレクトリ現実の世界のようではないようなフォルダ現実の世界で)。Unixファイルシステムは(概念的に)このように構成されています:

  • ファイルはデータの匿名のblobです。名前はなく、数字(inode)しかありません
  • ディレクトリは、ファイル(より具体的にはiノード)への名前のマッピングを含む特別な種類のファイルです。ディレクトリは単なるファイルであるため、ディレクトリはディレクトリのエントリを持つことができます、それが再帰の実装方法です(Unixファイルシステムが導入されたとき、これはまったく明らかではなく、多くのオペレーティングシステムはディレクトリにディレクトリを含めることを許可していませんでしたその後)
  • これらのディレクトリエントリはハードリンクと呼ばれます
  • シンボリックリンクは、コンテンツがパス名である別の特別な種類のファイルです。このパス名は別のファイルの名前として解釈されます
  • 他の種類の特殊ファイルは次のとおりです。ソケット、FIFO、ブロックデバイス、キャラクターデバイス

このメタファーを念頭に置いて、特にUnixディレクトリが実世界のディレクトリのように機能し、実世界のフォルダのように機能しないことを念頭に置いて、初心者がよく遭遇する「奇妙な」ことの多くを説明します。書き込み権限がありますか?1つは、ファイルを削除するのではなく、ファイルに存在する可能性のある名前の1つを削除することです。そのためには、ファイルではなくディレクトリへの書き込みアクセスのみが必要です。現実の世界のように。

または、なぜぶら下がっているシンボリックリンクを持つことができますか?まあ、シンボリックリンクには単にパス名が含まれています。その名前のファイルが実際に存在しなければならないということは何もありません。

私の質問は、単にファイルとハードリンクの違いは何ですか?

ファイルとハードリンクの違いは、あなたと電話帳の名前のある行との違いと同じです。

ハードリンクはiノードを指しているので、ファイルとは何ですか?iノードエントリ自体?または、ハードリンクのあるiノードですか?

ファイルは、匿名のデータです。それでおしまい。ファイルは、ファイルが、iノードではありません持っているあなたは、あなたが社会保障番号ではありません同じように、inodeを持って SSNを。

ハードリンクは、ファイルの名前です。ファイルには多くの名前を付けることができます。

たとえば、タッチでファイルを作成すると、iノードエントリがiノードテーブルに作成されます。

はい。

そして、ファイルと同じiノード番号を持つハードリンクを作成します。

いいえ。ハードリンクはファイルではないため、iノード番号はありません。ファイルにのみiノード番号があります。

ハードリンクは、名前とiノード番号を関連付けます。

新しいファイルを作成しましたか?

はい。

または、ファイルは単にiノードとして定義されていますか?

いいえ。ファイルにはiノードがありますが、iノードではありません


15
「ディレクトリ」という言葉の背後にある隠phorが何であるかを本当に理解したことはありませんでした。電話帳の例は素晴らしいものです。おそらく、あなたはそれをより早く(あなたが最初に現実の世界に言及したとき)紹介すべきです。同様に、ほとんどの人がコンピュータの外で「ファイル」を扱うことはめったにないので、「紙のファイルのように、電話帳のようなディレクトリ」と言う方が明確になるでしょう。
IMSoP

2
@IMSoP世代間のギャップです。コンピューターが登場する前は、電話帳は一種のディレクトリの1つでした。ケンブリッジ辞書には、「ディレクトリ:名前、住所、またはその他の事実のリストを提供する本[...例] 電話帳で番号を
調べてください

2
@kubanczyk確かに-プレデジタルオフィスで働いていた人にとっては、メタファーは非常に明白に見えるので、それらを説明することはほとんど見下されているように感じます。しかし、私の世代以下の人にとっては、車の後部の保管エリアが「ブート」または「トランク」と呼ばれる理由と同じくらいあいまいなので、実際に綴らなければなりません。
IMSoP

「ハードリンクにはiノード番号がありません」という語句の「持っている」という単語は、「ハードリンクは名前とiノード番号を関連付けている」と言うので、誤解を招く可能性があります。「ハードリンク」ディレクトリエントリのデータ構造には、実際にiノード番号が含まれています。これが、リンクがiノード番号に「関連付けられている」方法です。「持っていない」とは、リンクがディスク上のどこに保存されているかを示すiノードがハードリンクにないことを意味すると思います。
ケルビン

2
ファイル inodeがあると言うのは少し逆です。iノードは、「データの塊」の場所に関する情報を含む構造です。iノードがない場合、ファイルはありません。
バーマー

18

ハードリンクはディレクトリエントリです。異なる名前または異なるディレクトリに存在するファイルには、複数のディレクトリエントリが含まれる場合があります。ディレクトリエントリは、同じファイルの他のディレクトリエントリとの関係で「ハードリンク」と呼ばれます。

iノードには、名前と内容(内容の場所、許可、タイムスタンプなど)以外のファイルのメタデータが含まれます。ファイルごとに1つのiノードがあります。(すべてのファイルシステムがメタデータを「inode」と呼べるディスク上の明確に識別可能なスペースに置くわけではありませんが、これは一般的なアーキテクチャです。)ディレクトリエントリは名前をiノードにリンクします。複数のディレクトリエントリが同じiノードにリンクする可能性があるため、「リンク」という用語が使用されます。このようなリンクは「ハードリンク」と呼ばれ、「ソフトリンク」または「シンボリックリンク」とは反対で、「この名前ではこのiノードを使用します」ではなく、「この名前では他の名前を検索します」と言います。

ファイルは部屋、ディレクトリエントリはドアと考えてください。「ファイルを開く/foo/bar」とは、「廊下/fooに行き、部屋に行く」という意味barです。「部屋に行くbar」とは、「マークされたドアを開いてbar部屋に入る」ことをbar意味しますが、「部屋に行く」というのは、同じことを短い方法で言うのに目立たない方法です。同じ部屋に通じる複数のドアを持つことは可能です。

既存のファイルへのハードリンク(ln existing new)を作成すると、同じファイルへの2番目のリンクが作成されます。つまり、既存のファイルにリンクする新しいディレクトリエントリが作成されます。作成後、2つのディレクトリエントリのステータスは等しくなります。「プライマリ」と「セカンダリ」のどちらも存在せず、同じファイルへの両方のリンクにすぎません。

ファイル自体を削除せずに、ファイルへのすべてのリンクを削除することもできます。これは、プログラムがファイルを開いたままでファイルを削除した場合(つまり、ディレクトリエントリをすべて削除した場合)に発生します。ファイルはファイルシステムに残り、ファイルを開いていた最後のプロセスがファイルを閉じたときにのみ実際に削除されます。部屋とドアの比phorでは、ドアのない部屋はまだスペースを占有します。


ハードリンクとソフトリンクが最初にそれぞれ導入されたのはいつですか?
n611x007

2
@ n611x007:新しい質問やフォローアップの質問がある場合は、新しい質問を開いてください。コメントセクションは、新しい質問や詳細なディスカッションには適していません。ありがとう。
デビッドフォースター

1
@ n611x007ハードリンクはUnixよりも古く、v1にはありました。Unixのシンボリックリンクは少し新しいです。ウィキペディアにはいくつかの歴史があります。
ジル 'SO-悪であるのをやめる'

部屋とドアは素晴らしい例えです!シンボリックリンクはドアへの標識のようなものです。
curiousdannii

1
@curiousdannii:シンボリックリンクより「代わりに#234へOI M8間違っオフィス行く」と言い、その中に座っている人と部屋のようなもの
モニカと明度レース

8

他のすべての回答に加えて、次の重要な特性を指摘します。

ソフトリンクは真の参照です。つまり、パス名を含む小さなファイルです。ソフトリンクの解決はアプリケーションに対して透過的に行われます。プロセスがファイルを開くと、/this/path/hereそれが指し示すシンボリックリンクである場合、開く処理/that/other/path全体/that/other/pathはOSによって行われます。さらに、/that/other/pathたまたまそれ自体がシンボリックリンクである場合、これもOSによって処理されています。実際、OSは他の何か(例:通常のファイル)を見つけるまで、または多くのエントリに到達するまでSYMLOOP_MAX(参照sysconf(3))、シンボリックリンクのチェーンをたどります。errnoELOOP。したがって、循環参照のようなxyz -> xyzプロセスは停止しません。(Linuxシステムについてはpath_resolution(7)、詳細を参照してください。)

プロセスは、パス名がシンボリックリンクであるかどうかをチェックすることができlstat(2)、そのファイル属性(inodeテーブルに格納されている)を変更する場合があることに注意してくださいlchown(2)symlink(7)ストーリー全体を参照)。

これで、許可に関しては、シンボリックリンクには常に許可が777であることがわかります(rwxrwxrwx記号表記)。これは、とにかく実際のファイルにアクセスすることで、他の許可をバイパスできるという事実によるものです。逆に、シンボリックリンクの777は、そもそもアクセスできなかった場合、シンボリックリンクされたファイルをアクセス可能にしません。たとえば、パーミッション640のファイルを指すパーミッション777のシンボリックリンクは、ファイルが「その他」(一般の人々)にアクセスできません。言い換えれば、ファイルxyzは、直接アクセスできる場合、つまり間接性がない場合にのみ、シンボリックリンクを介してアクセスできます。したがって、シンボリックリンクのアクセス許可には、セキュリティ効果はまったくありません。

ハードリンクとシンボリックリンク(別名ソフトリンク)の目に見える主な違いの1つは、ハードリンクが1つのファイルシステムに限定されているのに対し、ファイルシステム間でシンボリックリンクが機能することです。つまり、パーティションAのファイルはパーティションBからシンボリックリンクできますが、そこからハードリンクすることはできません。これは、ハードリンクは実際にはディレクトリ内のエントリであり、ファイル名とiノード番号で構成され、iノード番号はファイルシステムごとにのみ一意であるという事実から明らかです。

ハードリンクという用語は、実際には多少誤解を招くものです。シンボリックリンクの場合、ソースと宛先は明確に区別できますが(シンボリックリンクはiノードテーブルに独自のエントリを持っています)、これはハードリンクには当てはまりません。ファイルのハードリンクを作成する場合、元のエントリとハードリンクは最初にあったものに関して区別できません。(同じiノードを参照するため、所有者、許可、タイムスタンプなどのファイル属性を共有します。)これにより、すべてのディレクトリエントリは実際にハードリンクであり、ファイルをハードリンクすることは単に2番目のまたは3番目、または4番目...)ハードリンク。実際、各iノードには、そのiノードへのハードリンクの数のカウンターが格納されます。

最後に、一般ユーザーはディレクトリをハードリンクできないことに注意してください。これは、細心の注意を払って行う必要があるためです。不注意なユーザーは、そうでなければ厳密に階層化されたファイルツリーにサイクルを導入する可能性がありますfsck


6

簡単な答え:

  • ディレクトリ内のファイルエントリは、そのファイルへのハードリンクです。

  • 同じファイルへの複数のハードリンクが許可されているため、一部のファイルには複数のそのようなハードリンクがあります。


3

Unixの初期には、ファイルは特定のディスクドライブ上のiノードでした。ファイル名は、それらにアクセスするためのよりわかりやすい方法でした。

ハードリンクがiノードに複数のファイル名を割り当てていました。ファイルを作成し、そのファイルに2番目の名前をハードリンクし、最初の名前を削除することができます。

実際、ファイルを削除するためにプログラムが使用する必要があるシステムコールは「unlink(2)」です。データは、姓がiノードからリンク解除されるまで消えません。(そして、iノードはどこかのプロセスによって開かれていない)

これにより、Linuxがプログラムを実行している間に物事を簡単にアップグレードできるようになります。プロセスが実行可能ファイルを実行していて、更新が発生すると、プログラム名は再利用されますが、古いバージョンを含むiノードはまだ存在するため、実行を継続できます。そして、その古いバージョンを実行している最後のプロセスが停止すると、その古いバージョンのストレージが解放されます。

複数のマウントポイントを持つ単一のファイルツリーがある場合、1つのハードドライブから別のハードドライブのiノードへのハードリンクを作成できなかったため、ソフトリンクが発生しました。そこで、ソフトリンクが発明されました。



2
early daysどうして今は違うの?とにかくあなたの答えはその見方を反映していないようですか?
n611x007

@ n611x007 Linuxのような「最近」のものは、inodeモデルに適合しない非UNIXタイプのファイルシステムをマウントできるためです。たとえば、FATデリバティブやISO-9660など。これは、すべてに適合するサイズではなく、はるかに多様なファイルシステムエコロジーです。
修正

1

ファイルは、ディスクに書き込まれるデータです。このデータは、iノードによって参照されます。iノードには、特に、このファイルがディスク上のどのブロックを使用しているかをシステムに伝えるファイルに関するメタデータが含まれています。ハードリンクは、このファイルのiノード番号を指します。

技術的にはもちろん、新しいファイルを作成していますが、このファイルに含まれているのは、参照するファイルのiノード番号とその名前だけです。iノードへのポインタ、またはファイルへのポインタを作成すると考える方が良いでしょう。


1

ファイルは、ファイルシステムのエントリについて広く使用されている概念です。

通常、ディレクトリ通常ファイル(ハードリンク)、およびシンボリックリンク(ソフトリンク)が含まれます。さらに、デバイスとソケットを含めることもできます。

私の質問は、単にファイルとハードリンクの違いは何ですか?ハードリンクはiノードを指しているので、ファイルとは何ですか?iノードエントリ自体?または、ハードリンクのあるiノードですか?

たとえば、タッチでファイルを作成すると、iノードエントリがiノードテーブルに作成されます。そして、ファイルと同じiノード番号を持つハードリンクを作成します。新しいファイルを作成しましたか?または、ファイルは単にiノードとして定義されていますか?

通常、シンボリックリンクもファイルとしてカウントされるため、ハードリンク自体もファイルとしてカウントされます。ハードリンクかソフトリンクかに関係なく、ファイルであると言えます。

概念は少しあいまいなので、iノードエントリがファイルであると言ってもかまいませんが、実際にはデータを参照したい場合があります。

C ++またはJavaプログラマーの場合、std :: filesystem :: file_typejava.io.File、およびjava.nio.file.Filesについて読むことができます

ハードリンクとソフトリンクの違いに関する詳細は、infixedのコメントのリンクに記載されています。


1

与えられた名前の「ファイル」と「ハードリンク」の違いは歴史の一つです。指定された名前の(通常の)ファイルはcreatシステムコールを使用して作成され、ハードリンクはリンクシステムコールを使用して作成されます。

ただし、人間がディレクトリエントリの履歴について話し、それを記憶し、それに応じてファイルとハードリンクを呼び出しますが、ファイルシステムは認識しません。「元のファイル」と「ハードリンク」のディレクトリエントリの品質はまったく区別できません。両方とも、ファイル名とファイルのiノード間の参照を確立します。ファイルだけでなく、開かれたファイルにアクセスできるファイル記述子)、参照されていないiノードのファイルは削除されたと見なされ、iノードと関連ファイルスペースが再利用されます。

したがって、人間が「ファイル」と「ハードリンク」を対比すると、最初のものは「リンク数1」で発生し、他のすべてはより大きなリンク数で発生しました。違いは学術的なものであり、実際にファイルの名前を一度に変更するには、ターゲット名のハードリンクを作成してから、ソース名のリンクを削除します。最近では、通常、これをアトミックに行う単一のシステムコールが使用されています。

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