拡張子 | .cpio |
---|---|
MIMEタイプ | application/x-cpio |
UTI | public.cpio-archive |
種別 | ファイルアーカイバ |
cpioは、ファイルアーカイバ・ユーティリティ並びにそのアーカイバで使われるファイルフォーマットである。主にUnix系オペレーティングシステムにインストールされることが多い。cpioは当初、"Programmer's Workbench"(PWB/UNIX)付属のテープメディア・アーカイブ・プログラムとして設計され、その後リリースされたUnix系OSのほとんど全てにコンポーネントとして含まれている。コマンドの名称はcopy in and out[1](入力複製と出力複製、コピー・インとコピー・アウト)という言い回しに由来し、cpioが動作中に標準入出力(standard I/O)を利用する様子を描写している。
全てのUNIXならびにその派生は、cpioよりよく知られておりResearch Unixに由来するtarのようなその他のバックアップ・プログラム、アーカイブ・プログラムもサポートしている[2]。cpioはRPM Package Manager(rpm)パッケージのアーカイブ形式として利用されたり、Linuxカーネル2.6系列の起動用RAMイメージに使われるアーカイブ形式としてArch Linuxのmkinitcpio [3]やDebianのinitramfs-tools [4]で利用されたり、Appleのpaxインストーラで使われるアーカイブフォーマットとして採用されるなど、一部では依然重要な位置を占めている。
オラクルはかつて同社のソフトウェアの大半をcpioフォーマットのアーカイブで頒布していたこともある。
当初のプログラム設計により、cpioとそのアーカイブ・ファイル・フォーマットは何度も仕様変更されており、時に互換性の無い変更も加えられてしまっている。最も有名な仕様改変は、アーカイブ・ファイルのメタ情報がバイナリ・フォーマットからASCIIベース表現(char)に変わったことである(ただし操作用オプション(--format)で切り替えることで両フォーマットに対応している実装もある)。
cpioはテープ・デバイス上で連続的にバックアップ・ファイル・アーカイブを保存できるよう設計されているが、tarと同じくアーカイブ・コンテンツの圧縮は行わない。このため適宜gzipやその他外部圧縮プログラムを利用して、cpioから生成されたアーカイブに圧縮を掛ける(この時、.cpgz
または.cpio.gz
という拡張子をファイル名の末尾に付す場合がある)。
cpioを-oコマンドライン・フラグと共に起動しコピーアウト(copy-out)・オペレーション・モードでアーカイブを作成する場合、標準入力を通してファイル/ディレクトリ・パス名を読み取り、標準出力にバイト・ストリームとしてアーカイブを書き出す。このため、cpioはfindプログラムのようなアーカイブ対象ファイルの一覧を生成する他のユーティリティと同時に利用するのが一般的である。以下のコマンドを実行すると、findコマンドを利用しカレント・ディレクトリの全ファイルのリストを標準出力経由でcpioに渡し、cpioはディレクトリ・ツリーごと完全にアーカイブする(このコマンド実行中、cpioはユーザにプロンプトを返すことなく直ちに処理を実行する。以下同様)。
$ find . -depth -print | cpio -o > archive.cpio
cpioが生成するアーカイブはファイルとディレクトリのストリームを連続的に単一のアーカイブに収めたものである。アーカイブはファイルメタ情報を含むヘッダ・セクション毎にデータを分離できる。そのようなファイルメタ情報とは、ファイル名、inode番号、ファイル所有者、パーミッションそしてタイムスタンプである。cpioはアーカイブのヘッダ情報に従いファイルやディレクトリをファイルシステム上に展開する(オプションで無視することもできる)。慣習的に、cpioアーカイブはしばしば拡張子.cpio
をアーカイブ・ファイル名の末尾に持つ。
cpioは、-iオプションを付してコピーイン(copy-in)モードで起動した場合、標準入力からアーカイブを読み取り、ファイルシステム上にアーカイブ済みファイルを再生成する。次に示すコマンド例を実行するとその様子が把握できる。
$ cpio -id < archive.cpio
上記の-dフラグはcpioに必要に応じて(すなわち、存在しなければ)ディレクトリを作成するよう指示する。また抽出されたファイル名を出力する-vフラグもある。
オプションを除く他全てのコマンドライン引数にはシェルライクなグロブパターンが利用できる。1つかそれ以上のパターンにマッチするファイル名を持つファイルのみをアーカイブから取り出しコピーできる。次の例は、アーカイブから"etc/fstab"というパターンにマッチするファイル名を持つものを取り出す。
$ cpio -id etc/fstab < archive.cpio
展開前にcpioアーカイブ内に含まれるファイルの一覧を出力するには、
$ cpio -it < archive.cpio
cpioアーカイブはファイルが相対パスだけではなく絶対パスで格納される(例えば、/bin/ls vs. bin/ls)場合があるので、事前にファイル一覧をチェックすることは有用である。
cpioは-pオプションを付すことで、第3のファイルコピー操作モードであるコピーパス(コピースルー)モードで起動する。このモードは実際にファイルにアーカイブすることなくコピーアウト、コピーイン・ステップを組み合わせ、あるディレクトリ・ツリーからファイルをコピーすることを可能にする。このモードでは、cpioはコピーアウト・モード同様、標準入力上でパス名を読み取るが、アーカイブを作成せず代わりにコマンドライン引数の一部として与えられたパスに相当するファイルシステム上の別のディレクトリにディレクトリ並びにファイルを再生成する。
次のコマンド例は、カレント・ディレクトリを起点にファイルシステム上の別のディレクトリ(ディレクトリ・パスは new-path)にカレント・ディレクトリ・ツリーごとコピーし、ファイル・パーミッションを保存(-m)、必要に応じてディレクトリを作成(-d)、ユーザにプロンプトすることなく無条件で存在するファイルを上書き(-u)し、そして標準出力に処理済ファイルの一覧を出力する(-v)。cpioは標準入力からはコピー元であるカレント・ディレクトリ・ツリーの全ファイルのパス名リストを読み込んでいる。
$ find . -depth -print | cpio -pdumv new-path
cpio形式はPOSIX.1-1988にて標準化されているが、cpioユーティリティ自体は標準化されていない。POSIX標準ではcpioユーティリティの代替ソフトウェアとしてpaxユーティリティがcpioアーカイブの読み書きに利用可能と規定されている。
ほぼ全てのLinuxディストリビューションはGNUプロジェクト版のcpioを提供している[5]。FreeBSDとmacOSではBSDライセンス下にあるcpioとlibarchive[6]ライブラリを利用している。