スポンサーリンク

SYMLINK(7) FreeBSD 多方面の情報マニュアル SYMLINK(7)

名称

symlink − シンボリックリンクの扱い

シンボリックリンクの扱い

シンボリックリンクは、他のファイルへのポインタとして働くファイルです。動 作を理解するためには、ハードリンクの動作を理解する必要があります。ファイ ルへのハードリンクは元のファイルとは区別できません。なぜなら、ハードリン クは元のファイル名の下敷きとなるオブジェクトを参照するからです。ファイル に対する変更は、ファイルを参照するために使用する名前には依存しません。 ハードリンクは、ディレクトリを参照してはなりませんし、他のファイルシステ ム上のファイルを参照してもなりません。シンボリックリンクは、リンクされた ファイルの名前を格納します。すなわち、他の名前へのポインタです。下敷きと なるオブジェクトを参照するわけではありません。このため、シンボリックリン クは、ディレクトリを参照することができますし、ファイルシステムをまたがる ことが可能です。

シンボリックリンクとこれが参照するオブジェクトはファイルシステムの名前空 間において共存しますので、リンク自身と参照されるオブジェクトの区別に関し て混乱が生じることがあります。歴史的には、コマンドおよびシステムコール は、場当たり的にそれぞれ独自のリンク追跡規則を採用してきました。このシス テムに実装されている、統一的なアプローチの規則をここに示します。ユーザイ ンタフェースをできる限り一貫性あるものとするために、ローカルアプリケー ションもまたこの規則を守ることが重要です。

シンボリックリンクの操作は、リンク自身への操作、もしくはリンクによって参 照されるオブジェクトへの操作によって実現されます。後者の場合、アプリケー ションまたはシステムコールがリンクを ‘‘追跡 (follow)’’ したと言います。シ ンボリックリンクは他のシンボリックリンクを参照することができます。この場 合、シンボリックリンクではないオブジェクトが見付かるか、存在しないファイ ルを参照するシンボリックリンクが見付かるか、ループが検出されるまで、リン クが手繰られます。 (ループ検出は、追跡可能なリンク数の上限を設定すること により実現されます。この制限を超過する場合にはエラーとなります。)

議論すべき領域で異なるものが 3 つあります。それらは次の通りです:

             1. システムコールのファイル名引数として使用されるシンボリックリンク。

2. ファイルツリーをたどらないユーティリティのコマンドライン引数と して指定されるシンボリックリンク。
3. ファイルツリーをたどる (traverse) ユーティリティが扱うシンボ リックリンク (コマンドラインで指定されるもの、およびファイル階 層をたどるときに出会うものの両方です)。

システムコール
最初の領域は、システムコールのファイル名引数として使用されるシンボリック リンクです。

次の例外を除き、全システムコールはシンボリックリンクを追跡します。例え ば、 ‘‘afile’’ という名前のファイルを指すシンボリックリンク ‘‘slink’’ が 存在する場合、システムコール ‘‘open("slink" ...)’’ はファイル ‘‘afile’’ のファイル記述子を返します。

リンクを追跡せずに、シンボリックリンク自身を操作するシステムコールが 9 つ あります。それらは次の通りです: lchflags(2), lchmod(2), lchown(2), lstat(2), lutimes(2), readlink(2), rename(2), rmdir(2), unlink(2)remove(3)unlink(2) の別名ですから、これもまたシンボリックリンクを追跡 しません。 rmdir(2) は、シンボリックリンクに対して適用されると、エラー ENOTDIR で失敗します。

既存のシンボリックリンクの所有者およびグループの変更は、 lchown(2) システ ムコールにて可能です。既存のシンボリックリンクのフラグ・アクセスパーミッ ション・所有者/グループ・修正時刻は、それぞれ lchflags(2), lchmod(2), lchown(2), lutimes(2) システムコールで変更可能です。これらのうち、システ ムが使用するのはフラグのみであり、アクセスパーミッションと所有者情報は無 視されます。

4.4BSD システムは歴史的な 4BSD システムとは異なり、システムコール chown(2) がシンボリックリンクを追跡するように変更されました。後になって、 新しい chown(2) の制限が明らかになると、 lchown(2) システムコールが追加さ れました。

ファイルツリーをたどらないコマンド
第 2 の領域は、ファイルツリーをたどらないコマンドに対するコマンドラインの ファイル名引数として指定されるシンボリックリンクです。

下に述べる例外を除き、コマンドは、コマンドライン引数として指定されるシン ボリックリンクを追跡します。例えば、 ‘‘afile’’ という名前のファイルを指す シンボリックリンク ‘‘slink’’ が存在する場合、コマンド ‘‘cat slink’’ は ファイル ‘‘afile’’ の内容を表示します。

この規則は、ファイルツリーをたどることもできるコマンドも含みます。これを 認識することが重要です。例えば、コマンド ‘‘chown file’’ はこの規則に含ま れますが、コマンド ‘‘chown -R file’’ は含まれません。 (後者は第 3 の領域 で後述します。)

コマンドがシンボリックリンクを追跡するのではなくシンボリックリンク自身を 操作することが明示的に意図されている場合、例えば ‘‘chown slink’’ が、シン ボリックリンクであるか否かにかかわらず、 ‘‘slink’’ 自身の所有者を変更した い場合、 −h オプションを使用します。先の例では、 ‘‘chown root slink’’ は ‘‘slink’’ が参照するファイルの所有者を変更しますが、 ‘‘chown -h root slink’’ は ‘‘slink’’ 自身の所有者を変更します。

この規則には 4 つの例外があります。 mv(1) および rm(1) のコマンドは、引数 として指定されるシンボリックリンクを追跡せずに、それぞれシンボリックリン ク自身を改名したり削除しようとします。 (シンボリックリンクがファイルを相 対パスで指定する場合、シンボリックリンクを他のディレクトリに移動してしま うと、パスが正しくなくなってしまいますので、追跡できなくなります。)

ls(1) コマンドもまたこの規則の例外です。歴史的なシステムとの互換性のため に ( ls がツリーをたどらない場合、すなわち −R オプションが指定されない場 合)、 −H, −L オプションが指定されるか −F, −d, −l オプションが指定されない 場合、 ls コマンドは引数として指定されたシンボリックリンクを追跡します。( ファイルツリーをたどらない場合にも、 −H, −L オプションが動作に影響を与え るコマンドは ls だけです。)

file(1) コマンドもまたこの規則の例外です。 file(1) コマンドは、引数として 指定されるシンボリックリンクを、デフォルトでは追跡しません。 −L オプショ ンが指定されると、 file(1) コマンドは引数として指定されるシンボリックリン クを追跡します。

4.4BSD システムは歴史的な 4BSD システムとは異なり、 chown, chgrp のコマン ドがコマンドラインに指定されたシンボリックリンクを追跡します。

ファイルツリーをたどるコマンド
次のコマンドは、オプションとしてまたは常にファイルツリーをたどります: chflags(1), chgrp(1), chmod(1), cp(1), du(1), find(1), ls(1), pax(1), rm(1), tar(1), chown(8)

ファイルシステムをたどるときに出会うシンボリックリンクおよびコマンドライ ン引数として指定されるシンボリックリンクに対し、次の規則が等しく適用され ることを認識することが重要です。

最初の規則は、ディレクトリ型ではないファイルを参照するシンボリックリンク に対して適用されます。シンボリックリンクに対して適用される操作は、リンク 自身に対してなされますが、そうでない場合にはリンクは無視されます。

コマンド ‘‘rm -r slink directory’’ は ‘‘slink’’ を削除し、 ‘‘directory’’ のツリーをたどるときに出会うシンボリックリンクもまた削除します。なぜな ら、シンボリックリンクは削除可能であるためです。いかなる場合も、 ‘‘slink’’ が参照するファイルに rm が影響することはありません。

第 2 の規則は、タイプがディレクトリであるファイルを参照するシンボリックリ ンクに適用されます。デフォルトでは、タイプがディレクトリであるファイルを 参照するシンボリックリンクは ‘‘追跡’’ されません。これはしばしば ‘‘物理’’ 探索と呼ばれ、 ‘‘論理’’ 探索 (ディレクトリを参照するシンボリックリンクが 追跡される場合です) の対極に位置します。

