前言
内核的裁减主要有两个思路:
-
通过控制内核的编译过程,让更少的代码编译进内核,以减少内核目标二进制文件的体积;
-
通过使用更高压缩率的压缩方法,让内核镜像文件更小。
内核源代码中除了系统运行所必须的核心代码之外,还包含了各种各样的外部设备驱动、文件系统,以及一些跟某种特性相关的代码。而这些代码,在我们的业务环境中,并不都是必须的。我们将这些不必要的内容,通过配置选项进行筛选。 -
进入内核源代码目录,打开内核配置菜单,并对菜单上的选项进行配置,配置完成后编译:
$ cd osdrv/opensource/kernel/linux-3.10.y/
$ cp arch/arm/configs/hi3536_full_defconfig .config
$ make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- menuconfig //打开内核配置菜单
$ make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- uImage //编译内核
一、内核裁减
- 一些特殊功能和特性的支持
1.1)POSIX标准的异步I/O操作支持:
若使用了aio_read之类的函数(不要关闭)。
1.2)系统的extended profiling(剖面)的支持:General setup ---> -*- Configure standard kernel features (expert users) ---> [ ] Enable AIO support
profiling(剖面图)是一个工具来扫描、统计和测评计算机性能的工具。对多数用户而言,可以关闭该选项。
1.3)Disk quotas支持:General setup ---> [ ] Profiling support
用于支持在多用户系统下,设置每个用户对硬盘的使用空间,可以关闭。File systems ---> [ ] Quota support
- 网络支持
2.1)无线网络部分(可以根据实际需要,选择支持或者不支持):
关闭对IEEE802.11 协议公共类库的支持和对 Linux wireless LAN配置API的支持。
2.2)关闭所有IEEE802.11协议相关的无线网络设备驱动:[*] Networking support ---> -*- Wireless ---> < > cfg80211 - wireless configuration API
Device Drivers ---> [*] Network device support ---> [ ] Wireless LAN --->
- 设备驱动支持
3.1)nand flash 驱动的支持:
如果系统不使用nand flash,可以将 nand flash的驱动去掉。另外,yaffs文件系统只能应用在nand flash上,去掉nand flash 驱动,意味着你不会使用yaffs文件系统。
去掉nand flash驱动支持:
去掉yaffs文件系统支持:Device Drivers ---> <*> Memory Technology Device (MTD) support ---> < > NAND Device Support --->
3.2)输入设备驱动相关的支持File systems ---> [*] Miscellaneous filesystems ---> < > YAFFS2 file system support
可以不选该选项。
3.3)USB相关的驱动Device Drivers ---> Input device support ---> Hardware I/O ports ---> < > Gameport support
U盘的支持,若不需要
可以不选。Device Drivers ---> [*] USB support ---> < > USB Mass Storage support
- 文件系统类型支持
4.1)Ext2文件系统的支持:
默认情况下,内核会自动把它选上。把下面选项关闭,可以去掉对Ext2的支持。
4.2)Ext3文件系统的支持:File systems ---> < > Second extended fs support
内核在默认情况下,通常都会支持Ext3。关闭下面选项,可以去掉对 Ext3 的支持。
4.3)Ext4文件系统的支持:File systems ---> < > Ext3 journalling file system support
内核在默认情况下,通常都会支持Ext4。关闭下面选项,可以去掉对Ext4的支持。
4.4)XFS文件系统的支持:File systems ---> < > The Extended 4 (ext4) filesystem
内核在默认情况下,通常都会支持XFS。关闭下面选项,可以去掉对XFS的支持。
4.5)JAFFS2文件系统(一般都不需要关闭):File systems ---> < > XFS filesystem support
*注意:多数情况下,我们都需要支持JFFS2,只有在明确不需要JFFS2的情况下,才关闭下面选项。
4.6)不支持cramfs:File systems ---> [*] Miscellaneous filesystems ---> < > Journalling Flash File System v2 (JFFS2) support
Cramfs文件系统是专门针对闪存设计的只读压缩的文件系统,其容量上限为256M,采用zlib压缩。
Cramfs的使用和 initrd/initial ram filesystem 密切相关,如果系统不使用 Cramfs,可以同时关闭 initrd/initial ram filesystem 选项:
4.7)不支持SquashFS:File systems ---> -*- Miscellaneous filesystems ---> < > Compressed ROM file system support (cramfs)
SquashFS是另一种可用于 flash 设备的Linux只读文件系统。squashfs保存了全部的32位UID/GIDS 和文件的创建时间,支持多达4G的文件系统,squashfs使用简单,响应速度快。
4.8)不支持UBIFS:File systems ---> [*] Miscellaneous filesystems ---> < > SquashFS 4.0 - Squashed file system support
如果不使用 UBIFS, 可以关闭。File systems ---> [*] Miscellaneous filesystems ---> < > UBIFS file system support
二、内核镜像文件的压缩方式
- Linux内核编译生成二进制文件之后,需要通过某种压缩模式,将庞大的二进制文件压缩成体积更小的镜像文件。对此,linux 3.4.y 内核提供了多种压缩方式:Gzip,LZMA 和 LZO:
Gzip: linux内核镜像默认的、也是最经典的压缩模式。它在压缩率和解压速度上,保持了最佳的平衡。
LZMA: LZMA是linux 内核新近才支持的压缩模式,相比另外两种压缩模式,它具有最高的压缩率(同样文件,通过LZMA压缩后的体积通常只有Gzip的70%),但是压缩和解压缩的速度要差一些。适用于spi flash 大小非常有限的场合中。
XZ: 使用 LZMA2 压缩算法,生成的压缩文件比 POSIX 平台传统使用的 gzip、bzip2 生成的压缩文件更小,而且解压缩速度也很快。LZMA2 是 LZMA 的改进版本,相对于 LZMA,LZMA2 增进了 encoder 和 decoder 的实现,并改善了对多线程的支持。
LZO: 这种压缩方式压缩率最低,但是压缩和解压的速度最快。(目前该算法在3.4内核中还不完善,使用该压缩算法会有风险,所以目前并不使用) - 具体的选择方法(以选择LZMA模式为例):
General setup —>
Kernel compression mode (LZMA) —>
( ) Gzip
(X) LZMA
( ) XZ
( ) LZO
总结
- 以上内核裁减的方法,大家可根据实际需要来进行,切勿照本宣科!!!
- 建议最好还是先整体编译一次osdrv后再做裁减,若编译osdrv遇到问题时可参考《海思SDK安装并编译osdrv问题汇总》
- 若按照以上方法裁减,大概内核可以减小 800KB左右。
- 重点提醒: 若板子已经在运行内核了,而又需要重新裁减无线网络(见第二小节)的,在重新编译完内核后,需要再执行 make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- modules 来更新内核中 drivers/net/ethernet/stmmac/stmmac.ko 的驱动。此时,先不要将新的内核更新到板子,在运行旧内核时把这个新的 stmmac.ko 替换到板子的根目录下的( /hitoe/ ),然后更新新的内核后,再重启板子,就能正常使用了。