做嵌入式开发的朋友,是不是总被存储空间逼得头疼?系统镜像就那么点空间,装个 util-linux 工具包,里面一堆用不上的命令占了好几百兆,删又不敢删,怕删错了系统崩掉。其实啊,util-linux 在嵌入式系统里是能裁剪的,把不用的工具去掉,能省出不少空间。今天就跟大家说说是怎么一步步裁剪的,全是实操过的步骤,虽然过程有点麻烦,但做完看着省出来的空间,值了。
为啥要裁剪 util-linux?嵌入式系统真的耗不起
嵌入式设备跟咱们的电脑不一样,内存小、存储也小,有的物联网设备存储空间就几百兆,甚至更小。util-linux 默认安装的话,像 fdisk、lsblk、mount 这些常用的有,还有好多这辈子都用不上的,比如 cal(日历命令)、logger(日志工具),在嵌入式设备里基本用不到。
小编之前做一个智能家居网关,系统镜像要求控制在 200 兆以内,没裁剪的 util-linux 占了 150 多兆,裁剪后只留了必要的 5 个命令,一下子省出 120 兆,刚好把其他驱动程序塞进去。所以啊,对嵌入式系统来说,裁剪不是可选项,是必须做的。
不过话说回来,裁剪也不是乱剪,得知道哪些命令有用,哪些没用,不然把关键命令删了,系统启动不了,哭都来不及。
裁剪前必须做的 3 件事,少一步都容易翻车
- 列个清单:明确自己需要哪些工具
打开 util-linux 的源码包,里面的 “misc” 目录下全是工具源码,一个个看名字,把自己系统里肯定会用到的记下来。比如做存储设备的,fdisk、mount、lsblk 肯定得留;做串口通信的,agetty 可能有用。像小编那个网关,只需要 mount、lsblk、blkid 三个命令,其他的都能删。 - 备份源码:删错了还能重来
拿到 util-linux 的源码包,先复制一份存起来,别直接在源码上改。小编第一次裁剪时就没备份,删错了配置文件,最后只能重新下载源码,白忙活大半天。 - 了解依赖关系:别把 “全家桶” 拆散了
有些工具是互相依赖的,比如 mount 依赖 libmount 库,要是把 libmount 删了,mount 也用不了。可以在源码目录里找 “Makefile”,里面会写每个工具依赖啥,虽然看着费劲,但花半小时捋一捋,能少踩很多坑。
具体步骤:从源码开始,一步步 “挑” 出有用的
第一步:下载源码,选对版本很重要
去 util-linux 的官网下源码,别选太新的版本,嵌入式系统的编译器可能不支持。小编用的是 2.36 版本,比较稳定,适配大部分嵌入式编译器。下好后解压,进入源码目录,准备开始改配置。
第二步:改配置文件,把不用的工具 “划掉”
源码目录里有个 “configure” 脚本,运行它的时候可以加参数,指定要编译哪些工具,不要哪些。比如只想保留 mount 和 lsblk,可以这么输:./configure --prefix=/usr --disable-all-programs --enable-mount --enable-lsblk
这里的 “–disable-all-programs” 是先禁用所有工具,再用 “–enable-xxx” 一个个启用需要的,比一个个禁用不用的方便多了。要是不知道某个工具对应的参数名,输./configure --help
,里面列得清清楚楚。
网友 “老周” 分享过一个坑:他想禁用 cal 命令,用了 “–disable-cal”,结果编译的时候还在,后来才发现参数名是 “–disable-calendar”,所以一定要核对参数名对不对。
第三步:编译安装,看看是不是真的变小了
配置好后,输 “make” 开始编译,编译完再输 “make install DESTDIR=./output”,把结果输出到 output 目录。然后去 output 目录里看看,是不是只有自己选的那几个命令。
小编裁剪完后,用 “du -sh” 测了下大小,从原来的 180 兆变成了 25 兆,效果立竿见影。不过这里有个小问题:不同版本的 util-linux,裁剪后节省的空间可能不一样,或许能省更多,也可能省得少点,主要看保留的工具数量和版本本身的大小。
裁剪时最容易踩的坑,新手一定要避开
- 把库文件误删了:有些工具依赖的库文件,比如 libblkid.so,看着像个库,不是命令,千万别删,删了依赖它的命令全用不了。小编就见过有人为了省空间删了 libmount.so,结果 mount 命令直接报错 “找不到库”。
- 禁用了默认工具:像 “su”“login” 这些基础命令,在有些嵌入式系统里是启动必需的,要是没确认就禁用,系统可能启动不了。
- 没考虑交叉编译:嵌入式系统大多用交叉编译器,编译时要加 “–host=arm-linux-gnueabihf” 这类参数,不然编译出来的是 x86 架构的,放嵌入式设备上跑不了。
对了,关于某些特别老的嵌入式芯片(比如 ARM9 以下的),util-linux 里有些新工具可能编译不过,具体是哪些命令不兼容,我目前还没完全测试明白,可能得查对应芯片的编译器手册,这也是我下一步要研究的。
小编的一点心得
裁剪 util-linux 就像给衣服改尺寸,得根据身材(嵌入式系统的需求)来,不能盲目求小。建议第一次裁剪时,先少删几个,编译后测试系统能不能正常运行,没问题了再逐步多删。另外,每次裁剪完最好做个记录,记下保留了哪些命令,用了什么配置参数,下次再做类似项目,直接套用就行,能省不少事。
总之,嵌入式系统里的 util-linux 裁剪,看着复杂,其实就是 “明确需求 — 筛选工具 — 配置编译” 这几步,耐心点,多试几次,肯定能掌握。希望这些步骤能帮到你,让你的嵌入式系统跑得更轻快。