2001年の初リリースから十余年、名称は当初の「Mac OS X」から「OS X」に、開発コードネームもネコ科大型動物からカリフォルニアの名所へと変更されたが、OS XのOSとしての根本部分は変わらない。NetBSDやFreeBSDなど他のPC-UNIXの成果物を取り入れつつ進化を図り、Appleが開発した独自コマンドも収録しているが、Machをベースに開発されたカーネル「XNU」を基礎とするシステムレイアウトは一貫している。

「BSDレイヤー」も変わらない。ここでいうBSDレイヤーとは、UNIX系OSならではのコマンド群および関連機能のことで、OS XにUNIXらしさをもたらす要素と言ってもいい。いわば"古典"ともいえるそれらををMavericksのいま確認することでOS Xの理解を深めることが、BSDレイヤー温故知新シリーズの狙いだ。

What's `inode` ?

UNIX系OSでは、あらゆるファイル/フォルダを「iノード」というデータ構造で管理する。iノードはファイル種別やサイズ、アクセス権といった属性情報を持ち、ファイルシステムの管理領域(スーパーブロック)に保存される。ファイルの中身とは別に存在し、ファイル本体はデータブロックに、属性情報はiノードブロックに格納されるしくみだ。

iノードは、同じファイルシステム上のファイル/フォルダすべてに割り振られ、他と重複しない(一意の)番号が与えられる。iノードにはディスク上の物理的な場所も記録されているため、iノード番号がわかればファイル本体を特定できる。なお、後述する「ハードリンク」は同じiノードを参照する存在であり、その内容は完全に同一だ。

利用可能なiノードの数は、ファイルシステムを作成する時点で決定され、あとから変更することはできない。ファイルやフォルダ(ディレクトリ)を1つ作成するたびに1つのiノードが消費されるため、大量にファイル/フォルダを作成すると枯渇することもあり、そうなると空き容量があるにもかかわらず新規ファイル/フォルダを作成できない事態に陥る。

ところで、OS X標準のファイルシステム「HFS Plus」は、本来iノードを理解しない。HFS Plusはカタログノードという独自の機構を持ち、そこにファイル名や各種属性情報を記録するのだが、UNIXとの互換性を要求されるOS XではHFS Plusの機能で代替される。その処理はシステムコールに優先するため、各種UNIXコマンドやCarbon/Cocoa API経由で利用したときもUNIXのiノードそのものに見えるというわけだ。

:iノードの使用状況は「df」コマンド(-iオプション要)で確認できる

消しても消せないファイルをつくろう

Finderではiノードは隠ぺいされているが、ターミナルで「ls」コマンドを使うと確認できる。必要なオプションは「-i」、詳細情報を出力するためのオプション「-l」と組み合わせ「ls -li」と実行するのがオーソドックスな使い方だ。以下の実行例では、「picture.png」というファイルのiノードが「3829867」だということがわかる。

$ ls -li picture.png 
3829867 -rw-r--r--@ 1 shinobu  staff  44747  5  7 23:20 picture.png

この「picture.png」にハードリンクを作成してみよう。前述したとおり、ハードリンクとは同じiノードを参照する存在のことで、「ln」コマンドを利用して作成する。以下の実行例では、作成した「Doppelganger.png」のiノード番号が「picture.png」と一致することを確認できる。なお、同じファイルサイズが表示されているが、ファイル実体がコピーされたわけではないので、コマンド実行前後でディスク全体の空き容量に変化は生じない。

$ ln picture.png Doppelganger.png
$ ls -li picture.png Doppelganger.png 
3829867 -rw-r--r--@ 2 shinobu  staff  44747  5  7 23:20 Doppelganger.png
3829867 -rw-r--r--@ 2 shinobu  staff  44747  5  7 23:20 picture.png

では、ハードリンクを作成したあとに元の「picture.png」を削除するとどうなるだろう? 答えは、「picture.pngだけが消えてDoppelganger.pngは残る」。この同じiノード番号を持つ2つのファイルは、同じファイル実体を参照しており、ファイル名以外は完全に同一だ。そして元の「picture.png」を削除してもハードリンクの「Doppelganger.png」に影響はなく、ファイル実体も残る。エイリアスとの違いを理解できただろうか。

ハードリンク作成後にオリジナル(picture.png)を削除してもファイル実体が残っていることを確認できる

ファイルにハードリンクをいくつか作成しておけば、もしそのうちのいくつかが削除されても(同じiノード番号を持つ)ハードリンクが存在するかぎりファイル実体は失われないため、バックアップに似た効果を期待できる。しかも複製ではないので、ディスク容量を消費しない。iノード番号さえ控えておけばfindコマンドでかんたんに探し出せるので、大切なファイルの名前と拡張子をオリジナルと無関係なものに変えておき、フォルダ階層の奥深くに保存しておけば、「消しても消せないファイル」を作成できるのだ。

findコマンド(-inumオプション要)でiノード番号を指定し、ファイル検索したところ。同じiノード番号を持つファイルが計4つあることを確認できる