文件分析——分析/etc/init.d/rcS文件(运行时最重要的配置文件)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、文件简介

由博文分析/etc/inittab文件可知,etc/inittab文件的第一行配置项是“::sysinit:/etc/init.d/rcS”,这表示系统初始化阶段(进入命令行前),会调用/etc/init.d/rcS文件。该文件是linux运行时最重要的配置文件,其他的一些配置都是由这个文件引出来的。

二、文件内容

rcS文件可以很复杂也可以很简单,但嵌入式一般不用像ubuntu那么复杂。

一个简单的rcS文件内容如下:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

runlevel=S
prevlevel=N

umask 022

export PATH runlevel prevlevel

mount -a
#下面这两行代码与生成/dev/目录下的设备文件有关
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

#-F选项表示指定/etc/sysconfig/HOSTNAME这个文件为主机名配置文件
#/bin/hostname -F /etc/sysconfig/HOSTNAME
 
# hostname xxx ,表示设置当前系统的主机名为xxx
/bin/hostname ZHUJI

ifconfig eth0 192.168.1.10

2.1 PATH=xxx

(1)从shell脚本的语法角度分析,该行定义了一个shell变量PATH,值等于后面的字符串。

(2)用export导出这个PATH变量,那么PATH变量就变成一个环境变量。PATH这个环境变量是linux系统内部定义的一个环境变量。操作系统执行程序时会默认到PATH指定的各个目录去寻找,如果找不到就认定这个程序不存在,如果找到了就去执行它。另外,将一个可执行程序的目录导出到PATH,可以不带路径地执行这个程序。

(3)rcS文件中为什么要导出PATH?因为我们希望进入命令行后,PATH环境变量中就有默认的/bin、/sbin、/usr/bin、/usr /sbin这几个常见的可执行程序的路径,从而可以直接使用ls、cd等命令。

(4)为什么还没添加rcS文件,系统启动就有PATH的值?因为busybox用代码硬编码导出了一些环境变量,其中就有PATH。

2.2 runlevel=

(1)runlevel也是一个shell变量,并且被导出为环境变量。

(2)runlevel这个环境变量的作用,类似于window中的启动模式识别,如安全模式、普通模式。

(3)runlevel=S表示将系统设置为单用户模式。

(4)busybox不支持runlevel这个特性。

2.3 umask=

(1)umask是linux的一个命令,作用是设置linux系统的umask值。

(2)umask值决定当前用户在创建文件时的默认权限。

(3)umask值和默认创建文件的权限值加起来是666。

比如umask是022的时候,默认touch创建一个文件的权限是644。

比如umask是044的时候,默认touch创建一个文件的权限是622。

比如umask是444的时候,默认touch创建一个文件的权限是222。

2.4 mount -a

(1)mount命令是用来挂载文件系统的,“mount -a”表示挂载所有应该被挂载的文件系统。

(2)在busybox中“mount -a”时,busybox会去查找一个文件/etc/fstab文件。该文件按照一定的格式列出来所有应该被挂载的文件系统(包括虚拟文件系统)。如果作为挂载点的目录不存在,应该手动创建,否则会提示挂载失败。

(3)一个简单的/etc/fstab文件内容如下:

2.5 mdev

(1)如果在rcS文件中没有mdev这个配置项,则启动后/dev目录是空的。在rcS文件中添加与mdev有关的2行配置项时,启动系统后/dev目录下有很多的设备驱动文件。

(2)mdev是udev的嵌入式简化版本,udev/mdev是一个应用层的软件,主要作用是配合linux驱动生成相应的/dev目录下的设备文件。

2.6 hostname

(1)hostname是linux中的一个shell命令。

(2)“hostname xxx”执行后可以用来设置当前系统的主机名为xxx,直接hostname不加参数可以显示当前系统的主机名。

(3)“/bin/hostname -F /etc/sysconfig/HOSTNAME”,表示指定/etc/sysconfig/HOSTNAME这个文件为主机名配置文件。因此在制作根文件系统时,要先创建这个配置文件,然后在里面输入主机名。

2.7 ifconfig

如果希望进入命令行后,ip地址就是一个指定的ip地址(比如192.168.1.30),需要在rcS文件中添加“ifconfig eth0 192.168.1.30”。如果没有添加,则完全启动后会没有ip地址,但可以在完全启动后用“ifconfig eth0 xxxxxxxxx”来设置。

### 如何创建和使用Linux根文件系统镜像 #### 创建根文件系统的准备工作 为了创建一个可用的 Linux 根文件系统镜像,首先要准备必要的工具和环境。确保安装了 `mkfs` 工具集以及任何可能需要用于构建文件系统的额外软件包。 #### 构建基础文件结构 建立基本的目录层次结构是第一步,在目标位置创建类似于标准 Unix/Linux 的树形结构,这通常包括 `/bin`, `/etc`, `/lib`, `/usr` 等重要目录[^3]。 ```bash mkdir -p rootfs/{bin,etc,home,mnt,opt,tmp,usr,var} chmod 1777 rootfs/tmp/ ``` #### 配置启动脚本和服务 配置初始化过程中的关键组件,比如编写简单的启动脚本来执行一些命令或是设置网络参数等。下面是一个例子,它会在每次开机打印欢迎信息并自动挂载所有定义好的分区: ```bash echo '#!/bin/sh' > rootfs/etc/init.d/rcS echo 'echo "Welcome to My Custom Linux!"' >> rootfs/etc/init.d/rcS echo '/bin/mount -a' >> rootfs/etc/init.d/rcS chmod +x rootfs/etc/init.d/rcS ``` 对于更复杂的场景,则需进一步完善此部分逻辑,甚至引入 BusyBox 或 systemd 来管理服务进程。 #### 打包成 img 文件 一旦完成了上述工作,下一步就是把整个根文件夹打包成为一个 .img 文件以便于后续部署到实际硬件设备上运行。这里介绍一种通用的方法来生成 ext 类型(如 ext2/ext3/ext4)的磁盘映像文件[^2]: ```bash dd if=/dev/zero of=rootfs.img bs=1M count=64 # 创建固定大小 (此处为 64MB) 的空白图像文件 losetup /dev/loop0 rootfs.img # 关联 loop 设备与新创建的 image file mkfs.ext4 /dev/loop0 # 对关联后的环回设备进行格式化处理 mount /dev/loop0 mnt/root # 挂载该虚拟磁盘至本地某个临路径下 cp -rpf rootfs/* mnt/root/ # 复制之前做好的 root filesystem 内容至此处 umount mnt/root # 卸载前先解除挂载关系 losetup -d /dev/loop0 # 解除 loop device 映射 ``` 以上步骤展示了如何将自定义的内容封装进一个可移植性强、易于分发的形式——即所谓的 “image”。 #### 使用根文件系统镜像 要让嵌入式板卡或其他支持此类功能的操作平台能够识别并加载这个新的根文件系统,可以采取多种方式实现烧录动作;最常见的是通过 SD 卡读卡器连接电脑端完成数据传输后再插入待测试机器中启动尝试。 另外也可以借助诸如 U-Boot 这样的引导程序直接从 USB 存储介质或者 TFTP 服务器加载指定地址空间内的 kernel 和 initramfs 组件组合起来形成完整的 boot chain.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值