linux学习4,busybox的使用
发表于: 2018-12-08 15:38:51 | 已被阅读: 37 | 分类于: Linux笔记
在第二节,我们一起下载和编译了 linux 内核源码,并且使用 qemu 模拟运行了编译好的内核,但是因为没有文件系统,内核在启动后期陷入了“kernel panic”。所以,上一节我们创建了 disk.img 文件作为“虚拟磁盘”,然后将其格式化为 linux 经典的 ext2 文件系统。
但是虽然有了 ext2 文件系统的 disk.img “虚拟磁盘”,里面却是空的,还没有 bin ,etc,proc 等基本目录,所以虽然解决了内核因缺少文件系统引起的“kernel panic”,最后还是报错了。而且,我们自己编写的 init 程序并没有实际意义,因此linux内核没有完全启动也是意料之中的事。
本节的
busybox 是一个开源项目,通常用在嵌入式等小型系统中。除了 init 程序外,busybox 还包含了很多常用的命令工具,比如 ls、cat 等。busybox 非常轻量级,可以编译出完全独立无依赖的 busybox 套件。
要使用 busybox,第一步当然是下载它的源码:
wget -c https://busybox.net/downloads/busybox-1.27.2.tar.bz2
这里选用的是 busybox 的 1.27.2 版本。下载以后,解压之,然后按照默认配置,编译。
tar xf busybox-1.27.2.tar.bz2
cd busybox-1.27.2
make defconfig
make menuconfig
上面这几条命令的意义,第一节已经介绍的比较清楚。最后一条命令执行完毕后,会弹出图形配置界面,依次选择:
Busybox Settings --->
--- Build Options
[*] Build BusyBox as a static binary (no shared libs)
make -j4
编译完成后,就可以安装了,我们新建一个目录 install,将 busybox 安装到该目录下:
mkdir install
make CONFIG_PREFIX=<你的install绝对路径> install
执行完毕以后,busybox 就安装到 install 目录了,如下图:
./busybox ls # 相当于 ls
./busybox ps # 相当于 ps
现在有了 busybox,我们把它们塞入 disk.img “虚拟磁盘”。先把 disk.img 挂载到 rootfs,然后直接将编译好的 busybox 复制进去即可:
现在我们的虚拟磁盘越来越像 linux 的文件系统了:
sudo umount rootfs
好了,现在再来使用 qemu 模拟运行一下 linux 内核试试:
内核终于不再恐慌了,只不过在 linux 内核启动到最后阶段,还是有一些不正常的信息:
...
# Note: BusyBox init works just fine without an inittab. If no inittab is
# found, it has the following default behavior:
# ::sysinit:/etc/init.d/rcS
# ::askfirst:/bin/sh
# ::ctrlaltdel:/sbin/reboot
# ::shutdown:/sbin/swapoff -a
# ::shutdown:/bin/umount -a -r
# ::restart:/sbin/init
# tty2::askfirst:/bin/sh
# tty3::askfirst:/bin/sh
# tty4::askfirst:/bin/sh
#
# Boot-time system configuration/initialization script.
# This is run first except when booting in single-user mode.
#
::sysinit:/etc/init.d/rcS
...
填入如下内容:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/ash
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
并且根据配置,我们需要创建可执行文件 /etc/init.d/rcS
mkdir etc/init.d
touch etc/init.d/rcS
chmod +x etc/init.d/rcS # 给 rcS 执行权限
linux 在启动后,会执行这个脚本,执行一些启动工作。查看当前系统环境,会发现当前文件系统结构是不完整的。比如没有 /proc 以及 /sys 挂载点。如果执行 df 命令也会因为没有 /proc 挂载点而报错:
df: /proc/mounts: No such file or directory
vim etc/init.d/rcS
修改 /etc/init.d/rcS 内容如下:
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
做完这些改动,要卸载 disk.img 以把改动刷新到磁盘:
cd ../
sudo umount rootfs
好了,现在我们再次使用 qemu 模拟运行编译好的 linux 内核,和修改好的文件系统。这次终于没有报错了,提示我们按回车激活 console:
Please press Enter to activate this console.
到这里,