Linux cpioコマンド徹底入門:アーカイブ作成から復元・initramfs展開まで網羅する実践ガイド (Ubuntu)

はじめに

Linuxカーネルの初期化プロセスで不可欠なinitramfsの構築や、レガシーシステムを含む確実なファイルバックアップで重宝される標準ツールがcpioです。本稿では、基本となる3大動作モード「copy-out(-o)」「copy-in(-i)」「copy-pass(-p)」の仕組みを解き明かしながら、実務の現場ですぐに役立つ主要オプションと実践的なユースケースをハンズオン形式で詳解します。

1. cpio環境のセットアップと基本アーカイブ生成(copy-outモード)

Ubuntu環境下でcpioを利用可能にするため、APTパッケージインデックスを更新した上で対象パッケージをインストールします。

APT経由でのcpioパッケージインストール

動作検証用の作業ディレクトリをホーム配下に切り出し、テスト対象となるサンプルテキストを複数生成しておきます。

作業用ディレクトリ作成とサンプルファイルの配置

一般的なtarコマンド等とは異なり、cpioはアーカイブ対象のファイルパス一覧を「標準入力(stdin)」経由で受け取るパイプライン指向の設計が採用されています。
ここではカレントディレクトリ内のエントリ一覧をパイプで流し込み、単一のアーカイブバイナリ(archive.cpio)へとパッケージングします。
⚙️ [押さえておくべき主要スイッチ]

-o (--create) : 入力リストを読み込んでアーカイブデータを送出する「copy-out」モードを指定。
-i (--extract) : 既存アーカイブを展開・抽出する「copy-in」モードを有効化。
-p (--pass-through) : 中間ファイルを作成せず、ディレクトリツリーを別領域へ直にストリーム複製する「copy-pass」モード。
-v (--verbose) : 処理対象のファイルパスを標準エラー出力へ順次ロギング。
-t (--list) : アーカイブ本体を展開することなく、格納されているヘッダ情報・一覧のみをインスペクション。
-d (--make-directories) : ファイル展開時、必要となる親階層ディレクトリを再帰的に自動生成。
-u (--unconditional) : 展開先に同名ファイルが既に存在する場合でも、タイムスタンプを問わず強制上書き。
-H (--format) : 出力するアーカイブ形式(newc, crc, tarなど)を明示指定。

標準入力経由でcpioアーカイブを生成

出力されたarchive.cpioのファイル属性およびデータサイズが適切であることを確認します。

作成されたcpioアーカイブのサイズ検証

2. アーカイブの事前インスペクションと安全なリストア(copy-inモード)

ディスク上へ展開する前にアーカイブ内部の格納状態を把握するため、-t(テーブル一覧表示)と-v(詳細属性表示)を組み合わせてコンテンツを検証します。
リダイレクトでアーカイブを流し込むことで、意図しないファイルの上書き事故を未然に防止できます。

cpioアーカイブ内のコンテンツ構造を事前確認

続いて復元検証を行うため、専用のリストア用ディレクトリを新設してカレント位置を切り替えます。

復元用ディレクトリの準備と移動

archive.cpioを入力ソースに指定し、cpio -idvによってカレントディレクトリ配下へデータをリストアします。
ディレクトリ自動補完の-dと進捗可視化の-vを併用することで、階層構造を壊さず確実に復元可能です。

copy-inモードによる実データの復元実行

展開先ディレクトリ内にターゲットファイルが正常なパーミッション・所有者情報で復元されているかをチェックします。

リストアされたファイルの存在・パーミッション確認

3. 中間アーカイブ不要:ディレクトリツリーの高速ストリーム複製(copy-passモード)

続いて、一時的なアーカイブファイルを作らずにディレクトリ構造を一発で複製する「copy-pass」の検証を行います。テスト用にネストされたサブ階層とファイルを配置します。

ネストしたディレクトリ階層とテストデータの生成

複製先となる空のターゲットディレクトリを用意します。

転送先ディレクトリの事前作成

ソース元へ移動し、findコマンドで走査した階層リストをcpio -pへ直接ストリーミングします。
必要なディレクトリを自動生成する-d、元の更新時刻(mtime)を維持する-m、進行状況を可視化する-vを組み合わせることで、メタデータを保ったまま極めて高精度なミラーリングが実現します。

find連携とcopy-passによるディレクトリツリー同期

転送先ディレクトリ内を再帰的にリストアップし、深層ディレクトリも含めて完全なクローンが作られたことを検証します。

複製先ディレクトリの再帰的構造チェック

4. エンタープライズ標準フォーマット(newc)とgzip圧縮ストリーム連携

Linuxカーネルのinitramfsイメージ作成における業界標準であるnewc(SVR4ポータブルフォーマット)形式を指定し、さらにパイプ経由でgzipの最高圧縮(-9)を施した圧縮アーカイブ(initramfs_sample.cpio.gz)を生成します。

newcフォーマット指定とgzip最大圧縮の組み合わせ実行

生成されたファイルが正常にgzipバイナリストリームとして認識されているかをfileコマンドで診断します。

gzip圧縮ファイルヘッダの形式確認

圧縮されたcpioアーカイブの展開フローを確認するため、独立したリストア先を用意します。

圧縮アーカイブ復元用ディレクトリの作成

伸張したデータを標準出力へ送出するzcatとcpio -idvをパイプラインで直結することで、ディスクに一時伸張ファイルを残すことなくメモリ上で直接一括展開します。

zcatとcpioのパイプラインによるオンザフライ展開

プロセス終了後、隠しエントリを含めたすべてのリソースが欠損なく所定の場所に復元されていることを一覧表示で確認します。

オンザフライ復元完了後のディレクトリ検証

以上、Ubuntu環境をベースに、cpioコマンドが持つ3つの基本動作と実務で役立つ主要オプションの活用法を整理しました。
標準入出力をフル活用するUNIX思想のパイプライン連携をマスターすることで、カーネルイメージのカスタマイズや確実なファイルマイグレーションをより柔軟かつ堅牢に自動化できるようになります。