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の最大の特徴です。
最近のコメント