10
01

在嵌入式系統切換file system-以squashfs和jffs2為例

因為有網友問到這個問題,所以我把它拿出來討論,熟讀LDD3(Linux Device Driver3)的朋友應該都知道Linux檔案系統和block driver之間的關係,在Linux kernel stack中,block driver負責驅動裝置上的硬體,而file system就是對block drvier下讀取和寫入的指令,所以只要能正確驅動平台上儲存裝置的block drvier,那你可以在此block driver上操作任何一種file system

為了這次的demo,必需再修改arch/arm/plat-s3c24xx/common-smdk.c這個檔案,這次把mtd partition調整為4個partition,最後一個partition放squashfs的image,修改範例如下

  1. static struct mtd_partition smdk_default_nand_part[] = { 
  2. [0] = { 
  3. .name = "Boot Agent",
  4. .offset = 0,
  5. .size = SZ_256K,
  6. .mask_flags = MTD_CAP_ROM,
  7. },
  8. [1] = { 
  9. .name = "S3C2410 flash partition 1(Kernel)",
  10. .offset = SZ_2M,
  11. .size = SZ_4M,
  12. .mask_flags = MTD_CAP_ROM,
  13. },
  14. [2] = { 
  15. .name = "S3C2410 flash partition 2(File system)",
  16. .offset = SZ_8M,
  17. .size = /*SZ_4M*//*SZ_50M*/SZ_8M,
  18. //.mask_flags = 0,
  19. },
  20. [3] = { 
  21. .name = "S3C2410 flash partition 3(Other file system)",
  22. .offset = SZ_16M,
  23. .size = SZ_8M,

燒寫完kernel後開機可以從/proc/mtd中得知Linux目前mtd分割區的狀態,接下來我們用flash_eraseall把/dev/mtd3整塊抹掉,並把製作好的squashfs的image燒到/dev/mtd3,簡列步驟如下(mtd utility簡介請參考拙作JFFS2 file system-老而彌堅的檔案系統)
(1)flash_eraseall /dev/mtd3
(2)nandwrite -p /dev/mtd3 squashfs.root

燒錄完成後重新開機,修改uboot的bootargs為mem=64M console=ttySAC0 root=/dev/mtdblock3 rootfstype=squashfs,接著啟動Linux,就會發現Linux的root file system已經變為squashfs

標籤: embedded
評論: 17 | 引用: 0 | 閱讀: 14674
  • 1 
路人 [ 2008-10-02 09:30 | 回覆 | 編輯 刪除 ]
如果是用nor flash的話,在erase完成後,要如何寫到mtd裡?
用 cat /tmp/squashfs.root > /dev/mtd2 這種方式可嗎?
Joey [ 2008-10-02 13:07 郵箱 | 回覆 | 編輯 刪除 ]
請用flashcp,for example:
flashcp -v squashfs.root /dev/mtd3
路人 [ 2008-10-02 14:25 | 回覆 | 編輯 刪除 ]
/bin # cat /proc/mtd
dev: size erasesize name
mtd0: 00800000 00010000 "MX29LV640BBTC"
mtd1: 00200000 00010000 "Kernel(2M)"
mtd2: 00400000 00010000 "File System(4M)"
mtd3: 00180000 00010000 "Other(1.5M)"
mtd4: 00080000 00010000 "U-boot(512K)"
/bin # flashcp -v /mnt/tmp/squash~1.roo /dev/mtd2
Erasing blocks: 24/24 (100%)
Writing data: 10k/1500k (0%)
While writing data to 0x00000000-0x00002800 on /dev/mtd2: Input/output error

請問出現Input/output error大約是那種可能?
Joey [ 2008-10-02 17:18 郵箱 | 回覆 | 編輯 刪除 ]
Hi.可以看你partition table的設定嗎?為什麼會writing data to 0x00000000-0x00002800 on /dev/mtd2
如果設定正確,燒錄應該不是問題....
路人 [ 2008-10-02 18:23 | 回覆 | 編輯 刪除 ]
該內容只有管理員可見
Joey [ 2008-10-03 09:20 郵箱 | 回覆 | 編輯 刪除 ]
Hi..
I don't use MSN, but we can discuss via email
ahdeng [ 2008-10-07 10:03 | 回覆 | 編輯 刪除 ]
請問FS是否可在U-BOOT直接燒錄?需要做轉換嗎?
Joey [ 回復於2008-10-07 21:00 郵箱 | 編輯 刪除 ]
可以直接燒錄,不需轉換...
ahdeng [ 2008-10-09 18:05 | 回覆 | 編輯 刪除 ]
我在u-boot直接把FS燒錄在mtd2對應的FLASH ADDRESS,但是仍無法mount起來,有可能是什麼原因?
Joey [ 回復於2008-10-09 23:16 郵箱 | 編輯 刪除 ]
如果您製作image的步驟和u-boot分割區都都沒錯
那就要檢查linux kernel的選項是否都選對,partition table是否分割正確,如果flash driver+partition table都設定正確,file system沒道理跑不起來
andyen [ 2008-11-04 20:41 | 回覆 | 編輯 刪除 ]
请问squashfs的mount速度如何?
Joey [ 回復於2008-11-10 09:01 郵箱 | 編輯 刪除 ]
不同的filesystem mount速度都差不多,我想您應該是指"執行指令"的速度吧,使用者執行指令時,壓縮型的filesystem需要解壓縮image內的檔案供使用者存取,所以速度會比jffs2 or ext2慢,但詳細的數據我沒有..

cromfs,cramfs和squshfs速度都差不多,只有壓縮率高低的差別...
andyen [ 2008-11-04 20:42 | 回覆 | 編輯 刪除 ]
比cramfs, cromfs如何?
iris [ 2008-12-29 16:27 | 回覆 | 編輯 刪除 ]
該內容只有管理員可見
Joey [ 回復於2009-01-05 09:15 郵箱 | 編輯 刪除 ]
1.GPL
2.修改可以,但要公布source,並且在修改後的檔案(不管是原始碼還是BINARY)都必需夾帶板權說明
slchen [ 2011-10-05 17:22 | 回覆 | 編輯 刪除 ]
Hi,
請問這種方式有處理到 bad block 嗎?

我刻意用 nand markbad 在 nand 上標了幾個 bad block, 如果用 nandwrite 寫, 會出現下列訊息

QUASHFS error: squashfs_read_data failed to read block 0x65d32ff
[ 1360.468750] SQUASHFS error: Unable to read metadata cache entry [65d32ff]
[ 1360.476562] SQUASHFS error: Unable to read inode 0x3b43b025f

如果是用 dd, 反而可以 mount 起來.

但是 dd 本身其實是不會處理 bad block 的, 我是先 dd 完再開到 u-boot 裡去 dump bad block, 就會發現非 oob 處被寫資料, 而 oob 是空的.
Joey [ 回復於2011-10-31 09:33 郵箱 | 編輯 刪除 ]
Sorry for the late reply.

No. SquashFS will not handle bad block. It is just like CRAMFS and bad block management is not the thing which it concern.

Use UBIFS or YAFFS to support flash file system.
  • 1 
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: