嵌入式Linux文件系统制作的入门
文件系统概念
嵌入式Linux系统完整组成
完整的嵌入式Linux系统分为三部分,uboot,Linux内核,根文件系统三个部分。
启动顺序:上电后执行uboot,由uboot引导Linux内核,内核启动成功后挂载根文件系统,启动成功。

我们常见的各种Linux发行版,在内核上基本上是一样的
而各种Ubuntu或者Debian,只是不同的文件系统。
什么是文件系统?
文件系统分两部分 文件 和 系统 。
文件存储在存储介质,而系统可以管理文件。
有了文件系统,可以方便的进行文件的删改,增添等。
文件系统的格式有很多种,如fat32,ext2,ext3,ntfs等。
他们的区别是,装文件的"盒子"不同
在Linux下,一切皆文件,不管是文档,二进制,或者说是外部硬件设备,都可以当成文件的形式,并用文件的方式访问和操作。
根文件系统
在Windows系统下,有各种盘符,比如C盘,D盘等。
而Linux却没有这一概念,表现为Linux的系统会从被称为“根”的最顶端开始,用“/”表示
然后一些特定文件的目录组成的文件系统挂载在根上。
这种文件系统成为根文件系统。

下定义就是:根文件系统是一个挂载在Linux系统根目录下的,有特定目录组成的文件系统
作为Linux的设计,不管是什么Linux发行版,都是保持这样的结构,拥有相似的文件夹名称和组成结构
根系统目录介绍
列出一些常见的目录和功能介绍
| 目录 | 功能 |
|---|---|
| /bin | 通用Linux命令 |
| /sbin | 管理员命令 |
| /dev | 设备接口 |
| /etc | 系统配置 |
| /lib | 系统所需的库 |
| /home | 用户文件夹 |
| /root | 管理员文件夹 |
| /usr | 用户共享文件夹,存放应用程序和文件 |
| /var | 变量,可变的数据,如日志 |
| /proc | 空目录,作为proc文件系统的挂接点 |
| /mnt | 临时挂载文件系统的挂接点。如优盘 |
| /tmp | 临时文件 |
事实上,目录比较灵活,一些不用的目录也可以不存在,并非一定要有这些所有的目录
入门制作根文件系统
根文件系统的选择
Linux发展至今有众多成熟的文件系统选择

最简单的根文件系统一般使用 busybox 制作,适合入门学习基础,但功能不全,不适合实际开发
在实际嵌入式项目中可以使用buildroot工具和yocto工具 注意yocto刚需上外网,具有网络门槛
也可以使用发行版Linux系统,如Ubuntu系统,Debian系统
下载busybox工具
busybox的官网是: https://busybox.net/
点击下载源码

这里有所有的版本,选择最新版的下载即可,这里选择了1.33.1

配置busybox的清单:
将下载好的文件放入ubuntu任意目录并解压,进入解压后的文件夹,
可见busybox的源码
输入make menuconfig可进入图形化界面配置,操作与内核驱动编译的图形化一致
可以决定哪个命令不编译,以下是新编译所需要手动设置的几个选项
配置交叉编译器
选择如下地方

根据自己的开发板配置交叉编译器,复制粘贴交叉编译器的绝对路径 ,并去掉后缀(不去最后的-),只保留前缀

取消静态编译
不要选中这个,这个选项是静态编译,会导致把所有的库都编译进去最后文件过大

添加vi命令
选中这个

热拔插支持
进入目录

选中这个,全都选上

保存并退出
选择保存 退出
添加中文支持
bysybox对中文显示有限制,打开libbb/printable可以发现,将大于 0x7f 的字符都屏蔽了(显示为?),
而中文都是大于0x7f的,所以要修改一下中文支持。
vim进去之后将这两段判断注释即可


打开libbb/printable这里还有地方要修改,通过vim跳转到1030行,把这两处关于0x7f的判断条件删除,只用删除0x7f相关的,不要全部删去

编码格式设置
打开图形化配置界面,选中这两项


记得选择yes保存
制作第一个文件系统
在busybox根目录下执行make编译busybox
编译完成后输入make install CONFIG_PREFIX=安装路径安装
打开安装路径即可看到生成的usr,bin,sbin目录
打开bin验证一下,可见里面全是命令

