https://blog.csdn.net/qq_24188351/article/details/77921653
第一部分:制作根文件系统
1.其实对于这个根文件系统,博主一直没有搞明白,何为根文件,想必知道device tree 的朋友并不 陌生,系统本身就是个树形结构,我们整个系统除了u-boot ,内核,其次就是 根文件,内核跑起来之后,接着就要挂载根文件了,根文件系统里存放着我们的各类参数,系统初始化数据,各种系统工具,库文件,头文件。
2.制作根文件要好多的方法,你也可以直接到开发板的厂商官网去看看是否有提供,这样里面的工具,库文件,头文件比较齐全,这样就不用花费时间去制作,但是这样有个缺点就是根文件系统过于庞大,臃肿,所以,这就解释了为什么根文件系统是可以定制的,内核也是可以裁剪的,有些开发板本身自己的内存比较小,如果在加之系统过于庞大,那么这样是不行
3.制作根文件系统的工具:一般有三个,buildroot,busybox ,yocto ,博主只有用过前两个,我们今天所展示的就是基于 buildroot 而定制的根文件系统
(1)首先我们需要下载 buildroot 安装包:
buildroot 下载地址:https://buildroot.org
(2)下载好以后我们拖放在虚拟机中,进行解压 tar -xvf buildroot-2017.02.5.tar.bz2
(3)解压完毕,我们打开buildroot-2017.05,里面的 configs 这里面有各种厂商的开发板的配置文件,我们找到我们需要的,这里有很多,要和我们在 第一节 中做使用的相同
(3)找到之后我们点击鼠标右键 复制,并 cd ../ 退回上级目录,执行 make qenu_vexpress_defconfig 将配置文件写入 并生成了一个 .cionfig 的配置文件,出现如下图中的所示,说明写入成功
(4)接下来我还可以对源码进行一些详细的配置 :输入 make menuconfig ,如果这里出错,你可以参考 第一节 中的 解决 方法,如果你在第一节中照着我的做了,那么这里是不会报错的,成功会进入如下的画面
(5)这里我们需要注意的是 :system configuration----> 这项,按 上下 键移到这项,按下 enter 键 进入
找到图中箭头所指的 选项,选择激活密码,并在下面的画面中输入密码,这样操作就需要我们输入密码才能登入根文件系统,博主之前在制作的过程中并没有选择,结果在成功加载 了内核之后进入根文件系统时提示要密码,在尝试了多次仍然失败后,博主重新进行了源码的编译,并选择了密码登录,才能成功登入系统
(6)选择完毕,选择 “exit” 退出主界面上,在选择图中的箭头所指的选项
进入该选项,进行如下的操作:这里我们选择的根文件系统的格式 ext4,根文件的格式有很多种,以后详细跟大家解释
选择完毕后,我们在该画面里选择如下的选项: 这里选项的是我们制作好跟文件后,进行压缩生成一个根文件的压缩文件,这样方便我们进行转移,可以保持文件的完整性
(7)其他的选项我都保持默认就可以了,我们进行保存
(8)解下来我就要进行编译工作了,输入 make -j4,等带编译完毕,我们看看我们的劳动成果
箭头所指的就是我们要的文件了
buildroot 的功能很强大,我们可以用它为我们制定一个属于自己的 操作系统,上图中我们可以看到,最终生成了 根文件rootfs.tar,内核镜像zImage
在host 目录我usr/bin 目录还生成叫 arm 的交叉编译工具链,
我们在制作根文件的时候,还可以选择busybox工具,其实你只要仔细查看了 buildroot 的选项过程,你会发现,buildroot其实是调用了busybox工具
这里我们只是介绍 采用 qemu 来模拟arm 的环境,至于要把我们生成的目标文件下载到嵌入式开发板实物,我们要需要是buildroot生成uboot文件如下:
这样我们就可以生成 u-boot 引导文件,即可以将 rootfs.ext4, u-boot, zImage 这些文件下载或烧写到开发板对应的扇区,就组成了我们的操作系统
至于如何烧写,这里不做讲解
第二部分:采用 qemu 生成我们最终的 模拟 环境
(1)通过在第一章中的操作,我们已经有了 u-boot引导文件,kernel的可引导镜像uImage,和配置好网络加载相关的环境变量,而在本节中的操作,我们又生成根文件系统的压缩文件rootfs.tar
(2)我们加目录下新建一个文件夹 QEMU ,将第一节中生成的文件: u-boot uImage 和本节中生成的rootfs.tar 文件都拷贝到该目录下,新建一个目录rootfs ,将rootfs.tar 放进去解压得到如下的文件
(3)cd ../
退回上级目录,我们来写个运行的脚本文件,touch qemu_arm_run.sh ,加上可执行权限 sudo chmod 777 qemu_arm_run.sh, vi qemu_arm_run.sh
加入如下的内容:注意 9 行的目录一定是你QEMU 文件夹所在目录,可以进入QEMU目录 ,输入pwd 命令来查看 目录结构
(4)我们现在可以来试试了,sudo ./qemu_arm_run.sh 看到我们已经成功加载就u-boot,博主这里是 ip 地址的问题,所有没有成功加载内核,我们进入 u-boot 所在的目录,按照第一章中的相关的方法 修改 include/vexpress_commd.h中的ip 地址,改成我们现在所用的ip,重新编译u-boot 生成新的u-boot,在拷贝到当前目录,再次执行脚本命令,就可以成功加载内核了
这里我们可以输入print 来打印环境变量信息:
我们修改完上面所说的新信息后,在执行运行脚本命令,这是激动的时刻出现了:
看到这一幕,是不是很熟悉呢
其实qemu 模拟arm 环境,还有一种方法,就是根文件也采用dd命令做成镜像,但这样我们就不能和主机里面的rootfs 目录同步,在arm 里面的操作,我们主机并不能接收到,采用 nfs 方式来挂载 根文件,我们模拟出来的arm环境和主机里面rootfs的内容是同步的,只要一个命目录中的内容改变,另一个目录里面的也随之改变,这是不是很方便呢,我们在 x86环境里写好测试程序,交叉编译成arm 版本的,就可以直接放到我们模拟出开的arm环境去运行了,并不需要开发板实物
好了,到这,里我们两节的内容就将完了,欢迎大家借鉴,希望可以尽早的帮助到您!