08
27

SQUASHFS-Linux壓縮型檔案系統的王者

squashfs是眾多Live CD使用的檔案系統,Why?因為它那嚇死人的壓縮率,舉個例子,以筆者製做的root file system為例,壓縮過後的initial ram disk大小為1.3MB,但squashfs製做出來的file system image只有500多k,squashfs image居然只有compressed initial ram disk image一半的容量,這種節省儲存空間和記憶體空間的檔案系統,最適合在台灣用了,因為代工廠最需要的cost down,這種軟體技術做到了在小容量記憶體系統中放大檔案的可能性

可惜目前Linux-2.6.26還沒有支援squashfs,所以必需去patch kernel才能使用,首先至官方網站下載squashfs source and tool,目前最新的版本是3.4,解壓縮後,參照以下指令執行patch

  1. %cd /usr/src/linux-2.6.26 
  2. %patch -p1 < location-of-squashfs/kernel-patches/linux-2.6.26/squashfs3.4-patch

然後編譯製作squafs file system image的工具

  1. %cd location-of-squashfs/squashfs3.4/squashfs-tools 
  2. %make

會得到兩支執行檔mksquashfs和unsquashfs,mksquashfs是製做映像檔的工具,unsquashfs可解壓縮印像檔並查看內容,詳細的使用方法請參考squashfs-HOWTO

製做squashfs檔案系統的指令很簡單,用法大致如下

  1. %mksquashfs [source] [dest] 
  2. %mksquashfs ./fs squashfs.root

kernel command line請修改為” mem=64M console=ttySAC0 initrd=0x32000000,2000000 root=/dev/ram0 rootfstype=squashfs”,這裡的範例是根據QT2410設定的,假設我們把squashfs image下載到板子上的0x32000000且其大小為2MB,rootfstype為squashfs,kernel開機完會mount /dev/ram0的squasfs image,可參考如下圖片

標籤: embedded
評論: 8 | 引用: 0 | 閱讀: 23765
  • 1 
路人 [ 2008-10-01 14:16 | 回覆 | 編輯 刪除 ]
請問,如果要把squashfs寫到mtd,該如何做?
Joey [ 回復於2008-10-01 19:46 郵箱 | 編輯 刪除 ]
Hi...你的問題我已經寫好網誌回答你了,請參考這一篇
bolulu [ 2009-06-08 20:50 | 回覆 | 編輯 刪除 ]
Hi Joey
小弟照著squash README中的方法, 成功的將一個RootFileSys壓縮為squashFS格式, 並寫入arm板子的nand中, 唯獨ramdisk不成功, kernel有開啟support ramdisk及squashFS, 錯誤訊息為"No filesystem could mount root, tried: squashfs
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)"
但此FS是可以work的(放HDD中開啟)

想請教Joey大大, 小的是不是還漏了什麼??
如: /etc/init.d/rcS 中要寫載入ramdisk的shell scrip??

謝謝 <(_ _)>
Joey [ 回復於2009-06-09 20:01 郵箱 | 編輯 刪除 ]
Hi bolulu:

linux開機的步驟如下
1.bootloader
2.linux kernel
3.file system
4.initial script
您的問題很明顯是卡在mounting filesystem,kernel根本不認得您擺在NAND的squashfs image,所以您修改/etc/init.d/rcS於事無補,建議您再確定一次nand的block driver,和kernel command line
我這邊的範例是直接把filesystem load到memory,所以你看我的kernel command line的file system位址是0x32000000
以上
bolulu [ 2009-06-10 13:11 | 回覆 | 編輯 刪除 ]
Hi Joey
小弟問題解決了, 原來是Kernel有問題
menuconfig時, 這些要選到(沒勾到第三個)
1. support squashFS
2. RAM disk support
3. Initial RAMdisk file system and RAMdisk support
謝謝您不吝賜教 ^_^
ycc [ 2009-06-11 00:06 | 回覆 | 編輯 刪除 ]
Hi Joey,
請教您一個問題, Squash root FS既然是read-only, 是不是意指我不能mount 一個device到Squash FS底下的任一個目錄呢? 舉例來說, 我有一個案子, 現在kernel可以成功的掛載Squash root FS, 假使在這之後, 有一USB外接式硬碟被plug-in到該系統, 我可以看到新增一個device node(/dev/sda1), 請問這樣有跟Read-only的說法衝突嗎? (不是read-only嗎? 為何可以增加一個device node ? 還是因為執行時是在RAM ?)其次是當我想將/dev/sda1 mount到在Squash FS底下其它的目錄,假設是/mnt目錄,這樣可嗎? 我們遇到了一些mount的問題. (關於Read-only)
Joey [ 回復於2009-06-24 19:37 郵箱 | 編輯 刪除 ]
No No No....

/dev不可以在readonly的filesystem,在開機的start up script裡,必需把它remount到jffs2 or tmpfs,一般常用的作法,把/dev re-mount到jffs(總不能每次開機都在重做device node)

請參考如下作法

mount -o move /dev /mnt/jffs2/dev
jethro [ 2012-02-21 17:21 | 回覆 | 編輯 刪除 ]
jemi大大你好:

看了您關於squashfs的文章,照著做之後卻不成功。
有些問題希望能請教您。

1. linux parameter中的initrd=addr 所指定的位置是physical addr而不是linux內部mapping的addr對嗎?

2. Initial RAM filesystem and RAM disk support選項開啟,那下面的
Initramfs source file(s)的內容留白可以嗎?

3. 除了上述說明的,我也確定有開RAM block device support 和
Squashfs support。請問是否還有其他support尚需開啟呢?

小弟目前一直會出現錯誤訊息如下:

No filesystem could mount root, tried: squashfs
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)

initrd=0x82000000,200000

位置確定是在ram中大小是設定2M
  • 1 
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: