基于系統升級的考慮,這兩天在君正T20平臺上折騰如何生成jffs2 格式的rootfs。詳細的過程如下:
1.修改uboot中的分區參數:
修改為rootfs格式為jffs2的,且適當擴大rootfs分區大小。(因jffs2的壓縮比不如只讀的squashfs)
#define CONFIG_BOOTARGS BOOTARGS_COMMON " init=/linuxrc rootfstype=jffs2 root=/dev/mtdblock2 rw mtdparts=jz_sfc:256k(boot),2560k(kernel),3072k(root),-(apps)"
2.生成jffs2格式的rootfs
mkfs.jffs2 -o rootfs.jffs2 -r rootfs -e 0x8000 -n -l -X zlib --pad=0x300000
這里需要注意兩個參數:
-e:擦除塊的大小,這個參數的確定需要根據flash的手冊確定,一般是32K/64K,我當前實驗了,在T20平臺上這個參數只能是32K,如果選擇為64K,系統會出現大量的打印錯誤
[ ? ?1.449483] jffs2: Node at 0x000076d4 with length 0x00000ab5 would run over the end of the erase block
[ ? ?1.459179] jffs2: Perhaps the file system was created with the wrong erase size?
[ ? ?1.466973] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076d8: 0x0ab5 instead
[ ? ?1.476829] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076dc: 0x0f09 instead
[ ? ?1.486675] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076e0: 0x0015 instead
[ ? ?1.496517] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076e4: 0x000e instead
[ ? ?1.506360] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076e8: 0x81ed instead
[ ? ?1.516202] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076ec: 0x03e8 instead
[ ? ?1.526043] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076f0: 0xcd00 instead
[ ? ?1.535884] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076f4: 0xefb7 instead
[ ? ?1.545727] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076f8: 0xefb7 instead
[ ? ?1.555569] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000076fc: 0xefb7 instead
[ ? ?1.565408] jffs2: Further such events for this erase block will not be printed
這個命令還可以用一個-s參數,如下:
mkfs.jffs2 -o rootfs.jffs2 -r rootfs -e 0x8000 -s 0x40000 -n -l -X zlib --pad=0x300000
這個參數可以提高jffs2文件的壓縮比,但是也會降低系統的啟動速度,故而建議可以在生成roofs.jffs2時,默認不使用這個參數,實在需要壓縮空間時,再啟用這個參數。
3.生成最終的img
dd if=u-boot-with-spl.bin of=isvp_sfc_nor_${DATE}_$1.bin
dd if=uImage of=isvp_sfc_nor_${DATE}_$1.bin bs=1024 seek=256
dd if=rootfs.jffs2 of=isvp_sfc_nor_${DATE}_$1.bin bs=1024 seek=2816
dd if=appfs.jffs2 of=isvp_sfc_nor_${DATE}_$1.bin bs=1024 seek=5888
cp isvp_sfc_nor_${DATE}_$1.bin ?../../tftp/
這里面需要計算好seek對應的偏移位置