次のページ 前のページ 目次へ

10. コンピュータはどのようにしてディスク上に情報を格納するの?

Unix でハードディスクの内容を見ると、名前の付いたディレクトリや ファイルのツリーがあります。通常それ以上のことを知る必要はありま せんが、深いところで何が行われているかを知っていると、ディスク・ クラッシュが起こってファイルを救おうとする場合などに役立つことも あります。残念なことに、ディスクの構造をファイルレベルから下の方 に下りながら説明するのによい方法がないのです。ということで、ここ ではハードウェアから上の方に向かって説明しなければなりません。

10.1 低レベルのディスクとファイルシステム構造

データを格納する場所であるディスクの表面領域は、環状のトラックが 前もってセクタ(sector:扇形)に切り分けられ、ちょうどダーツ盤の ように分割されています。外側の端に近いトラックは、ディスクの中心 部にあるスピンドル(中心軸)に近いところより多くの領域を持つため、 外側のトラックは内側のトラックより多くのセクタに区切られています。 各セクタ(またはディスクブロック)は同一のサ イズであり、最近の Unix では一般的に 1 キロバイト(1024 個の 8 ビ ット・ワード)です。各ディスクブロックはユニークなアドレスまたは ディスクブロック番号を持っています。

Unix ではディスクをディスク・パーティション に分けます。各パーティションはブロックが連続したもので、ファイル システムとしてもスワップスペースとしても、他のどのパーティション とも区別して使われます。一番小さい番号がつけられたパーティション は、ブートするカーネルを置くためのブート・パーティショ ン専用として取り扱われることがしばしばあります。

各パーティションは、スワップスペース( 仮想メモリを実装するために使われます)かまたは、 ファイルを保持するために使われる ファイルシステムのいずれかです。スワップスペース ・パーティションは単に連続したブロックの並びとして扱われます。一 方ファイルシステムは、ファイル名をディスクブロックの並びに対して マッピングするための方法を必要とします。なぜならば、ファイルとい うものは時間の経過につれそのサイズが大きくなったり小さくなったり、 また内容が変更されたりするので、各ファイルのデータブロックは連続 した並びではなくなってゆき、そのパーティション中に散り散りばらばら になってしまうかもしれないからです(オペレーティング・システムは、 必要なときにそのパーティションのどこからか空いているブロック を見つけることができるようになっています)。

10.2 ファイル名とディレクトリ

各ファイルシステムにおいては、名前からブロックへのマッピングは i-ノードと呼ばれる構造体を通して行われます。 各ファイルシステムの「底」(最小の番号がつけられたブロック)の近 くに、これらのものをプールしておく場所があります(この最小の番号 がついた場所は管理やラベリングの目的で使われますが、ここではふれ ません)。各々の i-ノードは 1 つのファイルを表します。ファイルの データブロックは、i-ノードがあるから成り立っているのです。

各々の i-ノードには、それが表すファイルのディスクブロック番号のリ ストが入っています(実際は、これは正確ではありません。本当は小 さなファイルにのみ当てはまりますが、これに関する具体的な 話はここでは重要ではありません)。i ノードにはファイルの名前が入 っているのではないことに注意してください。

ファイルの名前はディレクトリ構造体の中にあり ます。ディレクトリ構造体は、単に名前から i-ノードへのマッピングを 行っているだけです。なぜなら Unix では、1 つのファイルは複数の本 当の名前(またはハードリンク)を持つことがで きるからです。それらは単に、たまたま同じi-ノードを指している、複 数のディレクトリ・エントリなのです。

10.3 マウントポイント

もっとも単純なケースでは、Unix ファイルシステム全体がただ 1 つの ディスク・パーティション内にあります。ある種の小さなパーソナル Unix システムでこのような構成になっていることがありますが、これ は例外なのです。より一般的には、ファイルシステムはいくつかのディ スク・パーティションにまたがり、時には異なった物理ディスクにまた がっていることもあります。そこで、たとえばあなたのシステムでは、 小さな 1 つのパーティションにカーネルがあり、それより少し大きな パーティションに OS のユーティリティが入っていて、さらに大きな パーティションにユーザのホーム・ディレクトリがあるとしましょう。

