FreeBSD QandA 592
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 まで
お知らせください。