linux cpio命令详解


linux cpio命令详解

回到顶部
cpio类似tar命令,可以将文件复制打包到cpio或tar格式的归档包文件中,也可以从归档包文件中复制文件。 归档包文件可以是磁盘上的文件, 也可以是磁带等设备文件。
cpio有三种操作模式,如下表所示:
cpio三种操作模式
cpio三种操作模式
操作模式 模式说明
copy-out模式 该模式用于打包备份文件。
cpio把文件复制到归档包中。cpio要打包的文件名来自标准输入,它从标准输入获得文件名列表,一行一个。 一般通过管道来将标准输入重定向到另一个命令的输出。最常见的方法是使用find命令生成文件名列表,然后通过管道传送给cpio, 这样cpio就可以知道要备份的数据来自哪里。需要在find后面加上-depth选项, 减少因为进入没有访问权限的目录而引起的麻烦。
cpio默认把归档包文件写到标准输出,所以需要用重定向符号>或者>>将归档包数据输出重定向到一个文件中。
copy-in模式 该模式用于从归档包文件中恢复文件。
cpio它从标准输入读入归档包,将归档包中的文件读出或者列出归档包里的内容。cpio将从归档包中读出的数据写到标准输出。
copy-pass模式 cpio把文件从一棵目录树复制到另一棵, 它结合了 copy-in 和 copy-out 的操作, 但不使用归档包。 cpio从标准输入读取欲复制的文件名列表; 目标目录作为非选项的命令行参数给出。
cpio支持下列的归档包格式: binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, 和 POSIX.1 tar。
cpio的某些选项只能用在对应的操作模式上,常用的命令选项格式如下所示:
            [root@initroot ~]# cpio -ovcB  > [file|device] #备份
            [root@initroot ~]# cpio -ivcdu < [file|device] #还原 
            [root@initroot ~]# cpio -ivct  < [file|device] #察看
            
copy-out模式(备份)用到的选项与参数:
-o :将数据copy输出到文件或设备上
-B :让预设的Blocks可以增加至5120bytes ,预设是512bytes!这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)
copy-in模式(还原)用到的选项与参数:
-i :将数据自文件或设备copy出来系统当中
-d :自动建立目录!使用cpio所备份的数据内容不见得会在同一层目录中,因此我们必须要让cpio在还原时可以建立新目录,此时就得要-d选项的帮助!
-u :自动的将较新的文件覆盖较旧的文件!
-t :需配合-i选项,可用在"察看"以 cpio 建立的文件或设备的内容
通用的选项与参数:
-v :让储存的过程中文件名可以在屏幕上显示
-c :一种较新的portable format方式储存
cpio从标准输入读入数据,将处理过的数据输出到标准输出,所以cpio需要配合管道和重定向符号使用。
找出/boot目录下的所有文件,备份到/tmp/boot.cpio归档包文件中:
            [root@initroot ~]# cd / 
            [root@initroot /]# find boot -print
            boot
            boot/grub
            boot/grub/gfxblacklist.txt
            boot/grub/unicode.pf2
            boot/grub/locale
            ...省略...
            
find命令可以找出boot目录下所有的文件,包括文件与目录!注意这里的boot为相对路径,而不是绝对路径!
            [root@initroot /]# find boot | cpio -ocvB > /tmp/boot.cpio
            
            [root@initroot /]# ls -lh /tmp/boot.cpio 
            -rw-r--r-- 1 peter peter 193M Feb 10 15:59 /tmp/boot.cpio
            [root@initroot ~]# file /tmp/boot.cpio 
            /tmp/boot.cpio: ASCII cpio archive (pre-SVR4 or odc)
            
