Linuxではiノードという仕組みでファイルの管理をしています(iノードについては前回の記事を見てください)。ルートディレクトリ配下に「aaa」ディレクトリがあり「aaa」ディレクトリの直下に「ccc」ファイルがあったとします。
この場合、Linuxのファイルシステムではiノードを使って以下のように管理しています。
ルートディレクトリのiノード番号は「2」と決められていて、ディレクトリファイルと一般ファイルはデータブロックに置かれています。ディレクトリファイルを簡単に言うと「iノード番号とファイル名のペアを1つのエントリとして登録しておく入れ物」です。ルートディレクトリ(iノード番号「2」)からポインタをたどっていくと「ccc」ファイルまでたどり着けます。
上の図を見てわかるようにLinuxではファイル名をディレクトリファイルで管理しています。これはアプリケーションがログを書き込んでいる最中にログファイル名を変更したり、ログファイルを別の場所に移動しても影響を与えないということです(アプリケーションから見ると、ログファイルをiノード番号で認識している)。システム開発をしているとログローテーションの機能を組み込みますが、Linuxではアプリケーションがログを書き込んでいる最中にログローテンションをしても影響がないということです。
ディレクトリファイルの保護モードも一般ファイルと異なるので書いておきます。Linuxでは「ls -l」コマンドでファイルの保護モードを見ることができます。一般ファイルだと、r:読み出し可、w:書き込み可、x:実行可、となりますがディレクトリファイルだと以下のようになります。
- r: 許可されていればlsコマンドで表示することができる
- w: 許可されていれば新しくファイルを作成したり既存のファイルを削除できる
- x: 許可されていればcdコマンドでそのディレクトリに移動できる
ここで以下のように「bbb」ディレクトリ直下に「ddd」という名前で「ccc」ファイルのリンクを作成した場合を考えてみます( ddd と ccc は名前は違うけれども実体は同じファイルということ)。
まずはハードリンクで作成した場合です。Linuxのコマンドだと「ln ccc ddd」です。
ハードリンクはディレクトリファイルにiノード番号「300」、ファイル名「ddd」のエントリを追加することでリンクを作っています。次にシンボリックリンクで作成した場合です。Linuxのコマンドだと「ln -s ccc ddd」です。
シンボリックリンクでは新たにiノード番号「400」を使用するとともに、ディレクトリファイルにiノード番号「400」、ファイル名「ddd」のエントリを追加することでリンクを作っています。
ハードリンクではiノードを使用せず、シンボリックリンクではiノードを使用するところを実際に確かめてみました。まずはハードリンクの場合です。
IUsedが194890ですが、リンクを作成した後も194890のままです。次にシンボリックリンクの場合です。
IUsedが194887だったのが194888に1つ増えています。逆にIFreeが1681081から1681080に1つ減っています。シンボリックリンクではiノードを消費しているようです。また、ハードリンクだとcccとdddのファイルサイズ、タイムスタンプはいっしょですが、シンボリックリンクだと異なってますね。