シンボリックリンクは、UNIX/Linuxシステムによって内部的にどのように管理されていますか。実際のターゲットファイルがなくてもシンボリックリンクが存在する可能性があることが知られています(ダングリングリンク)。では、内部でシンボリックリンクを表すものは何ですか。
Windowsでは、答えはreparse point
です。
質問:
答えはUNIX/Linuxではinode
ですか?
はいの場合、iノード番号はターゲットとリンクで同じですか?
はいの場合、リンクiノードはターゲットのiノード(存在する場合)とは異なるアクセス許可を持つことができますか?
これはUNIX/Linuxに関するものではなく、ファイルシステムの実装に関するものです。しかし、そうです、Unix/Linuxはカーネルレベルでiノードを使用し、ファイルシステムの実装にはiノード(少なくとも仮想のもの)があります。
一般に、シンボリックリンクは単なるファイルです(ところで、ディレクトリもファイルです)。
file-type
仮想ファイルシステムにもシンボリックリンクを含めることができるため、Fuseまたはその他のファイルシステム実装ソースを確認してください。 (ext2/ext3/ufs..etc)
そう、
答えはUNIX/Linuxのiノードですか?
ファイルシステムの実装によって異なりますが、通常、iノードには「ファイルタイプ」(および所有者、アクセス権、タイムスタンプ、サイズ、データブロックへのポインタ)が含まれています。 (物理的な実装では)inode
sを持たないが、カーネルとの互換性を維持するための「仮想iノード」しかないファイルシステムがあります。
はいの場合、iノード番号はターゲットとリンクで同じですか?
いいえ。通常、シンボリックリンクは、独自のiノード(ファイルタイプ、独自のデータブロックなど)を持つファイルです。
はいの場合、リンクiノードはターゲットのiノード(存在する場合)とは異なるアクセス許可を持つことができますか?
これは、howシンボリックリンクファイルの処理方法についてです。通常、カーネルはシンボリックリンクのパーミッションの変更を許可しません-そしてシンボリックリンクは常にデフォルトのパーミッションを持っています。シンボリックリンクに異なるパーミッションを許可する独自のファイルシステムを作成することもできますが、chmod
のような一般的なプログラムはシンボリックリンク自体のパーミッションを変更しないため、問題が発生します。そのようなファイルシステムを作成しても意味がありません)
ハードリンクとシンボリックリンクの違いを理解するには、最初にディレクトリを理解する必要があります。
ディレクトリは、カーネルに「このファイルをfile-name
からinode_number
へのマップとして処理する」ように指示するファイル(iノードのフラグで区別される)です。ハードリンクは、同じinode
にマップされる単なるファイル名です。したがって、ディレクトリファイルに次のものが含まれている場合:
file_a: 1000
file_b: 1001
file_c: 1000
上記の意味は、このディレクトリに3つのファイルがあることを意味します。
これがシンボリックリンクとの主な違いであり、file_b
(inode 1001)のiノードにはcontent "file_a"と「これはシンボリックリンクです」を意味するフラグがあります。この場合、file_b
はfile_a
を指すシンボリックリンクになります。
これを自分で簡単に調べることもできます。
_$ touch a
$ ln -s a b
$ ln a c
$ ls -li
total 0
95905 -rw-r--r-- 1 regnarg regnarg 0 Jun 19 19:01 a
96990 lrwxrwxrwx 1 regnarg regnarg 1 Jun 19 19:01 b -> a
95905 -rw-r--r-- 2 regnarg regnarg 0 Jun 19 19:01 c
_
ls
の_-i
_オプションは、最初の列にiノード番号を示します。シンボリックリンクのiノード番号が異なるのに対し、ハードリンクのiノード番号は同じであることがわかります。 stat(1)
コマンドを使用することもできます。
_$ stat a
File: 'a'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 28h/40d Inode: 95905 Links: 2
[...]
$ stat b
File: 'b' -> 'a'
Size: 1 Blocks: 0 IO Block: 4096 symbolic link
Device: 28h/40d Inode: 96990 Links: 1
[...]
_
これをプログラムで実行する場合は、lstat(2)
システムコールを使用してシンボリックリンク自体に関する情報(iノード番号など)を検索できます。stat(2)
はシンボリックリンクのターゲット(存在する場合)。 Pythonの例:
_>>> import os
>>> os.stat("b").st_ino
95905
>>> os.lstat("b").st_ino
96990
_