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
評論: 15 | 引用: 0 | 閱讀: 4262
  • 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)都必需夾帶板權說明
  • 1 
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: