分类: LINUX
2012-03-22 16:24:40
作者:龙金东
序:
这几天在mcs8142上实现star8132上的所有功能;都已经用的是squashfs文件系统,star8132文件系统用的是uClibc0.8.28的库,而mcs8142用glibc的库;所以都是8M的flash,mcs8142容量空间不够。要想再去减小mcs8142的samba,transmission等应用的容量,难度提大的,前面也试过,还找不到方法去减。现在就想通过在kernel上加sqlzma(squashfs + lzma),来解决flash空间不够的问题。
那就开始吧。
一、开发环境:
1. host: Fedora8
2. target: mcs8142、star8132(ARM)
3. arm-kernel: mcs8142-linux 2.6.15、star8132-linux2.6.16.
4. toolchain: mcs8142—>arm-linux-gcc- 3.4.4、star8132—>1arm-linux-gcc-3.4.1
5. export PATH=/usr/local/arm-longjindong/
二、下载squashfs 和lzma
1. 创建工作目录:
1) mkdir –p /home/longjindong/squashfs
2) cd /home/longjindong/squashfs; #以后都在这里生活了。
3) mkdir lzma457 #下面要用到。
2. 下载
1)wget
2)wget
3)wget
好像这些连接不能用了。我把这些包附上来了。 src.rar
3. copy kernel
1)star8132kernel:
cp –a /home/longjindong/star/star8132/kernel/linux-2.6.16 .
2)mcs8142kernel:
cp –a /home/longjindong/moschip/mcs8142/kernel/linux-2.6.15 .
说明一下:a. squashfs3.4.tar.gz—squashfs文件包;
b. lzma457.tar.bz2—7Z压缩解压算法库;
c. sqlzma3.4-457.tar.bz2—squashfs工具、kernel相关补丁(patch)和Makefile.
三、解压文件和打patch
1、 解压上面下载的3个文件包:
1) tar xvf squashfs3.4.tar.gz
2) tar xvf lzma457.tar.bz2 –C lzma457
3) tar xvf sqlzma3.4-457.tar.bz2
2、 patch:
1) 为lzma457库patch
patch -p0 < sqlzma1-457.patch
2) 为squashfs3.4工具patch
patch -p0 < sqlzma2u-3.4.patch
3) 为kernel打patch, 这里先patch linux 2.6.16
a. patch -p0 < squashfs3.4/kernel-patches/linux-2.6.16
b. cp sqlzma2k-3.4.patch sqlzma2k-3.4.patch-16
c. vi sqlzma2k-3.4.patch-16 ,然后”:% s/ linux-2.6.27.4/ linux-2.6.16/g”
(这是为了修改为linux-2.6.16版本)
d. patch –p0 < sqlzma2k-3.4.patch-16
4) 改变squashfs3.4目录里的linux-2.6.16目录为链接文件
a. cd squashfs3.4/kernel-patches/
b. mv linux-2.6.16 linux-2.6.16-b
c. ln –sf /home/longjindong/squashfs/linux-2.6.16;cd –
5) 改/home/longjindong/squashfs里的Makefile
vi Makefile #把第16行改成KVer = linux-2.6.16
6) 把lzma相关文件copy到linux-2.6.16/fs/squashfs/下
cp -a sqlzma.h sqmagic.h ./lzma457/C/Compress/Lzma/{LzmaDecode.h,LzmaDecode.c,LzmaTypes.h,uncomp.c} linux-2.6.16/fs/squashfs/
如果不copy这此文件编译时会出现如下警告,并不能正常使用.
点击(此处)折叠或打开
7) vi linux-2.6.16/fs/squashfs/Makefile #加上如下二行:
squashfs-y += uncomp.o
squashfs-y += LzmaDecode.o
8) 把linux-2.6.16/fs/squashfs/inode.c中的static int __init init_squashfs_fs(void)函数里的kmalloc改成vmalloc, static void free_sqlzma(void) 函数里的kfree改成vfree.不然后会出如下警告并不能正常使用.
***Warning:"__you_cannot_kmalloc_that_much"[/home/longjindong/moschip/mos8142/src/squashfs3.4/kernel-patches/linux-2.6.15/fs/squashfs/squashfs.ko] undefined!
四. 编 译
1. ko及tools
make
完后,ko是: squashfs3.4/kernel-patches/linux-2.6.16/fs/squashfs/squashfs.ko
./lzma457/C/Compress/Lzma/kmod/sqlzma.ko
./lzma457/C/Compress/Lzma/kmod/unlzma.ko
Tools 是: ./squashfs3.4/squashfs-tools/unsquashfs
./squashfs3.4/squashfs-tools/mksquashfs
2. 让kernel从sqlzma分区起动系统
1) cd linux-2.6.16
2) make menuconfig
3) File systems ---> Miscellaneous filesystems ---> <*> SquashFS 3.4 - Squashed file system support
4) make
正常的话kenrel image就是arch/arm/boot/zImage
五.用mksquashfs 做文件系统
mksquashfs source1 source2 ... dest -all-root –lzmadic 1024K
到这里重点部分就完了。
六.现在来做mcs8142的sqlzma
除了打linux-2.6.15补丁不同外,其它和上面一样。下面就说给它patch的事。
1.cp squashfs3.4/kernel-patches/ linux-2.6.14 squashfs3.4/kernel-patches/ linux-2.6.15-b
说明:这里我要2.6.14的patch,试过2.6.16patch打不了,没去深究。
2.把squashfs3.4/kernel-patches/linux-2.6.15-b/squashfs3.4-patch里所有的linux-2.6.14改成linux-2.6.15
3. patch –p0 < squashfs3.4/kernel-patches/linux-2.6.15-b/squashfs3.4-patch
4. cp sqlzma1-457.patch sqlzma1-457.patch-15
5. 把sqlzma1-457.patch-15里所有的linux-2.6.27.4改成linux-2.6.15
6. patch –p0 < sqlzma1-457.patch-15 #到这里就有点麻烦了,patch失败了。提示如下:
[longjindong@bogon squashfs]$ patch -p0 < src/sqlzma2k-3.4.patch-15
点击(此处)折叠或打开
从上面可以看出,其实只要根据squashfs_fs_sb.h.rej,手动改squashfs_fs_sb.h;根据
inode.c.rej手动改inode.c,就可以了。这里只是个手工活,不也要细心哦。
END:
这此工作做完后,下载到板,能正常启动,目标达到;此外flash还可以再装一些应用。