ハードリンク

コンピューティングにおいて、ハードリンクとは、(ディレクトリベースのファイルシステムにおける)名前をファイルと関連付けるディレクトリエントリのことです。したがって、各ファイルは少なくとも 1 つのハードリンクを持つ必要があります。ファイルに追加のハードリンクを作成すると、そのファイルの内容に追加のパス(異なる名前または異なるディレクトリ)でアクセスできるようになります。[ 1 ]これによりエイリアス効果が発生します。つまり、プロセスは任意のパスでファイルを開き、その内容を変更することができます。対照的に、ファイルへのソフトリンクまたは「ショートカット」は、データ自体への直接リンクではなく、ハードリンクまたは別のソフトリンクへの参照です。

多くのシステムでは、ディレクトリ自体が特別なファイルであり、他のデータではなくファイル名のリストを保持しています。そのため、ディレクトリへのハードリンクが複数存在する可能性があり、ツリー構造のような分岐構造ではなく、循環的なディレクトリ構造が形成される可能性があります。そのため、一部のファイルシステムでは、ディレクトリへの追加のハードリンクの作成を禁止しています。

POSIX準拠のオペレーティングシステムLinuxAndroidmacOS、およびPOSIX非準拠のWindows NTファミリーなど) [ 2 ]は、ファイルシステムに応じて、同一ファイルへの複数のハードリンクをサポートしています。例えば、NTFSReFSはハードリンクをサポートしていますが[ 3 ] 、 FATはサポートしていません。

手術

ハードリンクの概念の図解

「LINK A.TXT」と「LINK B.TXT」という2つのハードリンクが同じ物理データを指しているとします。テキストエディタで「LINK A.TXT」を開き、変更を加えて保存します。エディタ(または他のアプリケーション)で「LINK B.TXT」を開くと、両方のファイル名が同じデータを指しているため、「LINK A.TXT」に加えられた変更を確認できます。つまり、ユーザーの観点から見ると、これは複数のファイル名を持つ1つのファイルです。いずれかのファイル名を編集すると「すべての」ファイルが変更されますが、「最後のファイル名を除く任意のファイル名」を削除しても、ファイルはそのまま残ります。

しかし、 GNU Emacsなどの一部のエディタはハードリンクの概念を破ります。例えば「LINK B.TXT」というファイルを編集用に開くと、emacs は「LINK B.TXT」を「LINK B.TXT~」に名前変更し、「LINK B.TXT~」をエディタに読み込み、変更された内容を新しく作成された「LINK B.TXT」に保存します。こうすることで、「LINK A.TXT」と「LINK B.TXT」は同じデータを共有しなくなります。(この動作は emacs 変数 を使って変更できますbackup-by-copying。)

物理データへのハードリンクは任意の数だけ作成できます。データにアクセスするには、ユーザーは既存のリンク名を指定するだけで済みます。オペレーティングシステムが実際のデータの場所を解決します。ユーザーがハードリンクの1つを削除した場合でも、残っている他のリンクを通じてデータにアクセスできます。ユーザーがすべてのリンクを削除し、どのプロセスもファイルをオープンしていない場合は、オペレーティングシステムはファイルが占有していたディスク領域を解放します。

参照カウント

典型的なUnixファイルシステム上のハードリンクの簡略図。ファイル「A」と「D」はどちらもファイルシステムのinodeテーブル内の同じインデックスエントリを指しており、参照カウントは2になっていることに注目してください。

ハードリンクをサポートするほとんどのファイルシステムは参照カウントを使用します。ファイルシステムは、各論理データセクションに、そのデータを指すために作成されたハードリンクの総数を表す整数値を格納します。新しいリンクが作成されると、この値は1ずつ増加します。リンクが削除されると、この値は1ずつ減少します。カウンタがゼロになると、オペレーティングシステムは論理データセクションを解放します。(OSは、パフォーマンス上の理由やundeleteコマンドを有効にするために、未処理のファイルハンドルが開いている場合など、すぐには解放しない場合があります。)

これは、ファイルシステムが特定のストレージ領域の使用状況を追跡するためのシンプルな方法です。ゼロ値は空き領域を示し、非ゼロ値は使用済み領域を示します。この値を維持することで、どこにも参照されていないハードリンクが存在しないことが保証されます。データセクションとそれに関連するinodeは、単一のハードリンク(ディレクトリ参照)がそれを指しているか、または何らかのプロセスが関連ファイルを開いている限り、保持されます。

POSIX準拠のオペレーティング システムでは、ファイルまたはディレクトリの参照カウントは、stat()または fstat() システム コールによって のst_nlinkフィールドに返されますstruct stat

制限事項

