根文件系统rootfs仅仅就是一个代名词,什么都不是从它包含的内容角度考虑,根文件系统rootfs包含的内容如下: 也就是进入linux系统之后执行:cd /然后ls看到的内容,组成根文件系统,例如:
bin目录:保存普通用户命令的目录
sbin目录:保存超级用户命令的目录
etc目录:保存系统配置文件的目录
lib目录:保存各种库文件的目录
等等
注意:EXT4,NTFS,FAT32等他们都是一种文件系统格式,就是一种管理目录和文件的方式方法,例如:单个文件超过4GB,NTFS文件系统格式可以管理,而FAT32文件系统格式无法管理,说明不同的文件系统格式管理目录和文件的方式方法不一样而根文件系统rootfs就是由一堆的目录和文件组成,用户想要看到所以必须采用一种文件系统格式
总结:根文件系统并不等价于文件系统,根文件系统是软件层面上的解释,但是根文件系统要想展示其目录和文件必须使用某一个文件系统。
必要的八大目录:
bin目录:保存普通用户命令的目录
sbin目录:保存超级用户命令的目录
lib目录:保存各种库文件的目录
etc目录:保存系统配置文件的目录
usr目录:保存其它命令或者库文件的目录
dev目录:保存设备文件,跟驱动相关
proc目录:跟驱动相关
sys目录:跟驱动相关
注意:dev,proc,sys跟驱动相关,里面的内容由驱动自动创建!
所以这三个目录只要创建好即可,里面的内容无需关注!
可选目录:
home:作为普通用户主目录
mnt:作为U盘,TF卡,SD卡,闪存分区的挂节点
var:作为临时文件的存放目录
opt:存放自己的可执行文件等 其它目录根据用户需求自行创建
bin目录:保存普通用户命令的目录
sbin目录:保存超级用户命令的目录
lib目录:保存各种库文件的目录
etc目录:保存系统配置文件的目录
usr目录:保存其它命令或者库文件的目录
dev目录:保存设备文件,跟驱动相关
proc目录:跟驱动相关
sys目录:跟驱动相关
注意:dev,proc,sys跟驱动相关,里面的内容由驱动自动创建!
获取正确的交叉编译器
注意版本要匹配
从www.busybox.net自己下载一个busybox源码(用新的)
修改busybox的Makefile指定处理器架构和交叉编译器
vim Makefile +190
将: ARCH ?= $(SUBARCH)
修改为: ARCH = arm 保存退出 说明:指定将来运行在ARM架构
vim Makefile +164
将:CROSS_COMPILE ?=
修改:CROSS_COMPILE = arm-cortex_a9-linux-gnueabi- 保存退出 说明:指定交叉编译器
配置busybox源码,采用完整版驱动操作命令
Linux Module Utilities --->
//按N键去除简化版的insmod和rmmod命令
[ ] Simplified modutils
//一旦将上面选项去除,立马出现以下完整版的命令无脑全部选中:
[*] insmod
[*] rmmod
[*] lsmod
[*] Pretty output
[*] modprobe
[*] Blacklist support
[*] depmod
保存退出
正式交叉编译busybox
安装busybox
make install
何为“安装”
答:安装就是将编译busybox生成的二进制文件统一的拷贝到指定的某个目录下busybox指定的默认安装目录为_install目录
ls /opt/busybox/_install //查看编译生成的二进制文件内容
bin sbin usr //三大必要目录
获取三大目录后,通过命令发现三大目录里面的,busybox仅仅给你提供各种命令而已!并且这些命令都是软连接文件,最终都链接到同一个实体文件:/opt/busybox/_install/bin/busybox交叉编译busybox仅仅生成一个可执行文件bin/busybox命令就是他的链接而已。
向根文件系统rootfs添加动态库到必要目录lib中
为何要添加动态库而没有静态库呢?
本质上位机编辑和交叉编译下位机运行开发模式,所以向根文件系统添加程序运行时的动态库即可(静态库在上位机编译是用到,运行时不需要;而动态库是编译和运行时都要用到,所以需要将用到的动态库放入到lib目录中)
动态库在哪里呢?
就在交叉编译器中,所以只需从交叉编译器中拷贝所需的动态库即可
如何知道一个应用程序所需哪些动态库呢?
总不能将无用的动态库也进行拷贝吧,这种全部拷贝,最终会浪费闪存空间,拷贝动态库的原则:需要哪些动态库就拷贝哪些动态库
获取所需动态库的命令:
arm-cortex_a9-linux-gnueabi-readelf -d 应用程序
从交叉编译器中找到的动态库拷贝到哪里?
必须只能拷贝到根文件系统rootfs的lib必要目录
分析知道busybox是实体文件,其他都是软链接(类似快捷方式),我们就需要将busybox依赖的动态库配置到lib目录里面。
find 【目录】-name 【应用程序】 //使用该命令查找路径
将busybox需要的动态库拷贝到lib目录里面。
最后向根文件系统rootfs的lib目录中添加加载器(动态链接库),加载器功能:负责将动态库里的变量和函数加载到当前进程的地址空间上,并且加载器本质也是一个动态库并且加载器的名称都是以“ld-”开头,一般动态库都是以“lib”开头,加载器也在交叉编译器中。
找到-->查看属性-->拷贝 // 三步骤
上电->CPU运行uboot->uboot先做硬件初始化
->uboot然后从某个地方加载内核到内存
->uboot然后给内核传递启动参数
->uboot最后启动内核->内核启动,uboot生命结束
->内核首先做七大子系统初始化
->内核运行到最后根据uboot传递的参数到某个地方找根文件系统
->一旦找到运行根文件系统/sbin/init第一号进程
->第一号进程init首先打开根文件系统/etc/inittab文件
->init找到关键字sysinit,一旦找到init进程创建一个子进程来执行sysinit指定的脚本程序rcS(位于根文件系统rootfs/etc/init.d目录下)父进程init等待着子进程结束
->rcS执行完毕,父进程init再找到关键字respawn
->找到以后,init再次创建一个子进程来执行根文件系统/bin/sh这个程序,此程序就是shell程序,用户至 此可以输入命令,父进程init等待着子进程sh结束!
首先完成inittab脚本文件,创建init.d目录,完成rcS脚本文件(该文件注意添加权限777),rcS文件中又涉及到fstab脚本文件
精简根文件系统rootfs,缩减体积
注意:目前根文件系统rootfs中占用磁盘空间最大的是各种动态库
所以对动态库进行精简体积:
arm-cortex_a9-linux-gnueabi-strip /opt/rootfs/lib/*
//查看rootfs的体积 du /opt/rootfs -lh //1.21.1版本制作出来的为2.7MB
//高版本大概在2.8M~3MB之间
结论:
产生研发阶段,不要对软件进行strip
产生发布阶段,软件必须strip,目的是节省占用的磁盘空间
至此,根文件系统制作完毕,撒花!!!