0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

i.MX6ULL嵌入式Linux开发5-根文件系统完善

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-03-14 08:44 次阅读

上篇文章,使用BusyBox构建了基础的嵌入式Linux系统的根文件系统,基本的功能可以正常运行,但在个基础功能上,还要许多地方需要完善。

1 完善根文件系统

上篇说道,Linux系统运行起来后,可以正常的执行"ls"等基础命令,但仔细观察系统运行后的打印信息,有一条提示:

can't run '/etc/init.d/rcS': No such file pngor directory 
pYYBAGIuBM6AJJ7_AADgfz1s3aY959.png

说是无法运行“/etc/init.d/rcS”这个文件,因为根文件系统(rootfs)里没有这个文件。这个rcS是什么呢?它其实是一个shell脚本, 在Linux内核启动以后,需要启动一些服务, 而rcS就是规定启动哪些文件的脚本文件。

1.1 创建/etc/init.d/rcS文件

在rootfs中创建/etc/init.d/rcS文件(前两级目录不存在,要先创建文件夹,再创建文件),然后在rcS中输入如下所示内容:

#!/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开机以后自动配置哪些需要自动挂载的分区,格式如下:

:要挂载的特殊设备,也可以是块设备,比如/dev/sda等

挂载点

文件系统类型,如ext2、ext3、proc、romfs、tmpfs等

挂载选项,一般使用默认的defaults(包含了 rw、suid、dev、exec、auto、nouser和async)

:为1表示允许备份,为0不备份一般不备份

磁盘检查设置,为0表示不检查。根目录‘/’设置为 1,其他的分区从2开始。一般不在fstab中挂载根目录,一般设置为0

按照上述格式,在fstab文件中输入如下内容(第1行是注释):

# 
proc            /proc           proc    defaults        0       0
tmpfs           /tmp            tmpfs   defaults        0       0
sysfs           /sys            sysfs   defaults        0       0

fstab文件创建完成以后,启动开发板,可以看出,启动成功,且没有提示rcS

poYBAGIuBNmAWDDFAACkEnGOU-o203.png

注:以上两个文件,可以直接在ubuntu的nfs文件中添加,也可以先通过板子的串口连接到nfs后,在串口窗口操作。我是在ubuntu中操作,然后再连接板子启动。

1.3 创建/etc/inittab文件

系统启动已经没有错误提示了,但我们要仍要创建另一个文件/etc/inittab ,这个文件用于busyboxd的初始化,init 程序会读取/etc/inittab这个文件。

inittab由若干条指令组成,每条指令的结构都是以“:”分隔4个段组成,格式如下:

:::

每个指令的标识符,不能重复。但是对于busybox的init 来说,有着特殊意义。对于busybox而言用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控 制 tty。

:对busybox来说此项完全没用,所以空着。

:动作,用于指定可能用到的动作。

:具体的动作,比如程序、脚本或命令等。

参考busyboxd的examples/inittab文件,来创建一个/etc/inittab,输入如下内容:

#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行出现了红色背景块,但似乎也没什么影响

pYYBAGIuBOuAV4ZXAABCook51Dc438.png

/etc/inittab文件创建好以后就可以重启开发板即可, 至此,根文件系统要创建的文件就已经全部完成了

总结一下刚才创建的目录文件,如下图

pYYBAGIuBPaAdNuoAAAlG0fqAqk350.png

2 根文件系统其他功能测试

根文件系统已经完善了,接下来就来继续测试根文件系统是否好用。

2.1 软件运行测试

先来编写一个简单的c语言程序运行一下,验证库文件是否能用

先在ubuntu的rootfs中(可以先创建一个单独的test文件夹用来测试)创建一个hello.c:

#include 

int main(void)
{
    while(1)
    {
        printf("hello world!\r\n"); //打印
        sleep(2); //休眠2秒
    }
}

然后使用交叉编译链来编译程序:

arm-linux-gnueabihf-gcc hello.c -o hello 

编译后会生成名为hello的可执行文件,可以使用“file”命令查看文件类型以及编码格式:

