2006年5月25日 (木)

PostgreSQLにセキュリティホール

また入れ換えか。。。

PostgreSQLにセキュリティホールが見つかったらしい。でも、即日修正モジュールがリリースされたということ。ここ2ヶ月ばかり、PostgreSQL 8.1.3 でWebシステムの検証を実施してきたのに、一部またやり直しだなぁ。なってこった。。。

でも、Webシステムリリース前でよかった。サービスがはじまれば、それはそれで面倒なものだから。

明日、若い人にたのんで、さっそく入れ換え & 再試験の実施をお願いしよっ~と。

PostgreSQL Global Development Groupは5月22日,オープンソースのデータベース管理システム(DBMS)「PostgreSQL 7.x/8.x」にセキュリティ・ホールが見つかったことを明らかにされた。不正なSQL文を送り込まれる「SQLインジェクション」攻撃を許して,データベース内の情報を操作される恐れなどがある。対策は,同日リリースされたバージョン 8.1.4/8.0.8/7.4.13/7.3.15にアップグレードすること。
。。。
ITpro オープンソース/Linux ニュース記事[2006/05/25]より 「PostgreSQL」にセキュリティ・ホール,SQLインジェクション攻撃を許す

| | コメント (19) | トラックバック (72)

2006年5月 8日 (月)

UNIX:ファイルを更新する

ガミガミ

UNIXのファイルを更新することは、システムを運用している方なら毎日のように行っていると思います。
ところが、ファイルを更新する「やりかた」は人によってまちまちで、あまり「こうしなさい」とガミガミいわれていないようです。

私の周りのSEの方々で、一番多いのは「vi コマンドでファイルを直接更新する」方法です。

しかし、この方法には問題があると思っています。私は、周りの人には毎年のように「○○のようにしなさい」と言っています。

可変長ファイルの更新

UNIXのviコマンドなどで編集するファイルは通常、可変長レコードのテキストファイルです。1行を1つの1レコードと考えると、各行の長さはまちまちで決まっていません。

空白や改行コードなどで、自由にレイアウトを決めることができる、便利なファイルですが、データ更新には全然向いていません。

途中のデータを1バイト削除することは、残りのデータ部分をすべて1バイト前に複写することになり、逆に1バイト挿入する場合はその逆に1バイト後に複写する必要があります。
結局、データを更新するということは、ごっそり新しいファイルを作成することと等しい結果になります。

元のデータ
 0  1  2  3  4  5  6  7  8  9
+--+--+--+--+--+--+--+--+--+--+
|# |t |e |s |t |f |i |l |e |LF|
+--+--+--+--+--+--+--+--+--+--+

1バイトを削除したデータ
 0  1  2  3  4  5  6  7  8  
+--+--+--+--+--+--+--+--+--+
|t |e |s |t |f |i |l |e |LF|
+--+--+--+--+--+--+--+--+--+

ファイルの更新

私は必ず、プログラムが参照するようなUNIXファイルの更新を、次のように行うように推奨しています。

  • ファイルの存在するディレクトリに2つのファイルを作成する。
  • 1つはバックアップ用のファイル
  • もう1つは更新用のファイル
  • 更新用のファイルを vi でも emacs でも適当なエディタで更新する。
  • 元のファイルの owner/group属性、パーミッションが同じことを確認する。
  • 更新ファイルを mv コマンドで入れ替える。
  • (同ファイルを参照しているプログラムを再起動する。起動のたびに読み込むようなプログラムなら次回起動から変更した内容が有効になる)

更新するファイルを /etc/hosts とすると、次のようなコマンド処理になります。

# cd /etc
# SUFFIX=`date +'%Y%m%d'`
# cp -p hosts hosts.$SUFFIX.new
# cp -p hosts hosts.$SUFFIX.old
# vi hosts.$SUFFIX.new    ←このファイルを更新
# ls -l hosts hosts.$SUFFIX.*
# (rm hosts)              ← この処理を行ってはなりません!!
#                            行った場合は、次のmvを行うまでの時間、
                             ファイルが存在しない空白の時間帯が
                             発生してしまいます。
# mv hosts.$SUFFIX.new hosts ← リネーム処理

なぜ、こんな更新をするのか

viコマンドで直接ファイルを更新しないで、わざわざこんな更新を行う理由は次のとおりです。

  • viコマンドで一度ファイルを更新(write)してしまえば、ファイルのinode番号は変わってしまいます。後戻りはできません。
  • 更新したファイルの inode番号は変わります。
  • ファイルが存在しない時間はありません。リネーム(rename)処理で「旧ファイルの削除」と「ファイル名の変更」はOS内部で一気に行います。
  • バックアップが存在します。

Linuxに付属する vi コマンドには、これよりもっと高度な機能が実装されており、わざわざこんな更新を行う必要はないのかもしれません。

ただ、ファイルの更新がどのように行われ、プログラムはどのようにデータにアクセスするのかを十分に理解した上で、毎日の運用業務を実践していかなければならないでしょうね。

| | コメント (7) | トラックバック (35)

2006年4月25日 (火)

UNIX:シンボリックリンクファイルを制す

inode番号の復習

前回までにこんなことを説明してきました。

  • OS(オペレーティングシステム)は、ハードディスクなどに作成するファイルを、「ファイルシステム」という仕組みで管理します。
  • UNIXのファイルシステムは、どこかのディレクトリにマウントして利用します。C:、D:などのドライブ名ではアクセスしません。
  • UNIXのファイルシステムでは、各ファイルの情報を、inodeというデータに保存します。
  • inodeには、ファイルシステム毎に一意の番号が割り振られ、その番号を inode番号といいます。
  • inodeには、ファイルの名前を保存する場所がありません。ファイルの名前は、ディレクトリに保存します。

ファイルシステムの表示例

ファイルシステムは普段 df コマンドを起動することでも、よく目にしていることと思います。 次の表示の例は FreeBSDという Linuxとは異なるOSのdfコマンドの出力結果です。 ハードディスクに作成したファイルシステムとして、/、/home、/usr、/var の4つのファイルシステムを表示しています。

FreeBSD 5.3-RELEASE (www) #3: Sat Dec 18 01:06:07 JST 2004
wwwsv06% df -k
Filesystem  1K-blocks    Used    Avail Capacity  Mounted on
/dev/ar0s1a    253678   47024   186360    20%    /
devfs               1       1        0   100%    /dev
/dev/ar0s1f  32494668 6626562 23268534    22%    /home
/dev/ar0s1e   4058062  965550  2767868    26%    /usr
/dev/ar0s1d   4058062  696530  3036888    19%    /var
wwwsv06%

図1 FreeBSDの df コマンド出力情報

会社の内線番号一覧

ディレクトリには、ファイルの名前とそのinode番号を格納します。 また、ディレクトリは、そのファイルの存在するファイルシステムと同じファイルシステムに存在しなければなりません。 つまり、inode番号はそのファイルシステム内でのみ一意であり、異なるファイルシステムではまったく意味をもちません。

例えば、わが家には、FAX機能付きの電話機1台(親機)と子供の部屋用に子機が2台あります。 この3台の電話機には それぞれ 親機、子機1番、子機2番を識別する番号が存在し、簡単なボタン操作で電話をかけることができます(そのはずです)。 親機、子機を識別する番号は、家の中では一意ですが、隣の家の電話機と一意ではありません。

また、会社の机の上の電話機は、内線番号を使って識別していますが、A社に 9448 という内線番号を割り当てたからといって、B社の 9448 という内線番号とはまったく関係ありません。

次のような会社の内線番号一覧をよく見かけると思いますが、実はディレクトリのデータと考え方はまったく同じです。

氏名内線番号
鈴木3313
田中9448
斉藤5511
佐藤3551

ディレクトリとファイルのリンクはファイルシステム内で有効であり、異なるファイルシステムにまたがることはできません。ファイルシステムにまたがって一意にファイルを示す、電話番号に相当するものはありません。

シンボリックリンクファイルの登場

この問題を解決するために、シンボリックリンクファイル(またはソフトリンク)という考え方が導入されました。 シンボリックリンクファイルにより、どこのファイルシステムに存在するのかを意識することなく、自由にファイルに名前を付けることができるようになりました。 シンボリックリンクファイルは、inode番号を使ってファイルを指し示すのではなく、そのファイルのパス名を使用します。

