About me

我的相片
I'm a web and software developer from Kaohsiung, Taiwan.
I design and implement user interfaces, also contribute to open source projects.
http://penkia.net/portfolio

2008年3月1日 星期六

Patch Kernel 2.6.24 with SquashFS+LZMA, the Ubuntu Way.

簡介

這是一篇在 Ubuntu 8.04 中使用 SquashFSLZMA 的筆記.

SquashFS 是一套唯讀的壓縮檔案系統, 在製作 LiveCD 的時候會用到它; LZMA 則是著名的 7-Zip 專案使用的壓縮演算法.

因為 SquashFS 的作者非常想將這套檔案系統推進官方的核心 (目前仍是以 patch 形式存在), 因此它只會支援 Zlib 這套核心預設的壓縮函式庫, 但是將上面提到的兩者結合, 會對 LiveCD 帶來莫大的好處: 更小的體積, 可以裝更多的程式.

有圖有真相, 偷來的比較資料: Compression benchmarks


methodblock sizeSlax data sizepercent
uncompressed-668 MB100%
mksquashfs+gzip64KB227 MB34%
mksquashfs+gzip1024KB222 MB33%
mksquashfs+lzma64KB191 MB28%
mksquashfs+lzma128KB184 MB27%
mksquashfs+lzma512KB172 MB26%
mksquashfs+lzma1024KB167 MB25%

感謝開放原始碼和偉大的開發者, 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 - 補綴檔的補綴檔 (差點咬到舌頭)
而核心原始碼我們將採用 Ubuntu 官方的套件.

(*) 我會將原始碼和編好的程式放在 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
# mv linux-source-2.6.24 linux-2.6.24
# ln -s `pwd`/linux-2.6.24 /lib/modules/`uname -r`/build
解開 SquashFS 原始碼:
# 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 則留言:

jackie 提到...
作者已經移除這則留言。
jackie 提到...

感謝你詳細的介紹
依你的的方法實做,可以使用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 加入到核心中...