Linux启动脚本rcS

1. 写在前面

Linux系统作为一个高级系统,其调度机理、调度链路非常复杂,仅仅是初启动阶段就非常复杂。如果要深究Linux系统的启动服务,需要理解Linux系统原理、文件管理、脚本链接等。但,如果是作为初学者,以“使用”为目的时,比如“期望在系统启动的时候自动执行指定程序”,则只需知道如何配置启动脚本即可。正比如,学开车,一开始并不需要知道发动机是如何工作的,会操控即可。

 

2. 启动脚本

2.1 文件位置

Linux启动脚本,即rcS文件。rcS文件位于系统根目录下的“/etc/init.d”下,可以查看到该文件的文件属主和文件属组都是root,只有root的权限可以修改和执行。

在这里插入图片描述

 

2.2 rcS文件格式
rcS文件本质是一个bash shell脚本,因此遵循bash脚本的语法规则。bash shell也是一门复杂的语言,深入研究可以独立出来研究,但我们知道基本的规则即可满足我们应用。
[1] 文件首行必须为“#!  /bin/sh”。
[2] 注释一行用“#”。
[3] 基本的赋值语句,如打印字符串。
[4] 打印特殊符号需加“\”。
[5] 逻辑语句、循环语句等。

 

2.3 实现功能
启动脚本可以做很多事情,只要我们需要初始化时配置或者执行的功能,几乎都满足,总结几点下来及常用的有如下几种。
[1] 启动某个进程程序,最常用的,如启动串口收发进程。
[2] 加载驱动模块(.ko文件);如驱动编译成模块时,可以在这里增加加载(insmod/modprobe)驱动模块命令。
[3] 启动其他模块启动脚本,如网络服务。
[4] 配置功能,该项功能比较实用,实现期望系统起来后进行某些配置,如:配置环境变量、创建临时文件(夹)、挂在文件到指定文件夹、设置默认IP参数,以及配置系统主机名称等基础配置。
[5] 其他,如增加打印功能,方便在调试终端(串口)查看初始化过程,或者两者执行间进行延时(sleep)等。

 

3.一个简单的rcS文件示例分析

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

runlevel=S
prevlevel=N

umask 022

export PATH runlevel prevlevel

mount -a

//将mdev设为热插拔的监视程序,可以形象的理解为将mdev写入hotplug中
echo /sbin/mdev > /proc/sys/kernel/hotplug   

mdev -s        //扫描并创建所有设备

/bin/hostname -F /etc/sysconfig/HOSTNAME

ifconfig eth0 192.168.1.10

1.PATH=xxx

(1)首先从shell脚本的语法角度分析,这一行定义了一个变量PATH,值等于后面的字符串
(2)后面用export导出了这个PATH,那么PATH就变成了一个环境变量。
(3)PATH这个环境变量是linux系统内部定义的一个环境变量,含义是操作系统去执行程序时会默认到PATH指定的各个目录下去寻找。如果找不到就认定这个程序不存在,如果找到了就去执行它。将一个可执行程序的目录导出到PATH,可以让我们不带路径来执行这个程序。

(4)rcS中为什么要先导出PATH?就是因为我们希望一旦进入命令行下时,PATH环境变量中就有默认的/bin /sbin /usr/bin /usr/sbin 这几个常见的可执行程序的路径,这样我们进入命令行后就可以ls、cd等直接使用了。
(5)为什么我们的rcS文件还没添加,系统启动就有了PATH中的值?原因在于busybox自己用代码硬编码为我们导出了一些环境变量,其中就有PATH。 

 

2、runlevel=

(1)runlevel也是一个shell变量,并且被导出为环境变量。
(2)runlevel这个环境变量到底有什么用?
(3)runlevel=S表示将系统设置为单用户模式  

 

3、umask=

(1)umask是linux的一个命令,作用是设置linux系统的umask值。
(2)umask值决定当前用户在创建文件时的默认权限。 

 

4、umask测试 

(1)umask是022的时候,默认touch创建一个文件的权限是644
(2)umask是044的时候,默认touch创建一个文件的权限是622
(3)umask是444的时候,默认touch创建一个文件的权限是222
总结:umask的规律就是:umask值和默认创建文件的权限值加起来是666. 

 

5、mount -a

(1)mount命令是用来挂载文件系统的
(2)mount -a是挂载所有的应该被挂载的文件系统,在busybox中mount -a时busybox会去查找一个文件/etc/fstab文件,这个文件按照一定的格式列出来所有应该被挂载的文件系统(包括了虚拟文件系统) 

 

6、mdev

(1)mdev是udev的嵌入式简化版本,udev/mdev是用来配合linux驱动工作的一个应用层的软件,udev/mdev的工作就是配合linux驱动生成相应的/dev目录下的设备文件。
(2)因为这个问题涉及到驱动,因此详细讲解要等到驱动部分。这里我们只是通过一些直观的现象来初步理解udev/mdev的工作效果。
(3)在rcS文件中没有启动mdev的时候,/dev目录下启动后是空的;在rcS文件中添加上mdev有关的2行配置项后,再次启动系统后发现/dev目录下生成了很多的设备驱动文件。
(4)/dev目录下的设备驱动文件就是mdev生成的,这就是mdev的效果和意义。 

 

7、hostname

(1)hostname是linux中的一个shell命令。命令(hostname xxx)执行后可以用来设置当前系统的主机名为xxx,直接hostname不加参数可以显示当前系统的主机名。
(2)/bin/hostname -F /etc/sysconfig/HOSTNAME -F来指定了一个主机名配置文件(这个文件一般文件名叫hostname或者HOSTNAME) 

 

8、ifconfig 

(1)有时候我们希望开机后进入命令行时ip地址就是一个指定的ip地址(譬如192.168.1.30),这时候就可以在rcS文件中ifconfig eth0 192.168.1.30 

 

 

你可能感兴趣的:(嵌入式开发)