busybox的安装和配置/最小根文件系统的制作

1.了解uImage和zImage:
linux内核经过编译后会生成一个elf格式的可执行程序,叫做vmlinux或vmlinuz,这个是原始的未经任何处理加工的原版内核elf文件,嵌入式系统部署时烧录一般不是这个vmlinux,而是要用objcopy工具去制作成烧录镜像格式的文件Image(这个制作烧录镜像主要目的是缩减大小,节省磁盘)。原则上Image就可以直接被烧录在flash上启动执行,,但是实际并不是那么简单,实际上linux的作者们觉得Image还是太大了,所以对Image
进行了也压缩,并且在Image压缩后的文件的前端附加了一部分解压缩代码,构成了一个压缩格式的镜像叫做zImage,解压的时候,通过zImage镜像头部的解压缩代码进行自解压,然后执行自解压出来的内核镜像。
同时,uboot为了启动linux内核,还发明了一种内核格式叫做uImage,uImage是由zImage加工得到的,uboot中有一个工具,可以将zImage加工成uImage,uImage是不管linux内核的事情,linux内核只管生成zImage,然后uboot中的mkimage工具再去由zImage加工成uImage来给uboot启动,这个加工过程时间就是在zImage前边加上64字节的uImage的头信息即可。
注:如果直接在kernel底下去make uImage会提示mkimage command not found,解决方式是去uboot/tools目录下执行cp mkimage /usr/local/bin 复制mkimage工具到系统目录下,再去make uImage即可。
原则上,uboot启动时应该给他uImage格式的镜像,但是实际上uboot中也支持zImage,是否支持就看是否定义了LINUX_ZIMAGE_MAGIC这个宏,所以可以看出,有些uboot是支持zImage启动的,有些是不支持的,但是所有的uboot肯定都支持uImage启动。

