web-dev-qa-db-ja.com

シンボリックリンクの背後には何がありますか?

シンボリックリンクは、UNIX/Linuxシステムによって内部的にどのように管理されていますか。実際のターゲットファイルがなくてもシンボリックリンクが存在する可能性があることが知られています(ダングリングリンク)。では、内部でシンボリックリンクを表すものは何ですか。

Windowsでは、答えはreparse pointです。

質問:

答えはUNIX/Linuxではinodeですか?

はいの場合、iノード番号はターゲットとリンクで同じですか?

はいの場合、リンクiノードはターゲットのiノード(存在する場合)とは異なるアクセス許可を持つことができますか?

19
Aravind

これはUNIX/Linuxに関するものではなく、ファイルシステムの実装に関するものです。しかし、そうです、Unix/Linuxはカーネルレベルでiノードを使用し、ファイルシステムの実装にはiノード(少なくとも仮想のもの)があります。

一般に、シンボリックリンクは単なるファイルです(ところで、ディレクトリもファイルです)。

  • このファイルが「シンボリックリンク」であることをシステムに通知する「inode」内のflagfile-type
  • file-content:ターゲットへのパス-言い換えると、シンボリックリンクは、iノードにフラグが設定されたファイル名を含むファイルです。

仮想ファイルシステムにもシンボリックリンクを含めることができるため、Fuseまたはその他のファイルシステム実装ソースを確認してください。 (ext2/ext3/ufs..etc)

そう、

答えはUNIX/Linuxのiノードですか?

ファイルシステムの実装によって異なりますが、通常、iノードには「ファイルタイプ」(および所有者、アクセス権、タイムスタンプ、サイズ、データブロックへのポインタ)が含まれています。 (物理的な実装では)inodesを持たないが、カーネルとの互換性を維持するための「仮想iノード」しかないファイルシステムがあります。

はいの場合、iノード番号はターゲットとリンクで同じですか?

いいえ。通常、シンボリックリンクは、独自のiノード(ファイルタイプ、独自のデータブロックなど)を持つファイルです。

はいの場合、リンクiノードはターゲットのiノード(存在する場合)とは異なるアクセス許可を持つことができますか?

これは、howシンボリックリンクファイルの処理方法についてです。通常、カーネルはシンボリックリンクのパーミッションの変更を許可しません-そしてシンボリックリンクは常にデフォルトのパーミッションを持っています。シンボリックリンクに異なるパーミッションを許可する独自のファイルシステムを作成することもできますが、chmodのような一般的なプログラムはシンボリックリンク自体のパーミッションを変更しないため、問題が発生します。そのようなファイルシステムを作成しても意味がありません)

ハードリンクとシンボリックリンクの違いを理解するには、最初にディレクトリを理解する必要があります。

ディレクトリは、カーネルに「このファイルをfile-nameからinode_numberへのマップとして処理する」ように指示するファイル(iノードのフラグで区別される)です。ハードリンクは、同じinodeにマップされる単なるファイル名です。したがって、ディレクトリファイルに次のものが含まれている場合:

file_a: 1000
file_b: 1001
file_c: 1000

上記の意味は、このディレクトリに3つのファイルがあることを意味します。

  • iノード1000で記述されたfile_a
  • iノード1001およびで記述されたfile_b
  • file_cはinode1000によって再び記述されます(したがって、ハードリンクwithfile_aであり、ハードリンクtofile_a-どのファイル名が最初に来たかを知ることができないため-それらは同一です)。

これがシンボリックリンクとの主な違いであり、file_b(inode 1001)のiノードにはcontent "file_a"と「これはシンボリックリンクです」を意味するフラグがあります。この場合、file_bfile_aを指すシンボリックリンクになります。

20
jm666

これを自分で簡単に調べることもできます。

_$ 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
_
3
regnarg