2013-06-04 5 views
8

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

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

質問:

が答えUNIX/Linuxでのinodeですか?

「はい」の場合、ターゲットとリンクのiノード番号は同じになりますか?

「はい」の場合、リンクのinodeには、ターゲットのiノード(存在する場合)のアクセス権と異なるアクセス権を設定できますか?

答えて

13

UNIX/Linuxについてではなくファイルシステムの実装についてですが、Unix/Linuxはカーネルレベルでinodeを使用し、ファイルシステムの実装ではinode(少なくとも仮想のもの)を使用します。

一般に

、シンボリックリンクは単に持っているファイル(ところで、ディレクトリもファイルである)、以下のとおりです。

  • フラグfile-typeシステムに伝える「iノード」にこのファイルがあります"シンボリックリンク"
  • file-content:ターゲットへのパス - 言い換えれば、シンボリックリンクは、単にinodeにフラグを持つファイル名を含むファイルです。

仮想ファイルシステムにもシンボリックリンクが存在する可能性があるため、FUSEやその他のファイルシステムの実装元を確認してください。 (EXT2/EXT3/ufs..etc)

ので、

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

は、ファイルシステムの実装に依存しますが、一般的には「ファイルタイプ」(所有者、アクセス権、タイムスタンプ、サイズ、データブロックへのポインタ)が含まれます。ファイルシステムにはinode(物理的な意味合いではありません)がありますが、カーネルとの互換性を維持するための「仮想inode」しかありません。

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

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

はい、リンクinodeがターゲットの iノードとは異なる権限を持つことができた場合は(もし1つは存在する)?

どのようにシンボリックリンクファイルが処理されます。通常、カーネルはシンボリックリンクパーミッションの変更を許可しません。シンボリックリンクは常にデフォルトパーミッションを持ちます。のような一般的なプログラムは、シンボリックリンクのアクセス権を変更しないので、このようなファイルシステムを作るのは無意味なので、シンボリックリンクに対して異なるアクセス権を許可する独自のファイルシステムを書くことはできますが、問題になるでしょう)

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

ディレクトリは、 "このファイルをfile-nameからinode_numberのマップとして扱う"というファイルをカーネルに伝えるファイルです(inodeのフラグによって区別されます)。ハードリンクは単に同じファイルにマップされるファイル名です。inodeだから、ディレクトリ・ファイルが含まれている場合:

file_a: 1000 
file_b: 1001 
file_c: 1000 

上記の手段を、このディレクトリに3つのファイルです:1000

  • file_bは、iノード1001によって記述iノードによって記述

    • file_aと
    • file_cは、再びinode 1000で記述されています(ハードリンク file_aで、ハードリンク file_aではありません - どのファイル名が最初に来たのかはわかりませんyは同一である)。

    これはfile_bのiノード(iノード1001)コンテンツ「file_a」および「これはシンボリックリンクである」を意味するフラグを有することができるシンボリックリンク、の主な違いです。この場合、file_bfile_aを指し示すシンボリックリンクになります。

  • 2

    また、簡単に自分でこれを探索することができます:ls

    $ 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 
    

    -iオプションは、最初の列のiノード番号を示しています。ハードリンクに同じシンボリックリンクがある間は、シンボリックリンクのinode番号が異なることがわかります。あなたがプログラムでこれを実行したい場合は、あなたがlstat(2)システムコールを使用することができます

    $ 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 
    [...] 
    

    stat(2)についての情報を示しているが、シンボリックリンク自体(そのinode番号など)についての情報を見つけるために:あなたはまた、stat(1)コマンドを使用することができますシンボリックリンクのターゲット(存在する場合) Pythonで例:

    >>> import os 
    >>> os.stat("b").st_ino 
    95905 
    >>> os.lstat("b").st_ino 
    96990 
    
    +0

    と 'READLINK()'あなたが与えられたシンボリックリンクにパス名として保存されているものを見つけることができます - しかし、1つのシンボリックリンクにパス名が横断する要素の1つは、それ自体であるとき、人生は本当に面白いですシンボリックリンク。カーネルはそれをaplombで処理します。人々は必ずしもそうではありません。与えられたファイルのシンボリックリンクのない絶対パスを決定する 'realpath()'もあります。 –

    関連する問題