linux 系统移植(第二十三期)---- 进一步完善BusyBox构建的根文件系统---- Ubuntu20.04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录

前言

[一、创建/etc/init.d/rcS 文件](#一、创建/etc/init.d/rcS 文件)

[二、创建/etc/fstab 文件](#二、创建/etc/fstab 文件)

[三、创建/etc/inittab 文件](#三、创建/etc/inittab 文件)

总结


前言

上一期的博客我们初步测试了构建的根文件系统,发现还是有一部分东西缺失,需要构建。


一、创建**/etc/init.d/rcS****文件**

先在rootfs目录中创建/etc/init.d/rcS 文件,如下图所示

rcS 是个 shell 脚本,Linux 内核启动以后需要启动一些服务,而 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

第 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 来管理热插拔设备,通过这两行,Linux 内核就可以在/dev 目录 下自动创建设备节点。关于 mdev 的详细内容可以参考 busybox 中的 docs/mdev.txt 文档。

注意:上述代码其实是最精简的,适合我们这种初学者
创建好文件/etc/init.d/rcS 以后一定要给其可执行权限
使用如下命令给予 /ec/init.d/rcS 可执行权限:

复制代码
chmod 777 rcS

设置好以后就重新启动 Linux 内核(secure中命令:reboot),启动以后如下图 所示:

提示找不到 /etc/fstab 文件
因为mount-a挂载所有根文件系统的时候需要读取/etc/fstab,所以我们要创建 /etc/fstab 文件。

二、创建**/etc/fstab****文件**

在 rootfs 中创建/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>:挂载选项,在 Ubuntu 中输入"man mount"命令可以查看具体的选项。一般使

用 defaults,也就是默认选项,defaults 包含了 rw、suid、 dev、 exec、 auto、 nouser 和 async。

<dump>:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。

<pass>:磁盘检查设置,为 0 表示不检查。根目录'/'设置为 1,其他的都不能设置为 1,

其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。

按照上述格式,在 fstab 文件中输入如下内容:

复制代码
#<file system> <mount point>   <type>   <options>       <dump>  <pass>
proc            /proc           proc     defaults        0       0
tmpfs           /tmp            tmpfs    defaults        0       0
sysfs           /sys            sysfs    defaults        0       0

fstab 文件创建完成以后重新启动 Linux ,结果如下图 所示:

可以看出,启动成功,而且没有任何错误提示。但是我们要还需要创建一个文件/etc/inittab 。

三、创建**/etc/inittab****文件**

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

复制代码
<id>:<runlevels>:<action>:<process>

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

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

<action>:动作,用于指定<process>可能用到的动作。busybox 支持的动作如下表所示:


<process> 具体的动作,比如程序、脚本或命令等。
我们创建一个 /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,看来 ctrl+alt+del 组合键用于重

启系统。

第 6 行,关机的时候执行/bin/umount,也就是卸载各个文件系统。

第 7 行,关机的时候执行/sbin/swapoff,也就是关闭交换分区。

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


总结

本期博客进一步完善了根文件系统。

相关推荐
.小墨迹19 分钟前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
Lsir10110_38 分钟前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
Sheffield44 分钟前
command和shell模块到底区别在哪?
linux·云计算·ansible
历程里程碑1 小时前
Linux20 : IO
linux·c语言·开发语言·数据结构·c++·算法
郝学胜-神的一滴1 小时前
深入浅出:使用Linux系统函数构建高性能TCP服务器
linux·服务器·开发语言·网络·c++·tcp/ip·程序人生
承渊政道1 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
技术路上的探险家1 小时前
Ubuntu下Docker与NVIDIA Container Toolkit完整安装教程(含国内源适配)
linux·ubuntu·docker
代码AC不AC1 小时前
【Linux】深入理解缓冲区
linux·缓冲区·标准错误
Doro再努力1 小时前
【Linux操作系统12】Git版本控制与GDB调试:从入门到实践
linux·运维·服务器·git·vim
全栈工程师修炼指南1 小时前
Nginx | stream content 阶段:UDP 协议四层反向代理浅析与实践
运维·网络·网络协议·nginx·udp