発端
ある日いつものようにファイルの権限を見ようと ls -l
したところ、いつもはスルーしてた上記の個所がふと気になったので調べました。
結論
「ハードリンク」の数
ハードリンクとは?
前提
ext4など、linuxでよく使用されるファイルシステムでは以下の3つに分けてファイルを管理しています。
- ディレクトリエントリ
- ファイル名orディレクトリ名とi-node番号(後述)の組み合わせのみを保持
- i-node
- ユニークなi-node番号を持つ
- ファイルorディレクトリのメタデータを保持
- 例)
- ファイルタイプ(通常のファイル、ディレクトリなど)
-
ls -l
した時のパーミッションの先頭についている文字のやつ
-
- パーミッション
- 所有者
- ファイルサイズ
- データブロックへのポインタ
- ファイルタイプ(通常のファイル、ディレクトリなど)
- 例)
- データブロック
- ファイルの実体
- ディレクトリの場合は子のファイル/ディレクトリのディレクトリエントリが格納されている
ではハードリンクとは
既存のi-nodeに別のファイル名を紐づけたもの。
i-node、データブロックは既存のものと共通なのでハードリンクからファイルを編集すると元のディレクトリエントリからファイルを開いても編集が反映される。
似たようなの:シンボリックリンク
リンク先のファイルへの参照を保持するファイル。
ハードリンクと異なりまったく別個のi-node、データブロックを持つ。
データブロックにリンク先のパスを保持する。
cat
などをシンボリックリンクに対して実行すると、ファイルシステムはシンボリックリンクのi-nodeからそれがシンボリックリンクであることを認識し、リンク先を参照しに行く。