1. 程式人生 > >cpio命令與檔案系統製作

cpio命令與檔案系統製作

嵌入式開發過程中的檔案系統製作,往往是使用已經定製好的目錄及檔案進行製作,下面以實際的例子進行說明:

假設當前目錄為rootdir,目錄結構如下:

[email protected]:~# tree -L 2 rootdir
rootdir
|-- dev
|-- drv
|   |-- drv1
|   `-- drv2
|-- etc
`-- proc

4 directories, 2 files

現在我們想把rootdir的內容製作成一個檔案系統,但是又不是使用rootdir的全部內容,而只有drv內容,操作如下:

cd rootdir
find . \( -path "./dev" -o -path "./etc" \) -prune -o -print | cpio -o -O ../rootimg.cpio

可以看到生成了一個rootimg.cpio檔案,現在我們建立一個檔案系統:

#建立一塊32MB大小的資料空間
dd if=/dev/zero of=root.img bs=1024 count=32000
#把資料空間製作成檔案系統
mkfs.ext4 -F root.img >/dev/null
#建立臨時目錄
mkdir tmpdir
#掛載檔案系統
mount -o loop root.img tmpdir
#把需要使用的檔案和目錄解壓到目錄
cd tmpdir
cpio -id -I ../root.cpio

可以看到tmpdir的目錄結構如下:

[email protected]:~# tree -L 2 tmpdir/
tmpdir/
|-- drv
|   |-- drv1
|   `-- drv2
|-- lost+found
`-- proc

3 directories, 2 files

基本上已經達到我們檔案系統製作的目的了,當然除了這些工作之外還需要做其他的工作。

  1. 補充一
    很多情況下我們遇到的可能是這種情況,檔案系統是已經給定的xxx.cpio.gz,我們只是需要解壓操作,不過個人比較推薦下面的方法:
    zcat xxx.cpio.gz | cpio -idmv
    這樣操作的好處是,不會對原始檔修改,如果使用gunzip解壓,可能會修改檔案日期等,當然也可能是我不太熟悉該命令使用。
    不過如果涉及到裝置檔案的話,可能需要root許可權,在這種情況下,個人比較推薦使用fakeroot命令,而不是使用sudo命令,這主要涉及到最後的檔案歸屬問題:
    zcat xxx.cpio.gz | fakeroot cpio -idmv
  2. 補充二
    上述的說明可能許可權上沒有問題,但是如果涉及到裝置檔案的話,可能fakeroot存在問題,使用fakeroot建立的dev目錄如下:
    [email protected]:~/workspace/exdroid/lichee/linux-2.6.36/rootfs/skel$ ll dev/
    total 0
    -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 console
    -rw-r----- 1 f30 f30 0 Jun 16 00:52 kmem
    -rw-r----- 1 f30 f30 0 Jun 16 00:52 loop0
    -rw-r----- 1 f30 f30 0 Jun 16 00:52 loop1
    -rw-r----- 1 f30 f30 0 Jun 16 00:52 mem
    -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 null
    -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 random
    -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 tty
    -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 tty0
    -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 tty7
    -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 ttyS0
    -rw-rw-rw- 1 f30 f30 0 Jun 16 00:52 zero
    而是用sudo操作建立的dev目錄如下:
    [email protected]:~/workspace/exdroid/lichee/linux-2.6.36/rootfs/skel$ ll dev/
    total 0
    crw-rw-rw- 1 root root 5,  1 Nov 25 03:48 console
    crw-r----- 1 root root 1,  2 Nov 25 03:48 kmem
    brw-r----- 1 root root 7,  0 Nov 25 03:48 loop0
    brw-r----- 1 root root 7,  1 Nov 25 03:48 loop1
    crw-r----- 1 root root 1,  1 Nov 25 03:48 mem
    crw-rw-rw- 1 root root 1,  3 Nov 25 03:48 null
    crw-rw-rw- 1 root root 1,  8 Nov 25 03:48 random
    crw-rw-rw- 1 root root 5,  0 Nov 25 03:48 tty
    crw-rw-rw- 1 root root 4,  0 Nov 25 03:48 tty0
    crw-rw-rw- 1 root root 4,  7 Nov 25 03:48 tty7
    crw-rw-rw- 1 root root 4, 64 Nov 25 03:48 ttyS0
    crw-rw-rw- 1 root root 1,  5 Nov 25 03:48 zero
    最後的結果沒有把檔案的屬性儲存下來,至於究竟是否有問題沒有考究