Linuxでファイルのリンク数を表示する方法とその応用

Linuxでリンク数を確認するなら、stat --format='%h %d %i %N' -- ./fileを使います。%hがハードリンク数、%dがファイルシステムを示すデバイス番号、%iがinode番号です。同じファイルシステムでデバイス番号とinode番号が同じ複数の名前は、同じinodeを参照するハードリンクです。ls -lの2列目にもリンク数は出ますが、スクリプトで列番号をawk解析するよりstatの書式指定が堅牢です。シンボリックリンクは別inodeを持つ別種のファイルなので、リンク先のハードリンク数と混同しません。

目次

リンク数st_nlinkが数えているもの

inodeには所有者、モード、サイズ、時刻、データ位置などのメタデータがあり、st_nlinkはそのinodeへ結び付くハードリンク(ディレクトリエントリ)の数です。通常ファイルを新規作成すると多くの場合1で、同じinodeへの別名を作ると2以上になります。「元ファイル」と「リンク」は技術的に同格で、どちらが本物という区別はinodeにありません。

同じ名前へシンボリックリンクがある、コピーが同じ内容である、重複排除やreflinkでブロックを共有する、といった状態はst_nlinkとは別です。バックアップ製品やコンテナ層の表示もファイルシステム実装で異なります。リンク数だけで容量節約、重複、利用者数を断定しません。

statでリンク数と識別子を同時表示する

一件ならstat --format='links=%h device=%d inode=%i name=%N' -- ./report.datとします。複数名を同じコマンドへ渡し、device/inodeが一致するか比較します。inode番号はファイルシステム内でのみ一意なので、inodeだけが同じでも別デバイスなら同じファイルではありません。

GNU statはシンボリックリンク引数を既定ではリンク自体として扱い、-Lでリンク先を参照します。両方を確認するならオプションなしとstat -Lを別々に実行し、どちらを記録したか明示します。別名やエイリアスで異なるstatが起動し得るため、自動化ではenv statや絶対パス、版を確認します。

ls -lの2列目は人向け確認に使う

ls -li -- ./fileは先頭付近にinode番号、長形式のリンク数、所有者、サイズ、時刻、名前を表示します。対話確認には便利ですが、ロケール、所有者名、ACL表示、特殊なファイル名で出力形が変わり得ます。ls -l file | awk '{print $2}'を重要スクリプトの入力にしません。

機械処理はstatの%hなど明示的な書式、またはプログラミング言語のstat APIを使います。ファイル名に改行がある場合、人向け一行出力も曖昧になります。NUL区切りのファイル一覧から一件ずつ引数として渡し、名前をシェルコードとして再解釈しません。

ハードリンクを安全なテスト領域で確認する

作業用ディレクトリで自作の無害なファイルへln -- original.txt second-name.txtを実行すると、既定のlnはハードリンクを作ります。前後にstatを実行すれば両名のdevice/inodeが同じでリンク数が1から2へ増えます。既存宛先を置換する-fは使わず、空のテスト領域だけで試します。

どちらの名前から内容を書き換えても同じinodeのデータが変わり、もう一方からも見えます。ハードリンクを「独立バックアップ」とみなしません。ランサムウェアや誤更新は両名へ反映します。保護には別ファイルシステム/媒体、版管理、アクセス制御、復元テストを使います。

ハードリンクはファイルシステム境界を越えない

ハードリンクは同じinodeを別ディレクトリエントリから参照する仕組みなので、別ファイルシステムへ作れません。GNU lnとLinuxのlink仕様でも境界越えはエラーです。別マウントへ同じ内容を置くならコピー、継続的同期、シンボリックリンクなど目的に合う方法を選びます。

マウントポイントの見た目だけで同一ファイルシステムと判断せず、statのdevice番号やfindmntで確認します。bind mount、ネットワークFS、コンテナ、スナップショットではパスと実体の関係が複雑です。リンク作成を失敗したからとrootで再実行せず、境界と権限を診断します。

ディレクトリへのハードリンクは作らない

