前言
先逐步构建 “文件夹形式”的根文件系统,然后制作烧录镜像。
(1) rootfs 有 2 种格式:nfs 方式启动的 “文件夹形式” 的 rootfs,和用来烧录的镜像形式的 rootfs。
(2) 我们先从空文件夹开始,逐步向其中添加一些 rootfs 中必备的东西,然后做一步就用 nfs 方式去挂载启动,观察启动后的现象,并且理论上去分析原因。
一、busybox 的移植实战
1、busybox源码下载
(1) busybox 是一个开源项目,所以源代码可以直接从网上下载。
(2) busybox 的版本差异不大,版本新旧无所谓。
(3) 下载 busybox 可以去 linuxidc 等镜像网站,也可以去 www.busybox.net 官方网站下载。
https://www.windowszj.net/pcsoft/youxi/25291.html
2、修改Makefile
(1) ARCH = arm
(2) CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-linux-
3、make menuconfig 进行配置
(1) 参照网盘中章节目录下的《busybox menuconfig配置.txt》文件中的记录进行配置。
4、make 然后 make install
(1) make 编译,如果有错误就去解决。
编译错误:
在 Kbuild 查看这个文件的编译配置:
在 make menuconfig 命令中,取消这个 sync 的选中。
最后重新编译,解决问题。
(2) 编译完成后,需要执行 make install 安装 busybox。make install 执行的时候,其实是在执行 busybox 顶层目录下的一个目标 install。
(3) make install 在所有的 linux 下的软件中,作用都是安装软件。
在传统的 linux 系统中安装软件时,都是选择源代码方式安装的。我们下载要安装的软件源代码,然后配置、编译、安装。make install 的目的就是,将编译生成的可执行程序及其依赖的库文件、配置文件、头文件安装到当前系统中指定(一般都可以自己指定安装到哪个目录下,如果不指定一般都有个默认目录)的目录下。
busybox 源代码指定的安装路径:
(4) 重新进行安装,安装到我们需要的 rootfs 根文件系统目录下。
首先,清空原始的 rootfs 根文件系统目录。
修改安装目录为我们指定的根文件系统路径:/home/aston/workspace/porting_x210/rootfs/rootfs
再次 make install,之后可以看到, busybox 安装到了我们指定的路径:/home/aston/workspace/porting_x210/rootfs/rootfs
5、设置 bootargs 挂载添加了 busybox 移植的 rootfs
(1) 之前建立了一个空的文件夹,然后自己 touch linuxrc 随便创建了一个不能用的 /linuxrc,然后去 nfs 挂载 rootfs,实验结果是:挂载成功,执行 /linuxrc 失败。
(2) 现在我们移植了 busybox 后,/linuxrc 就可以用了,然后再次去 nfs 挂载这个 rootfs。预计看到的效果是:挂载成功,执行 /linuxrc 也能成功。
(3) 注意 uboot 的 bootargs 设置成:
setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/home/aston/workspace/porting_x210/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
(4) 实验结果:挂载成功,执行 /linuxrc(也就是 busybox)成功,但是因为找不到 /etc/init.d/rcS 和 /dev/tty2 等文件,所以一直在打印错误提示信息,但是其实有进入命令行。
三、inittab 详解
1、添加一个典型的 inittab
(1) 将网盘提供的典型的 inittab 文件,复制到我们制作的 rootfs 的根目录下的 /etc/ 目录下。
网盘文件的位置:《课件&代码\课件\2.uboot和linux内核移植\2.19.根文件系统构建实验及过程详解\etc》.
root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs/etc# cat inittab
#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs/etc#
(2) 再次启动内核,挂载这个 rootfs 看效果。
(3) 实验现象是成功启动,并且挂载 rootfs 进入了控制台命令行。当前制作的最小 rootfs 成功了。
2、inittab 格式解析
(1) inittab 的工作原理就是,被 /linuxrc(也就是 busybox)执行时所调用 起作用。
(2) inittab 在 /etc 目录下,所以属于一个运行时配置文件,是文本格式的(内容是由一系列的遵照一个格式组织的字符组成的)。实际工作的时候,busybox 会(按照一定的格式)解析这个 inittab 文本文件,然后根据解析的内容来决定要怎么工作。
#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
(3) busybox 究竟如何完成解析,并且解析结果如何去工作(busybox 中实现 /etc/inittab 的原理)并不是我们的目标,我们的重点是 inittab 的格式究竟怎样的?我们看到一个 inittab 后,怎么去分析这个 inittab 对启动的影响。
(4) inittab 的格式在 busybox 中定义的,网上可以搜索到详细的格式说明,具体去参考即可:
#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
第一个:“#” 开始的行是注释。
第二个:冒号在里面的角色是 分隔符,分隔开各个部分。
第三个:inittab 内容是以行为单位的,行与行之间没有关联;每行都是一个独立的配置项,每一个配置项表示一个具体的含义。
第四个:每一行的配置项都是由 3 个冒号分隔开的 4 个配置值共同确定的。这 4 个配置值就是 “id:runlevels:action:process”。
值得注意的是,有些配置值可以空缺,空缺后冒号不能空缺,所以有时候会看到连续 2 个冒号。
第五个:每一行的配置项中,4 个配置值中最重要的是 action 和 process。action 是一个条件/状态,process 是一个可被执行的程序的 pathname。合起来的意思就是:当满足 action 的条件时,就会执行 process 这个程序。
注意:理解 inittab 的关键就是,明白 “当满足 action 的条件时,就会执行 process 这个程序。”
你去分析 busybox 的源代码就会发现,busybox 最终会进入一个死循环,在这个死循环中,去反复检查是否满足各个 action 的条件,如果某个 action 的条件满足,就会去执行对应的 process。
第六个:明白各个 action 什么意思。