> 文章列表 > ARM busybox 的移植实战1

ARM busybox 的移植实战1

ARM busybox 的移植实战1


前言

先逐步构建 “文件夹形式”的根文件系统,然后制作烧录镜像。

(1) rootfs 有 2 种格式:nfs 方式启动的 “文件夹形式” 的 rootfs,和用来烧录的镜像形式的 rootfs。


(2) 我们先从空文件夹开始,逐步向其中添加一些 rootfs 中必备的东西,然后做一步就用 nfs 方式去挂载启动,观察启动后的现象,并且理论上去分析原因。


一、busybox 的移植实战

1、busybox源码下载

(1) busybox 是一个开源项目,所以源代码可以直接从网上下载。

(2) busybox 的版本差异不大,版本新旧无所谓。

(3) 下载 busybox 可以去 linuxidc 等镜像网站,也可以去 www.busybox.net 官方网站下载。

ARM busybox 的移植实战1

https://www.windowszj.net/pcsoft/youxi/25291.html

ARM busybox 的移植实战1


2、修改Makefile

(1) ARCH = arm
(2) CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-linux-

ARM busybox 的移植实战1


3、make menuconfig 进行配置

(1) 参照网盘中章节目录下的《busybox menuconfig配置.txt》文件中的记录进行配置。

ARM busybox 的移植实战1

ARM busybox 的移植实战1


ARM busybox 的移植实战1

ARM busybox 的移植实战1


ARM busybox 的移植实战1

ARM busybox 的移植实战1


ARM busybox 的移植实战1

ARM busybox 的移植实战1


4、make 然后 make install

(1) make 编译,如果有错误就去解决。

编译错误:

ARM busybox 的移植实战1


在 Kbuild 查看这个文件的编译配置:

ARM busybox 的移植实战1


在 make menuconfig 命令中,取消这个 sync 的选中。

ARM busybox 的移植实战1


最后重新编译,解决问题。

ARM busybox 的移植实战1


(2) 编译完成后,需要执行 make install 安装 busybox。make install 执行的时候,其实是在执行 busybox 顶层目录下的一个目标 install。


(3) make install 在所有的 linux 下的软件中,作用都是安装软件。

在传统的 linux 系统中安装软件时,都是选择源代码方式安装的。我们下载要安装的软件源代码,然后配置、编译、安装。make install 的目的就是,将编译生成的可执行程序及其依赖的库文件、配置文件、头文件安装到当前系统中指定(一般都可以自己指定安装到哪个目录下,如果不指定一般都有个默认目录)的目录下。

busybox 源代码指定的安装路径:

ARM busybox 的移植实战1


ARM busybox 的移植实战1


ARM busybox 的移植实战1

ARM busybox 的移植实战1

ARM busybox 的移植实战1


(4) 重新进行安装,安装到我们需要的 rootfs 根文件系统目录下。

首先,清空原始的 rootfs 根文件系统目录。

ARM busybox 的移植实战1


修改安装目录为我们指定的根文件系统路径:/home/aston/workspace/porting_x210/rootfs/rootfs

ARM busybox 的移植实战1


再次 make install,之后可以看到, busybox 安装到了我们指定的路径:/home/aston/workspace/porting_x210/rootfs/rootfs

ARM busybox 的移植实战1


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 等文件,所以一直在打印错误提示信息,但是其实有进入命令行。

ARM busybox 的移植实战1


三、inittab 详解

1、添加一个典型的 inittab

(1) 将网盘提供的典型的 inittab 文件,复制到我们制作的 rootfs 的根目录下的 /etc/ 目录下。

网盘文件的位置:《课件&代码\\课件\\2.uboot和linux内核移植\\2.19.根文件系统构建实验及过程详解\\etc》.

ARM busybox 的移植实战1

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/initroot@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs/etc# 

(2) 再次启动内核,挂载这个 rootfs 看效果。

ARM busybox 的移植实战1

ARM busybox 的移植实战1

ARM busybox 的移植实战1


(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 什么意思。


源自朱有鹏老师.

免费资源