pYYBAGIuBP2ARoFgAAF5JrQ8fIk289.png

hello是个32位LSB可执行文件,ARM架构的,并且是动态链接的。

在ubunt中编译完后,重启开发板,在开发板的串口中(串口软件),运行hello文件:

poYBAGIuBQOAEscYAABXTk8bUCI256.png

程序每隔2秒打印一次,运行正常,说明我根文件系统中的动态库没有问题。按下“ctrl+c”组合键即可中止该程序。

该程序运行起来,会占用交互窗口,可以让hello进入后台运行,方法是在运行软件的时候加上“&”,即:./hello &

注意:程序在后台运行时,交互串口仍是有打印的,只是这时我们可以敲回车键来输入命令了,与程序的输出互不影响,唯一的影响是程序的输出会打断我们的输入,但可以不理会打断,继续输入命令仍是可以执行命令的。

在后台运行的程序,可以使用ps命令来查看各个进程的id,然后使用kill -9 pid(进程 ID)命令来关闭掉当前运行的程序。

如下图,输入ps命令,可以看到hello程序的进程为101,此时先敲回车键,弹出井号提示符,然后输入kill -9 101,再回车,就可以看到hello进程被杀掉了。

pYYBAGIuBQmAC9sJAABZg8CuRpI882.png

2.2 开机自启动测试

玩过单片机的都知道,单片机的程序烧录进去后,上电就自动开始运行了。那linux系统,写了一个程序,可以像单片机那样开机就运行吗,当然是可以的!

实现开机自启动的原理也很简单,linux在启动时,有一个默认的开机启动脚本(/etc/init.d/rcS这个shell文件),因此修改这个脚本,添加自启动相关内容即可:

poYBAGIuBRGABj4QAAC1LZbGuow591.png

自启动代码添加完成以后,重启开发板,可以看到hello这个软件已经开机时自动运行了:

pYYBAGIuBRaAVcpbAACcYb3KAio360.png

2.3 外网连接测试

这里的外网是相对于局域网这个内外而言的,即测试板子是否能访问百度、QQ这样的网站,先使用ping指令来测试一下:

/ # ping qq.com
ping: bad address 'qq.com'
/ # 

网络连接正常的情况下,无法ping通这些网址,是因为缺少域名解析服务,需要配置域名解析服务器的IP地址。

一般域名可以设置为所处网络的网关地址,比如我的局域网的网关是192.168.5.1。

也可以设置为运营商的域名解析服务器地址:114.114.114.114。

在rootfs中新建文件/etc/resolv.conf,然后在里面输入如下内容:

nameserver 114.114.114.114
nameserver 192.168.5.1

修改保存退出,再次ping一下QQ网站,可以看出ping QQ成功了!

poYBAGIuBRyAeInyAACcL2BlP8Y373.png

3 结语

至此!根文件系统的完善工作也完成了。

再来看一下本篇对文件都有哪些修改:

pYYBAGIuBSSADjXuAAB_QPT-_3A361.png

linux移植三巨头:uboot、kernel、rootfs已移植完毕,接下来可以将这三部分整体打包一下,方便系统的通用烧写,下篇见~

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10987

    浏览量

    206724
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24400
  • 嵌入式L
    +关注

    关注

    0

    文章

    5

    浏览量

    6649
