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

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

3天内不再提示

如何完善根文件系统

CHANBAEK 来源:嵌入式攻城狮 作者:安迪西 2023-04-18 15:26 次阅读

1. 完善根文件系统

在用 BusyBox 构建根文件系统一文中介绍了根文件系统的制作,rootfs制作完成后测试时,提示无法运行“/etc/init.d/rcS”这个文件,说明rootfs仍然不够完善,下面将介绍如何完善根文件系统。

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

rcS 是个 shell脚本,Linux内核启动后需要启动一些服务,rcS就是规定启动哪些文件的脚本文件。 在 rootfs中创建 /etc/init.d/rcS文件,命令如下:

mkdir -p etc/init.d/
cd etc/init.d/
touch rcS

然后在rcS文件中输入如下内容:

1 #!/bin/sh 
2 
3 PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH 
4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib 
5 export PATH LD_LIBRARY_PATH 
6 
7 mount -a 
8 mkdir /dev/pts 
9 mount -t devpts devpts /dev/pts 
10 
11 echo /sbin/mdev > /proc/sys/kernel/hotplug 
12 mdev -s
  • 第 1 行,表示这是一个 shell 脚本
  • 第 3 行,PATH 环境变量保存着可执行文件可能存在的目录
  • 第 4 行,LD_LIBRARY_PATH 环境变量保存着库文件所在的目录
  • 第 5 行,使用 export 来导出上面这些环境变量,相当于声明“全局变量”
  • 第 7 行,使用 mount 命令来挂载所有的文件系统,这些文件系统由文件 /etc/fstab来指定,所以后续还要创建 /etc/fstab文件
  • 第 8 和 9 行,创建目录/dev/pts,然后将 devpts挂载到 /dev/pts目录中
  • 第 11 和 12 行,使用 mdev 来管理热插拔设备,通过这两行,内核就可以在 /dev 目录下自动创建设备节点

创建好rcS文件后,赋予其可执行权限:

chmod 777 rcS

1.2 创建 /etc/fstab 文件

fstab文件是在 Linux开机以后自动配置哪些需要自动挂载的分区,格式如下:

<file system> <mount point> <type> <options> <dump> <pass>
  • file system:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等
  • mount point:挂载点必须为已经存在的目录
  • type:文件系统类型,比如 ext2、ext3、proc、romfs、tmpfs 等
  • options:挂载选项,用于设置挂载参数,一般使用 defaults默认选项
    – defaults:rw, suid, dev, exec, auto, nouser, and async
    – auto:系统自动挂载,fstab默认就是这个选项
    – noauto :开机不自动挂载
    – nouser:只有超级用户可以挂载
    – ro:按只读权限挂载
    – rw:按可读可写权限挂载
    – user:任何用户都可以挂载
  • dump:为 1 表示允许备份,为 0 不备份,一般设置为 0
  • pass:磁盘检查设置,为 0 表示不检查。 根目录‘/’设置为 1,其他的都不能设置为 1,其他的分区从 2 开始。 一般不在 fstab 中挂载根目录,因此这里一般设置为 0

在 rootfs根文件系统中创建 /etc/fstab文件:

cd etc/
touch fstab

fstab文件内容如下:

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

1.3 创建/etc/inittab文件

inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。 init 程序会读取/etc/inittab这个文件,inittab 由若干条指令组成。 每条指令的结构都是一样的,由以“ : ”分隔的 4 个段组成,格式如下:

:::
  • id:每个指令的标识符,不能重复。 对于 busybox的 init而言是用来指定启动进程的控制 tty,一般将串口或者 LCD屏幕设置为控制 tty
  • runlevels:对 busybox 来说此项完全没用,所以空着
  • action:动作关键字,用于指定 process 可能用到的动作
  • process:具体的动作,比如程序、脚本或命令等

参考 busybox的 examples/inittab文件,在 rootfs根文件系统中创建 /etc/inittab文件:

cd etc
touch inittab

inittab文件内容如下:

