兄弟们,今天咱聊聊 BusyBox 这个东西。这玩意儿我刚开始接触那会儿,也挺懵的。那时候手头有个项目,需要弄个特别小特别精简的 Linux 环境,不能带那些乱七八糟的大包袱。找来找去,就盯上 BusyBox 了。这个过程可真是磨人,但回头看看,也挺有意思的。
本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu
一、我咋就和 BusyBox 杠上了?
我为啥会去搞这个?得从几年前说起,公司有一个用了特别多年的老项目,里面的嵌入式板子,那存储空间小的可怜,主控性能也一般。原先跑的那个精简系统,因为业务迭代,功能越加越多,眼看着就塞不下了,卡得跟啥似的。领导开会的时候,拍着桌子说:“必须给我搞个能跑起来、占地儿又小的系统!麻雀虽小五脏俱全!” 我听着就头大,想了半天,才想起之前听人提过 BusyBox 这玩意儿,号称是“嵌入式 Linux 的瑞士军刀”。没办法,硬着头皮也得上,总不能让项目耽搁了不是?于是我就一头扎进了 BusyBox 的世界。
二、开始动手,先把工具备齐
干活之前,总得先把家伙事儿都准备好不是?这跟咱们去工地干活一个道理。
- 第一步,扒拉源码。 我当时就跑去了 BusyBox 的官方网站,在下载页面上找。版本号密密麻麻一大堆,我琢磨着要稳定点的,就选了个最新的稳定版。鼠标点一点,一个叫 `busybox-x.y.*2` 的压缩包就慢悠悠地下来了。拿到手心里还乐呵,心想这第一步总算成了。
- 第二步,解压。 这就简单了,找个空目录,命令行里敲个 `tar -jxvf busybox-x.y.*2`。回车一按,屏幕上哗一堆文件和文件夹就冒出来了。然后 `cd` 进去,看到那一堆源文件,心里既激动又有点犯怵,知道硬仗在后头。
三、动手编译,把功能定制得明明白白
到了这一步,才是真正体现 BusyBox “瑞士军刀”精髓的地方。它厉害就厉害在,把好多我们平时用的 Linux 命令,比如 `ls`、`cp`、`mv`、`grep`,甚至连最核心的 `sh`、`init`,都给打包到同一个可执行文件里了。你可以按需定制,不要的功能统统砍掉,像削铅笔一样,把冗余都削掉。
- 第一步,开菜单配置。 我最开始就直接在命令行里敲了个 `make menuconfig`。这个命令一跑,屏幕上就跳出个蓝乎乎的、有点像以前 DOS 界面那种图形界面。里面密密麻麻全是选项,各种功能模块、各种命令,你就可以用方向键和空格键勾勾选选。当时我第一次进去,差点没看花眼。为了确保系统能基本跑起来,我就把 `init`、`sh`、`mount`、`mkfs`、`cp`、`ls`、`mkdir` 这些最基础、最离不开的命令都给选上了。还有些什么网络工具,文件系统工具,也挑了几个常用的。选功能的时候,我可没少犯迷糊,有些功能看着有用就选了,结果编译的时候发现依赖别的库,又得回头去查去配,折腾了几次才算有了点经验,知道先选最少的,能跑起来再说,贪多嚼不烂。
- 第二步,憋气编译。 配置好了,保存退出,然后就一个简单的 `make` 命令。这时候电脑风扇就开始狂转了,屏幕上的编译信息像瀑布一样往下刷,各种链接、汇编、编译,看得人眼花缭乱。这段时间就比较漫长了,少说也得等个十来分钟,我可以去倒杯水,或者去厕所放个水,回来一看,差不多搞定。
- 第三步,安到指定地方。 编译完,还得把它安装到咱们指定的“家”里去。我敲了个 `make install CONFIG_PREFIX=/tmp/rootfs`。回车一按,它就会把编译好的 BusyBox 可执行文件,以及一大堆命令的软链接,都给安装到 `/tmp/rootfs` 这个目录下。这样所有的东西都会规规矩矩地放到一个地方,方便我后面打包,也方便我清理,心里就有个底了。
四、给它安个家,搭建个最简根文件系统
光有 BusyBox 可执行文件还不够,它还得上岗工作,所以得有个“家”给它住,这就是所谓的根文件系统。我当时是这么一步步来的,跟搭积木似的:
- 先搭骨架。 我就在 `/tmp/rootfs` 里面手动创建了一堆目录,比如 `/dev`、`/proc`、`/sys`、`/etc`、`/bin`、`/sbin`、`/usr`、`/lib`、`/tmp`、`/var`。这些都是 Linux 系统里最基本的目录结构,缺了哪个都寸步难行。我当时一个一个 `mkdir`,手都快酸了。
- 把核心文件塞进去。 把刚才 `make install` 出来的 BusyBox 文件,通常会在 `/bin` 或者 `/sbin` 里面,我确保它在对的位置。然后,最重要的,就是把各种动态链接库文件也放进去。
- 处理库文件,这才是大坑。 这块是个大坑,也是我当时掉坑最深的地方。BusyBox 虽然小,但它编译出来的可执行文件还是会依赖宿主系统的动态链接库,比如 `*.6`、`*.6` 等等。我当时就用 `ldd` 命令去查看编译好的 BusyBox 可执行文件到底依赖了哪些库,然后把这些库从我的开发机上,一个一个、不多不少地拷贝到 `/tmp/rootfs/lib` 里面。缺一个都不行,启动的时候就会报错说找不到库。这过程真是焦头烂额,就跟玩寻宝游戏似的,反复拷贝,反复测试。有时候一个库里头又套着另一个库,就得顺藤摸瓜找下去,真是折腾得人昏天黑地。
五、给系统通上电,让它“活”起来
文件有了,还得告诉系统怎么启动,怎么干活。这就涉及到几个关键的配置文件了,它们就像系统的说明书和启动脚本。
-
`init` 进程的主控文件。 BusyBox 自己的 `init` 功能是关键中的关键。我们需要在 `/etc` 下面创建一个 `inittab` 文件,这个文件就是告诉 `init` 程序开机后第一件事该干什么。我当时写了个最简单的版本,生怕写复杂了又出岔子:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
第一行就是开机启动脚本,告诉它先跑 `/etc/init.d/rcS`。第二行就是跑完脚本后,给我一个命令行界面,可以输入命令。后面两行是处理关机和重启的。
-
启动脚本 `rcS`。 在 `/etc/init.d/` 里面建个 `rcS` 文件,并给它执行权限。这个脚本是开机后第一个执行的。我一般会在里面做几件最基础的事,确保文件系统能正常工作:
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
mkdir -p /dev/pts
mount -t devpts none /dev/pts
echo "Hello, BusyBox! System is booting..."
主要就是挂载 `/proc`、`/sys`、`/dev` 这些虚拟文件系统,让系统能正常看到进程信息、硬件信息和设备文件。尤其是 `devtmpfs`,这玩意儿是后来的好东西,能自动把设备文件都创建省了我手动 `mknod` 的大麻烦。刚开始没用它的时候,还得手动去一个个创建串口、控制台设备文件,那真是折腾死个人,还容易错。
- 网络配置。 要是系统需要联网,还得准备 `/etc/network/interfaces` 或者 `/etc/sysconfig/network-scripts` 那些网络配置文件,再就是 `/etc/*` 这种 DNS 配置。我当时就是简单地配置了个静态 IP,或者用 `udhcpc` 去获取 IP,能连上就行,没敢太复杂。
六、把它跑起来,以及那些坑爹的瞬间
所有的东西都准备好了,最激动人心的就是把它跑起来了。我当时是用 Qemu 模拟器来测试的,因为板子烧写麻烦,模拟器快。敲下命令,启动 Qemu,然后我就像个望夫石一样,眼睛一眨不眨地盯着屏幕看输出。
第一次肯定没那么顺利,我是遇到了一堆问题,差点没把我气得摔键盘:
- 找不到命令: 屏幕上蹦出来 `sh: command not found` 或者别的命令找不到。这时候我就得回过头去看 BusyBox 的配置,是不是这个命令我没选上?或者是不是它的软链接没对?路径是不是写错了?有时候就差一个字母或者一个斜杠,能把你急得团团转。
- 找不到库文件: 最常见的报错就是 `error while loading shared libraries: *`。这个最头疼,前面说了,就是 `ldd` 没检查仔细,或者库文件没拷贝全。它报错一个,我就得去宿主机上找一个,然后拷贝到目标系统的 `/lib` 下面。有时候一个库里头套着好几个依赖,就得一层一层往下扒,那几天我光捣鼓这个就掉了一层皮。
- 系统起不来,卡住了: 各种 kernel panic 或者干脆就卡在某个地方没反应了。这时候就得检查 `inittab` 和 `rcS` 脚本,是不是哪里写错了,或者挂载顺序不对,哪个命令没权限。特别是 `/dev` 目录,如果没挂载好 `devtmpfs`,或者权限不对,很多基础命令都用不了,系统自然也就卡死了。
就这样,我反反复复地尝试,一次又一次地修改配置文件,一遍又一遍地编译,有时候连夜都在搞。终于,在一个灯火通明的晚上,屏幕上跳出了 `Hello, BusyBox! System is booting...`,然后是熟悉的命令行提示符,我可以输入 `ls`、`pwd` 这些命令了!那一刻,那种感觉,就跟攻克了一个大难题一样,特别有成就感,感觉所有的辛苦都值了。
七、折腾完这趟,我的一点小感想
折腾完 BusyBox 这么一趟,我算是彻底明白了,搞嵌入式系统,就得从最底层开始。虽然过程很痛苦,各种小细节特别多,也踩了不少坑,耗费了无数的脑细胞,但我搞完之后,对 Linux 系统的启动流程、文件系统结构、库依赖这些东西,有了更深更具体的理解。以前可能只是知道有这么回事,现在是亲手把它从零搭起来,那种掌控感完全不一样了。以后再遇到类似问题,起码心里有底了,知道该从哪个方向去查、去动手。现在很多工具都更方便了,但这种从零开始的折腾劲儿,真的挺锻炼人的,也挺有意义。