收藏 人收藏

    评论

    相关推荐

    嵌入式软件开发应该掌握哪些知识?

    知识点学习 熟悉 Linux 的基本使用对于嵌入式软件开发至关重要。包括文件系统的管理、用户权限的控制、软件包管理等。嵌入式开发人员需要能够
    发表于 02-19 11:23

    嵌入式学习——ElfBoard ELF1板卡 之文件系统的介绍

    文件系统是一样的,只是嵌入式Linux文件系统根据产品功能进行过裁剪,在内容多少和体积大小上不同。进行嵌入式
    发表于 11-24 10:02

    i.MX6ULL——ElfBoard ELF1板卡 之文件系统目录的介绍

    文件系统是一样的,只是嵌入式Linux文件系统根据产品功能进行过裁剪,在内容多少和体积大小上不同。进行嵌入式
    发表于 11-24 09:59

    i.MX6ULL——ElfBoard ELF1板卡 如何重新打包文件系统

    1.拷贝ELF1开发板资料包\\\\04-烧写镜像\\\\04-0 eMMC镜像目录下的rootfs.tar.bz2到开发环境下的任意目录,比如/home/elf。 2.创建存放目标文件系统的目录
    发表于 11-06 09:52

    嵌入式Linux应用开发的完全手册

    论坛疯狂发帖求教,现在回头一看不免感叹:怎么会提出这么弱智的问题?但是,当时就是被这类问题折磨得寝食难安。 相对于嵌入式Linux常识的匮乏,更大的困难是缺乏完善的知识结构:只了解硬件,或是只了解软件
    发表于 09-25 07:12

    嵌入式文件系统znFAT介绍

    今天给大家介绍一款适用于单片机的嵌入式文件系统——znFAT。 这款文件系统嵌入式大佬于振南开发,并在 gitee 开源共享的。
    发表于 09-13 09:22 759次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>文件系统</b>znFAT介绍

    嵌入式Linux入门(二、Linux文件系统文件类型及权限管理)

    嵌入式 Linux入 门第二课, linux 文件系统文件类型及权限管理。 ...... 矜辰所致
    的头像 发表于 06-20 11:44 1593次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>入门(二、<b class='flag-5'>Linux</b><b class='flag-5'>文件系统</b>、<b class='flag-5'>文件</b>类型及权限管理)

    嵌入式学习路线你知道吗?

    文件系统的定制、BootLoader、内核和文件系统的烧写。这一阶段的主要目的是掌握带有操作系统嵌入式
    发表于 06-14 16:00

    已知的HAB漏洞是否会影响i.MX6ULL版本1.1?

    我有一个 NXP iMX6ULL rev 1.1,发现i.MX6ULL 的 HAB 机制中存在两个已知漏洞。但是,我所指的文档并未指定芯片版本。因此,我不确定这些漏洞是否会影响我的设备。你能帮我澄清一下吗?
    发表于 06-02 09:07

    线程边界路由器i.mx6ull otbr-agent处于非活动状态是什么原因造成的?怎么解决?

    我关注 https://github.com/nxp-imx/meta-matter “如何在目标上设置 OpenThread 边界路由器”以在 i.mx6ull(定制板,非 EVK)上运行线程边界
    发表于 05-31 06:37

    如何在i.MX6ULL上为PF1510配置i2c?

    我们计划将 PF1510 与 i.MX6ULL 处理器一起使用。我看到这个设备树示例: https://github.com/Freescale/linux-fslc/blob
    发表于 05-17 14:02

    Linux系统中根文件系统构建基本方式

    嵌入式 Linux文件系统布局,建议还是按照FHS标准来安排,事实上大多数嵌入式Linux都是这样做的。但是,
    发表于 05-09 09:30 567次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>系统</b>中根<b class='flag-5'>文件系统</b>构建基本方式

    如何使用Linux版本在i.mx6ull上启用USB网络共享?

    我从 lf-5.10-y 分支为 i.mx6ull evk 构建了 Linux。我将我的 android 手机连接到 usb otg 端口并在我的手机上启用网络共享。但是我没有看到 USB0 接口
    发表于 05-09 08:06

    I.MX6ULL的SPI延迟问题如何解决?

    我们使用 NXP 的 I.MX6ULL 处理器和 TCAN4550 进行 CANFD 通信。我们在传输 CAN 数据时面临 SPI 延迟问题。CAN 数据传输/接收是根据 SPI 中断发生的。我们
    发表于 05-05 10:29

    运行嵌入式LinuxI.MX 6ULL​​处理器,是否可以使用shell脚本调用这些设备并查看它们产生的结果?

    我有一个运行嵌入式 LinuxI.MX 6ULL​​ 处理器。该板配备了硬件随机数发生器。查看屏幕截图,您会看到有hwrng、random和urandom设备。其中哪一个是实际的
    发表于 04-28 07:06