開發環境:
PC主機:Ubuntu 和 RedHat 9.0
目標板:TQ2440開發板,linux內核2.6.30,根文件系統為YAFFS。
0. 引言
在yaffs2,jffs2和cramfs這3個文件系統中,只有cramfs可以作為loop device使用mount命令來掛載,而其他兩個則不行。
不過內核可以使用RAM來模擬一個塊設備,從而可以讓jffs2文件系統使用mount命令來掛載文件系統。
至於yaffs2文件系統的掛載,目前還不知道有什麼方法。
本文將對如何使用RAM來掛載jffs2文件系統做簡要說明。
1. 配置開發板Linux內核
首先,打開test driver using RAM,這裡將它編譯進內核,而不是采用模塊方式。下面的4096可以設的更大一下,這樣能夠容納更大的文件系統。這裡使用默認的4096。
其次,讓內核支持jffs2文件系統。
最後,編譯內核。編譯完成以後,重新下載內核鏡像到開發板中。
2. 制作jffs2文件系統
在PC機執行:
www.linuxidc.com @ubuntu:~$ mkfs.jffs2 -r ./jffs-dir-test/ -o jffs2.bin
www.linuxidc.com @ubuntu:~$ ll jffs2.bin
-rw-r--r-- 1 www.linuxidc.com www.linuxidc.com 268 2012-07-13 17:22 jffs2.bin
說明:mkfs.jffs2工具是ubuntu系統自帶的。
3.修改內核命令行
在沒有使用RAM功能時,內核命令行:Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
分區表為:
major minor #blocks name
31 0 256 mtdblock0
31 1 3072 mtdblock1
31 2 257024 mtdblock2
新編譯的內核啟動後,分區表如下:
major minor #blocks name
31 0 4096 mtdblock0 //4096是配置時指定的大小
31 1 256 mtdblock1
31 2 3072 mtdblock2
31 3 257024 mtdblock3
我們可以看到,如果開啟test driver using RAM後,mtdblock0將成為內存映射的塊文件。原先的mtdblock0~1將後移,成為mtdblock1~3。而我們的內核命令行指定了文件系統在mtdblock2分區中,因此需要對內核命令行做出修改:root=/dev/mtdblock3。如果不做修改,內核將會panic,因為內核找不到文件系統。
4. 掛載jffs2
在開發板中執行:
[root@ www.linuxidc.com nfs]#dd if=jffs2.bin of=/dev/mtdblock0
0+1 records in
0+1 records out
[root@ www.linuxidc.com nfs]#mount -t jffs2 /dev/mtdblock0 /mnt/jiffs2/
[root@ www.linuxidc.com nfs]#cd /mnt/jiffs2/
[root@ www.linuxidc.com jiffs2]#ls
a hello
[root@ www.linuxidc.com jiffs2]#cat hello
#This is a test for jffs2
現在我們修改下hello的內容,並卸除掛載的jffs2。
[root@ www.linuxidc.com jiffs2]#cat hello
#This is a test for jffs2
#another test
然後,重新掛載,發現剛才修改的內容仍在
[root@ www.linuxidc.com nfs]#dd if=jffs2.bin of=/dev/mtdblock0
0+1 records in
0+1 records out
[root@ www.linuxidc.com nfs]#mount -t jffs2 /dev/mtdblock0 /mnt/jiffs2/
[root@ www.linuxidc.com nfs]#cat /mnt/jiffs2/hello
#This is a test for jffs2
#another test
但是,當重啟開發板之後,之前的修改又沒了。這個符合RAM的特性,掉電數據就沒了。
[root@ www.linuxidc.com nfs]#cat /mnt/jiffs2/hello
#This is a test for jffs2