■ファイルシステム1
/home/user/log/test.log ファイル(シンボリックリンクファイル)
=======================================================================
+--------------+
| ino |name    |親ディレクトリ
+--------------+
| 505 |test.log|--+
+--------------+  |
                  |    inode
                  +->+--------------+
                     |ino = 505     |
                     |nlink = 1     |    test.logのデータ
                     |mode = S      |--->+-----------------------+
                     +--------------+    |/var/log/debuglog      +---+
                                         +-----------------------+   |
                                                                     |
                                                                     |
■ファイルシステム2                                                 |
/var/log/debuglog ファイル(参照先のファイル、実ファイル)           |
=====================================================================|
+--------------+                                                     |
| ino |name    |親ディレクトリ                                       |
+--------------+                                                     |
| 123 |debuglog|--+                                                  |
+--------------+  |                                                  |
                  |    inode                                         |
                  +->+--------------+<-------------------------------+
                     |ino = 123     |
                     |nlink = 1     |    debuglogのデータ
                     |mode = R      |--->+-----------------------+
                     +--------------+    |Jan  1 11:12:33 s01 ...|
                                         +-----------------------+

=======================================================================

図2 シンボリックリンクの構成

シンボリックリンクファイルを作成する

シンボリックリンクファイルの作成も ln コマンドを使用します。ハードリンクと異なるのは、"-s" オプションを指定することだけです。 上記例では

  • ファイルシステム2には、/var/log/debuglog ファイルが存在する。
  • ファイルシステム1の /home/user/log ディレクトリに test.log シンボリックリンクファイルを作成する。
  • このファイルの指し示す先は、"/var/log/debuglog"である。
$ pwd
/home/user/log
$ ln -s /var/log/debuglog /home/user/log/test.log
$ ls -l
total 4
lrwxr-xr-x   1 user  wwwuser    17 Apr 24 22:03 test.log -> /var/log/debuglog
...
図3 ln コマンドの実行例

シンボリックリンクを制して、システムを構築する

シンボリックリンクとはとっても簡単な考え方です。一般ファイルやディレクトリなどとは異なる形式の inode で、データ部分には参照先のパス名のみしか格納することができない特殊なファイルです。

ハードリンク、シンボリックリンクを完全に理解することで、柔軟なシステム構築が可能になります。

| | コメント (3) | トラックバック (19)

2006年4月13日 (木)

UNIX:ファイルの名前を変える

ファイルは移動しない

1GBもあるような大きなファイルを mv コマンドで移動したのに、1秒もかからないで終了する。 身に覚えがある方も多いんじゃないでしょうか。 UNIXの mv コマンドは、同じファイルシステム内のファイルであれば、ファイルの移動は、データの移動を伴いません。

UNIXファイルシステムの特質から、データを移動する必要がないんです。

別のファイルシステムでは

ファイルシステムが異なる場合、cp コマンドでファイルを複写する処理と mv コマンドでファイルを移動する処理はほとんど同じです。
違いは、複写元のファイルを削除するか、しないか程度です。

でも、これはあくまでファイルシステムが異なる場合です。移動元ファイル、移動先ファイルのファイルシステムが同じ場合は、mvコマンドは データの移動も、ファイルの削除も行っていません。

移動はリンク、アンリンク

古い UNIX では、ファイルの移動は、mv コマンド内で次のように実施していました(だったよな~)?

  • 移動先のディレクトリにファイルをリンクする。
  • 移動元のディレクトリからファイルをアンリンクする

以下の図は、/var/tmp/A/from.txt ファイルを /var/tmp/B/to.txt ファイルに移動する様子を示しています。/var/tmp/A, B ディレクトリは同一のパーティション、ファイルシステムです。

/tmp/tmp/A                               /var/tmp/B
ディレクトリ                             ディレクトリ
+--------------+                         +--------------+
| ino |name    |                         | ino | name   |
+--------------+                         +--------------+
| ... |......  |  (3)                  +-| 123 | to.txt |(1)
+--------------+↓ここを消す           | +--------------+
| 123 |from.txt|--+                    |
+--------------+  |                    |
|     |        |  |    inode           |
+--------------+  +->+--------------+<-+ 
                     |ino = 123     |
                     |nlink = 2 (2) |    from.txtのデータ
                     |↓            |--->+--------------+
                     +nlink = 1 (4) +    |データ        |
                     +--------------+    |              | 
                                         |              |
                                         +--------------+

