10 01 |
在嵌入式系統切換file system-以squashfs和jffs2為例作者: Joey 日期: 2008-10-01 19:44 |
因為有網友問到這個問題,所以我把它拿出來討論,熟讀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,修改範例如下
燒寫完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
![]() |
如果是用nor flash的話,在erase完成後,要如何寫到mtd裡? 用 cat /tmp/squashfs.root > /dev/mtd2 這種方式可嗎? |
![]() |
/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大約是那種可能? |
![]() |
請問FS是否可在U-BOOT直接燒錄?需要做轉換嗎? |
![]() |
我在u-boot直接把FS燒錄在mtd2對應的FLASH ADDRESS,但是仍無法mount起來,有可能是什麼原因? |
![]() |
请问squashfs的mount速度如何? |
![]() |
不同的filesystem mount速度都差不多,我想您應該是指"執行指令"的速度吧,使用者執行指令時,壓縮型的filesystem需要解壓縮image內的檔案供使用者存取,所以速度會比jffs2 or ext2慢,但詳細的數據我沒有.. cromfs,cramfs和squshfs速度都差不多,只有壓縮率高低的差別... |
![]() |
該內容只有管理員可見 |
![]() |
1.GPL 2.修改可以,但要公布source,並且在修改後的檔案(不管是原始碼還是BINARY)都必需夾帶板權說明 |
![]() |
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 是空的. |
![]() |
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. |
fw_printenv-control u-boot enviroment variables under linux (2009-05-12 16:35)
rpcapd與netcat-測試嵌入式系統的好工具 (2009-04-09 17:06)
udev-強大的device node管理系統 (2009-02-02 20:35)
Framebuffer兩三事-Test On QT2410 (2009-01-12 16:29)
UIO-Linux user space I/O driver (2008-12-15 14:50)
GDB-刺入bug心臟的寶劍 (2008-10-15 16:11)
Telnet daemon-RS232以外的選擇 (2008-10-03 18:57)
Linux kernel module-進入系統核心的鑰匙 (2008-09-12 14:03)
SQLite-麻雀雖小五臟俱全 (2008-09-05 14:46)