システムのブート後すぐにアクセスする唯一のパーティションは ルート・パーティション です。(ほとんど常に)こ こからブートが始まります。ここはファイルシステムのルート・ディレ クトリを保持していて、ぶらさがっているもの全ての最上位ノードです。

システム内のそれ以外のパーティションは、複数パーティションにまたがるあなた のファイルシステム全体がアクセス可能になるように、このルート・ディレクトリ に接続されなければなりません。ブート処理の途中あたりに、Unix システムはこれ らルートでないパーティションをアクセス可能にします。 これは、そのパーティションをルート・パーティション上のあるディレクトリに マウントすることにより行います。

たとえば `/usr' と呼ばれる Unix のディレクトリがありますが、これ はおそらくパーティションへのマウントポイントであり、その中には Unix にインストールされている多くのプログラムが入っています。し かしこれらは、ブートの最初の時点では必要とされないものです。

10.4 どうやってファイルを検索するの?

さて、どうやってファイルをトップダウンで検索すればいいのでしょう。 あなたがファイル(たとえば/home/esr/WWW/ldp/fundamentals.sgml) をオープンする際に起こっているのは以下のようなことです:

カーネルは、(ルート・パーティションにある) Unix ファイルシステ ムから検索を開始します。そこに `home' と呼ばれるディレクトリがあ ります。普通 `home' は他のところにある大きなユーザ・パーティショ ンへのマウントポイントで、まずそこへ行きます。そのユーザ・パーテ ィションのトップレベルのディレクトリ構造において `esr' というエ ントリがあるので、その i-ノード番号を抽出します。その i-ノードへ行 き、それがディレクトリ構成であることを知り、次に `WWW' を探しま す。その i-ノード番号を抽出し、対応するサブディレクトリ に行き、`ldp' を探します。そこもまたディレクトリの i-ノードです。 それをオープンし、`fundamentals.sgml' の i-ノード番号を探します。 その i-ノードはディレクトリではなく、そのかわりそのファイルに関連 するディスクブロックのリストを保持しています。

10.5 ファイルの所有権、パーミッション、セキュリティ

壊してはいけないデータをプログラムが事故で、あるい は悪意を持って壊さないようにするため、Unix には パーミッションという機能があります。これは元々、 同じマシン上にいる複数のユーザを保護することによってタイムシェアリングを サポートするために設計された機能であり、主に高価な共有ミニコンピュータ上で Unix が使われていた時代に作られたものです。

ファイルパーミッションを理解するためには、 ログインすると何が起こるのの章の ユーザとグループの説明を思い出す必要があります。全てのファイルは所有ユーザ と所有グループを持っています。これらの初期値はファイルの作成者です。値を変 えるには chown(1) と chgrp(1) というプログラムを使い ます。

ファイルに持たせられる基本的なパーミッションは 「読み取り」(ファイルからデータを読み取る許可)、 「書き込み」(ファイルを修正する許可)、 「実行」(ファイルをプログラムとして実行する許可)です。それぞれのファイルは 3 組のパーミッションを持っています。つまり所有ユーザに対するパーミッション、 所有グループに対するパーミッション、それ以外の全ての人に対するパーミッション です。ログインした時に得られる「権限(privileges)」は、 パーミッションを表すビットが自分のユーザ ID か自分が所属しているグループに 一致するファイルの読み取り、書き込み、実行を行うことだけです。

パーミッションがが与える影響と、Unix がパーミッションをどのように表示するの かを知るために、仮想的な Unix システムにおけるファイルのリスト表示を見てみ ましょう。以下がそのリストです:

snark:~$ ls -l notes
-rw-r--r--   1 esr      users         2993 Jun 17 11:00 notes

これは通常のデータファイルです。リスト表示を見ると、これはユーザ `esr' が所 有しており、所有グループ `users' で作成されていることがわかります。 我々が使っているマシンでは、全ての一般ユーザはデフォルトでこのグループに入っ ているでしょう。タイムシェアリングシステムのマシンで他によく使われる グループとしては、`staff', `admin', `wheel' があります(自明なことですが、 個人使用のワークステーションや PC ではグループはあまり重要ではありません。)。 あなたが使っている Unix では、異なるデフォルトのグループ(多分ユーザ ID の後 に示されているグループだと思います)を使っているかもしれません。

