cpio命令与文件系统制作

43 篇文章 1 订阅
16 篇文章 0 订阅

嵌入式开发过程中的文件系统制作,往往是使用已经定制好的目录及文件进行制作,下面以实际的例子进行说明:

假设当前目录为rootdir,目录结构如下:

[plain]  view plain copy
  1. root@debian:~# tree -L 2 rootdir  
  2. rootdir  
  3. |-- dev  
  4. |-- drv  
  5. |   |-- drv1  
  6. |   `-- drv2  
  7. |-- etc  
  8. `-- proc  
  9.   
  10. 4 directories, 2 files  

现在我们想把rootdir的内容制作成一个文件系统,但是又不是使用rootdir的全部内容,而只有drv内容,操作如下:

[plain]  view plain copy
  1. cd rootdir  
  2. find .  path"./dev"opath"./etc"  -prune -o -print | cpio -o -O ../rootimg.cpio  

可以看到生成了一个rootimg.cpio文件,现在我们创建一个文件系统:

[plain]  view plain copy
  1. #创建一块32MB大小的数据空间  
  2. dd if=/dev/zero of=root.img bs=1024 count=32000  
  3. #把数据空间制作成文件系统  
  4. mkfs.ext4 -F root.img >/dev/null  
  5. #创建临时目录  
  6. mkdir tmpdir  
  7. #挂载文件系统  
  8. mount -o loop root.img tmpdir  
  9. #把需要使用的文件和目录解压到目录  
  10. cd tmpdir  
  11. cpio -id -I ../root.cpio  

可以看到tmpdir的目录结构如下:

[plain]  view plain copy
  1. root@debian:~# tree -L 2 tmpdir/  
  2. tmpdir/  
  3. |-- drv  
  4. |   |-- drv1  
  5. |   `-- drv2  
  6. |-- lost+found  
  7. `-- proc  
  8.   
  9. 3 directories, 2 files  

基本上已经达到我们文件系统制作的目的了,当然除了这些工作之外还需要做其他的工作。

  1. 补充一
    很多情况下我们遇到的可能是这种情况,文件系统是已经给定的xxx.cpio.gz,我们只是需要解压操作,不过个人比较推荐下面的方法:
    [plain]  view plain copy
    1. zcat xxx.cpio.gz | cpio -idmv  
    这样操作的好处是,不会对源文件修改,如果使用gunzip解压,可能会修改文件日期等,当然也可能是我不太熟悉该命令使用。
    不过如果涉及到设备文件的话,可能需要root权限,在这种情况下,个人比较推荐使用fakeroot命令,而不是使用sudo命令,这主要涉及到最后的文件归属问题:
    [plain]  view plain copy
    1. zcat xxx.cpio.gz | fakeroot cpio -idmv  
  2. 补充二
    上述的说明可能权限上没有问题,但是如果涉及到设备文件的话,可能fakeroot存在问题,使用fakeroot创建的dev目录如下:
    [plain]  view plain copy
    1. f30@debian:~/workspace/exdroid/lichee/linux-2.6.36/rootfs/skel$ ll dev/  
    2. total 0  
    3. -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 console  
    4. -rw-r----- 1 f30 f30 0 Jun 16 00:52 kmem  
    5. -rw-r----- 1 f30 f30 0 Jun 16 00:52 loop0  
    6. -rw-r----- 1 f30 f30 0 Jun 16 00:52 loop1  
    7. -rw-r----- 1 f30 f30 0 Jun 16 00:52 mem  
    8. -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 null  
    9. -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 random  
    10. -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 tty  
    11. -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 tty0  
    12. -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 tty7  
    13. -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 ttyS0  
    14. -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 zero  
    而是用sudo操作创建的dev目录如下:
    [plain]  view plain copy
    1. f30@debian:~/workspace/exdroid/lichee/linux-2.6.36/rootfs/skel$ ll dev/  
    2. total 0  
    3. crw-rw-rw- 1 root root 5,  1 Nov 25 03:48 console  
    4. crw-r----- 1 root root 1,  2 Nov 25 03:48 kmem  
    5. brw-r----- 1 root root 7,  0 Nov 25 03:48 loop0  
    6. brw-r----- 1 root root 7,  1 Nov 25 03:48 loop1  
    7. crw-r----- 1 root root 1,  1 Nov 25 03:48 mem  
    8. crw-rw-rw- 1 root root 1,  3 Nov 25 03:48 null  
    9. crw-rw-rw- 1 root root 1,  8 Nov 25 03:48 random  
    10. crw-rw-rw- 1 root root 5,  0 Nov 25 03:48 tty  
    11. crw-rw-rw- 1 root root 4,  0 Nov 25 03:48 tty0  
    12. crw-rw-rw- 1 root root 4,  7 Nov 25 03:48 tty7  
    13. crw-rw-rw- 1 root root 4, 64 Nov 25 03:48 ttyS0  
    14. crw-rw-rw- 1 root root 1,  5 Nov 25 03:48 zero  
    最后的结果没有把文件的属性保存下来,至于究竟是否有问题没有考究
cpio命令的使用 利用cpio 可将文件或目录从文件库获取出来或将数据拷贝到文件库。 cpio 的指令格式: cpio –i[bcdmrtuv] [patterns] cpio –o [abcv] cpio –p [adlmuv][directory] 说明:cpio 共有三种基本模式,-o即copy-out 模式,将一组文件copy到一个文件库,-i 即copy-in 模式,读取文件库,并将其展开在当前目录,-p 能从某个目录读取所有文件(包括子目录到另一个目录),且不以archive(归档)的方式存放。 cpio 常配合shell使用。-o常用标准输入设备读取要copy 的文件名称,并将copy成的archive file 通过标准输出设备输出。一般利用输入/输出重定向或管道的原理,达到真正复制的功能。 (一)利用cpio备份: [例1] $ find work –print | cpio –ocdv > /dev/rfd0135ds18 将work目录下的文件备份到软盘上。-o表示输出模式,-c生成一个带有头信息的文件。 -d表示按需要生成目录,-v表示命令执行时不断显示信息。用“>”把结果定向到软盘。 [例2] $ ls |cpio –o >/usr/linfs/old1 将当前目录下的所有文件复制成old1 archive file [例3] $ ls *.c | cpio –o>oldc 复制工作目录中的所有的c程序. [例4] $ ls| cpio –p /usr/linfs/tempdir 复制当前工作目录下的文件到/usr/linfs/tempdir 目录,不生成archive file . (二)利用cpio 复原: [例5] $ cpio –icdv < /dev/rfd0135ds18 将软盘中的文件复原。-i告诉cpio把文件作为它的输入,-d按需要生成目录,-v显示执行时的所有信息,-c具有头文件格式。 [例6] $ cpio –icdv "*stat.wp" < /dev/rfd0135ds18 仅复原*stat.wp的文件 [例7] $ cpio –i </usr/linfs/old1 *.f 仅复原*.f 文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值