簡介
這是一篇在 Ubuntu 8.04 中使用 SquashFS 和 LZMA 的筆記.SquashFS 是一套唯讀的壓縮檔案系統, 在製作 LiveCD 的時候會用到它; LZMA 則是著名的 7-Zip 專案使用的壓縮演算法.
因為 SquashFS 的作者非常想將這套檔案系統推進官方的核心 (目前仍是以 patch 形式存在), 因此它只會支援 Zlib 這套核心預設的壓縮函式庫, 但是將上面提到的兩者結合, 會對 LiveCD 帶來莫大的好處: 更小的體積, 可以裝更多的程式.
有圖有真相, 偷來的比較資料: Compression benchmarks
method | block size | Slax data size | percent |
uncompressed | - | 668 MB | 100% |
mksquashfs+gzip | 64KB | 227 MB | 34% |
mksquashfs+gzip | 1024KB | 222 MB | 33% |
mksquashfs+lzma | 64KB | 191 MB | 28% |
mksquashfs+lzma | 128KB | 184 MB | 27% |
mksquashfs+lzma | 512KB | 172 MB | 26% |
mksquashfs+lzma | 1024KB | 167 MB | 25% |
感謝開放原始碼和偉大的開發者, Squashfs LZMA 計畫因應而生, 提供了許多的補綴檔 (patch, 下同), 本篇筆記就是在 Ubuntu 上實地使用的過程.
下載
首先從這個連結下載網頁左手邊列出的除了 kernel source 以外的所有檔案. 包括:- lzma457.tar.bz2 - 7-Zip 提供的 LZMA SDK
- sqlzma3.3-457.tar.bz2 - 主要的補綴檔
- squashfs3.3.tar.gz - SquashFS 原始碼, 也是個核心的補綴檔
- squashfs-cvsfix.patch - 補綴檔的補綴檔 (差點咬到舌頭)
(*) 我會將原始碼和編好的程式放在 PUD 的 ftp 站台, 但目前還傳不上去.
安裝
安裝所有需要的工具:# apt-get install linux-headers-2.6.24-10-generic \接著建立一個工作目錄, 切換進去, 並將剛剛抓來的四個檔案都放進來.
linux-headers-2.6.24-10 linux-source-2.6.24 \
build-essential zlib1g-dev patch
把補綴檔先解開:
# tar xvf sqlzma3.3-457.tar.bz2
# mv sqlzma1-449.patch sqlzma1-457.patch
(*) 這裡要注意, 要把 sqlzma1-457.patch 檔案當中所有的數字 449 都換成 457.
再來把 LZMA 的 SDK 解開:
# mkdir lzma457; tar xvf lzma457.tar.bz2 -C lzma457把剛剛安裝好的核心原始碼解開, 並建立鍊結:
# tar xvf /usr/src/linux-source-2.6.24.tar.bz2解開 SquashFS 原始碼:
# mv linux-source-2.6.24 linux-2.6.24
# ln -s `pwd`/linux-2.6.24 /lib/modules/`uname -r`/build
# tar xvf squashfs3.3.tar.gz
補綴
現在來到了重頭戲, 開始加工啦.首先補綴 LZMA SDK:
# patch -p0 < sqlzma1-457.patch
接著是替核心加入 SquashFS:
# patch -p0 < squashfs3.3/kernel-patches/linux-2.6.24/squashfs3.3-patch
順便補綴一下 SquashFS:
# patch -p0 < squashfs-cvsfix.patch
(*) 需要先把 squashfs-cvsfix.patch 中的 linux 路徑都改成 linux-2.6.24
補綴核心:
# patch -p0 < sqlzma2k-3.3.patch
最後, 補綴 SquashFS 的工具程式:
# patch -p0 < sqlzma2u-3.3.patch
編譯
一切補綴完成之後, 就開始編譯.先配合 Makefile 建立好路徑的鍊結:
# rm -rf squashfs3.3/kernel-patches/linux-2.6.24/
# ln -s `pwd`/linux-2.6.24/ squashfs3.3/kernel-patches/linux-2.6.24
接著稍微修改一下 Makefile, 有兩個地方. 在 LzmaVer 這行要改成:
LzmaVer = lzma457
然後找到 -Werror 參數把它關掉:
EXTRA_CFLAGS = -I${Sqlzma} -I${SqFs}/../../include -Wall # -Werror
最後, 執行編譯指令:
# make
沒有錯誤的話就完成啦!
使用
至於使用方法, 編譯出來總共有兩樣東西,一個是建立或解開 SquashFS 檔案系統使用的工具, 會放在:
squashfs3.3/squashfs-tools/mksquashfs
squashfs3.3/squashfs-tools/unsquashfs
而核心的模組則在:
lzma457/C/Compress/Lzma/kmod/sqlzma.ko
lzma457/C/Compress/Lzma/kmod/unlzma.ko
linux-2.6.24/fs/squashfs/squashfs.ko
若是想在 LiveCD 裡面使用, 可以參考 build-livecd 工具組, 使用 svn 取得最新原始碼即可.
敬請指教, 謝謝!
Pin-Shiun Chen (penkia) <penkia@gmail.com>
2 則留言:
感謝你詳細的介紹
依你的的方法實做,可以使用squashFS
但我在工作目錄,下的LINUX子目錄底下去
Make menuconfig 設定SquashFS (*)編入核心
make BzImage 少了 *.H
從工作目錄 COPY 到對應路徑
再 make
出現 BzImage
fs/built-in.o: In function `free_sqlzma':
inode.c:(.text+0x43062): undefined reference to `sqlzma_fin'
fs/built-in.o: In function `squashfs_read_data':
(.text+0x437f7): undefined reference to `sqlzma_un'
fs/built-in.o: In function `init_squashfs_fs':
inode.c:(.init.text+0x12b2): undefined reference to `sqlzma_init'
make: *** [.tmp_vmlinux1] Error 1
請教要如可將 SquashFS+LZMA 加入到核心中...
張貼留言