使用find boot找出文件名,通过管道线|将输出传给cpio,通过重定向符号>将归档数据输出到/tmp/boot.cpio文件! 上面find的参数boot为相对路径,而不是绝对路径,cpio不会对路径做特殊处理,给的什么数据它就接收什么数据。 所以如果这里用绝对路径的话,那么find命令的输出也是也是绝对路径,cpio接收的也是绝对路径, 那么当从归档文件中复制文件的时候,因为是绝对路径,那么复制出来的文件就一定会覆盖掉原本/boot目中的文件! 这是非常危险的!所以再用find命令配合cpio打包文件的时候,一定要用相对路径。参考tar命令的-P选项!!
现在将归档包文件/tmp/boot.cpio解开到/root/目录下:
            [root@initroot ~]# cd ~
            [root@initroot ~]# cpio -idvc < /tmp/boot.cpio 
            [root@initroot ~]# ls -al /root/boot
            
可以看出/root/boot与/boot的内容一模一样!
cpio可以将系统的数据完整的备份到磁带机上:
              [root@initroot ~]# find / | cpio -ocvB > /dev/st0
            
从磁带机中还原数据:
              [root@initroot ~]# cpio -idvc < /dev/st0
            
cpio可以备份任何的文件, 包括/dev下的设备文件!是非常重要的命令!
cpio必需要配合其他的程序,例如find来建立文件名,所以cpio与管线命令及数据流重导向有非常密切的关系!
事实上/boot目录下的/boot/initramfs-xxx或者/boot/initrd.img-xxx-generic文件也是一个cpio归档包文件。
我们可以将该文件解开到/tmp/initramfs目录下看看这个归档包中都有哪些文件:
            [root@initroot ~]# file initrd.img-4.15.0-65-generic 
            initrd.img-4.15.0-65-generic: ASCII cpio archive (SVR4 with no CRC)
            [root@initroot ~]# mkdir /tmp/initramfs
            [root@initroot ~]# cd /tmp/initramfs 
            [root@initroot initramfs]# cpio -idv < /boot/initrd.img-4.15.0-65-generic
            .
            kernel
            kernel/x86
            kernel/x86/microcode
            kernel/x86/microcode/AuthenticAMD.bin
            56 blocks
            
注意这里将-c选项去掉,如果加上-c选项的话,cpio会出现如下提示:
            cpio: premature end of file
            
