inode:ファイルの実体を指し示す仕組み
リンクの仕組みを理解するには、まずinode(アイノード)という概念を知る必要があります。Linuxのファイルシステムでは、ファイルの「名前」と、ファイルデータおよび属性などの管理情報が分離されて管理されています。ファイル名以外の管理情報をinodeと呼び、inodeにはパーミッション・所有者・サイズなどの属性や、ファイルデータの格納場所を管理する情報が記録されています。それぞれのinodeには、ファイルシステム内で一意の番号(inode番号)が割り振られています。ディレクトリエントリ(ファイル名)は、このinode番号を指し示す「ラベル」のような役割を果たしています。
ls -i file.txt # ファイルのinode番号を表示するハードリンク:同じinodeを指す別の名前
ハードリンクとは、同じinodeを指す、もう1つの別のファイル名(ディレクトリエントリ)を作ることです。ハードリンクを作成すると、元のファイルとリンク先のファイルは、名前は違ってもまったく同じ実体(同じinode番号)を共有します。
ln original.txt hardlink.txt # original.txtへのハードリンクhardlink.txtを作成する
ls -i original.txt hardlink.txt # 両者のinode番号が同じであることを確認するハードリンクの特徴
- どちらか一方の内容を変更すると、もう一方にも同じ変更が反映される(同じ実体を指しているため)。
- どちらのファイル名を削除しても、実体(inode)はもう一方の名前が存在する限り残り続ける。実体が実際に破棄されるのは、そのinodeを指す名前(リンク数)がすべて無くなり、かつそのファイルを開いているプロセスが無くなったときです。
- 同じファイルシステム内でしか作成できない(inode番号はファイルシステムごとに管理されているため)。
- ディレクトリに対しては(一部の特殊なケースを除き)作成できない。
シンボリックリンク:パスを記録した別のファイル
シンボリックリンク(symbolic link、略してsymlink、ソフトリンクとも呼ばれる)は、ハードリンクとは異なり、リンク先のパス名を記録した、別の種類の小さなファイルです。実体(inode)を共有するのではなく、「あのパスを見に行ってください」という参照情報を持つだけの独立したファイルです。
ln -s original.txt symlink.txt # original.txtへのシンボリックリンクsymlink.txtを作成する
ls -l symlink.txt # "symlink.txt -> original.txt" のように表示されるシンボリックリンクの特徴
- 異なるファイルシステム間でも作成できる(パス名を記録しているだけなので、inode番号の制約を受けない)。
- ディレクトリに対しても作成できる。
- リンク先のパスで対象に到達できなくなると、リンクが無効になる(壊れたリンク、
dangling linkと呼ばれる状態になる)。 ls -lで表示すると、パーミッション欄の先頭がlとなり、リンク先のパスが->で示される。
ハードリンクとシンボリックリンクの比較
| 観点 | ハードリンク | シンボリックリンク |
|---|---|---|
| 実体の共有 | 同じinodeを共有する | 別のファイル(パス名の参照情報を持つ) |
| ファイルシステムをまたぐ作成 | できない | できる |
| ディレクトリへのリンク | 原則できない | できる |
| 元ファイル削除後の状態 | 実体は残る(リンク数が0になるまで) | リンク先のパスで対象に到達できなくなると、リンク切れ(壊れたリンク)になる |
ls -lでの表示 | 通常のファイルと同じに見える | lで始まり、リンク先が->で示される |
lnコマンドの主なオプション
lnコマンドは、既定ではハードリンクを作成します。
| オプション | 効果 |
|---|---|
| (オプション無し) | ハードリンクを作成する(既定の動作) |
-s | シンボリックリンクを作成する |
-f | 作成先に同名のファイルがすでに存在する場合、確認なしで削除してリンクを作成する。作成先がディレクトリを指すシンボリックリンクの場合は、-nと組み合わせる |
-n | 作成先がディレクトリを指すシンボリックリンクであっても、ディレクトリとしてたどらない |
-v | 作成したリンクの名前を表示する |
ln file.txt hardlink.txt # ハードリンクを作成する
ln -s /var/log/app.log latest.log # シンボリックリンクを作成する
ln -sfn newtarget.txt mylink # 既存のリンクを上書きしてシンボリックリンクを張り直すコピーとリンクの違い
ファイルを複製する方法には、cpによるコピーと、lnによるリンクの2種類があります。
| 観点 | cp(コピー) | ln(リンク) |
|---|---|---|
| ディスク使用量 | 別の実体が作られるため、容量を消費する | ハードリンクは追加の実体を作らない(シンボリックリンクはごく小さい) |
| 片方を変更した場合 | もう一方には影響しない(独立したファイル) | ハードリンクは影響する(同じ実体) |
システム管理業務では、設定ファイルのバージョン切り替えや、複数のパスから同じファイル・ディレクトリにアクセスできるようにする目的で、シンボリックリンクがよく使われます(例:/etc/localtimeが/usr/share/zoneinfo/以下の該当ファイルへのシンボリックリンクになっている場合がある等)。