図1 ファイルの移動

現在はリネーム(rename)

移動処理を説明すると、次のようになります。

  • 移動先のディレクトリ /var/tmp/B に、from.txt の inode番号、ファイル名(to.txt) を追加(1)
  • このとき、移動対象のファイル from.txt の nlink を +1。(2)   リンクカウント
  • 移動元のディレクトリ /var/tmp/A に登録されているの from.txt のinode番号とファイル名の情報を削除(3)
  • このとき、移動対象のファイル from.txt の nlink を -1。(4)

現在のUNIXでは、この一連の処理を rename システムコール一回で完了するように実装しています。

同一ファイルシステムにおいて、ファイルを移動することは、実は、ディレクトリに登録している名称を A から B に変更するだけなんです。

| | コメント (2) | トラックバック (9)

2006年4月10日 (月)

UNIXのハードリンク

ファイルシステム

ファイルシステムは、ハードディスクのパーティション単位に作成します。Windowsの、FATやNTFSなどは聞いたことがあると思います。Linuxで普段利用しているファイルシステムは、ext2やext3などでしょう。

ファイルシステムとは、おおざっぱに言ってしまえば、ハードディスクやCD-ROMに記録されているデータにアクセスするための「仕組み」ということになります。通常、1つのパーティションに1つのファイルシステムを作成します。

マウント

UNIXでは、作成したファイルシステムを どこかのディレクトリに mount して、"/var/log/syslog.log" などの形式でファイルにアクセスします。Windowsでは 「mount する」という概念がなく、"C:\WINDOWS\SYSTEM....." のように 作成したファイルシステムはドライブ名からアクセスします。Windowsの「ネットワークドライブの割り当て」が mount という概念に近いのですが、UNIXのように、「どこかの」ディレクトリ(フォルダ)から自由にディレクトリ階層を構成することはできません。

"C:\Program File\tools" フォルダは、実は "D:" ドライブを指しているなんて構成にはできません。(できたら随分楽なのに。。。)

ファイルシステムもマウントもここでは、詳しく説明しませんが、パーティション単位にファイルシステムを作成すると理解してください。

ディレクトリとは

UNIX:ディレクトリの正体を理解するでも説明したように、UNIXのファイルシステムでは、ファイルを inodeとデータで管理しています。また、ファイルのinodeには、そのファイル名を格納しません。ファイル名は、ディレクトリに、 inode番号と そのファイルの名前のペアで格納しています。

。。。
ディレクトリは inode番号とそのファイルの名前だけを格納するファイルです。
電話番号と名前が書いてあるアドレス帳を思い浮かべてください。ディレクトリは、たったそれだけのアドレス帳と同じです。
。。。。

リンクカウント

"ls -l" の出力結果で、左から2番目に出力する数字の意味はご存知ですか?これはリンクカウントといいます。リンクカウントとはその inode を参照しているディレクトリ数をあらわしています。実際のコマンドを実行して、リンクカウントの意味を理解しておきます。

次のコマンドを実行すると、a.txt ファイルのリンクカウントは 1 であることがわかります。"rw-rw-r--" と "pagan" の間の数字です。

$ mkdir /tmp/w1
$ cd /tmp/w1
$ ls -l
total 0
$ echo "ABC" > a.txt
$ ls -l
total 4
-rw-rw-r--  1 pagan pagan 4 Mar 27 12:00 a.txt
$
...
図1 ファイルを作成するとリンクカウントは 1になる

ファイルを作成した直後の状態では、ファイルのリンクカウントは 1 になります。上記の例では、"/tmp/w1" ディレクトリにファイルを作成しました。これは、"/tmp/w1" ディレクトリのデータ部に inode番号と "a.txt" という名称を登録したということです。"/tmp/w1" ディレクトリから "a.txt" ファイルを参照することになるので、"a.txt"ファイルのリンクカウントは "1" です。