ファイルシステムのループを防ぎ、" .." ファイル(親ディレクトリ)の解釈の一貫性を保つため、オペレーティングシステムは一般的にディレクトリへのハードリンクを許可しません。UNIX System Vではハードリンクが許可されていましたが、スーパーユーザーのみがそのようなリンクを作成できる権限を持っていました。[ 4 ] Mac OS X v10.5(Leopard)以降では、 Time Machineバックアップメカニズムのためだけにディレクトリへのハードリンクを使用します。[ 5 ]

ハードリンクは、同じボリューム、つまり同じファイルシステム内のファイルにのみ作成できます。(これは、ハードリンクが「名前 → inode」の関連付けであり、inode は番号で識別され、inode 番号はパーティション内でのみ一意であるためです。また、異なるボリュームには異なるファイルシステムが存在する場合があります。ターゲットボリュームのファイルシステムがハードリンクと互換性があるという保証はありません。)

特定の種類のファイルシステム上の単一ファイルへのハードリンクの最大数は、ファイルシステムの参照カウンタのサイズと、オペレーティングシステムのメモリ内のファイルごとのデータ構造内の参照カウンタのコピーのサイズによって制限されます。また、オペレーティングシステムコードのポリシー選択によって制限されることもあります。許可されたリンク数を超えるとエラーが発生します。1975年にリリースされたAT&T Unix System 6では、許可されたハードリンクの数は127でした。[ 6 ] [ 7 ] Unix系システムでは、メモリ内のカウンタは4,294,967,295(32ビットマシン)または18,446,744,073,709,551,615(64ビットマシン)です。一部のファイルシステムでは、ハードリンクの数はディスク上のフォーマットによってより厳密に制限されています。例えば、Linux 3.11では、ext4ファイルシステムはファイル上のハードリンクの数を65,000に制限しています。[ 8 ] WindowsはNTFSボリューム上のファイルへのハードリンクの数を1024に制限しています。[ 9 ]

Linux Weekly Newsで、ニール・ブラウンはハードリンクがメンテナンスの手間がかかると批判しました。アーカイバやディスク使用ツールなど、ディレクトリツリーを扱うプログラムの設計を複雑にするからです。これらのアプリケーションは、階層内で複数回リンクされているファイルの重複排除に注意する必要があります。ブラウンは、ベル研究所がUnixの後継として計画していたPlan 9にはハードリンクの概念が含まれていないことを指摘しています。[ 10 ]

プラットフォームサポート

Windows NT 3.1以降では、NTFSファイルシステム上のハードリンクをサポートしています。[ 11 ] Windows 2000ではCreateHardLink()ハードリンクを作成する機能が導入されましたが、これはファイルに対してのみであり、ディレクトリに対しては作成できません。[ 12 ]このDeleteFile()機能はハードリンクを削除することもできます。

Windows でハード リンクを作成するには、エンド ユーザーは以下を使用できます。

ファイルのハードリンクを調べるために、エンドユーザーは以下を使用できます。

  • ユーティリティ[ 13 ]fsutil
  • PowerShellのコマンドレットGet-ItemGet-ChildItemコマンドレット。これらのコマンドレットは各ファイルをオブジェクトで表し、PowerShellは各コマンドレットに読み取り専用のLinkTypeプロパティを追加します。HardLink関連付けられたファイルに複数のハードリンクがある場合、このプロパティには文字列「 」が含まれます。[ 16 ]

Windowsコンポーネント ストアは、ハード リンクを使用して、ハード ディスク ドライブに保存されているコンポーネントのさまざまなバージョンを追跡します。

Unix系システムでは、link()システムコールによって既存のファイルへのハードリンクを追加できます。ハードリンクを作成するには、エンドユーザーは以下を使用します。

  • lnユーティリティ
  • リンクユーティリティ
  • New-ItemPowerShellのコマンドレット[ 15 ]

ファイルのハードリンクを調べるために、エンドユーザーは以下を使用できます。

  • コマンドstat
  • コマンドls -l
  • Get-ItemPowerShellのコマンドレットGet-ChildItem(上記参照)[ 16 ]

CygwinSubsystem for UNIX-based Applicationsなど、Microsoft Windows 上で実行される Unix ライクなエミュレーションまたは互換性ソフトウェアでは、POSIX インターフェイスを使用できます。

OpenVMSはODS-5ファイルシステム上のハードリンクをサポートしています。[ 17 ] Unixとは異なり、VMSはディレクトリへのハードリンクを作成できます。