1 #etc/inittab
2 ::sysinit:/etc/init.d/rcS
3 console::askfirst:-/bin/sh
4 ::restart:/sbin/init
5 ::ctrlaltdel:/sbin/reboot
6 ::shutdown:/bin/umount -a -r 
7 ::shutdown:/sbin/swapoff -a
  • 第 2 行,系统启动以后运行/etc/init.d/rcS 这个脚本文件
  • 第 3 行,将 console 作为控制台终端,也就是 ttymxc0
  • 第 4 行,重启的话运行/sbin/init
  • 第 5 行,按下 ctrl+alt+del 组合键就运行/sbin/reboot,用于重启系统
  • 第 6 行,关机的时候执行/bin/umount,也就是卸载各个文件系统
  • 第 7 行,关机的时候执行/sbin/swapoff,也就是关闭交换分区

/etc/inittab 文件创建好以后重启开发板即可,至此! 根文件系统要创建的文件就已经全部完成了。 接下来就要对根文件系统进行其他的测试,比如我们自己编写的软件运行是否正常、是否支持软件开机自启动、中文支持是否正常以及能不能链接等

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

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

2.1 软件运行测试

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

在ubuntu的 rootfs中创建一个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”命令查看文件类型以及编码格式,见下图

图片

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

重启开发板,在开发板上运行hello文件,程序每隔2秒打印一次,运行正常,说明根文件系统中的动态库没有问题,“ctrl+c”可中止程序

图片

程序运行起来后,会占用交互窗口,可在运行时加上“&”,即:./hello&,让其进入后台运行

图片

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

后台运行的程序,可通过 ps命令查看进程id,然后使用 kill -9 pid(进程ID)命令来关闭后台运行的程序。 如下图,输入ps命令,可见 hello程序的进程ID为92,输入kill -9 92(不用理会被打断)后回车,就可看到hello进程被关闭了

图片

2.2 中文字符测试

在Ubuntu中的 rootfs目录下新建一个“中文测试”文件夹,并新建一个“测试文档.txt”,里面输入任意中文,下载到开发板后,在开发板命令行模式中,使用cat命令查看中文是否显示正确

图片

2.3 开机自启动测试

一般做好产品以后都是需要开机自动启动相应的软件,实现开机自启动的原理也很简单,linux在启动时,有一个默认的开机启动脚本(/etc/init.d/rcS这个shell文件),修改这个脚本,添加自启动相关内容即可

########## /etc/init.d/rcS 文件代码 ##########
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

#开机自启动,先进入hello所在文件夹再执行
cd /drivers 
./hello &
cd /

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

图片

2.4 外网连接测试

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

图片

网络连接正常的情况下,无法ping通这些网址,是因为缺少域名解析服务,需要配置域名解析服务器的IP地址。 一般域名可以设置为所处网络的网关地址,比如我的局域网的网关是192.168.10.1,也可以设置为运营商的域名解析服务器地址:114.114.114.114

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

nameserver 114.114.114.114
nameserver 192.168.10.1

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

图片

至此! 根文件系统就彻底的制作完成。 uboot、kernel、rootfs这三个共同构成了一个完整的 Linux系统,这个系统是一个可以正常运行的系统,可以在这个系统上进行 Linux驱动开发。

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

    关注

    3

    文章

    1372

    浏览量

    40282
  • Linux
    +关注

    关注

    87

    文章

    11296

    浏览量

    209359
  • busybox
    +关注

    关注

    0

    文章

    21

    浏览量

    11294
  • 根文件系统
    +关注

    关注

    0

    文章

    25

    浏览量

    11979
  • rootfs
    +关注

    关注

    0

    文章

    19

    浏览量

    4665