多くのシステムはディレクトリのハードリンク作成を禁止します。許すと循環ができ、探索、バックアップ、削除が破綻するためです。GNU lnも通常は禁止され、特権オプションを使ってもシステム制限で失敗し得ます。ディレクトリを別場所から参照したい場合はシンボリックリンク、bind mountなど管理された仕組みを検討します。

ディレクトリのリンク数は伝統的ファイルシステムで自身の.、親からの名前、直下サブディレクトリの..により増えるため、「2+直下サブディレクトリ数」と見えることがあります。ただしファイルシステムによって最適化や報告方法が異なるため、正確な件数をリンク数だけで推定しません。

シンボリックリンクとは別に読む

ln -s target linknameで作るシンボリックリンクは、対象パス文字列を内容に持つ別ファイルです。stat linknameはリンク自体、stat -L linknameは解決できればリンク先を表示します。リンク先を削除/移動すればdangling linkになり得ますが、ハードリンクは他の名前変更に依存しません。

リンク自体を確認するreadlink -- linknameと、解決後パスを扱うコマンドの違いを理解します。調査中にシンボリックリンクをたどると想定外の領域へ出るため、findの-Lやツールのdereferenceを無条件に付けません。

find -linksでリンク数条件を検索する

限定ディレクトリでリンク数2の通常ファイルはfind ./data -xdev -type f -links 2 -printです。-links +1は1より多い、-links -3は3より少ないというGNU findの数値規則です。まず-printで候補を確認し、ルート全体やネットワーク共有を無計画に走査しません。

検索中にもリンク作成/削除は起こるため、結果は瞬間的です。機械処理は-print0で名前を安全に扱い、各候補をstatで再確認します。リンク数2だから「重複が一つだけ存在」とは断定せず、同じinodeを参照する名前の所在を別途調べます。

find -samefileで同じinodeの名前を探す

基準ファイルと同じinodeを参照する名前は、同一ファイルシステム内の限定した開始点でfind ./data -xdev -samefile ./data/reference.bin -printと探せます。リンク数が3なのに結果が2件なら、探索範囲外、権限不足、別名前空間などが考えられます。

ファイルシステム全体をrootで検索して機密パスを集めず、所有者と業務範囲を確認します。基準ファイルが検索中に差し替えられる競合もあるため、開始時のdevice/inode/ctimeと終了時を照合します。

名前の削除とデータ寿命を区別する

一つのハードリンク名を削除するとリンク数は減りますが、他の名前が残ればinodeとデータは引き続きアクセスできます。すべてのリンクがなくてもプロセスが開いたファイル記述子を保持していれば、最後に閉じるまで領域が残ります。「rmしたのに容量が戻らない」原因の一つです。

ただし調査だけでリンクを削除しません。削除対象名、他リンク、開いているプロセス、バックアップ、保持要件を確認し、一件ずつ承認します。リンク数を1にする目的で未知の別名を一括削除すると業務パスを壊します。

バックアップと移行でリンク関係を検証する

コピー方法によって、ハードリンク関係を保持する、別ファイルへ展開する、同内容を重複排除する結果が変わります。バックアップ/アーカイブツールのハードリンク保持仕様を確認し、復元後にdevice/inode/link countと内容ハッシュを検証します。単なるファイル件数と論理サイズだけでは復元品質を判断できません。

棚卸し記録にはマウント、device、inode、リンク数、名前一覧、所有者、ctime、取得時刻を残します。inodeは再利用され得るため、長期識別子としてinode番号だけを保存せず、パス、ハッシュ、ファイルシステムID、時刻と組み合わせます。

確認チェックリスト

  • statの%h/%d/%iでリンク数・デバイス・inodeを確認した
  • ls出力をawkで機械解析していない
  • ハードリンクは同じinodeの同格な名前だと理解した
  • シンボリックリンクをstatとstat -Lで区別した
  • 別ファイルシステム/ディレクトリへの制約を理解した
  • findは限定範囲・-xdev・-printから始めた
  • -samefile結果とリンク数の差を権限/範囲で検証した
  • 削除や復元前に他リンク・開放状況・バックアップを確認した

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次