ISO 9660
目次
概要
ISO 9660は、ISOで標準化された、CD-ROMのファイルシステムです。
さまざまなOSに対応するため、かなり制限があり、文字コードまで決まっています。
ISO 9660ファイルシステムのCDイメージを作成するために、mkisofsというコマンドがlinuxにあります。
→Manpage of MKISOFS
エンディアン
ISO 9660は、エンディアンが違っても読み取れるように、工夫されています。
- L : リトルエンディアン
- B : ビッグエンディアン
L,B
リトルエンディアンにビッグエンディアンが続く構成。
これは、両エンディアンに対応するため。
| 0x050-0x057(8Byte) | ボリューム空間の大きさ | ボリュームの論理ブロック数(L,B) |
の場合、
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|
| ボリューム空間の大きさ | L | B |
|---|
L/B
リトルエンディアンかビッグエンディアンのどちらかで記述する。
d文字, a文字
| d文字 | | a文字 |
|---|
| Hex | Char | Hex | Char | Hex | Char | Hex | Char | Hex | Char | Hex | Char | Hex | Char | Hex | Char |
|---|
| 0x00 | | 0x20 | | 0x40 | | 0x60 | | 0x00 | | 0x20 | SP | 0x40 | | 0x60 | |
| 0x01 | | 0x21 | | 0x41 | A | 0x61 | | 0x01 | | 0x21 | ! | 0x41 | A | 0x61 | |
| 0x02 | | 0x22 | | 0x42 | B | 0x62 | | 0x02 | | 0x22 | " | 0x42 | B | 0x62 | |
| 0x03 | | 0x23 | | 0x43 | C | 0x63 | | 0x03 | | 0x23 | | 0x43 | C | 0x63 | |
| 0x04 | | 0x24 | | 0x44 | D | 0x64 | | 0x04 | | 0x24 | | 0x44 | D | 0x64 | |
| 0x05 | | 0x25 | | 0x45 | E | 0x65 | | 0x05 | | 0x25 | % | 0x45 | E | 0x65 | |
| 0x06 | | 0x26 | | 0x46 | F | 0x66 | | 0x06 | | 0x26 | & | 0x46 | F | 0x66 | |
| 0x07 | | 0x27 | | 0x47 | G | 0x67 | | 0x07 | | 0x27 | ' | 0x47 | G | 0x67 | |
| 0x08 | | 0x28 | | 0x48 | H | 0x68 | | 0x08 | | 0x28 | ( | 0x48 | H | 0x68 | |
| 0x09 | | 0x29 | | 0x49 | I | 0x69 | | 0x09 | | 0x29 | ) | 0x49 | I | 0x69 | |
| 0x0a | | 0x2a | | 0x4a | J | 0x6a | | 0x0a | | 0x2a | * | 0x4a | J | 0x6a | |
| 0x0b | | 0x2b | | 0x4b | K | 0x6b | | 0x0b | | 0x2b | + | 0x4b | K | 0x6b | |
| 0x0c | | 0x2c | | 0x4c | L | 0x6c | | 0x0c | | 0x2c | , | 0x4c | L | 0x6c | |
| 0x0d | | 0x2d | | 0x4d | M | 0x6d | | 0x0d | | 0x2d | - | 0x4d | M | 0x6d | |
| 0x0e | | 0x2e | | 0x4e | N | 0x6e | | 0x0e | | 0x2e | . | 0x4e | N | 0x6e | |
| 0x0f | | 0x2f | | 0x4f | O | 0x6f | | 0x0f | | 0x2f | / | 0x4f | O | 0x6f | |
| 0x10 | | 0x30 | 0 | 0x50 | P | 0x70 | | 0x10 | | 0x30 | 0 | 0x50 | P | 0x70 | |
| 0x11 | | 0x31 | 1 | 0x51 | Q | 0x71 | | 0x11 | | 0x31 | 1 | 0x51 | Q | 0x71 | |
| 0x12 | | 0x32 | 2 | 0x52 | R | 0x72 | | 0x12 | | 0x32 | 2 | 0x52 | R | 0x72 | |
| 0x13 | | 0x33 | 3 | 0x53 | S | 0x73 | | 0x13 | | 0x33 | 3 | 0x53 | S | 0x73 | |
| 0x14 | | 0x34 | 4 | 0x54 | T | 0x74 | | 0x14 | | 0x34 | 4 | 0x54 | T | 0x74 | |
| 0x15 | | 0x35 | 5 | 0x55 | U | 0x75 | | 0x15 | | 0x35 | 5 | 0x55 | U | 0x75 | |
| 0x16 | | 0x36 | 6 | 0x56 | V | 0x76 | | 0x16 | | 0x36 | 6 | 0x56 | V | 0x76 | |
| 0x17 | | 0x37 | 7 | 0x57 | W | 0x77 | | 0x17 | | 0x37 | 7 | 0x57 | W | 0x77 | |
| 0x18 | | 0x38 | 8 | 0x58 | X | 0x78 | | 0x18 | | 0x38 | 8 | 0x58 | X | 0x78 | |
| 0x19 | | 0x39 | 9 | 0x59 | Y | 0x79 | | 0x19 | | 0x39 | 9 | 0x59 | Y | 0x79 | |
| 0x1a | | 0x3a | | 0x5a | Z | 0x7a | | 0x1a | | 0x3a | : | 0x5a | Z | 0x7a | |
| 0x1b | | 0x3b | | 0x5b | | 0x7b | | 0x1b | | 0x3b | ; | 0x5b | | 0x7b | |
| 0x1c | | 0x3c | | 0x5c | | 0x7c | | 0x1c | | 0x3c | < | 0x5c | | 0x7c | |
| 0x1d | | 0x3d | | 0x5d | | 0x7d | | 0x1d | | 0x3d | = | 0x5d | | 0x7d | |
| 0x1e | | 0x3e | | 0x5e | | 0x7e | | 0x1e | | 0x3e | > | 0x5e | | 0x7e | |
| 0x1f | | 0x3f | | 0x5f | _ | 0x7f | | 0x1f | | 0x3f | ? | 0x5f | _ | 0x7f | |
ボリュームの構成
ISO 9660のボリュームは、次の要素で構成されます。
ちなみに、ボリュームとは管理の単位で、直訳すると(本の)"巻"などの意味がある。
ボリューム・ディスクリプタ群
ボリューム・ディスクリプタには、以下のものがある。
PVD : Primary Volume Descriptor, SVD : Supplementary Volume Descriptor, EVD : Enhanced Volume Descriptor
PVDは必須のディスクリプタで、システムエリア(0-15セクタ)の次(16セクタ)に配置する。
日時構造体
| Byte | Size | 内容 |
|---|
| 0x0000 | 0x0004 | 西暦年 | d文字(1-9999) |
| 0x0004 | 0x0002 | 月 | d文字(1-12) |
| 0x0006 | 0x0002 | 日 | d文字(1-31) |
| 0x0008 | 0x0002 | 時 | d文字(0-23) |
| 0x000a | 0x0002 | 分 | d文字(0-59) |
| 0x000c | 0x0002 | 秒 | d文字(0-59) |
| 0x000e | 0x0002 | 1/100秒 | d文字 |
| 0x0010 | 0x0001 | グリニッジ標準時からの偏差 | 15分単位 |
"グリニッジ標準時からの偏差"以外は文字列で、数値ではありません。
システム識別子 (Byte:0x0008)
ボリューム識別子 (Byte:0x0028)
ボリュームの名前です。
DOS等ではボリュームラベルとして見えるようです。
ボリューム空間サイズ (Byte:0x0050)
ボリューム集合サイズ (Byte:0x0078), ボリューム順序番号 (Byte:0x007c), ボリューム集合識別子 (Byte:0x00be)
ディスクが複数枚で構成される場合に使用します。
ボリューム集合サイズ (Byte:0x0078)
ディスクの枚数を指定します。
2バイト*2の(L,B)構成です。
1枚構成の場合は、01 00 00 01です。
ボリューム順序番号 (Byte:0x007c)
ディスクの番号を指定します。
2バイト*2の(L,B)構成です。
1枚構成の場合は、01 00 00 01です。
ボリューム集合識別子 (Byte:0x00be)
複数枚ディスクのグループに対する名前を指定します。
ボリューム識別子と同じでいいと思います。
ルートディレクトリのディレクトリ・レコード (Byte:0x009c)
0x22バイト構成のディレクトリ・レコードがそのまま入ります。
ディレクトリ識別子は0x00で、システム用エリアはありません。
ディレクトリ識別子までで0x22バイトなので、パディングもありません。
VPD : Volume Partition Descriptor
| Byte | Size | 内容 |
|---|
| 0x0000 | 0x0001 | ボリューム記述子タイプ | 3 |
| 0x0001 | 0x0005 | 規格識別子 | "CD001" |
| 0x0006 | 0x0001 | ボリューム記述子バージョン | 1 |
| 0x0007 | 0x0001 | 未使用 | 0 |
| 0x0008 | 0x0020 | システム識別子 | a文字 |
| 0x0028 | 0x0020 | ボリューム・パーティション識別子 | d文字 |
| 0x0048 | 0x0004*2 | ボリューム区画の位置 | 先頭の論理ブロック番号(L,B) |
| 0x0050 | 0x0004*2 | ボリューム空間の大きさ | ボリュームの論理ブロック数(L,B) |
| 0x0058 | 0x07a8 | システム用 | システム用 |
BRVD : Boot Record Volume Descriptor
| Byte | Size | 内容 |
|---|
| 0x0000 | 0x0001 | ボリューム記述子タイプ | 0 |
| 0x0001 | 0x0005 | 規格識別子 | "CD001" |
| 0x0006 | 0x0001 | ボリューム記述子バージョン | 1 |
| 0x0007 | 0x0020 | 起動システム識別子 | a文字 |
| 0x0027 | 0x0020 | 起動識別子 | a文字 |
| 0x0047 | 0x07b9 | 起動システム用 | 起動システム用 |
VDT : Volume Descriptor Set Terminator
ボリューム・ディスクリプタ群の終端を表すディスクリプタ。
無駄遣いもいいところ。。。
| Byte | Size | 内容 |
|---|
| 0x0000 | 0x0001 | ボリューム記述子タイプ | 255 |
| 0x0001 | 0x0005 | 規格識別子 | "CD001" |
| 0x0006 | 0x0001 | ボリューム記述子バージョン | 1 |
| 0x0077 | 0x07f9 | 予約 | 0 |
パステーブル
パステーブルには、ボリュームが持つ全てのディレクトリの階層情報と、ディレクトリの場所が記されています。
その情報はパステーブル・レコードに記されていて、一つのパステーブル・レコードは一つのディレクトリに対応しています。
パステーブル・レコード
| Byte | Size | 内容 |
|---|
| 0x0000 | 0x0001 | ディレクトリ識別子の長さ | |
| 0x0001 | 0x0001 | 拡張属性レコードの長さ | |
| 0x0002 | 0x0004 | ディレクトリ・レコードの先頭LBA | (L/B) |
| 0x0006 | 0x0002 | 親ディレクトリの番号 | (L/B) |
| 0x0008 | 可変 | ディレクトリ識別子 | |
| 0x0001 | パディング | 全体を偶数にするための埋め合わせ。 |
ディレクトリ・レコード
ディレクトリ・レコードは、そのディレクトリが持つファイルやディレクトリの情報を記したものです。
子ファイル(ディレクトリ)の情報が連続で格納されています。
日時構造体
| Byte | Size | 内容 |
|---|
| 0x0000 | 0x0001 | 西暦年 | 1900年からの年 |
| 0x0001 | 0x0001 | 月 | 1-12 |
| 0x0002 | 0x0001 | 日 | 1-31 |
| 0x0003 | 0x0001 | 時 | 0-23 |
| 0x0004 | 0x0001 | 分 | 0-59 |
| 0x0005 | 0x0001 | 秒 | 0-59 |
| 0x0006 | 0x0001 | グリニッジ標準時からの偏差 | 15分単位 |
ファイル属性フラグ
| bit | 値 | 内容 |
|---|
| 0 | 0 | 可視 |
| 1 | 不可視 |
| 1 | 0 | ファイル |
| 1 | ディレクトリ |
| 2 | 0 | 主ファイル |
| 1 | 関連ファイル |
| 3 | 0 | ファイルがレコード形式を持たない |
| 1 | ファイルがレコード形式を持つ |
| 4 | 0 | 許可条件無効 |
| 1 | 許可条件有効 |
| 5 | | 予約 |
| 6 | | 予約 |
| 7 | 0 | ファイルの最終ディレクトリレコードである |
| 1 | ファイルの最終ディレクトリレコードでない |
ファイルユニットの大きさ
インタリーブ間隙の大きさ
ボリューム順序番号
ファイル/ディレクトリ識別子
ファイル名・ディレクトリ名です。
d文字を使い、
ファイル名 + '.' + 拡張子 + ';' + バージョン
の形で記述します。
参考・関連