一.开发板的启动方式:emmc启动(存储容量大,也快)
二.从emmc启动需要以下几种文件,如图:
busybox的安装和配置/最小根文件系统的制作_第1张图片
三.busybox的安装和配置
1.首先配置和编译busybox
A.将busybox-1.27.2.tar.bz2上传到linux上面,并且解压
这里写图片描述
busybox的安装和配置/最小根文件系统的制作_第2张图片
2.配置busybox
(1)修改busybox的Makefile文件
busybox的安装和配置/最小根文件系统的制作_第3张图片
(2)在busybox的目录下(这里我的是root@ubuntu:/home/imx6/busybox-1.27.2# )make menuconfig,出现菜单
busybox的安装和配置/最小根文件系统的制作_第4张图片
(3)按照下面选项进行配置
busybox的安装和配置/最小根文件系统的制作_第5张图片
(4)指定根文件系统安装的目录
首先在需要的目录下新建rootfs文件夹:mkdir rootfs
我这里的路径是/home/mf/Desktop/rootfs
然后进入make menuconfig菜单进行路径配置
busybox的安装和配置/最小根文件系统的制作_第6张图片
点击进入进行修改
busybox的安装和配置/最小根文件系统的制作_第7张图片
保存配置
(5)配置完成后make
出现下面报错miscutils/nandwrite.c:151:35: error: ‘MTD_FILE_MODE_RAW’ undeclared (first use in this function)
busybox的安装和配置/最小根文件系统的制作_第8张图片
解决方法:
a.查询编译器下面的相关文件(进入以下目录root@ubuntu:/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/usr/include/mtd#)
busybox的安装和配置/最小根文件系统的制作_第9张图片
进行以下修改
busybox的安装和配置/最小根文件系统的制作_第10张图片
b.root@ubuntu:/home/imx6/busybox-1.27.2# find -name nandwrite.c
添加:#include
busybox的安装和配置/最小根文件系统的制作_第11张图片
(6)make没有任何报错,执行make install(make install在所有的linux下的软件中作用都是安装软件–make install的目的就是将编译生成的可执行程序及其依赖的库文件、配置文件、头文件安装到当前系统中指定(一般都可以自己指定安装到哪个目录下,如果不指定一般都有个默认目录)的目录下)
成功,生成四个文件夹bin linuxrc sbin usr:
busybox的安装和配置/最小根文件系统的制作_第12张图片
四.根文件系统基础知识
1.为什么要构建根文件系统?
应用程序位于根文件系统上,需要构建根文件系统。
内核启动后先运行rest_init()–必须保证Open the /dev/console on the rootfs, this should never fail,才能够正常运行应用程序。
以下这段内核代码启动分析非本人,借鉴的一个同事整理的文档

rest_init();
   ----> kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
     ----> kernel_init 
         ----> kernel_init_freeable();
               ----> /* Open the /dev/console on the rootfs, this should never fail */
                  在根文件系统里边打开/dev/console 
             if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) //标准输入
              pr_err("Warning: unable to open an initial console.\n");    
                   (void) sys_dup(0);    //标准输出
                       (void) sys_dup(0);  //标准错误
               说明:sys_open(“/dev/console”) 和两个(void) sys_dup(0),就是指printf、scanf、err等输入输出设备从/dev/console(这里指串口2)上输出。对于其他的设备可能是别的,比如,键盘和液晶啥的。

----> prepare_namespace();
               ---->mount_root();   //挂接根文件系统

     ---->  if (execute_command) {
           if (!run_init_process(execute_command))
                   return 0;
            pr_err("Failed to execute %s.  Attempting defaults...\n",execute_command);
            }
            execute_command :就是uboot传给内核的init参数,本例为rdinit=/linuxrc,这里表示uboot如果定义了bootargs中:init=/linuxrc ,就会运行linuxrc,否则执行下边的代码。
              if (!run_init_process("/sbin/init") ||      //4个只执行一个,执行了就不回来
               !run_init_process("/etc/init") ||
               !run_init_process("/bin/init") ||
               !run_init_process("/bin/sh"))

通过run_init_process来启动应用程序,要么是我们传入的启动参数,要么是上边4个其中一个。

2.根文件系统里面有哪些内容?–利用busybox制作
在系统中shell命令:ls cp rm 等命令的都是一个个的应用程序,busybox工具实际上就是这些命令的整合。以上busybox我使用的是1.27.2的版本
3.最小的根文件系统需要哪些东西?
/dev/console
/dev/NULL
Init—-> busybox
/etc/inittab
配置文件里指定的应用程序
C库(如果busybox编译成静态的程序,那么库可以不需要)
这里写图片描述
Init本身,也就是busybox
五.最小根文件系统制作
1.在上述新建的rootfs文件夹下面创建两个设备文件/dev/console 和 /dev/NULL
mkdir dev/console
mkdir dev/NULL
2.查询虚拟机
busybox的安装和配置/最小根文件系统的制作_第13张图片
console : 主设备号为5,次设备号为1
null:主设备号为1,次设备号为3
所以,创建两个新的设备节点
root@ubuntu:/home/mf/Desktop/rootfs/dev/console# mknod -m 666 console c 5 1
root@ubuntu:/home/mf/Desktop/rootfs/dev/NULL# mknod -m 666 null c 1 3
3.创建etc目录,构造inittab
这里移植的是一个已经做好的典型的inittab,所以操作如下
root@ubuntu:/home/imx6/busybox-1.27.2/examples/bootfloppy#目录下有一个etc文件夹,将它全部拷贝到你的rootfs目录下的etc文件夹下,在tootfs下先新建一个etc文件夹

root@ubuntu:/home/imx6/busybox-1.27.2/examples/bootfloppy#  cp -Rf /home/imx6/busybox-1.27.2/examples/bootfloppy/etc/* /home/mf/Desktop/rootfs/etc

4.C库
进入到编译busybox的C库,这里我的路径是,将
/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf里面需要的文件动态链接到rootfs的lib下(在rootfs下新建lib文件夹)

root@ubuntu:/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf# cp -d *.so* /home/mf/Desktop/rootfs/lib

5.验证
将rootfs打包,生成一个rootfs.tar.bz2

root@ubuntu:/home/mf/Desktop/rootfs# tar jcf ../rootfs.tar.bz2 */

将rootfs.tar.bz2文件从linux传到win中,然后放在mfgtools的相应位置,具体操作参考mfgtools烧录的操作
观察:开发板是否能够正常启动,能够正常启动则是正确的啦
接着只需要对rootfs做进一步的完善
六.完善根文件系统
利用nfs服务将开发板挂载到虚拟机上后,可以在虚拟机上对开发板进行操作
1.这里以挂载proc虚拟文件为例,需要在inittab里边加上一个脚本
busybox的安装和配置/最小根文件系统的制作_第14张图片
执行mount –a 命令后,将挂接proc、tmpfs文件系统
写成mount –a 它会依赖于etc/fstab ,根据fstab的指示来挂载根文件系统
2.在fstab文件里边加上(这里只挂接proc)
proc /proc proc defaults 0 0
busybox的安装和配置/最小根文件系统的制作_第15张图片
chmod +x rcS
这样我们这个文件系统启动就会执行rcS,可以在proc目录看到所有运行的文件。

你可能感兴趣的:(嵌入式软件基础,文件系统,busybox)