連載
» 2010年04月05日 00時00分 公開

作りながら理解するファイルシステムの仕組み(3):ファイルシステムってそんなに簡単に作れるの? (2/3)

[森 崇 株式会社 永和システムマネジメント,@IT MONOist]

tarファイルのデータ構造

 次は、tarファイルのデータ構造について説明していきます。

 ここでは単純な例として、以下の3種類のファイルを、tarファイルとしてアーカイブしたときのデータ構造を見ていきましょう。

  • 通常ファイル
  • ディレクトリ
  • シンボリックリンク(注6)

 上記3種類のファイルとして、以下の4個のファイルを用意します。

testDir(ディレクトリ)
testDir/testFile.txt(通常ファイル:ファイルサイズ 35bytes(注7))
testDir/dir(ディレクトリ)
testDir/symfile(シンボリックリンク(注8))

 これらのファイルをtarファイルとしてアーカイブし、その中のデータが正しく入っているかどうかを、実際にtarコマンドを操作して確認してみましょう(図1)。

tarファイルの作成 図1 tarファイルの作成

 tarファイルを作る操作は、tarコマンドのオプションにcvfを指定し、その次にtarファイル名、アーカイブしたいファイルを指定します。

 そして、このtarファイル内のファイル一覧を参照するには、tarコマンドのオプションにtvfを指定し、その次にtarファイル名を指定します。いかがですか? tarファイル内に、4個のファイルが入っていることを確認できると思います。

※注6:
シンボリックリンクとは、あるファイルの配置先(リンク先ファイルパス)をinode内に保持するもので、このシンボリックリンクにアクセスすると、リンク先ファイルにアクセスできます。Windowsのショートカットと同じようなものと考えてください。


※注7:
ファイルのデータとしては、以下の35文字(改行文字2個を含む)が入っています。

Hello world!!
This is a test File.


※注8:
リンク先パス名は、/usr/include/c++/4.3/mapです。


tarファイルをダンプしてみよう!

 tarファイル内のデータは、互換性を考慮して、テキストデータ(ASCIIコード)で構成されています(注9)。このため、tarファイルのデータ構造を確認するには、そのASCIIコードをテキストに変換してみるのが一番分かりやすい方法といえます。

 それでは、Linuxのダンプコマンドであるod(注10)コマンドを使って、tarファイルの中を探検してみましょう。まずは、tarファイルの先頭から512bytesを表示してみます(図2)。

先頭から512bytes分のダンプ情報 図2 先頭から512bytes分のダンプ情報

 最初に、“testDir/”という文字が見えますよね。tarファイルの最初のデータは、ファイル名が入っています。

 次に、“755”という文字があります。これは、testDirのファイルモードを表しています。さらに、読み進めると、“5”という文字がありますが、これはファイルタイプを示しており、このファイルがディレクトリであることを示しています。

 ここで、「ん……? 待てよ。これらの情報は、前回の解説にあったinodeの情報と非常によく似ているなぁ」と感じた方、非常に鋭いです。

 そうです。tarファイルは、各ファイルのinode情報を512bytes単位で記録しているのです。ほかにもいろいろと数字や文字が見えますが、このinodeのフォーマットは、表3のようになっています。

※注9:
バイナリデータだと、CPUアーキテクチャに依存するデータ(4bytesなどの多バイトデータ)の場合、バイトオーダーの関係で、x86系のCPUで書き出したデータが、SPARCのCPUでは正しく見られないといったことが起こります。


※注10:
od -c testDir.tar

を実行します。cオプションは、ASCIIコードをテキスト表示するものです。


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でした。このように、データが正しく入っていることを確認できると思います。

512bytes目から1024bytes分のダンプ情報 図3 512bytes目から1024bytes分のダンプ情報

 では、この通常ファイルのデータはどこにあるのか? というと、inode情報の次の512bytesの領域にあります。“Hello world!! ....”という文字(35文字)が見えますよね。このように、通常ファイルのデータは、inode情報の次の512bytesのところから書き込まれます。なお、ファイルサイズが512bytesを超える場合は、次の512bytesの領域が使われます。

 さらに、512bytes進めてみると、“testDir/dir/”というファイル名が見えてきます。また、ファイルタイプもディレクトリを表す“5”になっています。

1536bytes目から512bytes分のダンプ情報 図4 1536bytes目から512bytes分のダンプ情報

 残りは、シンボリックリンクファイルです。確認してみると(図5)、“testDir/symfile”というファイル名が見えてきます。ファイルタイプは、シンボリックリンクを表す“2”です。さらに、リンク先パス名は、その直後に“/usr/include/c++/4.3/map”とあります。

2048bytes目からtarファイルの終端までのダンプ情報 図5 2048bytes目からtarファイルの終端までのダンプ情報

 これで、すべてのファイルが見えましたが、tarファイルの残りはゼロクリアされていることが分かります。つまり、これが“tarファイルが終端である”ことの目安になります。

 以上をまとめると、tarファイルデータの構造は、以下のような特徴があります。

  • tarファイルの中は、512bytes単位で区切られている
  • 各ファイルのinode情報が格納されている
  • ユーザーデータは、inode情報の直後に存在している
  • tarファイルの終端はゼロクリアされている

 そして、そのデータ構造のイメージは、図6のようなものになります。

tarファイル内のデータのイメージ 図6 tarファイル内のデータのイメージ

Copyright © ITmedia, Inc. All Rights Reserved.