ファイルディスクリプタと i ノード
UNIX では、ファイルの内容 と ファイルの管理情報 を明確に区別しています。
通常のファイルは単なる バイト列 であり、ファイルの長さや終端情報(EOF)などのメタデータはファイル内部には含まれません。
ファイルを管理するために必要な情報は、i ノード(inode) と呼ばれるデータ構造に格納されます。
各ファイルには一意の i ノードが割り当てられ、ファイルシステム内での識別に使用されます。
UNIX の ファイルシステムの構造 や カーネルのファイル管理機能 は、システムごとに異なります。しかし、POSIX 標準 では、i ノードに格納すべき最低限の属性が規定されています。POSIX 準拠のシステムでは、以下の情報を i ノードに保持する必要があります。
- ファイルの種類(通常ファイル、ディレクトリ、シンボリックリンクなど)
- ファイルに関連付けられているハードリンクの数
- ファイルのバイト数
- デバイス番号(ファイルがデバイスファイルの場合)
- i ノード番号(ファイルシステム内での識別用)
- ファイル所有者のユーザ ID
- ファイルのグループ ID
- i ノードの変更時刻、最終アクセス時刻、最終変更時刻(タイムスタンプ情報)
- アクセス権とファイルのモード(読み取り・書き込み・実行権限など)
このように、i ノードは ファイルのメタデータを管理するための重要なデータ構造 ですが、カーネルのファイル管理全体を担うわけではありません。
たとえば、開いているファイルの一覧やキャッシュ情報 などは、i ノードではなく ファイルディスクリプタや他のデータ構造 によって管理されます。
iノードまとめ
- i ノードは、ファイルのメタデータを管理する重要なデータ構造 である
- ファイルの実体(データ)はディスク上のブロックに保存され、i ノードはその管理情報を保持する
- ファイル名とは無関係に、i ノード番号でファイルを識別する
- ハードリンクは i ノードを共有するため、異なる名前から同じファイルにアクセスできる
- ノード数には上限があり、枯渇すると新しいファイルを作成できなくなる
アクセス権とファイルのモード
UNIX では、ファイルのアクセス権はユーザごとに異なり、次の 3 つのカテゴリに分類されます。
- 所有者(User, u) - ファイルの所有者であるユーザ
- グループ(Group, g) - ファイルのグループに属するユーザ(所有者以外)
- その他(Other, o) - 上記 2 つに該当しないすべてのユーザ
各ユーザカテゴリごとに、以下の 3 つのアクセス権が設定されます。
- 読み取り(Read, r) - ファイルの内容を閲覧できる
- 書き込み(Write, w) - ファイルの内容を変更できる
- 実行(Execute, x) - 実行可能なファイル(プログラムやスクリプト)を実行できる
この組み合わせにより、ファイルのアクセス権は 9 ビット(3 × 3)で管理 されます。
また、ファイルの動作を制御するための 補助フラグ(特殊ビット) も 3 つ存在します。
- セットユーザ ID(Set User ID, SUID, s)
- セットグループ ID(Set Group ID, SGID, s)
- スティッキービット(Sticky bit, t)
これらのフラグが設定されると、実行ファイルやディレクトリの動作が以下のように変化します。
特殊フラグの意味(実行ファイルの場合)
SUID(Set User ID)
通常、プログラムを実行したプロセスは、その 実行したユーザの UID で動作します。
しかし、SUID が設定された実行ファイル を実行すると、プロセスは ファイルの所有者の UID で実行されます。
例: passwd コマンド(/usr/bin/passwd)は SUID が設定されており、一般ユーザでもパスワード変更時に /etc/shadow を更新できます。
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Jan 10 12:34 /usr/bin/passwd
(所有者 root の s が SUID を示す)
SGID(Set Group ID)
通常、プロセスは実行時に 実行ユーザの GID を引き継ぎます。
しかし、SGID が設定された実行ファイル は、ファイルのグループ ID で実行 されます。
例: 研究グループ内で共有されるツールを、特定のグループ権限で実行させる場合に使用されます。
$ ls -l /usr/local/bin/shared_tool
-rwxr-sr-x 1 root staff 123456 Jan 10 12:34 /usr/local/bin/shared_tool
(グループ staff の s が SGID を示す)
Sticky ビット(現在では実行ファイルではほぼ使用されない)
かつて Sticky ビットが設定された実行ファイル は、プログラムの実行終了後もメモリ上に残り、再実行時の読み込みを高速化するために使用されていました。
しかし、現代の UNIX システムではほぼ無効化されており、もっぱらディレクトリの制御に使用 されます(詳細は後述)。
SGID の特性(ディレクトリの場合)
SGID は ディレクトリにも適用可能 であり、この場合、そのディレクトリ内で作成されたファイルの GID は親ディレクトリの GID になる という特性があります。
例: /var/www などの共有ディレクトリで、すべてのファイルを www-data グループに自動的に所属させる設定。
$ ls -ld /var/www
drwxr-sr-x 1 root www-data 4096 Jan 10 12:34 /var/www
(ディレクトリの s が SGID を示す)
Sticky ビット(ディレクトリの場合)
Sticky ビットが設定されたディレクトリ では、そのディレクトリ内のファイルを削除できるのは、所有者か root のみ になります。
例: /tmp は多くのユーザがファイルを作成できるが、他のユーザが勝手に削除できないよう Sticky ビットが設定されている。
$ ls -ld /tmp
drwxrwxrwt 1 root root 4096 Jan 10 12:34 /tmp
(t が Sticky ビットを示す)
ファイル作成時の UID/GID の決定
- 所有者 UID → 作成したプロセスの UID になる。
- グループ GID は次のルールで決定される:
- 親ディレクトリに SGID が設定されていれば → 親ディレクトリの GID を継承
- SGID が 設定されていなければ → 作成したプロセスの GID
まとめ
- ファイルのアクセス権は、所有者 / グループ / その他の 3 つのカテゴリごとに設定される(読み取り・書き込み・実行)
- SUID → プログラム実行時に 所有者の UID で実行される
-
SGID → プログラム実行時に ファイルの GID で実行される
- ディレクトリに適用 すると、新規ファイルの GID が親ディレクトリの GID になる
- Sticky ビット → ディレクトリに適用 すると、ファイルの所有者以外が削除できなくなる
このように、ファイルのモードは UNIX のアクセス制御において重要な役割を果たします。
免責事項
本記事は、筆者の理解に基づいて執筆したものです。正確性には十分配慮していますが、内容の誤りや最新の情報と異なる可能性があります。
本記事の内容を参考にしたことによるいかなる損害についても、筆者は責任を負いかねますのでご了承ください。
正確な情報や書籍に書かれている根拠等はサポートしませんので、ご自身で公式ドキュメントをお調べください。
よって、この内容をAIの学習データに活用することはおすすめしません。