/tmp/w1 ディレクトリ
+--------------+
| ino |name    |
+--------------+
| 901 |a.txt   |--+
+--------------+  |
                  |    inode
                  +->+--------------+
                     |ino = 901     |
                     |nlink = 1     |    a.txt のデータ
                     |              |--->+--------------+
                     +--------------+    |ABC\n         |
                                         |              | 
                                         |              |
                                         +--------------+

図2 リンクカウントが 1のinodeとディレクトリの関係

リンクカウントを増やす?

では、このファイルを同じディレクトリから、別の名前で参照できるように設定してみます。設定は"ln" コマンドを使えば簡単にできます。ln コマンドは、ディレクトリにファイルを登録するためのコマンドです。また、"ls" コマンドには "-i" オプションを付けて、inode番号も確認します。同じディレクトリに、"a.txt" という名前のファイルと、"b.txt" という名前のファイルができていますが、inode番号は同じ 901 となっています。ファイルの実態は1つで、2つの名前が付いているという状態です。リンクカウントは 2 になっています。

$ ln ./a.txt ./b.txt
$ ls -il
total 8
901 -rw-rw-r--  2 pagan pagan 4 Mar 27 12:00 a.txt
901 -rw-rw-r--  2 pagan pagan 4 Mar 27 12:00 b.txt
$ 
...
図3 lnコマンドでファイルの別名をつける

この操作のことを「ハードリンクを作成する」といいます。"ln"コマンドは、"リンク"を作成するためのコマンドです。ディレクトリに inode番号とファイル名を登録し、そのファイルの リンクカウントを "+1" する操作のことです。ファイルを最初に作成することも、「ハードリンクを作成する」ことになりますが、この場合は「ハードリンクを作成する」とはあまりいいません。

この関係を示したものが、下の図です。

/tmp/w1 ディレクトリ
+--------------+
| ino |name    |
+--------------+
| 901 |a.txt   |--+
+--------------+  |
| 901 |b.txt   |--+
+--------------+  |
                  |    inode
                  +->+--------------+
                     |ino = 901     |
                     |nlink = 2     |    a.txtのデータ
                     |              |--->+--------------+
                     +--------------+    |ABC\n         |
                                         |              | 
                                         |              |
                                         +--------------+

図4 リンクカウントが 2のinodeとディレクトリの関係

別のディレクトリからもリンクを作成する

別のディレクトリからも "a.txt" にリンクを作成してみます。

$ mkdir /tmp/w2
$ cd /tmp/w2
$ ln ../w1/a.txt ./c.txt
$ ls -il
total 4
901 -rw-rw-r--  3 pagan pagan 4 Mar 27 12:00 c.txt
$ 
...
図5 別ディレクトリからもリンクしてみる

リンクカウントが "3" になっていますね。ただし、1以上なので、"c.txt"ファイルを他のディレクトリから参照しているということはわかっても、それがどこのディレクトリからなのか、よくわかりません。ハードリンクを多用すると、ファイル管理が複雑になってしまいます。ハードリンクを使用する場合は、運用のことをよく考えて利用するようにしたいものです。

/tmp/w1ディレクトリ                      /tmp/w2ディレクトリ
+--------------+                         +--------------+
| ino |name    |                         | ino | name   |
+--------------+                         +--------------+
| 901 |a.txt   |--+                    +-| 901 | c.txt  |
+--------------+  |                    | +--------------+
| 901 |b.txt   |--+                    |
+--------------+  |                    |
                  |    inode           |
                  +->+--------------+<-+
                     |ino = 901     |
                     |nlink = 3     |    a.txtのデータ
                     |              |--->+--------------+
                     +--------------+    |ABC\n         |
                                         |              | 
                                         |              |
                                         +--------------+

図6 リンクカウントが 3のinodeとディレクトリの関係

ディレクトリからのリンクを作成する

ハードリンクは、すでに存在するファイルへの参照(inode番号とファイル名)をあるディレクトリに作成することです。
どこかのアドレス帳に、電話番号と名前を登録することです。
リンク数を減らす、つまりディレクトリに登録した名前を削除するにはどうすればいいか、わかりますか?
そう、単に "rm" コマンドを実行すればいいだけです。ファイルを削除することは、ディレクトリからのリンクを消すことです。そのとき、ファイルのリンクカウントも減算します。リンクカウントが 0 になったら、どのディレクトリからも参照していないことになるので、見えなくなります。「ファイルを削除する」とはそんな処理です。

