裁剪之前,我觉得有必要用一定的篇幅介绍一下rootfs
(1)rootfs目录
(2)命令解析
而内核的命令串为:root=/dev/mtdblock2 devfs=mount load_ramdisk=0 inti=/linuxrc console=ttyS0,115200 display=shp240
root=告诉内核启动时使用设备/dev/mtdblock2 作为根文件系统。
init=表示设置内核执行的初始化进程名为/linuxrc,Linux启动完毕右后首先执行根目录下的linuxrc,用来在安装过程中配置核心的程序,可以用来加载模块,挂载文件系统,创建文件夹,引导已安装的系统等。linuxrc文件中一般有条命令“exec /sbin/init”,表示开始系统的初始化进程。init程序在终结系统启动程序之前会衍生各种应用程序,并启动若干关键的软件组件。在busybox制作的根文件系统中,/sbin/init是/bin/busybox的符号链接,所以busybox是系统上执行的第一个应用程序,当busybox知道调用它的目的是要执行init,它立即跳转到init进程,进行以下工作:
执行所有终止时必须重新启动的inittab命令(动作类型:respawn)
执行所有终止时必须重新启动但启动前必须询问用户的inittab命令(动作类型:askfirst)
(3)文件系统的类型
所以制作文件系统之前,得根据项目需求选择对应的文件系统的类型,不同的文件系统有不同的特点,对启动速度,占用空间大小,读写权限等都有很大的影响。
rootfs的裁剪主要包括两大部分:系统工具和库的裁剪,用户工具和库的裁剪,将根文件系统进行压缩;
这里先只讲系统工具和库的裁剪。
rootfs里面为了方便用户的使用,配置了很多系统工具和库,而项目可根据需要对此进行裁剪。
(1)shell工具和库
到buildroot目录下,执行make ARCH=平台 menuconfig,就可以通过图形化对需要的shell工具和库进行裁剪:
为了减小根文件系统的尺寸,在不影响功能的情况下,一些工具是可以删除的,比如:
调试工具:tcpdump,rz\sz,strace等;
性能测试工具:lmbench,sysstat,tiobench等;
冗余功能chattr,lsattr等;
其他:example等。
至于该menuconfig每个配置项的含义,可以参考一下附件四,地址如下:
然后根据提示进行裁剪,裁剪完以后,将.config覆盖到buildroot/configs/sun***_deforconfig,然后重新编译即可。
(2)busybox工具裁剪
系统的工具中有一部分的工具是busybox提供的,这部分工具裁剪要到相应的busybox目录进行裁剪。切换到buildroot/build/busybox-1.18目录,执行 make ARCH=平台 menuconfig,就能对busybox进行裁剪了,裁剪时将不需要的工具选项去掉即可:
配置完成后,将.config覆盖buildroot/package/busybox/busybox-1.18.x.***.config
即可,推荐使用busybox的工具代替shell工具,毕竟busybox工具的尺寸较小,极限一般不会超过1M。
(3)C标准库的选择和裁剪
目前用gilbc还是比较多,但是glibc有着功能齐全的特点的同时也伴随着尺寸大的缺点,所以根据项目的不同可以选择不同的C标准库,这往往能减少根文件系统的尺寸,各个标准库的区别如下图:
而生成的函数库也有些未必在你的项目中能用到,根据你的项目可以对其进行裁剪,下面是对glibc库的总结:
(4)系统库总结说明