我在 CPIO 中有这个命令,我知道它基本上提取了 initrd,但是,CPIO 到底在做什么?(man cpio
和info cpio
太难理解了),所以我无法弄清楚 CPIO 在这个命令中在做什么。
gzip -cd /boot/initrd-xxxxxxxxx.img | cpio -imd --quiet ;
find . | cpio -co
基本上,“cpio -imd”与“cpio -co”是什么意思?
答案1
-i
-o
本质上是cpio
命令从中提取文件(复制进来), 和添加文件(复制出),一个档案。
这选项包括:
-c
Use the old portable (ASCII) archive format.
-d
,--make-directories
Create leading directories where needed.
如果您的档案包含
a/b/c/d/f
,并且您要提取到的文件夹仅包含a/b
,则a/b/c
和a/b/c/d
目录将由自动创建cpio
。-m
,--preserve-modification-time
Retain previous file modification times when creating files.
该-c
选项可能是为了兼容性而添加的。该-m
选项意味着使用文件存档时的修改时间而不是当前时间。这可能有用也可能没用,具体取决于任务。(例如,备份可能需要保留它,但如果您只关心您拥有文件内容的副本,则可能不需要它。)
看看这个有点旧的Linux 期刊文章在cpio
。
答案2
非常感谢!您的信息非常有用!我希望 CPIO 开发人员可以修复 cpio 的手册页,因为它很难理解。
如果其他人读到这个帖子,这是来自您帮助我的链接,并且真正帮助我理解了 CPIO 到底是什么以及为什么使用它而不是 tar 或 zip 或 rpm/nash/initrd 等...:
cpio 可以使用八种不同的存档格式(包括 tar)在软盘、磁带或文件中创建和提取存档。它还可以创建目录树的近乎完美的副本,保留文件所有权、模式和访问时间。由于 cpio 旨在接受文件列表(例如 ls 或 find 的输出),因此它比传统的 tar 等工具更适合综合备份系统;处理的文件集可以通过编程轻松控制。
cpio 还具有一些不太明显的优势。默认的 cpio 格式比传统的 tar 格式更有效地利用磁带上的空间,并且它还可以跳过存档的损坏部分并在恢复操作期间继续,而不是完全退出。
cpio 有三种操作模式。直通模式(我在上面的示例中使用了该模式进行复制)、创建模式(用于创建档案)和提取模式(用于从档案中提取文件)。直通模式
顾名思义,在直通模式下,cpio 充当将文件列表从一个目标复制到另一个目标的管道。它能够根据需要创建子目录并处理特殊文件,因此成为任何系统管理员都必须熟悉的重要工具。
例如,多用户系统中常见的一种情况是需要更多驱动器空间来存放用户目录。管理员需要执行以下步骤:向系统添加额外的驱动器,创建一个或多个文件系统,将用户目录从旧文件系统复制到新文件系统,然后根据具体情况更改文件系统挂载点,以使转换过程不引人注目。
有三种方法可以将用户的文件复制到新磁盘。一种方法是使用 tar 归档文件并将其提取到新区域。这需要归档和提取文件所需的时间。
另一种方法是使用 cp 的递归模式直接复制它们。此模式仅复制常规文件和链接。它还会跟踪符号链接,如果使用不当,可能会复制大量文件。
当然,很少有系统管理员确切知道用户目录中的内容。开发人员可能有特殊文件,例如套接字或管道。任何用户都可能拥有具有特殊权限的文件,以防止不必要的访问。管理员没有时间仔细检查主目录,而且许多用户也不想让他们这样做。
$ find . -depth | cpio --pass-through \ --preserve-modification-times \ --make-directories --verbose /mnt/export
此命令使 find 输出当前目录下每个文件的名称。(-depth 选项确保目录名称先于其中文件的名称输出。)cpio 读入这些文件名并将它们复制到 /mnt/export。
传递给 cpio 的开关是:
--pass-through 以直通模式操作。
--preserve-modification-times 将新文件的修改时间设置为旧文件的修改时间。
--make-directories必要时创建目录。(此选项在恢复档案时也有效。)
--verbose详细模式。此模式将为所有文件生成输出。另一种选择是 -dot 选项,它只为处理的每个文件生成一个 .。(这些选项适用于所有模式。)
上述命令将创建原始目录的精确副本,无论文件类型或设置的任何特殊文件模式如何。
如果文件被复制到同一个文件系统,则可以在必要时使用 --link 选项对文件进行硬链接。
创建模式
创建模式创建存档文件。(这也称为“复制出”模式。)cpio 接受文件名列表,就像在传递模式下一样。但它不会在另一个区域创建重复文件,而是创建一个存档并将其发送到标准输出。
由于被发送到标准输出,档案可以被重定向到任何设备或文件,例如磁带、软盘或标准文件。
$ find -depth /export/home \ | cpio --create > /dev/fd0
这会在软盘驱动器 /dev/fd0 上创建 /export/home 目录树的存档。当然,/export/home 区域可能不适合一张软盘,但当每张软盘都写满时,cpio 会提示输入另一个设备或文件名,因此可以替换它,然后用户可以再次输入设备名称。(请注意,仍然建议使用 find 的 -depth 开关,以防止提取存档时可能出现的问题。)
在创建档案时,cpio 有很多选项。其中最重要的是档案的格式。
bin(默认)二进制格式以不可移植的方式对文件进行编码。因此,它不适合在 PC 上的 Linux 和其他架构(如 Alpha 或 Power PC)上的 Linux 之间交换文件。
odcold (POSIX.1) 可移植格式。该格式可跨平台移植,但不适用于 inode 超过 65536 个的文件系统,而这相当于当今大多数较大的硬盘。
newcnew 可移植格式。该格式可跨平台移植,并且对 inode 数量没有固有限制。
crcnew 可移植格式,添加了校验和。
tar与tar兼容,但仅支持最多100个字符的文件名。
ustarnew tar 格式。支持最多 255 个字符的文件名。
hpbinHP/UX 使用的非便携格式。
hpodc HP/UX 使用的“便携式”格式。以不同的方式存储设备文件。
档案格式用--format开关指定。
在所有格式中,crc 格式可能是最好的,因为它是可移植的,并且通过校验和具有额外的错误检查程度。
创建档案的更好方法是:
$ find /export/home -depth | cpio --create \ --message="插入下一个磁盘并输入 /dev/fd0 " \ --format=crc > /dev/fd0
它使用 crc 格式来存档,并在每张软盘写满时提示用户插入下一张磁盘并键入 /dev/fd0。--message 选项在创建和提取模式下均有效,可替换默认消息。
还有许多其他可用于创建档案的选项,我将在后面介绍。
尽管 GNU tar 确实具有 cpio 的许多优点,但使用 find 指定要备份的文件的能力比 shell 通配符提供了更大的灵活性。[您也可以使用 tar 执行此操作,但您必须将 find 的输出发送到文件中,并将该文件用作 tar 的“包含文件”—ED] 提取模式
提取模式(也称为“复制”模式)从档案中提取文件。此模式与其他两种模式不一致,因为文件名是在命令行上指定的,而不是通过标准输入上的列表指定的。
$ cpio --extract < /dev/fd0
由于未指定文件名,此命令将从 /dev/fd0 中的存档中恢复所有文件。如果存档跨越多个卷,cpio 将以与创建存档时相同的方式提示每个卷。--message 选项可用于覆盖默认消息,如在创建模式中一样。
cpio 在提取过程中会自动识别档案格式,因此无需在命令行上指定它们。
find 传递给 cpio 的路径存储在存档中。因此,注意 find 的使用方法非常重要。
@@@@@@所以.... 基本上要创建您这样做,以创建一个 cpio 文件或一张软盘: $ find . -depth | cpio --create > /tmp/archive
这将创建一个档案并提取到当前工作目录中。
$ 查找/export/home-depth|cpio--创建\
/tmp/存档
这将创建一个存档,无论情况如何,它都会尝试提取到 /export/home。如果指定了 -d 选项,则在目录不存在的情况下创建该目录。(如果 /export/home 不存在且省略了 -d,则提取将失败。)
命令行上指定的任何非选项内容都被视为文件名模式。
$ cpio --extract "back" < /dev/fd0
这将提取存档中名称中包含 back 的文件。不会恢复其他文件。还可以指定多个模式。
$ cpio --extract“返回”“保存”</dev/fd0
这将提取名称中带有“back”或“save”的文件。
除了在命令行上提供模式外,还可以将它们作为文件中的行提供。使用 --pattern-file=filename 选项指定文件。这为恢复文件提供了很大的灵活性,因为不必知道实际路径,也不需要通配符。经常恢复的模式可以存储在文件中。
--nonmatching 选项用于指定不提取的文件。
在从档案中提取任何内容之前,查看档案的内容可能会有所帮助。
$ cpio --list < /dev/fd0
--list 选项列出档案的内容。选项 --numeric-uid-gid 强制列表以数字形式显示用户和组 ID,而不是尝试使用 passwd 和 group 文件解析名称。
可以将档案发送到文件(或从文件中提取),而不是使用标准输入和输出。
$ find /export/home -depth | cpio --create \ --file=/vol/archive
此选项可用于创建或提取档案。要使用远程磁带驱动器,请在文件名前指定主机名和用户名。(用户必须无需密码即可访问远程主机。这可以通过使用文件 .rhosts 来实现)
$ find /export/home -depth | cpio --create \ --file=eric@bajor:/dev/rmt0
使用此选项创建档案的主要优点之一是,使用此选项创建的磁盘文件(不在磁带或软盘上的档案)可以使用 --append 选项附加。
如果 eric 没有密码(不推荐),或者运行该命令的主机在 eric 主目录中的 .rhosts 文件中列出,则此命令将起作用。
恢复档案时,有时不希望改变文件修改时间:
$ find /export/home -depth | cpio --extract \ --preserve-modification-times --file /vol/archive
除传递模式外,--preserve-modification-times 选项还适用于提取模式。
除了保留修改时间之外,还可以保留归档或复制文件的访问时间,以便 cpio 操作不会影响原始文件:
$ find . -depth | cpio --pass-through \ --make-directories --preserve-modification-times \ --reset-access-time /vol/copy
这会将当前目录复制到 /vol/copy,同时将旧文件的修改时间复制到新文件,并且保持原始文件的访问时间不变。
在复制(提取)或传递模式下,cpio 的默认操作是,如果现有文件较新,则在覆盖现有文件之前提示用户确认。默认情况下,cpio 不会替换现有文件。--unconditional 选项可覆盖该行为:
$ cpio --extract --无条件“返回”“保存” \ < /dev/fd0
--dereference 选项在档案创建和直通模式下复制符号链接指向的文件,而不是链接本身。
--rename 命令将提示用户以交互方式重命名每个文件。该命令仅在提取模式下有效。
当充当系统管理员时,恢复档案或复制目录并在过程中更改目标的用户或组 ID 有时很有用。
@@@@所以......基本上要提取你要做的是从 cpio 文件或软盘中提取:
$ cpio --extract --owner=Cloud.Strife < /dev/fd0
这将恢复 /dev/fd0 上的存档,并将所有提取文件的所有者设置为 eric,将组设置为 staff。只有 root 可以使用此选项。如果组被省略,则不会更改,除非包含 .,在这种情况下,组将被设置为用户的登录组。
与文件所有权相关的另一个选项是 --no-preserve-owner。这是非 root 用户的默认行为。文件将属于复制或提取它们的用户,而不是原始用户。对于 root,默认是保留所有权。
还有一些高级选项与在大端和小端架构之间传输数据以及控制 I/O 缓冲区大小以优化性能有关。