| | コメント (1) | トラックバック (27)

2006年4月 7日 (金)

UNIXのinode番号

inode番号を理解する

UNIXファイルシステムで使用するシンボリックリンク(または、ソフトリンク、symlinkなど)はとっても便利なファイルです。Windowsのショートカットファイルに似ていますね。 このシンボリックリンクファイルに「出会ってよかった!」って思います。 特に、システム構築時に各ファイル、ディレクトリの配置を設計する人は、よく理解しておくことをお勧めします。

でも、その前に。。。

UNIXのファイルシステムの特徴、inode番号、ディレクトリの仕組みをざっくり理解しないと、なかなか難しいかもしれません。


ls-lの結果はinodeの情報

UNIXのファイルシステムでは、1つのファイルを、データ部分と属性部の2つから構成して管理します。 Linuxでは、この属性部のことを、inodeと呼んでいます。 このinodeもハードディスクに書き込まれています。データ以外にこのinode分のディスクを消費しているわけです。

inodeでは、およそ次のような属性を管理しています。どこかで見たことありませんか? そう、"ls -l" コマンドで出力する情報とほとんど同じなんです。

"drwxr--r--" は、modeの値を表示しています。

更新時刻は mtime、ファイルサイズはも size、uidもgidもここにあります。 この"ls -l"コマンドの出力情報は、inodeの内容を出力しているだけなんです。

inode
+-------------+
| mode        |ファイル区分
|             |## ディレクトリとかファイルの区分
|             |## ls -l で出力する rwxrwxrwx の情報
| ino         |inode番号(あるファイルシステムで一意の番号)
| uid         |ユーザID
| gid         |グループID
| size        |ファイルサイズ
| atime       |最終アクセス時刻
| ctime       |最終属性変更時刻
| mtime       |最終更新時刻
| nlink       |リンクカウント
| blocks      |実データへのポイント
| ....        |>>1種類ではありません
|             |>>ファイルシステム毎に異なります
+-------------+

図1 inodeの構成要素(概要)

inode番号を表示してみる。

でも、普段 "ls -l"コマンドを使っていて、inodeなんて考えて操作している人は少ないでしょうね。 このinode番号は、"ls"コマンドでも出力することができます。

"-i" オプションを付けて、コマンドを起動してみてください。 なにやら、見慣れない数字が左端に出てきませんか?

# cd /tmp
# ls -li
root@localhost tmp]# ls -li
total 32
162782 -rw-r--r--  1 root  root    99 Mar 26 22:51 a.pl
162774 srwxrwxr-x  1 pagan pagan    0 Mar 26 21:01 mapping-pagan
162757 drwx------  2 pagan pagan 4096 Mar 26 21:00 ssh-ybsvAm3007
...
図2 inode番号の表示例

この 162782という数字が、a.pl ファイルを示すinode番号です。

inodeの先に本当のデータ

ファイルのデータは、このinodeからたどって参照します。ファイルシステムの構造によって も違いますが(高速化のためにいろんな工夫がしてあります)、論理的には inode->データ の関係で理解していいでしょう。(これまで、それで困ったことはありません)

inodeとデータの関係はこんな感じです。テキストファイルも、ディレクトリも、symlinkファイル も、すべてこの構造が基本です。なお、プリンタなどをアクセスするための特殊ファイルに はデータ部はありません。

ファイルにアクセスするには、必ず、このinodeを探してこなければなりません。 逆にこの inode を読み込んでしまえば、自由にデータにアクセスすることができます。 inodeの検索効率を上げることで、ファイルアクセスの性能改善にも繋がります。

inode
+-------------+
| ino         |inode番号(このファイルを識別する番号)
|             |
|             |            データ
| blocks      |----------->+-------------+
|             |            |hello world! |
+-------------+            |my name is ..|
                           |.....        |
                           +-------------+
図3 inodeとデータの関係

ファイル名はinodeに書かれていない

もう一度、inodeの構造を見てみてください。そこには、ファイル名を格納する場所はありません。 では、このファイル名はいったいどこに格納するのでしょうか?

UNIXは、このファイル名を格納する専用のファイルを開発しました。それがディレクトリです。 ディレクトリは inode番号とそのファイルの名前だけを格納するファイルです。

