cpio命令與檔案系統製作
阿新 • • 發佈:2018-12-31
嵌入式開發過程中的檔案系統製作,往往是使用已經定製好的目錄及檔案進行製作,下面以實際的例子進行說明:
假設當前目錄為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
基本上已經達到我們檔案系統製作的目的了,當然除了這些工作之外還需要做其他的工作。
- 補充一
很多情況下我們遇到的可能是這種情況,檔案系統是已經給定的xxx.cpio.gz,我們只是需要解壓操作,不過個人比較推薦下面的方法:
這樣操作的好處是,不會對原始檔修改,如果使用gunzip解壓,可能會修改檔案日期等,當然也可能是我不太熟悉該命令使用。zcat xxx.cpio.gz | cpio -idmv
不過如果涉及到裝置檔案的話,可能需要root許可權,在這種情況下,個人比較推薦使用fakeroot命令,而不是使用sudo命令,這主要涉及到最後的檔案歸屬問題:zcat xxx.cpio.gz | fakeroot cpio -idmv
- 補充二
上述的說明可能許可權上沒有問題,但是如果涉及到裝置檔案的話,可能fakeroot存在問題,使用fakeroot建立的dev目錄如下:
而是用sudo操作建立的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
最後的結果沒有把檔案的屬性儲存下來,至於究竟是否有問題沒有考究[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