收藏 人收藏

    评论

    相关推荐

    使用i.MX6ULL开发板进行Linux根文件系统完善

    上一篇推文讲了怎么移植根文件系统,并在i.MX6ULL开发板中运行起来,但是会出现一些提示,现在来进行根文件完善
    发表于 10-17 11:13 791次阅读

    谈谈什么是文件系统 文件系统的功能与特点

    文件系统的应用非常广泛,同时种类也是特别的多,并且不同平台也会使用不同性能和特点的文件系统,比如查找效率、数据安全等级等等,如下面windows使用的NTFS:
    发表于 08-30 09:50 2888次阅读
    谈谈什么是<b class='flag-5'>文件系统</b> <b class='flag-5'>文件系统</b>的功能与特点

    申精:郭天祥ARM9视频教程TX2440、S3C2440+光盘原理图 全!!!6G...

    目录结构详解3. 配置,编译busybox4. 完善根文件系统5. 制作yaffs镜像第十八讲应用程序的移植1. NFS文件系统的挂载2. 移植嵌入式web服务器Boa3. 移植madplay音乐播放器
    发表于 09-27 12:22

    [原创]【UT4418试用体验】busybox制作跟文件系统

    在当前目录下的 _install 目录下。步骤4: 完善根文件系统与库文件。# arm-none-linux-gnueabi-readelf -d命令查看需要依赖的库文件。在
    发表于 10-20 22:04

    郭天祥ARM9视频教程TX2440、S3C2440+光盘原理图资料下载

    第十七讲 用busybox制作根文件系统 1. 嵌入式文件系统介绍 2. Linux目录结构详解 3. 配置,编译busybox 4. 完善根文件系统 5. 制作yaffs镜像 第十
    发表于 07-06 07:09

    Linux文件系统课程

    本章学习目标理解什么是文件系统了解文件系统工作原理理解Fedora Core Linux文件系统的结构掌握Fedora Core Linux文件系统的类型、权限和修改方法掌握如何安装、
    发表于 04-10 17:07 0次下载

    NTFS文件系统,NTFS文件系统是什么意思

    NTFS文件系统,NTFS文件系统是什么意思 NTFS是Windows NT以及之后的Windows 2000、Windows XP、Windows Server 2003、Windows Server 2008
    发表于 03-29 10:38 5962次阅读

    XfS文件系统,XfS文件系统是什么意思

    XfS文件系统,XfS文件系统是什么意思 XfS文件系统是SGI开发的高级日志文件系统,XFS极具伸缩性,非常健壮。所幸的是SGI将其移植到了Lin
    发表于 03-29 10:39 4258次阅读

    FatFs文件系统使用

    STM系列FatFs文件系统使用文件,希望对大家有帮助。
    发表于 11-06 18:10 8次下载

    文件系统是什么?浅谈EXT文件系统历史

    在先前关于Linux文件系统的文章中,我很想去深入地讨论更多EXT文件系统的特性的信息。所以,首先让我们来回答这个问题:什么是文件系统?一个文件系统应该遵循以下特点。
    发表于 06-28 09:03 5695次阅读
    <b class='flag-5'>文件系统</b>是什么?浅谈EXT<b class='flag-5'>文件系统</b>历史

    Linux 内核/sys 文件系统介绍

    linux2.6内核引入sysfs文件系统,sysfs可以看成与proc,devfs和devpty同类别的文件系统,该文件系统是虚拟的文件系统,可以更方便对
    发表于 04-25 16:20 4291次阅读
    Linux 内核/sys <b class='flag-5'>文件系统</b>介绍

    FATFS文件系统详解

    一、文件系统负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。即在磁盘上组织文件
    发表于 11-29 09:51 29次下载
    FATFS<b class='flag-5'>文件系统</b>详解

    FATFS文件系统原版文件下载

    FATFS文件系统原版文件下载
    发表于 06-25 09:02 0次下载

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

    上篇文章,使用BusyBox构建了基础的嵌入式Linux系统的根文件系统,基本的功能可以正常运行,但在个基础功能上,还要许多地方需要完善
    的头像 发表于 03-14 08:44 1347次阅读
    i.MX6ULL嵌入式Linux开发5-根<b class='flag-5'>文件系统</b><b class='flag-5'>完善</b>

    Linux的文件系统特点

    Linux的文件系统特点 文件系统要有严格的组织形式,使得文件能够以块为单位进行存储。 文件系统中也要有索引区,用来方便查找一个文件分成的多
    的头像 发表于 11-09 14:48 1177次阅读
    Linux的<b class='flag-5'>文件系统</b>特点