从单片机步入Linux之文件系统的构建

bf5b73658f5f074d9640ebc89545fde0.png

5ddeadbee1410727b0f699358f0a559e.png

大家好,我是情报小哥!

本文为【从单片机步入嵌入式Linux】系列文章的第四篇文章,前面三篇大家有时间也可以回头阅读一下,本系列文章的很多知识我都会从裸机开发和理解的角度来分析,帮助大家迅速理解Linux系统相关的知识点~

01

关于文件系统

7860d718bf487ca2b9413a2026123deb.png

很多朋友一看到"系统"这两个词眼就有点蒙了,嵌入式系统、Linux系统等等,就感觉很庞大、水很深~

其实完全不要有这样的顾虑,既然能够成为一个通用的系统,所采用的技术都是相对比较成熟的,但是不要一开始就想着一头扎进去研究本质,甚至重写改造,而是更多的享受该系统所提供的服务,以文件的形式组织数据展示给用户,会更加的形象直观。

就像使用笔记本电脑来制作一个精美的ppt,并不需要我们先去研究计算机系统是怎么构成的、怎么运作的。只需要了解并熟悉ppt软件的使用,便能够制作出一份不错的PPT。

同样文件系统也是类似的,文件系统主要是架在存储器上来管理数据,这些数据也就是文件,可以先了解这些文件如何操作,而暂时不需要直接研究这些文件怎么管理等,同样这也是linux系统一切皆文件的哲学思想的体现。

02

嵌入式Linux文件系统

a0299e8195d00f1831b0ae00143c79dd.png

文件系统组织数据和管理文件的方式和算法不同,不同文件系统所适应的存储介质也不同等等,使得文件系统的类型变得比较丰富,比如有些非常精简,占用存储空间小,甚至能够放到单片机中也能良好使用,当然这样的文件系统提供的功能也相对比较简单;而有些文件系统更加的安全等。

为了增强嵌入式Linux系统的通用性,其支持的文件系统当然也需要非常之多,比如 ext2、ext3、ext4、jffs、yaffs、romfs 等等,然而Linux内核中为了支持这么多的文件系统,从而抽象出了一套统一的层,叫虚拟文件系统(VFS),前面提到的文件系统类型均可以在VFS中得到支持,嵌入式Linux文件系统架构简图如下:

ad9f6ec8318511d829ffe43fa770c736.png

03

文件系统制作

e018f612208893cc1df2bd0d43b5058b.png

那么,为了构造自己的嵌入式系统,就需要制作根文件系统,在进行文件系统制作前首先我们要明白Linux系统为什么需要文件系统?

这个问题其实可以类比我们的window为什么需要C盘系统盘中里面的文件内容?

在Linux内核启动过程中第一个挂载的就是根文件系统,如果没有根文件系统也就无法再挂载其他文件系统了,根文件系统相应目录中存在Linux系统启动过程中一些关键性的文件和程序,比如shell程序、各种命令行程序(如ls等)、Linux内核启动的第一个程序init等等。

对于文件系统的格式我们倒可以通过相应的工具直接制作,毕竟这是比较固定化的东西,而对于文件系统中Linux启动和使用必须要的文件从哪里来呢?这样就需要busybox了。

busybox在嵌入式领域非常常用,它集成了各种工具和命令,说得简单一点就是一个制作根文件系统的安装程序。

下面以生成.yaffs2为例,画了一个简图:

413cb41485ef0e052b0df5a3e1440226.png

1、安装busybox  

1)首先我们需要下载busybox安装文件,这些东西都有人在维护着:

下载路径 : Index of /downloads (busybox.net)

这次使用的版本为busybox1.22.1版本,如下图所示:

9ce357d53041bae8d9763b309cd7926a.png

2)解压配置busybox

在压缩文件目录解压采用如下命令解压busybox:

tar jxvf busybox-1.22.1.tar.bz2

并且建立一个目录用于存放所要制作的最小根文件系统(Minifs),如下图所示:

63c6ac3d06839cfeabc4098031018402.png

待会配置完busybox以后就可以直接把内容安装到Minifs文件夹中。