文字列 `-rw-r--r--' はそのファイルのパーミッションビットを表します。 最初のダッシュ(`-')は、ディレクトリビットの位置です。そのファイルがディ レクトリなら、これは `d' となります。それからその次の 3 つがユーザパーミッション、 その次の 3 つがグループパーミッション、その次の 3 つが それ以外に対するパーミッション(「世界中に対する」パーミッションと呼ばれるこ ともあります)です。このファイルの場合は、所有ユーザ `esr' はファイルの読み 書きができ、`users' グループの他のユーザはファイルを読むことができ、それ以 外のユーザは全員ファイルを読むことができます。 このパーミッションの組み合わせは、通常のデータファイルとしては典型的な設定で す。

さて、まったく別のパーミッションを持つファイルを見てみましょう。このファイ ルは GCC(GNU C コンパイラ)です。

snark:~$ ls -l /usr/bin/gcc
-rwxr-xr-x   3 root     bin         64796 Mar 21 16:41 /usr/bin/gcc

このファイルは `root' と呼ばれるユーザと `bin' と呼ばれるグループに所属して います。このファイルに書き込み(変更)ができるのは root だけですが、読み取り と実行は誰でも行えます。これは予めインストールされているシステムコマンドの 所有者およびパーミッションとしては典型的な設定です。`bin' グループは、 システムコマンドをまとめるために一部の Unix システムで用意されています。 Unix の種類によっては、`bin' グループでなく `root' グループを使っている場合 もあります(`root' グループと `root' ユーザは全く別物です!)。

`root' ユーザは、数値ユーザ ID が 0 のユーザの伝統的な名前です。これは は特別なユーザであり、他の権限を上書きできる特権を持っています。root による アクセスは便利ですが、危険でもあります。root としてログインしている時の入力 ミスで、重要なシステムファイルを壊してしまうかもしれないからです。 同じコマンドを実行しても、一般ユーザのアカウントからであれば、こういった ファイルは壊せません。

root のアカウントは非常に強力なので、root へのアクセスは特に厳重に守るべき です。root のパスワードは、システムのセキュリティ情報の中でも最も重要なもの であり、あなたを狙っているクラッカーや侵入者が奪おうとしているものです。

(パスワードについて: パスワードは書き留めてはいけません。自分の名前や友達、 配偶者の名前など、簡単に推測できるようなパスワードを選んではいけません。 これはクラッカーをとても助ける、この上なく悪い習慣です…。)

次に、3 番目のケースを見ましょう:

snark:~$ ls -ld ~
drwxr-xr-x  89 esr      users          9216 Jun 27 11:29 /home2/esr
snark:~$ 

