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

    文章

    11292

    浏览量

    209309
  • 文件
    +关注

    关注

    1

    文章

    565

    浏览量

    24725
  • 嵌入式L
    +关注

    关注

    0

    文章

    5

    浏览量

    6664
收藏 人收藏

    评论

    相关推荐

    【迅为电子】i.MX6UL和i.MX6ULL芯片区别与开发板对比

    【迅为电子】i.MX6UL和i.MX6ULL芯片区别与开发板对比
    的头像 发表于 11-28 14:31 315次阅读
    【迅为电子】<b class='flag-5'>i.MX6</b>UL和<b class='flag-5'>i.MX6ULL</b>芯片区别与<b class='flag-5'>开发</b>板对比

    【新品】i.MX6ULL工业嵌入式核心板!NXP低功耗MPU,LCD显示

    核心板新品上市ECK20-6Y2XA系列核心板是亿佰特基于NXPCortex-A7内核i.MX6ULL处理器精心设计的,采用邮票孔连接的低成本、低功耗、高性价比、高可靠性的嵌入式核心板。可广泛应用于工业控制、HMI、IoT等领域
    的头像 发表于 11-15 01:04 174次阅读
    【新品】<b class='flag-5'>i.MX6ULL</b>工业<b class='flag-5'>嵌入式</b>核心板!NXP低功耗MPU,LCD显示

    【北京迅为】i.mx8mm嵌入式linux开发指南第四篇 嵌入式Linux系统移植篇第六十九章uboot移植

    【北京迅为】i.mx8mm嵌入式linux开发指南第四篇 嵌入式Linux
    的头像 发表于 10-22 14:46 586次阅读
    【北京迅为】<b class='flag-5'>i.mx</b>8mm<b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>开发</b>指南第四篇 <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系统</b>移植篇第六十九章uboot移植

    Linux文件系统的挂载过程

    Linux文件系统(rootfs)是Linux系统中所有其他文件系统和目录的起点,它是内核启动
    的头像 发表于 10-05 16:50 400次阅读

    如何构建Linux文件系统

    构建Linux文件系统是一个涉及多个步骤和概念的过程,它对于Linux系统的启动和运行至关重要。
    的头像 发表于 10-05 16:47 292次阅读

    嵌入式linux开发的基本步骤有哪些?

    嵌入式Linux开发是一个复杂的过程,涉及到硬件选择、操作系统移植、驱动开发、应用程序开发等多个
    的头像 发表于 09-02 09:11 477次阅读

    嵌入式linux开发板怎么操作

    嵌入式Linux开发板是一种基于Linux操作系统嵌入式
    的头像 发表于 09-02 09:09 370次阅读

    嵌入式linux开发板芯片的工作原理

    嵌入式Linux开发板是一种基于Linux操作系统嵌入式
    的头像 发表于 09-02 09:07 374次阅读

    【出版发行】嵌入式系统原理与开发——基于RISC-V和Linux系统

    【出版发行】嵌入式系统原理与开发——基于RISC-V和Linux系统
    的头像 发表于 07-26 08:36 310次阅读
    【出版发行】<b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b>原理与<b class='flag-5'>开发</b>——基于RISC-V和<b class='flag-5'>Linux</b><b class='flag-5'>系统</b>

    专家力荐|《嵌入式系统原理与开发——基于RISC-V和Linux系统》新书发售

    当前,嵌入式系统已成为智能设备的核心之一,RISC-V+Linux的开源力量为嵌入式系统注入强大的创新动力。作为中国RISC-V软硬件生态领
    的头像 发表于 07-24 08:20 596次阅读
    专家力荐|《<b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b>原理与<b class='flag-5'>开发</b>——基于RISC-V和<b class='flag-5'>Linux</b><b class='flag-5'>系统</b>》新书发售

    浅析在NXP I.MX6ULL+Linux平台下进行WM8960音频芯片移植的过程

    本文详细记录在NXP I.MX6ULL+Linux平台下进行WM8960音频芯片移植的过程,其他平台操作方法类似,希望为大家提供帮助。
    的头像 发表于 05-17 11:33 1270次阅读
    浅析在NXP <b class='flag-5'>I.MX6ULL+Linux</b>平台下进行WM8960音频芯片移植的过程

    基于飞凌嵌入式i.MX6ULL核心板的电梯智能物联网关方案

    使用飞凌嵌入式FETMX6ULL-S核心板作为智能电梯物联网关的主控平台,为智能电梯的变革提供了强有力的技术支持。
    的头像 发表于 03-22 10:45 1488次阅读
    基于飞凌<b class='flag-5'>嵌入式</b><b class='flag-5'>i.MX6ULL</b>核心板的电梯智能物联网关方案

    嵌入式SD NAND】基于FATFS/Littlefs文件系统的日志框架实现

    文章目录【嵌入式】基于FATFS/Littlefs文件系统的日志框架实现1.概述2.设计概要3.设计实现3.1初始化`init`3.2日志写入`write`3.3日志读取`read`3.4注销
    的头像 发表于 03-14 18:12 1155次阅读
    【<b class='flag-5'>嵌入式</b>SD NAND】基于FATFS/Littlefs<b class='flag-5'>文件系统</b>的日志框架实现

    嵌入式学习-ElfBoard ELF 1-gpio模拟i2c的方法

    /linux-4.1.15-elf1$ make zImage 二、设备树修改设备树路径:linux-4.1.15-elf1/arch/arm/boot/dts/imx6ull-elf1-emmc.dts(1)将
    发表于 02-22 15:17

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

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