シンボリックリンク
100%

ファイルシステム · レッスン 12

シンボリックリンク

シンボリックリンクとハードリンクについて、パス名解決、inode の同一性、ファイルシステムの範囲の違いを学びます。

ディレクトリエントリは inode に名前を与えます。ハードリンクは同じ inode に対する別のディレクトリエントリを作成し、シンボリックリンクは解決すべきパス名を内容として持つ別の 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 が出力するものは何ですか?

レッスン完了

シンボリックリンク を完了しました

これで、適切な種類のファイルシステムリンクを選び、調べられるようになりました。

  • パス名に基づくシンボリックリンクには ln -s TARGET LINK を使う。

  • 相対的な対象は、リンクを含むディレクトリを基準に解決する。

  • 同じファイルシステムの inode に別名を付けるには ln EXISTING LINK を使う。

  • シンボリックリンクの unlink とハードリンクの unlink を区別する。

  • 特権操作や再帰操作では、安全でないリンク追跡を避ける。

学習進捗を保存

無料アカウントを作成してこのレッスンを保存し、どのデバイスからでも学習を続けられます。

無料アカウントを作成
ファイルシステム に戻る