电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
i.MX6ULL嵌入式Linux开发5-根文件系统完善
分 享
扫描二维码分享
i.MX6ULL嵌入式Linux开发5-根文件系统完善
i.MX6ULL
嵌入式
linux
码农爱学习
关注
发布时间: 2021-08-10
丨
阅读: 1609
[上篇文章](https://www.icxbk.com/article/detail/2336.html),**使用BusyBox**构建了**基础的嵌入式Linux系统的根文件系统**,基本的功能可以正常运行,但在个基础功能上,还要许多地方需要完善。 [TOC] # 1 完善根文件系统 [上篇](https://www.icxbk.com/article/detail/2336.html)说道,Linux系统运行起来后,可以正常的执行"ls"等基础命令,但**仔细观察系统运行后的打印信息,有一条提示**: ```sh can't run '/etc/init.d/rcS': No such file pngor directory ``` ![](https://cf05.ickimg.com/bbsimages/202108/5a71c7a7670d6056e15cecaa87c887fd.png) 说是无法运行“/etc/init.d/rcS”这个文件,因为根文件系统(rootfs)里没有这个文件。**这个rcS是什么呢?**它其实是一个shell脚本, 在Linux内核启动以后,需要启动一些服务, 而**rcS就是规定启动哪些文件**的脚本文件。 ## 1.1 创建/etc/init.d/rcS文件 在rootfs中**创建/etc/init.d/rcS文件**(前两级目录不存在,要先创建文件夹,再创建文件),然后在rcS中输入如下所示内容: ```sh #!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s ``` 各行含义如下: - `PATH环境变量`:保存着**可执行文件可能存在的目录**,这样我们在执行一些命令或者可执行文件的时候就不会提示找不到文件这样的错误。 - `LD_LIBRARY_PATH环境变量`:保存着**库文件所在的目录**。 - `export命令`:用来**导出上面这些环境变量**,相当于声明一些“全局变量” 。 - `mount命令`:用来**挂载所有的文件系统**,这些文件系统由文件/etc/fstab来指定,所以后续还要创建/etc/fstab文件。 - `mkdir命令`:**创建目录/dev/pts**,然后将devpts挂载到/dev/pts目录中。 - `最后两行`:**使用mdev来管理热插拔设备**,通过这两行,Linux内核就可以在/dev目录下自动创建设备节点。 创建好/etc/init.d/rcS后还定要**给其可执行权限**(chmod 777)。 ## 1.2 创建/etc/fstab文件 上面说道,**rcS在挂载所用的文件系统**时,这些文件系统**由文件/etc/fstab 来指定**,所以还要创建/etc/fstab文件。 在rootfs中创建 **/etc/fstab文件**, fstab在Linux开机以后自动配置哪些需要自动挂载的分区,格式如下: ```sh
``` - `
`:要挂载的**特殊设备**,也可以是**块设备**,比如/dev/sda等 - `
`:**挂载点** - `
`:**文件系统类型**,如ext2、ext3、proc、romfs、tmpfs等 - `
`:**挂载选项**,一般使用默认的defaults(包含了 rw、suid、dev、ex
ec、auto、nouser和async) - `
`:为1表示允许备份,**为0不备份**,**一般不备份** - `
`:**磁盘检查设置**,为0表示不检查。根目录‘/’设置为 1,其他的分区从2开始。一般不在fstab中挂载根目录,**一般设置为0** 按照上述格式,在fstab文件中输入如下内容(第1行是注释): ```sh #
proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 ``` fstab文件创建完成以后,启动开发板,可以看出,**启动成功,且没有提示rcS**: ![](https://cf05.ickimg.com/bbsimages/202108/9c70c8e8896f4e63690d801ec514f86d.png) > 注:以上两个文件,**可以直接在ubuntu的nfs文件中添加,也可以先通过板子的串口连接到nfs后,在串口窗口操作**。我是在ubuntu中操作,然后再连接板子启动。 ## 1.3 创建/etc/inittab文件 系统启动已经没有错误提示了,但我们要仍要创建另一个文件/etc/inittab ,这个文件**用于busyboxd的初始化**,init 程序会读取/etc/inittab这个文件。 **inittab由若干条指令组成**,每条指令的结构都是**以“:”分隔**的**4个段**组成,格式如下: ```sh
:
:
:
``` - `
`:**每个指令的标识符,不能重复**。但是对于busybox的init 来说,`
`有着特殊意义。对于busybox而言`
`用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控 制 tty。 - `
` :对busybox来说此项完全没用,所以空着。 - `
`:动作,用于指定`
`可能用到的动作。 - `
` :具体的动作,比如程序、脚本或命令等。 参考busyboxd的examples/inittab文件,来创建一个/etc/inittab,输入如下内容: ```sh #etc/inittab ::sysinit:/etc/init.d/rcS console::askfirst:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a ``` - 第 2 行:**系统启动**以后**运行 /etc/init.d/rcS**这个脚本文件。 - 第 3 行:将console作为**控制台终端**,也就是ttymxc0。 - 第 4 行:**重启**将运行 **/sbin/init**。 - 第 5 行:按下ctrl+alt+del组合键的将运行 **/sbin/reboot**(注:windows系统的串口软件连接开发板,这个命令无效,因为该组合键会被windows系统拦截而执行windows系统的ctrl+alt+del组合键命令)。 - 第 6 行:**关机**的时候执行 **/bin/umount**,也就是**卸载各个文件系统**。 - 第 7 行:**关机**的时候执行 **/sbin/swapoff**,也就是**关闭交换分区**。 > 注:我在ubuntu上编辑测文件时,console行出现了红色背景块,但似乎也没什么影响 > >![](https://cf05.ickimg.com/bbsimages/202108/4792b904cb85169bd67fa6fcdca0d8ae.png) /etc/inittab文件创建好以后就可以重启开发板即可, **至此,根文件系统要创建的文件就已经全部完成了**。 总结一下刚才创建的**目录**和**文件**,如下图 ![](https://cf05.ickimg.com/bbsimages/202108/eaca2278a11b2a21728c9b8d70916748.png) # 2 根文件系统其他功能测试 根文件系统已经完善了,接下来就来继续测试根文件系统是否好用。 ## 2.1 软件运行测试 先来编写一个简单的c语言程序运行一下,**验证库文件是否能用**。 先在ubuntu的rootfs中(可以先创建一个单独的test文件夹用来测试)创建一个hello.c: ```c #include
int main(void) { while(1) { printf("hello world!\r\n"); //打印 sl
eep(2); //休眠2秒 } } ``` 然后使用**交叉编译链**来编译程序: ```sh arm-linux-gnueabihf-gcc hello.c -o hello ``` 编译后会生成名为hello的可执行文件,可以使用“file”命令查看文件类型以及编码格式: ![](https://cf05.ickimg.com/bbsimages/202108/b584afe63cb3e3e9e62d530eb7a97849.png) hello是个**32位**的**LSB**可执行文件,**ARM架构**的,并且是**动态链接**的。 在ubunt中编译完后,重启开发板,在开发板的串口中(串口软件),运行hello文件: ![](https://cf05.ickimg.com/bbsimages/202108/035e4155152f85e08e5097c812559258.png) 程序每隔2秒打印一次,运行正常,说明我根文件系统中的**动态库没有问题**。按下“ctrl+c”组合键即可中止该程序。 > 该程序运行起来,会占用交互窗口,可以让hello**进入后台运行**,方法是在运行软件的时候加上“&”,即:`./hello &`。 > > 注意:**程序在后台运行时,交互串口仍是有打印的,只是这时我们可以敲回车键来输入命令了,与程序的输出互不影响**,唯一的影响是程序的输出会打断我们的输入,但可以不理会打断,继续输入命令仍是可以执行命令的。 > > 在后台运行的程序,可以**使用`ps`命令来查看各个进程的id**,然后使用`kill -9 pid(进程 ID)`命令来关闭掉当前运行的程序。 > > 如下图,输入ps命令,可以看到hello程序的进程为101,此时**先敲回车键**,弹出井号提示符,然后输入`kill -9 101`,再回车,就可以看到**hello进程被杀掉**了。 > > ![](https://cf05.ickimg.com/bbsimages/202108/47138b07f475ec0af1ea3d31206a57c5.png) ## 2.2 开机自启动测试 玩过单片机的都知道,单片机的程序烧录进去后,上电就自动开始运行了。**那linux系统,写了一个程序,可以像单片机那样开机就运行吗**,当然是可以的! 实现开机自启动的原理也很简单,linux在启动时,有一个默认的开机启动脚本(/etc/init.d/rcS这个shell文件),因此**修改这个脚本,添加自启动相关内容**即可: ![](https://cf05.ickimg.com/bbsimages/202108/0527a229a7171483ab74d7f74a06beaa.png) 自启动代码添加完成以后,重启开发板,可以看到**hello这个软件已经开机时自动运行**了: ![](https://cf05.ickimg.com/bbsimages/202108/81c5629f13fe29e0aa77ac3610c2f95b.png) ## 2.3 外网连接测试 这里的**外网**是相对于局域网这个**内外**而言的,即测试板子是否能访问百度、QQ这样的网站,先使用ping指令来测试一下: ```sh / # ping qq.com ping: bad address 'qq.com' / # ``` 在网络连接正常的情况下,无法ping通这些网址,是因为缺少**域名解析服务**,需要配置域名解析服务器的IP地址。 一般域名可以设置为所处网络的网关地址,比如我的**局域网的网关**是192.168.5.1。 也可以设置为**运营商的域名解析服务器地址**:114.114.114.114。 在rootfs中新建文件/etc/resolv.conf,然后在里面输入如下内容: ```sh nameserver 114.114.114.114 nameserver 192.168.5.1 ``` 修改保存退出,再次ping一下QQ网站,可以看出ping QQ成功了! ![](https://cf05.ickimg.com/bbsimages/202108/d047c5a3eea3274aa7f2199b2c9cd342.png) # 3 结语 至此!根文件系统的完善工作也完成了。 再来看一下本篇对文件都有哪些修改: ![](https://cf05.ickimg.com/bbsimages/202108/45efb6e2e1722d356c4d2f7adce433f3.png) **linux移植三巨头:uboot、kernel、rootfs**已移植完毕,接下来可以将这三部分整体打包一下,方便系统的通用烧写,下篇见~
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
码农爱学习
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交