「cpio」

认识

官网:https://www.gnu.org/software/cpio/
文档:https://www.gnu.org/software/cpio/manual/
仓库:https://savannah.gnu.org/projects/cpio/

GNU cpio copies files into or out of a cpio or tar archive. The archive can be another file on the disk, a magnetic tape, or a pipe. GNU cpio supports the following archive formats: binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, and POSIX.1 tar. The tar format is provided for compatibility with the tar program. By default, cpio creates binary format archives, for compatibility with older cpio programs. When extracting from archives, cpio automatically recognizes which kind of archive it is reading and can read archives created on machines with a different byte-order.

cpio, copy in and out,是个用于创建和提取归档文件的命令行工具及相应的文件格式。与更常见的 `tar` 类似,它将多个文件和目录打包成一个单一的归档文件,同时保留文件属性(如权限、所有权、时间戳等)。

它的名字直接描述了其两种主要操作模式:

  • Copy-In 模式 (`-i`): 从归档文件中提取(解包)文件。
  • Copy-Out 模式 (`-o`): 创建归档文件。

历史与现状

  • 起源:CPIO 起源于 Unix Version 7(1979 年左右),后来成为 POSIX 标准的一部分。它最初被设计用于磁带备份和软件包的传输。
  • 现状:虽然如今 `tar` 和 `zip` 格式更为流行和通用,但 CPIO 仍然在特定领域(尤其是 Linux 内核和 initramfs)扮演着关键角色。许多 Linux 发行版仍然默认安装了这个工具。

组成

安装的可执行程序

cpio | copies files to and from archives.

mt | controls magnetic tape drive operations.

性质

强大的保留信息能力:可以很好地保留文件的硬链接、设备文件、权限、所有权等元数据。

通过标准输入 / 输出工作:CPIO 的设计哲学是大量使用管道和标准输入 / 输出。这使得它可以轻松地与其他命令(如 `find`, `ls`, `cpio`)组合使用,非常符合 Unix 的“一个工具只做一件事”的设计思想。

处理大量文件:理论上,CPIO 可以处理任何数量的文件,不受命令行参数数量的限制(因为它通常从管道读取文件名列表)。

多种格式支持:CPIO 支持多种归档格式,包括:

  • `bin`:旧的二进制格式,兼容性差。
  • `odc` 或 `ascii`:古老的 ASCII 格式。
  • `newc`:目前最常用的格式,一种可移植的 ASCII 格式,支持大于 8GB 的文件和具有长文件名的文件。Linux 内核的 initramfs 映像就使用这种格式。
  • `crc`:带有校验信息的 `newc` 格式。
  • `tar`:支持 tar 格式。
  • `ustar`:支持 POSIX tar 格式。

构建

apt-get install cpio

应用

CPIO 的操作需要指定模式。最常用的模式是 `-o`(创建)、`-i`(提取)和 `-p`(传递,用于复制目录树)。

创建归档文件 (Copy-Out Mode `-o`)

创建归档时,CPIO 需要一个文件列表作为输入。这通常通过 `find` 或 `ls` 命令结合管道来实现。

示例:将 `/path/to/source` 目录及其内容打包成 `backup.cpio` 文件:find /path/to/source -depth -print | cpio -ov > backup.cpio

  • `find … -print`: 生成文件列表。
  • `-o`: 创建归档模式。
  • `-v`: 详细模式,显示正在处理的文件。
  • `> backup.cpio`: 将 CPIO 的标准输出重定向到文件 `backup.cpio`。

示例:只打包 `.txt` 文件:find /path/to/source -name “*.txt” -print | cpio -ov > text_files.cpio

提取归档文件 (Copy-In Mode `-i`)

示例:提取 `backup.cpio` 到当前目录:cpio -iv < backup.cpio

  • `-i`: 提取模式。
  • `-v`: 详细模式。
  • `< backup.cpio`: 将归档文件内容作为标准输入传递给 CPIO。

重要选项:

  • `-d`: 自动创建所需的目录。
  • `-u`: 无条件覆盖现有文件(默认情况下,如果文件已存在且更新,CPIO 不会覆盖它)。
  • `–no-absolute-filenames`: 始终提取到当前目录,忽略归档文件中可能存在的绝对路径,这是一种安全措施。

常用提取命令:cpio -idv < backup.cpio

列出归档内容 (Copy-In Mode with `-t`)

示例:列出 `backup.cpio` 中的所有文件 cpio -it < backup.cpio

  • `-t`: 列出文件列表(但不提取)。

复制目录 (Pass-Through Mode `-p`)

这是一种非常实用的模式,它不创建归档文件,而是直接将文件复制到另一个目录。

示例:将 `source_dir` 的内容复制到 `dest_dir`(保留所有属性):find source_dir -depth -print | cpio -pvd dest_dir

  • `-p`: 传递模式。
  • `dest_dir`: 目标目录。

应用

针对普通用户,掌握 `tar` 足以应对所有需求。但对于系统管理员和开发者,了解 CPIO 及其在 initramfs 中的作用是很有价值的。

initramfs

尽管 `tar` 更流行,但 CPIO 在现代 Linux 系统中有一个不可替代的角色:构建初始 RAM 文件系统(initramfs)

参考

BLFS / cpio-2.12 / http://www.linuxfromscratch.org/blfs/view/7.10-systemd/general/cpio.html
DeepSeek / 介绍 CPIO