試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

cpioについて

  1. 概要
  2. 形式
  3. 展開
  4. cpioファイルの作成

概要

cpioは、tarと同様、複数のファイルやディレクトリを1つにまとめるコマンド。
古くはバックアップ用途にも使用されていたようだが、この用途においてはSquashfs*1のほうが優れていると思われる。
現在でも初期RAMディスクイメージ(initrd/initramfs)では使用されている。
tar形式と同様、アクセス権情報(所有者情報と「読み取り/書き込み/実行」の属性)を保存することができる。

形式

cpioファイルにはデータ形式が幾つかあり、作成時に必要に応じて-H [形式名]オプションで指定する。Gentoo Linuxのinitrd*2の場合、「newc」形式のcpioファイルをgzip圧縮しているため、-H newcというオプションが付く。
種類はfileコマンドで確認できる。「newc」では下のようになる。

$ file [cpioファイル]
[cpioファイル]: ASCII cpio archive (SVR4 with no CRC)

既定の形式(-Hオプションなし)で出力したものは「cpio archive」とのみ表示された。

展開

現在の作業ディレクトリ以下に展開される。

(無圧縮のcpioファイルを展開)
$ cpio -idm --quiet [cpioファイル]
(gzip圧縮されたcpioファイルを展開)
$ zcat [cpio.gzファイル] | cpio -idm --quiet

2つ目の例はgzip圧縮されたファイルを展開する場合だが、initrdのファイルでは「.gz」や「.img」といった拡張子の場合もある(むしろ「.cpio.gz」と書かれることは少ない気がする)。
また、一般ユーザでinitrdファイルを展開した場合、

cpio: dev/console: Cannot mknod: 許可されていない操作です
(以下、同様のエラーが続く)

のように、デバイスファイルが作成できないエラーになるため、偽の管理者権限*3で操作を実行するfakerootというコマンドでシェルを起動し、その中で処理する。*4Gentoo Linux上のuswsuspについての覚え書き(復帰デバイス名を直接指定する方法)」や「Gentoo Linux上のuswsuspについての覚え書き(UUID指定による休止を行う)」などでも使用している。fakerootはinitrdのcpioファイルを作成する場合にも役に立つ。

cpioファイルの作成

cpioファイルに含めたいディレクトリ構造の最上位ディレクトリで実行する。

(無圧縮のまま出力する場合)
$ find | cpio --quiet -o -H newc > [出力ファイル].cpio
(gzip圧縮して出力する場合)
$ find | cpio --quiet -o -H newc | gzip -9 > [出力ファイル].cpio.gz

関連URL:

使用したバージョン:

  • cpio 2.9(2.9-r1)
  • file 4.23

*1:読み取り専用圧縮ファイルシステム。「読み取るだけのファイルやディレクトリを圧縮しつつ、無圧縮時と同様に扱う(概要と準備)」を参照

*2:genkernelsplash_geninitramfsが作成するもの

*3:実際には一般ユーザ権限で動作する

*4:削除されたデバイスファイルは外から見ると空ファイルになっている