このファイルはディレクトリです(最初のパーミッションの項目が `d' であること に注意)。このファイルに書き込みができるのは esr だけですが、他の誰でも読み 取りと実行は可能です。ディレクトリの場合、パーミッションの扱われ方は特別で す。ディレクトリのパーミッションは、そのディレクトリに入っているファイルへ のアクセスを制御します。

ディレクトリの読み取りパーミッションは簡単です。単に、そのディレクトリの 内容を調べられるかどうかを表します。書き込みパーミッションは、そのディレク トリ内でのファイルの作成・削除の許可を出します。実行パーミッションは、その ディレクトリの「検索」の許可を出します。ディレクトリの内容を表示する時、ファ イルを作成・削除する時は検索可能でなければなりません。世界中から実行できる けれど世界中から読み取ることはできないディレクトリをよく見かけますが、これ は不特定のユーザにディレクトリ内のファイルやディレクトリの取得を許すけれど、 許すのは正確な名前がわかっている場合に限るという意味になります。

最後に、login プログラム自身のパーミッションを見てみましょう。

snark:~$ ls -l /bin/login
-rwsr-xr-x   1 root     bin         20164 Apr 17 12:57 /bin/login

これは、所有者の実行ビットの `s' を除けば、システムコマンドで想定される パーミッションになっています。これは `set-user-id' または `setuid ビット' と呼ばれる特殊なパーミッションを示しています。

setuid ビットは普通、一般ユーザに root 権限を与える(ただし制限された形で)必 要があるプログラムに付けられます。setuid ビットが実行プログラムに付けられて いると、そのプログラムを実行している間は、プログラムファイルの所有者の権限 を得ることができます。 それがあなた自身の権限と一致しているかどうかは関係ありません。

root アカウントそのものと同じく、setuid されたプログラムは便利であると同時 に危険でもあります。root が所有者の setuid されたプログラムを壊したり改変で きる人は誰でも、これを使って root 権限を持つシェルを起動できます。そのため、 ほとんどの Unix システムでは、ファイルをオープンして書き込みを行うと、 setuid ビットは自動的に落とされます。Unix のセキュリティに対する攻撃の多く は、セキュリティを破るために setuid されたプログラムをのバグを突こうとしま す。したがって、セキュリティに気を使うシステム管理者は setuid されたプログ ラムに特に注意を払っており、こういったプログラムを新しくインストールするこ とを嫌います。

先にパーミッションの説明を行ったときにはごまかしていた、細かいけれど重要な 話が 2 つあります。つまり、ファイルが最初に作成されたときの所有グループと パーミッションの付け方です。 ユーザは複数個のグループに所属できるのでグループの付け方が問題になるのです が、そのうちの一つ(/etc/passwd の項目で指定したもの)がユーザの デフォルトグループになり、ユーザが作ったファイルは普通、 このグループの所有となります。

最初に付くパーミッションビットの話はもう少し複雑な問題です。ファイルを作る プログラムでは普通、最初のパーミッションを指定します。しかし、この値は umask と呼ばれるユーザの環境変数によって修正されます。 umask 値は、ファイルを作る際に落とすパーミッションビットを指定しま す。最もよく使われる値であり、かつほとんどのシステムでのデフォルト値となっ ているのは -------w- すなわち 002 です。この値は世界中からの書き込みビット を落とします。詳しくは、お使いのシェルの man ページで umask コマンドに関す る説明をご覧ください。

10.6 どうして動作がおかしくなるのでしょう?

前に、ファイルシステムは壊れやすいものであると ほのめかしたことがありましたね。ここで私たちは、ファイルを得るた めには、気まぐれな長いチェインをもつディレクトリや i-ノード参照の 迷路の中で、石けり遊びみたいなことをしなければならないことが分か っています。ここで、あなたのハードディスクに悪いところがあること が明るみに出たとします。

運が良ければ、いくつかのファイルデータが壊れるくらいですむでしょ う。運が悪ければ、ディレクトリ構造や i-ノード番号に矛盾が生じ、あ なたのシステムのサブツリーがまとめて奈落の底に落ちることでしょう。 あるいはさらに運が悪ければ、ファイル構造体が乱され、一つのディスク ブロックや i-ノードへの参照がダブってしまったりするかもしれません。 このような乱れは正常なファイル操作にも広がり、もともとは正しい場 所にあったデータまでも次々と破壊されてしまいます。

幸いにもこのような偶発的な事故は、ディスクのハードウェアの信頼性 が上がってきたために、非常に少なくなってきました。それでもなお、 間違った個所がないことを保証するために、Unix が定期的にファイル システムの整合性を取りたいと考えることも無理のないことです。最近 の Unix は、ブート時(マウントする直前)に各パーティションに対し て高速な整合性チェックを行います。また、何回かブートするごとに、 より詳細なチェックを行うので、この際は多少時間がかかります。

こんなことを聞くと、Unix とは恐ろしく複雑でトラブルが起こりやす いもののように感じるかもしれませんが、これらブート時のチェックは、 実際に被害に遭う前に検出可能な問題を見つけたり修正した りすることにより、ユーザを安心させるためなのです。他のオペレーテ ィング・システムにはこういった機能はなく、ブート処理の速度をちょ っとばかり向上させる代償に、ユーザがびくびくしながら手作業で修復 しようとせざるを得ないことを強いています(要するに、最初からノー トン・ユーティリティか何かをひとつ準備しておけ、ということですね)。


次のページ 前のページ 目次へ