電話番号と名前が書いてあるアドレス帳を思い浮かべてください。ディレクトリは、たったそれだけのアドレス帳と同じです。

アドレス帳を理解する

ディレクトリは、電話番号と名前だけのアドレス帳とイメージがぴったり合います。

  • 私の携帯電話には娘の携帯番号と苗字のない名前がひらがなで書いてある。
  • 妻の携帯電話には娘の携帯番号と愛称が書いてある。
  • 家族のアドレス帳には番号しか書いていない。
  • 家の電話には着信の鳴り分けように、名前と電話番号と音が登録してある。

電話番号がinode番号、名前はファイル名です。そして、アドレス帳がディレクトリ。 アドレス帳は家中、いたるところにあります。家の外にもあるはずです。

  • 家族それぞれの携帯電話
  • 電話の下にあるアドレス帳
  • 友達の携帯電話
  • NTTのデータベース内にも当然記録
  • 。。。

どこの場所にあるアドレス帳にも、同じ電話番号が記録されているはずです。 でも、名前は同じである必要はまったくありません。 検索したい人がわかりやすい名前をつけておけばいいんです。

UNIXではファイル名を inodeに持っていません。必要ないからです。 inode番号があれば、どのアドレス帳からでもアクセスすることができます。 ディレクトリには、inode番号に対応する、わかりやすい名前を、「どうぞご自由に」付けてくださいということです。

ここを理解すると、symlinkファイルはとっても簡単に理解できます。

ディレクトリ構造

実際のディレクトリ構造はいたって簡単です。

inode->データの関係は同じですが、データ部の構造を次のように定義しています(dir)。 dirには、そのディレクトリに存在するファイルの inode 番号とその名前を定義しているだけです。

このdirのデータ部は vi などでは参照、更新することができなくなっています。 (誰かがこの構造を勝手に書き換えるとシステムは動かなくなります。)

inode
+-------------+
| ino         |inode番号(ディレクトリの)
|             |
|             |            データ(dir)
| blocks      |----------->+-------------+
|             |            | ino         |inode番号(ファイルの)
+-------------+            | len         |ファイル名のサイズ
                           | name        |ファイル名
                           | ....        |
                           +-------------+

図4 ディレクトリのデータ要素(概要)

ディレクトリをたぐる

もう少し、具体的してみます。いたって簡単なんで、ぜんぜん難しく考える必要ありません。 実際に、/tmp ディレクトリに存在する a.c ファイルはこんな風に表現できます。 OSは、"/tmp/a.c" で表現できる a.c ファイルにアクセスする時に、図のように上から順番にアクセスしていきます。

a.cのinode番号は505です。

簡単に説明するために、一番上つまり、ルートディレクトリを単純に表現しています。 スーパブロックやマウントなど、余計なものは随分、はしょっています。雰囲気で捉えてください。

    inode
    +--------+
    |DIR     |ディレクトリ(ルート)
    |2       |
    |        |  
    |        |--->+--------------+
    +--------+    | ino |name .. |
                  |--------------|
                  | 204 |test    |
 +----------------* 201 |tmp     |
 |                | 209 |xxxx    |
 |                +--------------+
 |  inode
 +->+--------+
    |DIR     |ディレクトリ(tmp)
    |201     |
    |        |  
    |        |--->+--------------+
    +--------+    | ino |name .. |
                  |--------------+
                  | 931 |x.c     |
 +--------------- * 505 |a.c     |ここに名前
 |                | 404 |y.pl    |
 |                |   ......     |
 |                +--------------+
 | 
 |  inode
 +->+--------+
    |REG     |一般ファイル(a.c)
    |505     |
    |        |    データ
    |        |--->+--------------+
    +--------+    |main()        |データはここ!
                  |{             |
                  | printf("\n") |
                  |}             |
                  |              |
                  |   ......     |
                  +--------------+

図5 inodeのディレクトリ構造(概要)

親子関係

ちょっと補足です。

"ls -al" でファイルリストを出力すると、"." と ".." という名前が付いたファイル?があります。 これ、なんだかわかります?

実はこれ、自分自身のinode番号を "." ファイル名として格納し、親ディレクトリのinode番号を".."で格納する決まりなんです。

