CPIO(5) | FreeBSD File Formats Manual | CPIO(5) |
名称
cpio — cpio アーカイブファイルの形式解説
cpio アーカイブ形式は、いろいろなファイル、ディレクトリ、と他のファイルシステムオブジェクト (シンボリックリンク、デバイスノード、など) をバイトの単一のストリームにまとめます。一般形式
cpio アーカイブのそれぞれのファイルシステムオブジェクトは、エントリのフルパス名とファイルデータが基本の数値メタデータのあとに続いているヘッダレコードより成ります。ヘッダレコードは、一般的に、 struct stat のフールドに続く一連の整数値を保存します。 (詳細については、 stat(2) を参照してください。) 主として、それらがどのようにそれらの整数 (バイナリ、8 進、または 16 進) を格納しているかにより、変異型は、異なりますヘッダは、エントリのパス名 (パス名の長さはヘッダに格納される) と任意のファイルデータが続きます。アーカイブの終わりは、パス名“TRAILER!!!”がある特別なレコードによって示されます。PWB format
XXX 何かオリジナルの PWB/UNIX 1.0 形式に関する文書はありませんか ? XXX古いバイナリ形式
古いバイナリ cpio 形式は、2 バイトと 4 バイトのバイナリ値として数を格納しています。各エントリは、次の形式のヘッダで始まります:
struct header_old_cpio { unsigned short c_magic; unsigned short c_dev; unsigned short c_ino; unsigned short c_mode; unsigned short c_uid; unsigned short c_gid; unsigned short c_nlink; unsigned short c_rdev; unsigned short c_mtime[2]; unsigned short c_namesize; unsigned short c_filesize[2]; };
ここの unsigned short フィールドは、16 ビットの整数値です。 unsigned int フィールドは、32 ビットの整数値です。フィールドは、次の通りです:
- magic
- 整数値 8 進の 070707。このアーカイブがリトルエンディアンまたはビッグエンディアンの整数で書き込まれているかどうか決定するために、この値を使用することができます。
- dev, ino
- ディスクのデバイス番号と i ノード番号。これらは、2 つのエントリが同じファイルを参照する場合を決定するために cpio アーカイブを読み込むプログラムによって使用されます。 cpio アーカイブを総合的に扱うプログラムは、各エントリのためにこれらを区別される値に設定するために慎重であるべきです。
- mode
-
モードは、通常のパーミッションとファイルのタイプの両方を指定します。それは、次のいくつかのビットフィールドから成ります:
- 0170000
- これは、ファイルタイプビットをマスクします。
- 0140000
- ソケットのためのファイルタイプ値。
- 0120000
- シンボリックリンクのためのファイルタイプ値。シンボリックリンクに関して、リンク本体は、ファイルデータとして格納されます。
- 0100000
- 通常のファイルのためのファイルタイプ値。
- 0060000
- ブロック型特殊ファイルのためのファイルタイプ値。
- 0040000
- ディレクトリのためのファイルタイプ値。
- 0020000
- キャラクタ型特殊ファイルのためのファイルタイプ値。
- 0010000
- 名前付きパイプまたは FIFO のためのファイルタイプ値。
- 0004000
- SUID (set-user-ID) ビット。
- 0002000
- SGID (set-group-ID) ビット。
- 0001000
- スティッキ (sticky) ビット。いくつかのシステムでは、これは、実行形式、そして/または、ディレクトリの振る舞いを変更します。
- 0000777
- 下位 9 ビットは、一般的な POSIX 規約に従って、 world、グループとユーザの "読み込み/書き込み/実行"パーミッションを指定します。
- uid, gid
- 所有者の数値ユーザ ID とグループ ID。
- nlink
- このファイルへのリンク数。ディレクトリは、ここで、常に少なくとも 2 の値があります。ハードリンクされたファイルは、アーカイブ中にファイルデータのすべてのコピーを含んでいることに注意してください。
- rdev
- ブロック型特殊とキャラクタ型特殊のエントリに関して、このフィールドは、関連するデバイス番号を含んでいます。他のすべてのエントリタイプに関して、書き込み側によって 0 に設定され、読み込み側によって無視されるべきです。
- mtime
- 1970 年 1 月 1 日の協定世界時 0 時 0 分 0 秒のエポックから始まる、秒数として示されたファイルの更新時刻。 4 バイトの整数は、最初の最上位の 16 ビットに続いて最下位 16 ビットで格納されます。それぞれの 2 つの 16 ビット値は、ネイティブのマシンバイト順序で格納されます。
- namesize
- ヘッダに続くパス名のバイト数。このカウントは、後続するヌルバイトを含んでいます。
- filesize
- ファイルのサイズ。このアーカイブ形式は、4 ギガバイトのファイルサイズに制限されることに注意してください。 4 バイトの整数の格納方法の説明については、上記の mtime を参照してください。
パス名は、固定ヘッダの直後に続きます。 namesize が奇数であるなら、追加のヌルバイトがパス名の後に付け加えられます。つぎにファイルデータは、奇数の長さになるようにヌルバイトを埋めて、追加されます。
ハードリンクされたファイルは、特別に処理されません。完全なファイルの内容は、ファイルを各コピーして含まれています。
移植性のある ASCII 形式
Version 2 of the Single UNIX Specification (“SUSv2”) は、すべてのプラットフォームに渡って移植性のある ASCII 変異型を標準化しました。それは、“old character” (古い文字) 形式、または、“odc”形式として一般的に知られています。それは、古いバイナリ形式と同じ数字フィールドを格納しますが、 6 文字または 11 文字の 8 進数値としてそれらを表します。
struct cpio_odc_header { char c_magic[6]; char c_dev[6]; char c_ino[6]; char c_mode[6]; char c_uid[6]; char c_gid[6]; char c_nlink[6]; char c_rdev[6]; char c_mtime[11]; char c_namesize[6]; char c_filesize[11]; };
フィールドは、古いバイナリ形式と同じです。名前とファイル門対は、固定のヘッダに続きます。古いバイナリ形式と異なって、パス名またはファイルの内容の後に、追加の詰め物がありません。アーカイブされるファイルがそれら自体全体に ASCII であるなら、結果のアーカイブは、名前フィールドの終りのヌルバイトを除いて、全体に ASCII となります。
新しい ASCII 形式
"新しい" ASCII 形式は、すべての数に 8 バイトの 16 進数フィールドを使用し、デバイス番号をメジャーとマイナ番号のために別々のフィールドに分割します。
struct cpio_newc_header { char c_magic[6]; char c_ino[8]; char c_mode[8]; char c_uid[8]; char c_gid[8]; char c_nlink[8]; char c_mtime[8]; char c_filesize[8]; char c_devmajor[8]; char c_devminor[8]; char c_rdevmajor[8]; char c_rdevminor[8]; char c_namesize[8]; char c_check[8]; };
以下に指定されることを除いて、フィールドは、上記の古いバイナリ形式で指定されたものと一致します。
- magic
- 文字列“070701”。
- check
- このフィールドは、常に書き込み側によって 0 に設定され、読み込み側によって無視されます。その他の詳細については、次のセクションを参照してください。
固定のヘッダとパス名の合計サイズが、4 の倍数となるように、パス名にヌルバイトが続きます。同様に、ファイルデータは、4 バイトの倍数とするように詰め物をされます。この形式は、(8 ギガバイトのファイルをサポートする、古い ASCII 書式と違って) 4 ギガバイトのファイルしかサポートしないことに注意してください。
この形式では、ハードリンクされたファイルは、アーカイブに現れる最後のものを除いて、各エントリの filesize (ファイルサイズ) を 0 に設定することによって操作されます。
新しい CRC 形式
CRC 形式は、マジックフィールドが“070702”に設定され、 check フィールドがファイルデータのすべてのバイトの sum に設定されることを除いて、前のセクションで説明された新しい ASCII 書式と同じです。この sum は、すべてのバイトを符号なしの値として扱い、符号なしの演算を使用して計算されます。 sum の最下位の 32 ビットだけが格納されます。HP 変異型
cpio 実装は、XXXX を使用して HPUX で配布しましたが、デバイス番号を XXX と異なって格納しました。他の拡張と変異型
Sun Solaris は、cpio アーカイブの特別なエントリとして、 ACL と拡張属性を含んで、拡張ファイルデータを格納するために追加のファイルタイプを使用します。XXX 他に? XXX
規格
cpio ユーティリティは、もはや POSIX または Single Unix Standard の一部ではありません。それは、最後に Version 2 of the Single UNIX Specification (“SUSv2”) で登場しました。それは、 pax(1) によってその後の規格に取って代わられまし。現在、移植性のある ASCII 形式は、 pax(1) ユーティリティのための仕様の一部です。歴史
オリジナルの cpio ユーティリティは、AT&T の Unix サポートグループで働いている間に、Dick Haight によって書かれました。それは、1977 年に AT&T で内部的に使用された Version 6 AT&T UNIX に由来する“Programmer's Work Bench”である、PWB/UNIX 1.0 の一部として登場しました。両方の古いバイナリと古い文字形式は、“Ancient Unix” (古い unix) ライセンスの下で SCO によってリリースされた System III によれば、1980 年まで使用されていました。文字形式は、 IEEE Std 1003.1-1988 (“POSIX.1”) の一部として採用されました。 XXX "newc"はいつ現れましたか? だれがそれを考案しましたか? HP はそれらの変異型でいつ明らかにされましたか? Sun は、いつ ACL と拡張属性を導入しましたか? XXXバグ
“CRC”形式は、周期的冗長チェック (cyclic redundancy check) ではなく、簡単なチェックサムを使用するので、誤称です。古いバイナリ形式は、ユーザ ID、グループ ID、デバイス、と i ノード番号に対して 16 ビットに制限されます。それは、4 ギガバイトのファイルサイズに制限されます。
古い ASCII 形式は、ユーザ ID、グループ ID、デバイス、と i ノード番号に対して 18 ビットに制限されます。それは、8 ギガバイトのファイルサイズに制限されます。
新しい ASCII 形式は、4 ギガバイトのファイルサイズに制限されます。
cpio 形式のいずれも、異なったユーザまたはグループの番号付けのあるシステムの間で動かすとき、絶対に必要な、ユーザまたはグループ名を格納していません。
特により古い cpio 変異型を書くとき、実際のデバイス/i ノード値を利用可能なフィールドに適合する合成された値にマップすることが必要です。非常に大きいファイルシステムで、これは、より新しい形式として考えても必要です。
December 23, 2011 | FreeBSD |