早年写的笔记,压箱底了,翻出来晒晒
目 录
南瓜文件系统(Squashfs)采用gzip或lamz(更高压缩率)来制作只读的映像文件。LZMA 是 7-Zip 程序中 7z 格式 的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成,拥有不错的压缩比。Squashfs也可以使用LZMA的算法进行更好的压缩。Squashfs是linux2.6.27之后并入内核的,所以FC6是不能够支持Squashfs文件系统的,但是可以利用应用程序解压和制作Squashfs镜像。
openwrt里的squashfs就是用lzma进行压缩的,openwrt的编译文件夹里就有制作squashfs-lzma和解压的工具。
既然openwrt里面有打包的工具,也应该有解压的工具。使用find命令在整个openwrt编译文件夹查找,找到有几个地方有
[root@localhost kamikaze_8.09]# find ./ |grepunsquashfs
./build_dir/armeb/OpenWrt-SDK-ixp4xx-for-Linux-i686/staging_dir/host/bin/unsquashfs-lzma
./build_dir/armeb/OpenWrt-ImageBuilder-ixp4xx-for-Linux-i686/staging_dir/host/bin/unsquashfs-lzma
./build_dir/host/squashfs3.0/squashfs-tools/unsquashfs.c
./build_dir/host/squashfs3.0/squashfs-tools/unsquashfs-lzma
./build_dir/host/squashfs3.0/squashfs-tools/unsquashfs.o
./staging_dir/host/bin/unsquashfs-lzma
将kamikaze_8.09/tools/lzma下面的文件和文件夹复制到
/home/linuxuser/squashfs/lzma_open/lzma
kamikaze_8.09/tools/lzma里的文件清单
# ls -Rl
.:
total 8
-rw-rw-rw- 1 501 games 1042 Dec 22 2008 Makefile
drwxrwxrwx 2 501 games 4096 Jun 2 03:21 patches
./patches:
total 16
-rw-rw-rw- 1 501 games 11733 Jun 21 2006 100-lzma_zlib.patch
-rw-rw-rw- 1 501 games 406 Dec 3 2007 110-ranlib.patch
将/kamikaze_8.09/dl/lzma432.tar.bz2解压到/home/linuxuser/squashfs/lzma_open/lzma/lzma432
执行下面两条命令
# patch -d lzma432 -p1 <100-lzma_zlib.patch
#patch -d lzma432 -p1 < 110-ranlib.patch
打印信息如下:
# patch -d lzma432 -p1 < 100-lzma_zlib.patch
patching file C/7zip/Compress/LZMA/LZMADecoder.cpp
patching file C/7zip/Compress/LZMA/LZMADecoder.h
patching file C/7zip/Compress/LZMA_Lib/makefile
patching file C/7zip/Compress/LZMA_Lib/ZLib.cpp
# patch -d lzma432 -p1 < 110-ranlib.patch
patching file C/7zip/Compress/LZMA_Lib/makefile
这样补丁就打好了。
进入/squashfs/lzma_open/lzma/lzma432/C/7zip/Compress/LZMA_Lib,执行make命令即可得到squashfs需要的库文件和源码。
做好的文件已经打包为lzma_forsquash_ryab.tar.gz
找到kamikaze_8.09/tools/squashfs,发现只有一个makefile和100-lzma.patch,并没有源代码。
找到kamikaze_8.09/dl/squashfs3.0.tar.gz,解压到
/home/linuxuser/squashfs/squash3_openwrt/squashfs3.0
现在该目录下文件如下
# ls
100-lzma.patch Makefile open_make_sq.txt squashfs3.0 squashfs3.0.tar.gz
执行如下操作
patch -d squashfs3.0 -p1 < 100-lzma.patch
对比打了patch之后的效果。
结果发现只改变了/home/linuxuser/squashfs/squash3_openwrt/squashfs3.0/makefile,红色的为新添加的内容,其他的都没有变化。
lzma的路径需要修改,改后的makefile如下:注意红色部分
INCLUDEDIR = .
#LZMAPATH = ../lzma/SRC/7zip/Compress/LZMA_Lib
LZMAPATH =/home/linuxuser/openwrt/kamikaze_8.09/build_dir/host/lzma-432/lzma/C/7zip/Compress/LZMA_Lib
CFLAGS := -I$(INCLUDEDIR) -D_FILE_OFFSET_BITS=64-D_LARGEFILE_SOURCE -O2
all: mksquashfs unsquashfs mksquashfs-lzmaunsquashfs-lzma
mksquashfs: mksquashfs.o read_fs.o sort.o
$(CC)mksquashfs.o read_fs.o sort.o -lz -o $@
mksquashfs-lzma: mksquashfs.o read_fs.o sort.o
$(CXX)mksquashfs.o read_fs.o sort.o -L$(LZMAPATH) -llzma -o $@
mksquashfs.o: mksquashfs.c squashfs_fs.h mksquashfs.hglobal.h sort.h
read_fs.o: read_fs.c squashfs_fs.h read_fs.h global.h
sort.o: sort.c squashfs_fs.h global.h sort.h
unsquashfs: unsquashfs.o
$(CC)unsquashfs.o -lz -o $@
unsquashfs-lzma: unsquashfs.o
$(CXX)unsquashfs.o -L$(LZMAPATH) -llzma -o $@
unsquashfs.o: unsquashfs.c squashfs_fs.h read_fs.hglobal.h
clean:
执行make就可以得到4个文件:mksquashfs unsquashfs mksquashfs-lzma unsquashfs-lzma。
官方网站www.squashfs-lzma.org上有最新的代码,想试试看。
下载了lzma457.tar.bz2,sqlzma3.4-457.tar.bz2,squashfs3.4.tar.gz之后,通过参看build.sample进行打补丁,修改sqlzma3.4-457.tar.bz2里的makefile已经可以完全编译mksquashfs 和unsquashfs,但是不能正确解压openwrt的文件。
试验了下载的五个压缩包
7z457.tar.bz2
linux-2.6.27.4.tar.bz2
lzma457.tar.bz2
sqlzma3.4-457.tar.bz2
squashfs3.4.tar.gz
其中sqlzma3.4-457.tar.bz2里有一个build.sample。
先解压sqlzma3.4-457.tar.bz2到/home/linuxuser/squashfs/sqlzma3.4-457,然后将五个压缩包全部复制进去,包括sqlzma3.4-457.tar.bz2。执行build.sample。其中build.sample执行到一半的时候,会出现提示
cp .config linux-2.6.27.4
cd linux-2.6.27.4
make oldconfig
make prepare
make scripts
cd -
initialize kernel sources now, by using the commandsmentioned above
and then press ENTER...
这个时候再开一个窗口,cd到/home/linuxuser/squashfs/sqlzma3.4-457,执行红色部分的命令。但是实际上cp .config linux-2.6.27.4会报错没有.config文件。但是没关系,继续执行,中间会有一大堆的选择问题,不用理会,全部直接回车。执行完之后,再切换到执行build.sample的那个窗口回车。最终在/home/linuxuser/squashfs/sqlzma3.4-457/BUILD生成下面五个文件,
mksquashfs
sqlzma.ko
squashfs.ko
unlzma.ko
unsquashfs
但是还是不能解开oepnwrt的squash文件,决定放弃。
链接一个lib,比如liblzma.a,只需要-llzma就可以,不能-llibunlzma.比如:
unsquashfs-lzma: unsquashfs.o
$(CXX)$(LDFLAGS) unsquashfs.o -llibunlzma -lpthread -o $@