ハードリンクとシンボリックリンク
多くのオペレーティングシステムでは、ファイルやディレクトリに別名を付け、異なった名前で同一のファイルにアクセスできる仕組みが備わっています。
Linuxには「ハードリンク」と「シンボリックリンク」の2種類の仕組みがあります。
ハードリンク
Linuxでは、ファイルをディスクに保存すると、重複しないiノード番号が割り当てあられます。全てのファイルには対応するiノードが存在し、iノードにはディスク上のファイルに関する属性情報が格納されています。
ディレクトリは特殊なファイルの形態であり、所属するファイル名とiノードを関連づけています。以下はiノードに格納されている情報の一部です。
- ファイルの種別
- ファイルサイズ
- アクセス権
- 所有者
- リンク
- ディスク上の物理的な保存場所(ブロック番号)
ファイルの実態(ディスク上に保存されているデータ)が1つでも、その実体を参照にするファイルが複数あれば、それぞれのファイル名で同一の実体を参照にすることができます。
これが「ハードリンク」です。
ハードリンクは。元のファイルと、リンクして作成したファイルの区別がどちらもiノードが同じなのでつけられません。ファイルをコピーした場合は、いずれかを変更しても他方に影響はありません。
ハードリンクの場合は、いずれのハードリンクファイルに変更を加えても、同一の実体に対して変更を加えることになります。ハードリンクが複数作成されている場合、そのすべてを削除するまでは、ファイルの実体は削除されません。
リンクが作成されている数は、lsコマンドで確認できます。
次の例では、1つのファイルと、そのファイルへの2つのハードリンクがあるため、リンク数が3となっています。
$ ls -lf
total 12
129851 -rw-r–r– 3 lpic lpic 1433 jul 17 13:22 file.org
129851 -rw-r–r– 3 lpic lpic 1433 jul 17 13:22 file2
129851 -rw-r–r– 3 lpic lpic 1433 jul 17 13:22 file3
-iオプションでiノード番号を表示します。前記の例ではいずれもiノード番号が同じである点に注目してください。
ハードリンクには、リンク元のファイルが存在するファイルシステムと異なるファイルシステム上に生成することはできません。
iノードはファイルシステムごとに管理されているためです。また、ディレクトリのハードリンクを作成することもできません。
シンボリックリンク
2種類の仕組みのもう1つが「シンボリックリンク」です。シンボリックリンクは、リンク元の場所を指し示します。
シンボリックリンク自身が持っているのは、リンク元へのポインタです。そのため、シンボリックリンクをを残したまま、リンク元のファイルを削除することも可能です。この場合、シンボリックリンクにアクセスすると、実体ファイルがみつけられずエラーになります。
シンボリックリンクは、ハードリンクと異なり、別のファイルシステムへのリンクを作成することもできます。また、ディレクトリのリンクを作成することもできます。