FreeBSD QandA 592

FreeBSD QandA

Q. パーミッションの実行許可 (rwx の x) がよく理解できません。ファイルの
   場合は、そのファイルが実行可能かどうかを表しますが、ディレクトリだと
   どうなるのでしょうか。

A. ディレクトリの実行許可を より正確に表記すると、
      「実行/検索 (execute/search) 許可」
   となります。これは、そのディレクトリ名をパス名 (ファイル名) の一部
   として使っていいかどうかの判断に使われます。

   それではどうしてまた、パス名の一部に使っていいかどうかを示すのに、
   「検索」などというのでしょう。だいたい「検索」って何を探しているの
   でしょう。これは、カーネルの内部動作を示していて、その動作の内容を
   知らないと意味不明な言葉なのです。


   UNIX では、ファイルを示すのにパス名を使います。一方、カーネル内部で
   は、ファイルを扱うときに inode を使います。このため、カーネルは、シ
   ステムコールなどでパス名を指定された場合、そのパス名が示す inode を
   知らなければなりません。

   カーネルが最初から知っているのはルート("/")とカレント(".")の 2つの
   ディレクトリの inode だけです。

   なので、パス名で指定されたファイルをカーネルが扱うには、この2つのど
   ちらかの位置から、ひとつひとつディレトリを辿り、目的のパス名の最後
   の要素が入っているディレクトリを探し当て、そこに書かれた inode番号
   から目的とするファイルの inode を探し求める旅に出ることになります。

   この「ディレクトリを辿ってパス名で示されたファイルの inode を探す」
   ことをパスの検索(path search)といい、namei という有名なカーネル関数
   がその仕事をしています。この inode を探し求める旅で、通過するディレ
   クトリの中を「検索」していいかを決めるのが、ディレクトリの search
   permission ということになります。直訳すれば「検索許可」。「検索権」
   とも呼ばれます。

   たとえば、/etc/hosts を "/etc/hosts" という絶対パス名を使ってアクセ
   スして読みたい場合には、/etc/hosts そのものの読取り許可だけでなく、
   "/" と "/etc" 両方のディレクトリに検索許可が必要です。

   カーネルの動作をもう少し細かく書きましょう。

   "/etc/hosts" を指定されたカーネルは、これを "/", "etc", "hosts" に
   分解してひとつづつ調べていきます。"/" の inode をカーネルは知ってい
   ますから、"/" の中を検索して "etc" というエントリを見つけます。が、
   その前に "/" を検索していいかどうかを確認します。この時使うのがディ
   レクトリの実行/検索許可です(注)。許可がなければここでエラーになり、
   許可があれば中を検索して "etc" を見つけ出します。

   見つけたエントリにはファイル名(ディレクトリ名)とその inode番号の組
   が書かれていますから、inode番号から inode が手に入ります。次にやる
   のは "etc" の中を検索して "hosts" を見つけ出すことです。そう、もち
   ろん検索の前には、"etc" に実行/検索許可があるかどうかを確認します。
   許可があって "hosts" が見つかったなら、"/etc/hosts" の inode が手に
   入り、検索はここで終ります。

   カレントディレクトリ(".")からの相対指定でも、同様の検索をおこなって
   目的ファイルの inode を求めます。カレントディレクトリが /usr/X11R6 
   だとして、grep -i green lib/X11/rgb.txt を実行するには、".",
   "/usr/X11R6/lib", "/usr/X11R6/lib/X11" の3つのディレクトリに検索許
   可が必要になります。

   "lib/X11/rgb.txt" を指定されたカーネルは、パス名が "/" で始まってい
   ないので、カレントディレクトリから検索をおこないます。カレントディ
   レクトリの inode をカーネルは知ってますから、中を読んで "lib" とい
   うエントリを検索します。もちろん検索の前にはカレントディレクトリの
   実行/検索許可を確認し… あとは同じです。


   このように、カーネルにとっては単純に「検索許可」であるものが、カー
   ネルの外からは「パス名の一部に使っていいかを制限している」と説明す
   るしかない風変りなものに見えるのです。


   関連項目
     intro(2) DEFINITIONS節の File Name から File Access Permissions。
     UNIXカーネルの設計, 4.4節 パス名のiノードへの変換
     Lion's Commentary on UNIX(r) 6th Edition, unix/nami.c
     /sys/kern/vfs_lookup.c

   注
     ディレクトリの中を検索するとき、当然これらをカーネルは「読」んで
     いますが、この時に必要なのは検索許可であり、読取り許可は問われな
     いことを覚えておきましょう。読み取り許可は、ユーザープロセスが読
     む時に使われるものです。

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。