cpio命令与文件系统制作

来源:互联网 发布:c语言中如何产生随机数 编辑:程序博客网 时间:2024/06/14 10:59

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

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

[plain] view plaincopy
  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 plaincopy
  1. cd rootdir  
  2. find . path"./dev"opath"./etc" -prune -o -print | cpio -o -O ../rootimg.cpio  

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

[plain] view plaincopy
  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 plaincopy
  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 plaincopy
    1. zcat xxx.cpio.gz | cpio -idmv  
    这样操作的好处是,不会对源文件修改,如果使用gunzip解压,可能会修改文件日期等,当然也可能是我不太熟悉该命令使用。
    不过如果涉及到设备文件的话,可能需要root权限,在这种情况下,个人比较推荐使用fakeroot命令,而不是使用sudo命令,这主要涉及到最后的文件归属问题:
    [plain] view plaincopy
    1. zcat xxx.cpio.gz | fakeroot cpio -idmv  
  2. 补充二
    上述的说明可能权限上没有问题,但是如果涉及到设备文件的话,可能fakeroot存在问题,使用fakeroot创建的dev目录如下:
    [plain] view plaincopy
    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 plaincopy
    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  
    最后的结果没有把文件的属性保存下来,至于究竟是否有问题没有考究
0 0