当前位置: 首页 > 工具软件 > Squashfs LZMA > 使用案例 >

编译squashfs和lzma

贺聪
2023-12-01

编译squashfs和lzma

早年写的笔记,压箱底了,翻出来晒晒


目          录

编译squashfs和lzma. 1

openwrt里的squashfs-lzma. 1

利用openwrt源码编译squashfs-lzma. 2

编译lzma432.tar.bz2. 2

编译squashfs-lzma. 3

摸索的过程... 4

3.4版本的lzma. 5

试试全部按照说明上的来操作... 5

链接的小问题... 6

 

 

 

南瓜文件系统(Squashfs)采用gzip或lamz(更高压缩率)来制作只读的映像文件。LZMA 是 7-Zip 程序中 7z 格式 的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成,拥有不错的压缩比。Squashfs也可以使用LZMA的算法进行更好的压缩。Squashfs是linux2.6.27之后并入内核的,所以FC6是不能够支持Squashfs文件系统的,但是可以利用应用程序解压和制作Squashfs镜像。

 

openwrt里的squashfs就是用lzma进行压缩的,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

 

利用openwrt源码编译squashfs-lzma

编译lzma432.tar.bz2

将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

 

编译squashfs-lzma

找到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上有最新的代码,想试试看。

3.4版本的lzma

下载了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 $@

 

 类似资料: