ディレクトリエントリは inode に名前を与えます。ハードリンクは同じ inode に対する別のディレクトリエントリを作成し、シンボリックリンクは解決すべきパス名を内容として持つ別の inode を作成します。この違いによって、同一性、寿命、ファイルシステムをまたぐ動作が決まります。
ファイルシステム · レッスン 12
シンボリックリンク
シンボリックリンクとハードリンクについて、パス名解決、inode の同一性、ファイルシステムの範囲の違いを学びます。
シンボリックリンクを作成して調べる
ln -s TARGET LINK_NAME でシンボリックリンクを作成します。
$ printf '%s\n' 'example' > myfile
$ ln -s -- myfile myfilelink
$ ls -li myfile myfilelink
151 -rw-r--r-- 1 user user 8 ... myfile
93403 lrwxrwxrwx 1 user user 6 ... myfilelink -> myfile
シンボリックリンクは独自の inode を持ち、myfile というテキストを保存しています。プログラムが myfilelink をたどると、パス名解決はその対象へ続きます。リンクをたどらずに保存されたテキストを表示するには、次を使います。
$ readlink myfilelink
対象テキストが myfile のシンボリックリンク myfilelink を作るコマンドはどれですか?
相対パスと絶対パスのシンボリックリンク対象
絶対パスの対象は / から始まります。相対パスの対象はシンボリックリンクを含むディレクトリを基準に解決されます。後で誰かがリンクを開くときのシェルの現在のディレクトリではありません。
$ mkdir -p tree/data tree/current
$ printf '%s\n' 'value' > tree/data/item
$ ln -s ../data/item tree/current/item
tree 階層全体を移動しても、この相対関係は保たれます。リンクまたは対象だけを移動すると壊れることがあります。存在しない対象をシンボリックリンクに保存することもでき、その状態を dangling link または broken link と呼びます。
シンボリックリンクの相対的な対象は、どこを基準に解決されますか?
ハードリンクを作成する
-s を付けずに、既存の通常ファイルに別の名前を作成します。
$ ln -- myfile myhardlink
$ ls -li myfile myhardlink
151 -rw-r--r-- 2 user user 8 ... myfile
151 -rw-r--r-- 2 user user 8 ... myhardlink
両方の名前が、同じファイルシステムと inode 番号に対応します。リンク数は 2 になります。どちらかが本質的な「元ファイル」というわけではありません。一方の名前から内容を変更すると共有オブジェクトが変わり、一方を削除してももう一方は残ります。
inode 番号はそのファイルシステム内でだけ意味を持つため、ハードリンクはファイルシステムの境界を越えられません。また Linux は、循環やセキュリティ上の問題を防ぐため、一般ユーザーによるディレクトリへのハードリンクを制限し、所有していないファイルへのリンクも制限する場合があります。
1 つの通常ファイルに対する 2 つのハードリンクが共有するものは何ですか?
寿命と削除
シンボリックリンクを削除すると、その対象ではなくリンクオブジェクトが削除されます。
$ rm -- myfilelink
ハードリンク名を削除すると、共有 inode のリンク数が減ります。リンク数が 0 になり、開いているファイル記述やほかのファイルシステム参照が残っていない場合にだけ、ファイルシステムはオブジェクトを回収できます。
ディレクトリへのシンボリックリンクを削除する際は、末尾にスラッシュを付けないでください。コマンドによっては、末尾のスラッシュによるパス解決でディレクトリとしてリンクをたどる場合があります。ls -ld -- LINK で調べ、リンク名を意図的に削除してください。
通常、シンボリックリンク自体を削除するとどうなりますか?
リンクを安全にたどる
シンボリックリンクは、特権プログラムを想定外のディレクトリ外へ誘導したり、検証と使用の間に対象を変えたりできます。安全なプログラムでは、確認してから開くパス名競合を避け、言語とオペレーティングシステムに適した、ディレクトリ相対、リンク非追跡、解決範囲制限のインターフェースを使う必要があります。
日常的な調査には次を使います。
ls -ld LINKはリンク自体を表示するreadlink LINKは保存された対象テキストを出力する- GNU coreutils では通常、
stat LINKがリンクのメタデータを報告し、stat -L LINKはリンクをたどる find -Lはリンクをたどるため循環に遭遇することがあり、意図した場合だけ使用する
lrwxrwxrwx と表示されるパーミッションは、一般的なアクセス許可を意味しません。アクセスは、ディレクトリの探索、リンク追跡方針、対象のパーミッションによって決まり、一部の保護ディレクトリ規則ではシンボリックリンクの所有権も関係します。
既定で readlink LINK が出力するものは何ですか?
使い捨てのファイルでリンクを練習し inode 番号を比較するには、Linux でファイルとディレクトリを管理する を利用してください。
レッスン完了
シンボリックリンク を完了しました
これで、適切な種類のファイルシステムリンクを選び、調べられるようになりました。
パス名に基づくシンボリックリンクには
ln -s TARGET LINKを使う。相対的な対象は、リンクを含むディレクトリを基準に解決する。
同じファイルシステムの inode に別名を付けるには
ln EXISTING LINKを使う。シンボリックリンクの unlink とハードリンクの unlink を区別する。
特権操作や再帰操作では、安全でないリンク追跡を避ける。