参照

  • シンボリック リンク: ファイル データ自体ではなくハード リンクを指します。したがって、ボリュームやファイル システム間で機能します。
  • NTFS リンク: NTFS がサポートする 4 つのリンク タイプ (ハード リンク、シンボリック リンク、ジャンクション ポイント、ボリューム マウント ポイント) の詳細を示します。
  • ショートカット: ローカルまたはリモートの場所にある別のファイルを指す小さなファイル
  • freedup : このfreedupコマンドは、重複したデータストアを自動的に生成されたハードリンクに置き換えることでディスク領域を解放します。
  • rsync :--link-dest=DIR新しいバックアップフォルダが、変更されていない場合は以前のバックアップのハードリンクを使用するようにサポートされています[ 18 ]スペースと時間を節約する機能(増分バックアップ[ 19 ] [ 20 ] [ 21 ]

参考文献

  1. ^ Pitcher, Lew. 「Q&A: ハードリンクとソフトリンクの違い」
  2. ^ 「リンクシェル拡張」
  3. ^ 「Resilient File System (ReFS​​) の概要」。Microsoft Learn 。2022年10月26日 – Microsoft Docs経由
  4. ^ Bach, Maurice J. (1986). 『UNIXオペレーティングシステムの設計』 Prentice Hall. p. 128. ISBN 9780132017992
  5. ^ Pond, James (2013年8月31日). 「Time Machineの魔法の仕組み」 . ファイルシステムイベントストア、ハードリンク. 2019年6月21日時点のオリジナルよりアーカイブ。 2019年5月19日閲覧
  6. ^ 「2.2 エラーコード」 . gnu.org . フリーソフトウェア財団. 2025年4月2日閲覧
  7. ^ Lions, John (1977). 「19.5 リンク」 . シドニー、オーストラリア:ニューサウスウェールズ大学. 5917行目. 2025年4月2日閲覧
  8. ^ 「Linuxカーネルソースツリー、fs/ext4/ext4.h、行229」
  9. ^ "CreateHardLinkA 関数 (winbase.h)" . Windows アプリ開発. 2021年10月13日 – Microsoft Docs経由.
  10. ^ Brown, Neil (2010年11月23日). 「Unixの過去の亡霊、パート4:メンテナンスに手間のかかる設計」 . Linux Weekly News . 2014年4月20日閲覧
  11. ^ 「ハードリンクの仕組み」 Microsoft Docs 2011年1月6日。
  12. ^ "CreateHardLink Function" . Windows Development . Microsoft . 2011年3月10日. オリジナルから2011年7月2日時点のアーカイブ – MSDN経由.既存のファイルと新しいファイルの間にハードリンクを確立します。この関数はNTFSファイルシステムでのみサポートされており、ディレクトリではなくファイルに対してのみサポートされています。
  13. ^ a b「Fsutil ハードリンク」 . Windows アプリ開発. Microsoft . 2012年4月18日 – Microsoft Docs経由.
  14. ^ "Mklink" . Microsoft Docs . Microsoft . 2012年4月18日.
  15. ^ a b "New-Item (PowerShell 3.0)" . Microsoft Docs . Microsoft . 2020年6月22日.場所がファイルシステムドライブ内にある場合、次の値が許可されます。場所がファイルシステムドライブ内にある場合、次の値が許可されます。File[,] Directory[,] Junction[,] HardLink
  16. ^ a b "FileSystemProvider.cs" . PowerShell / PowerShell リポジトリ. Microsoft . 2021年11月20日. 行番号8139~8234 – GitHub経由.
  17. ^ 「OpenVMS システム管理者マニュアル 第1巻」(PDF) . VSI. 2019年8月. 2021年1月23日閲覧
  18. ^ "rsync(1) - Linux man page" . linux.die.net . 2026年1月26日アーカイブ2026年1月31日閲覧。このオプションは--copy-destと同様に動作しますが、変更されていないファイルはDIRからコピー先ディレクトリにハードリンクされます。ファイルをリンクするには、保存されるすべての属性(権限、所有権など)が同一である必要があります。
  19. ^ 「Rsyncのlink-dest:デプロイメントには向かない - Konstantin Kovshenin」2026年1月31日閲覧。-- link-dest引数を使用すると、変更されていないファイルを別の宛先からハードリンクすることができ、転送時間とディスク容量の両方を節約できます。
  20. ^ 「rsyncとハードリンクを使用した増分バックアップ | Digitalis Blog」 . digitalis.io . 2026年1月31日閲覧。/backup/server1Old内のファイルがリモートサーバー上のファイルと同じ場合、rsyncはそれをコピーする代わりに、/backup/server1Old内のファイルから/backup/server1Newへのハードリンクを作成します。
  21. ^プレストン、W. カーティス (2007年1月3日).バックアップとリカバリ:オープンシステム向け低コストバックアップソリューション. O'Reilly Media, Inc.. p. 189. ISBN 978-0-596-55504-7変更を新しいディレクトリにコピーし、変更されていないファイルに可能な限りハードリンクを作成します