ファイルシステムってそんなに簡単に作れるの?:作りながら理解するファイルシステムの仕組み(3)(2/3 ページ)
Linuxカーネルとtarファイルの構造を理解し、オリジナルのファイルシステム「tarファイルシステム」の設計をはじめよう
tarファイルのデータ構造
次は、tarファイルのデータ構造について説明していきます。
ここでは単純な例として、以下の3種類のファイルを、tarファイルとしてアーカイブしたときのデータ構造を見ていきましょう。
- 通常ファイル
- ディレクトリ
- シンボリックリンク(注6)
上記3種類のファイルとして、以下の4個のファイルを用意します。
これらのファイルをtarファイルとしてアーカイブし、その中のデータが正しく入っているかどうかを、実際にtarコマンドを操作して確認してみましょう(図1)。
tarファイルを作る操作は、tarコマンドのオプションにcvfを指定し、その次にtarファイル名、アーカイブしたいファイルを指定します。
そして、このtarファイル内のファイル一覧を参照するには、tarコマンドのオプションにtvfを指定し、その次にtarファイル名を指定します。いかがですか? tarファイル内に、4個のファイルが入っていることを確認できると思います。
tarファイルをダンプしてみよう!
tarファイル内のデータは、互換性を考慮して、テキストデータ(ASCIIコード)で構成されています(注9)。このため、tarファイルのデータ構造を確認するには、そのASCIIコードをテキストに変換してみるのが一番分かりやすい方法といえます。
それでは、Linuxのダンプコマンドであるod(注10)コマンドを使って、tarファイルの中を探検してみましょう。まずは、tarファイルの先頭から512bytesを表示してみます(図2)。
最初に、“testDir/”という文字が見えますよね。tarファイルの最初のデータは、ファイル名が入っています。
次に、“755”という文字があります。これは、testDirのファイルモードを表しています。さらに、読み進めると、“5”という文字がありますが、これはファイルタイプを示しており、このファイルがディレクトリであることを示しています。
ここで、「ん……? 待てよ。これらの情報は、前回の解説にあったinodeの情報と非常によく似ているなぁ」と感じた方、非常に鋭いです。
そうです。tarファイルは、各ファイルのinode情報を512bytes単位で記録しているのです。ほかにもいろいろと数字や文字が見えますが、このinodeのフォーマットは、表3のようになっています。
inodeの情報 | サイズ(bytes) | 意味 | |
---|---|---|---|
ファイルパス | 100 | ファイルのパス | |
ファイルモード | 8 | ファイルアクセス権(読み込み権、書き込み権、実行権) | |
所有者番号 | 8 | ファイル所有者であるユーザーのID | |
グループ番号 | 8 | ファイル所有者であるユーザーのグループID | |
ファイルサイズ(byte) | 12 | ファイルのサイズ | |
ファイル更新時刻 | 12 | ファイルのデータを更新した時刻 | |
チェックサム | 8 | このinode領域のチェックサム | |
ファイルタイプ | 1 | ファイルタイプを識別するためのフラグ | |
リンク先パス名 | 100 | ファイルタイプがシンボリックリンクの場合、リンク先パス名が設定される | |
マジック番号 | 6 | このtarファイルのマジック番号 | |
バージョン番号 | 2 | このtarファイルのバージョン番号 | |
ユーザー名 | 32 | ユーザー名 | |
グループ名 | 32 | グループ名 | |
デバイス番号(minor) | 8 | ファイルタイプがデバイスファイルの場合、デバイスのマイナー番号が設定される | |
デバイス番号(major) | 8 | ファイルタイプがデバイスファイルの場合、デバイスのメジャー番号が設定される | |
パディング | 167 | 未使用領域 | |
表3 tarファイル内のinode情報 |
tarファイル内のファイルの順番として、testDir/の次は、testDir/testFile.txtでしたので、次の領域には、きっとこのファイルが入っているはずです。
それでは、ダンプ情報の続きを見ていきましょう(図3)。予想どおり、“testDir/testFile.txt”というファイル名が入っていますね。このファイルは、通常ファイルで、そのファイルサイズは35bytesでした。このように、データが正しく入っていることを確認できると思います。
では、この通常ファイルのデータはどこにあるのか? というと、inode情報の次の512bytesの領域にあります。“Hello world!! ....”という文字(35文字)が見えますよね。このように、通常ファイルのデータは、inode情報の次の512bytesのところから書き込まれます。なお、ファイルサイズが512bytesを超える場合は、次の512bytesの領域が使われます。
さらに、512bytes進めてみると、“testDir/dir/”というファイル名が見えてきます。また、ファイルタイプもディレクトリを表す“5”になっています。
残りは、シンボリックリンクファイルです。確認してみると(図5)、“testDir/symfile”というファイル名が見えてきます。ファイルタイプは、シンボリックリンクを表す“2”です。さらに、リンク先パス名は、その直後に“/usr/include/c++/4.3/map”とあります。
これで、すべてのファイルが見えましたが、tarファイルの残りはゼロクリアされていることが分かります。つまり、これが“tarファイルが終端である”ことの目安になります。
以上をまとめると、tarファイルデータの構造は、以下のような特徴があります。
- tarファイルの中は、512bytes単位で区切られている
- 各ファイルのinode情報が格納されている
- ユーザーデータは、inode情報の直後に存在している
- tarファイルの終端はゼロクリアされている
そして、そのデータ構造のイメージは、図6のようなものになります。
Copyright © ITmedia, Inc. All Rights Reserved.