回到busybox目录,采用如下命令行进入busybox菜单进行makefile配置选项设置:

make menuconfig CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux- ARCH=arm -j8

小哥不太想把编译器设置到系统中,所以这里麻烦一点指定了相应gcc编译器路径,如果已经有配置gcc系统路径,可以直接make menuconfig,这也是Linux中进行工程配置的常规操作。

3)具体配置信息:
设置【Don't use /usr】,为了避免有可能破坏原宿主系统中的/usr :

61e69ec1cb309f2cc81d904f908274e9.png

选择交叉编译工具链路径(.../arm-linux-):

edaf7d7e3f8b6e83cf51d4a7b1dc3122.png

把busybox安装路径设置为前面创建的Minifs文件夹路径:

b487566b7e26aea6a4c5ca2e483c8ed7.png

配置完成以后记得保存,然后开始进行编译、安装。

4)busybox分别执行编译和安装,分别执行命令make 和 make install,如果大家跟我一样没有在系统中设置编译器路径,记得后面加上编译器路径。

3e3ac268c69a75a023963810851468b5.png

721ee94af1db9281a2fca3d332d9f305.png

顺利执行完上面的安装路径以后,便可以在Minifs文件夹中看到如下安装项目,这些就是我们制作根文件系统的材料 :

e156ac499878161206a7543e3adb7fe6.png

可以看到所安装的文件夹中主要是一些系统使用的运行程序(如init程序)和命令行工具(如ls、mv)等:

046abb31cb92b99111dec5b560b5364a.png

7f809db4d3410580ac8bd2eede0eb6fd.png

这样busybox就安装完了,但是我们还需要对其中与系统运行有关的文件进行添加和配置 。

2、构造glibc库 

前面我们在编译busybox的时候,其编译选项采用的是【No shared libs】,没有使用静态链接库,这样我们就需要自己构建glic库,相关程序只有在加载运行的时候才能链接到相关库中的实现最终得以正常运行--也叫动态链接。

动态链接至少要准备加载器和动态库,因为编译器在编译程序的时候也有可能使用到这些库,所以这些在交叉编译器中已经存在了,只需要拷贝相应的文件到/lib中即可。

cp /home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/lib/*.so* ./lib -d

cp /home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/lib/*.so* ./lib -d

注意使用cp命令的时候需要注意加上-d选项,表示复制时保留链接。

814f1b856b6ca7d3626e56f4887bb428.png

那么,这样/lib目录就准备好了。

3、添加相关配置和文件  

通过busybox我们把根文件系统中大部分目录已经建立好了, 不过还有一些启动的脚本等配置信息需要手动添加,因为Linux在启动过程中会需要读取并运行这些配置,而这些配置信息基本上都统一放在/etc目录下:

2cbce6076dfa8ace1421e73fb470f9f1.png

如上是我们在/etc目录下主要配置的文件信息,内核启动以后就会创建busybox中的init进程(可以在前面生成的/sbin文件夹中看到init可执行程序),init进程也是第一个进程,而init进程会根据/etc/inittab文件来创建其他进程,比如执行脚本、启动shell以及电源开关机等处理。(详细说明可以参考inittab格式),下面是配置的initab文件内容:

71ce8f73d45a867564d34906a5d588d9.png

第三行我们知道,在inittab中一般首先会执行/etc/init.d/rcS这个开机脚本文件,而这个文件可以用于配置开机启动程序和服务,以及linux系统配置,比如设置IP地址,挂载其他文件系统等等。(如下是rcS脚本)

cb579d90e14cae16ba3406669f9e87b3.png

而rcS脚本文件所要挂载的文件系统来源于fstab文件中,fstab该文件中指定需要挂载哪些文件系统,所以只要将磁盘信息配置到该文件中,便会自动挂载。(如下是主要挂载的文件系统)

acf7670fd8d28db5de15d1775d841503.png

由于我们需要操作外部设备,而这些设备都是以文件的形式在/dev目录中展示(一切皆文件),一种方式是静态在该目录中mknod创建设备节点,而另外一种便是通过mdev动态的创建。

大家都知道udev是linux下的一个管理/dev下设备节点的管理器,驱动程序提供信息(设备文件名、设备号),udev便会根据驱动提供的信息自动创建设备文件,才会注册生成相应的设备节点。那么mdev就是busybox中的udev的简化版本。

所以为了支持mdev,需要系统支持sysfs和tempfs,这些在上面的fstab文件中进行了描述,同时为了让mdev自动启动,我们在rcS脚本文件中加入了相应的启动命令,具体可以参考busybox中的mdev的用法文档:

785c5325fa527a0e6fd0389137ec6446.png

不过在mdev构造/dev目录之前,还需要静态创建两个节点console和null以供init进程使用,那就只能通过静态方式创建了,如下LinuxPC下通过命令创建即可。

mknod console c 5 1
mknod null c 1 3

c89c3b1a767a1211869623da47562658.png

然而后面小哥把该文件制作成为yaffs文件系统映像挂载以后,会报一些文件权限问题:

d275a1e79c6a22d0d8ea484c6585eea4.png

所以这里我们还需要把rcS和rc.local文件设置一下可执行权限,类似于如下命令:

chmod -x rcS
chmod -x rc.local

至此一个最小根文件系统材料就准备好了。

04

制作映像并烧录

2fee3059b996c0713654129d54ccb1b5.png

我们最终需要把前面构建的文件系统烧录到开发板中的非易失性存储器中,是不是我们直接把刚刚构建的文件系统压缩打包烧写到相应的分区即可?

其实差不多是这个道理吧,但不是简单使用tar命令直接进行压缩,而是要通过工具把其转化为相应的文件系统映像格式,这样操作系统才能够识别该映像文件(烧录进去的内容),并且读取到与构建前相同的文件结构和内容,否则操作系统找不到文件系统中你所配置的内容。

1、制作映像文件  

这里把前面构建好的最小根文件系统制作成yaffs烧录映像文件,这里就直接使用到百问网做好的yaffs映像文件制作工具的源码,并编译生成制作工具-‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍mkyaffsimage应用程序软件。

如下是制作mkyaffsimage制作工具所使用的命令:

1tar jxvf yaffs_source_util_larger_small_page_nand.tar.bz2 
2
3cd ./Development_util_ok/yaffs2/utils
4
5make CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux- ARCH=arm -j8
6
7chmod -x  mkyaffs2image

首先解压百问网提供的yaffs工具源码,到utils目录中使用make直接编译,便可以生成mkyaffsimage工具,然后赋予该工具为可执行权限。

接着,下面直接使用该工具把前面构建的根文件系统Minifs制作为映像文件:

1./mkyaffs2image /home/book/WorkSpace/Qt/src/busybox-1.22.1/Minifs Minifs.yaffs

于是在当前目录中即可获得文件系统的烧录映像了:

b3a96a2990ad844a3a860159b872e51d.png

2、烧录根文件系统  

同样使用uboot来进行整个系统的部署,包括根文件系统,其烧录过程与前面进行linux内核映像文件烧录一致。

直接在uboot中使用TFT服务先下载到SDRAM中:

89d121920a5d89df6f0d0cac339ec6b4.png

然后使用如下命令烧录nandflash中进行固化:

1nand erase.part rootfs
2nand write.yaffs 0x30000000 0x02460000 $filesize
3boot

首先把uboot中存放根文件系统rootfs的分区进行擦除,然后把SDRAM中yaffs文件映像烧写到Nandflash中,烧写完成以后,采用boot命令重新启动系统。

最后我们看到,Linux重新启动并挂载了根文件系统并进入shell命令行:

36808e4581913027c4187bdfb333a5b2.png

至此,根文件系统也成功构建好了,其他相关问题,等我们使用过程中再具体解决~

这样一个相对比较完整的Linux系统就运行起来了,这样就跟命令行版本的LinuxPC类似了,我们可以在上面执行应用程序等等。

最  后 

好了,这里小哥就介绍了一下Linux文件系统的构建、烧录相关知识,希望本文能够对你有帮助,下期应该是跟大家介绍QT的移植等~


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

f5fe5e294ff86d4475bc7cad6f4b78d7.png

嵌入式Linux

微信扫描二维码,关注我的公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值