"cd .." や、"cd /tmp/./../tmp" など、"." もちゃんとファイルをたぐっているんです。



最大の特徴

UNIXのエンジニアの方には、このファイルとディレクトリの関係をよく理解されることをお勧めします。

特に inode番号は理解してしまえばなんでもないことです。 電話番号、名前、アドレス帳を頭の中にイメージしてできれば、「なーんだ」ってくらい簡単なことなんです。

この柔軟なディレクトリ構造、ファイル構造が UNIXの最大の特徴です。

| | コメント (5) | トラックバック (36)

2006年3月27日 (月)

なんとVMwareがフリーに

VMware Serverが無償で公開

今まで随分お金をかけてきた VMware Workstation とお別れすることになりました。なんと VMware がフリーになってしまったのです。2月のことなので、もうすでに存知のかたも多いことでしょうね。VMwareって何?という方にとっては、なんのことか、わからないと思いますが、数万円もしたソフトウェアが、ある日突然、無償になってしまったといえば、多少ご理解いただけると思います。

このソフトウェア、システム構築が仕事の私にとって、今ではなくてはならない存在です。特に、複数のサーバ構成からなるシステムを構築する場合に、ハードウェアの台数がたりなくて困ることがありません。3層構造のWebアプリケーションの構築も、Web+アプリ+DBの3X2の計6台のシステムでも、まずは私の1台のパソコンの中にすべて構築できてしまうという優れものです。

窓の杜の記事

VMware Serverについては、窓の杜の記事が丁寧に説明されていました。


米VMware, Inc.は6日(現地時間)(注 2006/02/06 のことです)、仮想PC作成・実行ソフト“VMware”シリーズのサーバー版「VMware Server」のBeta版を無償公開した。。。。

基本的な操作方法などは、本ソフトの下位版である「VMware Workstation」と共通で、作成した仮想PCにも互換性がある。また、本製品は「VMware GSX Server」の後継版であり、「VMware GSX Server」からは仮想PC内で64ビットOSを動作させる機能や、2つのCPUを利用する機能、Intelの仮想化技術である “Virtualization Technology”を利用する機能が追加された。

また、仮想PC実行専用ソフト「VMware Player」でも、本ソフトで作成した仮想PCを実行可能。

VMware Playerも無償で提供

VMware Playerもこれに先立ち、無償で提供されています。この VMware Player には大きな可能性を感じます。いままで、OSをインストールして、さまざま設定を行い、必要なアプリケーションをインストールしてシステム構築を行ってきました。でも、これさえあれば、そんなことが必要なくなるかもしれません。

MYCOM PC WEBの記事

VMwareは20日(米国時間) (注 記事の日付けが 2005/10/21 なので、2005/10/20のことでしょう)、VMware Playerの無料公開を開始した。VMware PlayerはWindowsやLinux上で動作するフリーソフトウェアのPCエミュレータ。VMware Workstation、VMware GSX Server、VMware ESX ServerなどのPCエミュレータで作成された仮想マシンを簡単に実行することができる。。。

ダウンロード

VMware Serverも、VMware Player も、VMware社のWebサイトよりダウンロードすることができます。ダウンロードは vmware -> product から、"VMware Server" や "VMware Player"などのサイトから可能になっています。

また、VMware PlayerのVirtual Appliancesサイトでは、VMwaer Player用のアプリケーションのダウンロードも可能です。

さっそくダウンロードして、インストールしておこうっと。




VMware 対 Xen。Xen の影響はこれほど大きいのか?

| | コメント (5) | トラックバック (86)

2006年3月20日 (月)

いつも説明しているsyslog。。

syslogは、UNIXで発生する異常、警告などを保守者に伝達するための仕組みの一つで、その基本的な構成、設定の方法、運用の設計、プログラミングインタフェースなどは昔から大きく変わっていません。Solaris、LinuxなどOSによっては実装の方法は若干異なりますが、その構成のシンプルさは維持されています。

このsyslogの設定や使い方を、あまり理解できていない方がときどき、いらっしゃいます。

毎回、同じ話をするのもなんなんで、何回かにわけてTipsを記録しておこうと思います。

でも、次回はいつになることやら。。。

| | コメント (1) | トラックバック (33)