将-c选项去掉就可以成功解压归档包文件了!
下面是更多cpio选项参数的说明:
选项 (OPTIONS)
-0, --null 在copy-out 和 copy-pass 模式中, 认为输入的文件名以 null字符结尾,而不是换行符, 这样即使文件名中包含换行符, 也不影响归档。 GNU find 是生成 null 结尾文件名列表的方法之一。
-a, --reset-access-time 读取完文件后重置文件的访问时间, 这样看上去就象没被访问过一样。
-A, --append 追加到已经存在的归档包中。仅用于 copy-out模式。该归档包必须是用 -O 或 -F (--file) 选项指定的磁盘文件。
-b, --swap 在 copy-in 模式中, 颠倒数据中字中的半字和半字中的字节顺序。 相当于 -sS 使用这个选项,可以在大端数和小端数机器之间转换 32 位整数。
-B 把 I/O 块大小设置成 5120 字节,最初的块大小是 512 字节。
--block-size=BLOCK-SIZE 设置 I/O 块 大小 为 BLOCK-SIZE * 512 字节。
-c 使用老式的跨平台 (ASCII) 归档格式。
-C IO-SIZE, --io-size=IO-SIZE 设置 I/O 块大小为 IO-SIZE 字节。
-d, --make-directories 在需要的地方创建开始目录。
-E FILE, --pattern-file=FILE 在 copy-in 模式中, 从 FILE 中读取用于匹配文件名的模式串, FILE 中的内容就象 cpio 的非选项参数一样看待。
-f, --nonmatching 只复制那些不匹配任何给定的模式串的文件。
-F, --file=archive 使用归档文件名, 而不是标准输入或输出,此参数 后边 需要 紧跟 归档文件名。
--force-local 和 -F, -I, 或 -O, 一起用, 即使文件名中含有一个冒号,也把归档文件看作本地文件, 一般说来冒号指出一个远程主机名字。
-H FORMAT, --format=FORMAT使用归档格式 FORMAT。有效的格式在下面列出, 大小写均可. "copy-in" 模式的缺省动作是自动检测归档格式, "copy-out" 的缺省格式是"bin"。
bin 老式的 binary 格式。
odc 老式的 (POSIX.1) 跨平台格式。
newc 新型 (SVR4) 跨平台格式, 支持大于 65536 i节点的文件系统,一般 制作 ramdisk 就用 这个 格式。
crc 新型 (SVR4) 跨平台格式, 并且计算校验和。
tar 老式的 tar 格式。
ustar POSIX.1 tar 格式, 也能识别 GNU tar 归档文件, 它们相似但不全相同。
hpbin HP UNIX 上的 cpio 使用的老式的 binary 格式。(用独特的方法储存设备文件)
hpodc HP UNIX 上的 cpio 使用的跨平台格式。 (用独特的方法储存设备文件)
-i, --extract 进入 copy-in 模式,也就是 解压。
-I archive 使用归档文件名, 而不是标准输入。 如果把其他机器上的磁带机作成归档文件, 文件名要用 "HOSTNAME:" 开始。 主机名前面可以加上用户名和一个 '@', 作为 访问远程 磁带机的用户 (如果你有这样的权限, 一般在用户的 ~/.rhosts 文件中会有这么一项)。
-k 无效操作; 只是用来兼容其他版本的 cpio。
-l, --link 如果有可能, 连接文件, 而不是复制。
-L, --dereference 解除符号连接的关联 (复制符号连接指向的 文件, 而不是连接本身)。
-m, --preserve-modification-time 当创建文件时, 保留以前的文件修改时间。
-M MESSAGE, --message=MESSAGE当备份介质(例如 磁带或软盘) 到达卷尾时, 显示一条消息, 提醒用户插入下一卷。 如果 MESSAGE 包含字符串 "%d", 它被替换成当前卷号 (从 1 开始)。
-n, --numeric-uid-gid 以详细方式 (verbose) 显示内容时, 用数字显示 UID 和 GID, 而不是翻译成名称。
--no-absolute-filenames 在copy-in模式中, 即使它们在归档包中有绝对路径名。也在当前目录中创建所有相关文件,
--no-preserve-owner 在 copy-in 和 copy-pass 模式中, 不改变文件的属主关系 (译注: 疑为不保留); 使它们属于展开它们的用户。 这是普通用户的缺省行为, 因此 System V 的用户不致于无意中把文件泄露(give away)。
-o, --create 进入 copy-out 模式。
-O archive 使用归档文件名, 而不是标准输出。
--only-verify-crc 当在 copy-in 模式读入 CRC 格式的归档包时, 不展开里面的文件, 而只是测试文件的 CRC 码。
-p, --pass-through 进入 copy-pass 模式。
--quiet 不显示复制的块数。
-r, --rename 交互式文件改名。
-R [user][:.][group], --owner [user][:.][group] 在 copy-out 和 copy-pass 模式中, 把所有文件的属主设置为指定的用户和/或用户组。 无论用户还是用户组都必须存在。 如果省略用户组, 但是给出了分隔符 ":" 或 "。', 则使用给定用户登录时的用户组。 只有超级用户能够改变文件的属主。
--sparse 在 copy-out 和 copy-pass 模式中, 把大块数据 0 的文件写成稀疏文件 (sparse file)。
-s, --swap-bytes 在 copy-in 模式中, 交换文件中每一个半字(字节对) 中的字节。
-S, --swap-halfwords 在 copy-in 模式中, 交换文件中每一个字(4字节) 中的半字。
-t, --list 显示输入归档包的内容,默认 把 内容 显示 到 屏幕。
-u, --unconditional 替换所有文件, 不再提问是否用旧文件替换已经存在的新文件。
-v, --verbose 列出处理的文件, 加上 -t 选项可以列出一个 'ls -l' 风格的列表。 在一个归档包内容的详细列表 (verbose) 中, 如果本地系统不存在归档文件的用户和用户组名称, 它们将被替换成其数字 UID和GID 对应于本地系统的用户和用户组名称。
-V --dot 每处理一个文件, 显示一个 "."。
--version 显示 cpio 程序的版本号, 然后退出。

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读