web-dev-qa-db-ja.com

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

ハードリンクは、iノードへのポインタとして定義されます。 ソフトリンク(別名シンボリックリンク)は、ハードリンクの制限なしに別のリンクを指す独立したファイルとして定義されます。

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

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

37

非常に短い答えは:

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

Unixのファイルとディレクトリは動作します正確に現実世界のファイルとディレクトリのように(そしてnot現実世界のフォルダのように); Unixファイルシステムは、(概念的には)次のように構成されています。

  • ファイルはデータの匿名のblobです。名前はなく、番号(inode)のみです
  • ディレクトリは、ファイルへの名前のマッピング(より具体的にはiノード)を含む特別な種類のファイルです。ディレクトリは単なるファイルなので、ディレクトリはディレクトリのエントリを持つことができ、それが再帰の実装方法です(Unixファイルシステムが導入されたとき、これはnotであることに注意してください。多くのオペレーティングシステムはそうではありませんでした) tディレクトリにその当時のディレクトリを含めることを許可する)
  • これらのディレクトリエントリはhardlinksと呼ばれます
  • シンボリックリンクは別の特別な種類のファイルで、その内容はパス名です。このパス名は別のファイルの名前として解釈されます
  • 他の種類の特殊ファイルは、ソケット、fifo、ブロックデバイス、キャラクターデバイスです。

このメタファーを念頭に置き、特にUnixディレクトリは実世界のディレクトリのように機能し、-not実世界のフォルダのように動作することを特に念頭に置いて、新規参入者がよく遭遇する「奇妙さ」の多くを説明します。書き込みアクセス権のないファイルを削除しますか?その1つは、ファイルを削除するのではなく、ファイルの多くの可能な名前の1つを削除することです。これを行うには、ファイルではなくディレクトリへの書き込みアクセスのみが必要です。実世界と同じように。

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

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

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

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

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

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

たとえば、タッチでファイルを作成すると、Inode TableにInodeエントリが作成されます。

はい。

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

いいえ。ハードリンクはファイルではないため、iノード番号はありません。 iノード番号を持つのはファイルだけです。

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

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

はい。

または、ファイルがInodeとして定義されているだけですか?

いいえ、ファイルにはiノードがありますis n't iノード。

61
Jörg W Mittag

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

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

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

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

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

他のすべての回答に加えて、以下の重要な特性を指摘したいと思います。

ソフトリンクは真の参照です。つまり、パス名を含む小さなファイルです。ソフトリンクの解決はアプリケーションに対して透過的に行われます。プロセスがファイルを開く場合、_/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)を使用してパス名がシンボリックリンクであるかどうかを確認でき、lchown(2)などを使用して(inodeテーブルに格納されている)ファイル属性を変更できます(参照)ストーリー全体のsymlink(7)

ここで、許可の観点から、シンボリックリンクには常に許可777(シンボリック表記ではrwxrwxrwx)があることに気づくでしょう。これは、実際のファイルにアクセスすることで、他の権限をバイパスできるためです。逆に、シンボリックリンクの777は、そもそもアクセスできないシンボリックリンクファイルをアクセス可能にしません。たとえば、アクセス許可777のシンボリックリンクがアクセス許可640のファイルを指している場合、そのファイルは「その他」(一般の人々)がアクセスできなくなります。言い換えると、ファイルxyzは、直接アクセスできる場合にのみ、つまり間接参照なしで、シンボリックリンクを介してアクセスできます。したがって、symlinkのアクセス権はセキュリティにまったく影響しません。

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

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

最後に、通常のユーザーはディレクトリをハードリンクできない場合があることに注意してください。これは細心の注意を払って行う必要があるためです。注意を怠ったユーザーは、通常のすべてのツール(fsckなど)とOS自体が処理する準備ができていない、厳密に階層的なファイルツリーに循環を導入する可能性があります。

8
countermode

簡単な答え:

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

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

6
Andrew Henle

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

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

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

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

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

3
infixed

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

つまり、技術的には、はい、あなたは新しいファイルを作成していますが、このファイルに含まれているのは、参照するファイルのiノード番号と名前です。 iノードへのポインタまたはファイルへのポインタを作成することを考えるとよいでしょう。

1
user151768

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

通常、DirectoryRegular File(hard link)、およびシンボリックリンク(ソフトリンク)。また、デバイスとソケットが含まれる場合もあります。

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

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

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

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

C++またはJavaプログラマーの場合、 std :: filesystem :: file_type についてお読みになることをお勧めします Java.io.File 、および Java.nio.file.Files

ハードリンクとソフトリンクの違いについての詳細は、infixedのコメントのリンクを参照してください。

1
cshu

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

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

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

1
user217420