可以看到还有一个linuxrc文件,这个文件的作用是挂载linux根文件系统
完善系统
目前只有三个目录,很多完整的根目录有的目录并没有
可以手动把其他目录建出来
由前文可知,一些可以空着的就不管了,比如mnt目录等
还有一些比如dev目录,在系统运行时自动创建,也不用管
故真正需要完善的有:
- etc目录,存放系统配置
- lib目录,存放系统所需要的库
完善lib
为什么不在之前直接静态编译库呢?
原因一是为了更灵活,需要什么库可以自己选
原因二是因为静态编译会占用很大的空间
因为我们编译使用了交叉编译器,所以我们运行所需要的,就是交叉编译器的库
打开交叉编译器所在,找到libc目录,打开后找到lib目录,就是我们需要的
将所有库拷贝进lib里
输入ls检查,如果有红色的,说明可能是连接关系的问题
需要打开交叉编译器里面看看是需要哪些链接
完善etc
创建基本目录结构
创建init.d目录,存放初始化配置
创建rc.d目录,存放
创建网络信息文件
etc目录下
创建eth0.setting
赋予文件权限
进入init.d目录
ifconfig.eth0
赋予文件权限
创建 rcS,开机启动脚本文件
进入init.d目录
创建并完善rcS文件
赋予文件权限
创建passwd文件,保存用户信息
在etc目录下
创建并完善passwd文件
赋予文件权限
创建profile文件,存放环境变量
etc下
创建并完善profile文件
赋予文件权限
创建netd文件,启动守护进程
进入rc.d目录
创建并完善netd文件
赋予文件权限
创建inittab文件,linux启动后第一个进程init的配置文件
etc下
创建并完善inittab文件
赋予文件权限
创建fstab文件,挂载设备到目录
etc下
创建并完善fstab文件
赋予文件权限
创建mdev.conf,热拔插相关文件
etc下
创建并完善mdev.conf文件
赋予文件权限
在etc下创建hotplug,存放热拔插配置
在hotplug下创建并完善udisk_inserting和udisk_removing,配置储存设备的热拔插配置
赋予文件权限
创建mtab,记录分区挂载情况,也会被ifconfig.eth0用于判断是不是nfs
是一个链接文件
链接上指定的文件
打包和烧录
dd if=/dev/zero of=rootfs.img bs=1M count=300
创建一个空的镜像文件,通过查询已经知道了大致的的大小是300mb,这句命令是写了3000mb的0x00到rootfs.img里
mkfs.ext4 rootfs.img
格式化为ext4格式
sudo mount rootfs.img rootfs
挂载命令,把一个文件系统 “接入” 到当前系统的目录树中,往 rootfs 里写文件,其实就是写进了 rootfs.img 这个虚拟磁盘里
sudo cp -rfpd sys/* ./rootfs
把 busybox 构建好的所有文件(这里的sys是之前存放busybox构建文件夹,根据实际情况选择),完整地复制到已经挂载好的 rootfs.img 镜像里
sudo umount rootfs
把挂载点 rootfs 从当前系统中卸载,切断和 rootfs.img 的关联,卸载会强制把缓存数据同步到镜像文件里,保证镜像数据完整。
现在所有文件都被打包进了 rootfs.img,现在rootfs.img 就是一个独立、完整的 ext4 根文件系统镜像了。
打包后可以烧录给开发板
加入额外功能
QT库
挺复杂的,要配置一堆环境变量
总结
本文分析了Linux文件系统,并使用busybox制作了简单的文件系统,
重要的是理解文件系统的作用和结构,
配置目录的文件的作用
一个最小的文件系统需要哪些东西
知道这些以对驱动开发理解更加深入,
busybo的文件夹需要自己创建,还要自己写配置,只适合学习不适合实际开发
buildroot相比于busybox,简化了很多操作,而且buildroot内置了busybox和目录,文件夹,并且增加新功能也更方便,不用手动配置复杂的环境变量
接下来将会尝试buildroot和其他更复杂的文件系统的制作。

浙公网安备 33010602011771号