可能な限り一貫性を持たせるため、シンボリックリンクが参照するファイルのタ イプに依存せずに、ファイルツリーをたどるコマンドにコマンドラインで指定さ れるシンボリックリンクを追跡させるためには、 −H (‘‘半論理’’) フラグを指定 します。このフラグは、コマンドラインの名前空間を論理的な名前空間とするこ とを意図しています。 (注: 常にファイルツリーをたどるわけではないコマンド においては、 −R フラグも指定されていない場合には、 −H フラグは無視されま す。)

例えば、コマンド ‘‘chown -HR user slink’’ は、 ‘‘slink’’ で指されるファイ ルを根とするファイル階層をたどります。注: −H は、以前議論した −h フラグと は同じではありません。 −H フラグは、実行される操作およびファイルツリーを たどるときの両方において、コマンドラインで指定されるシンボリックリンクを 手繰るようにします。これにより、シンボリックリンクが指すファイルの名前 を、ユーザが指定したかのようになります。

可能な限り一貫性を持たせるため、シンボリックリンクが参照するファイルのタ イプに依存せずに、ファイルツリーをたどるコマンドにコマンドラインで指定さ れるシンボリックリンクだけでなくファイルツリーをたどっているときに出会う シンボリックリンクも追跡させるためには、 −L (‘‘論理’’) フラグを指定しま す。このフラグは、すべての名前空間を論理的な名前空間とすることを意図して います。 (注: 常にファイルツリーをたどるわけではないコマンドにおいては、 −R フラグも指定されていない場合には、 −L フラグは無視されます。)

例えば、コマンド ‘‘chown -LR user slink’’ は、 ‘‘slink’’ で指されるファイ ルの所有者を変更します。 ‘‘slink’’ がディレクトリを参照する場合、 chown は ‘‘slink’’ で指されるディレクトリを根とするファイル階層をたどります。さ らに、 chown がたどるファイルツリーの中でシンボリックリンクに出会うと、そ のシンボリックリンクは ‘‘slink’’ と同じ方法で扱われます。

可能な限り一貫性を持たせるため、デフォルトの動作を指定するには、 −P (‘‘物 理’’) フラグを指定します。このフラグは、名前空間全体を物理的な名前空間の ように見せるためのものです。

デフォルトでファイルツリーをたどらないコマンドにおいては、 −R もまた指定 しない場合には、 −H, −L, −P フラグは無視されます。また、 −H, −L, −P オプ ションは複数回指定可能です。この場合、最後に指定したものがコマンドの動作 を指定します。ある動作を行うようにコマンドをエイリアスし、それをコマンド ラインで上書きできるようにすることを意図しています。

ls(1)rm(1) のコマンドは、これらの規則において例外を持ちます。 rm コマ ンドはシンボリックリンクを操作し、シンボリックリンクが参照するファイルを 操作しません。また、シンボリックリンクを追跡しません。 rm コマンドは −H, −L, −P のオプションをサポートしません。

歴史的なシステムとの互換性を維持するために、 ls コマンドは少し異なる挙動 を示します。 −F, −d, −l オプションのいずれも指定しない場合、 ls コマンド は、コマンド行で指定したシンボリックリンクを追跡します。 −L フラグが指定 されると、シンボリックリンクのタイプにかかわらず、またコマンドラインで指 定されたのかファイルツリーをたどる途中に出会ったのにかもかかわらず、 ls は全シンボリックリンクを追跡します。

関連項目

chflags(1), chgrp(1), chmod(1), cp(1), du(1), find(1), ln(1), ls(1), mv(1), pax(1), rm(1), tar(1), lchflags(2), lchmod(2), lchown(2), lstat(2), lutimes(2), readlink(2), rename(2), symlink(2), unlink(2), fts(3), remove(3), chown(8)

FreeBSD 10.0 March 31, 1994 FreeBSD 10.0

スポンサーリンク