init.rc 是由许多的 Actions(行动) 、 Services(服务) 等类型组成。在这语法里规定,所有类型的语句都是基于行的,即 一个语句占据一行,并且各个关键字被空格分开。
简介
目前 Linux 有很多通讯机制可以在 用户空间 和 内核空间 之间交互,例如 设备驱动文件(位于/dev目录中)、内存文件(/proc、/sys 目录等等)。众所周知,在 Linux 中一切皆文件,即一切都是以文件的形式存在的。例如:一个设备通常与一个或多个设备文件对应。这些与内核空间交互的文件都在用户空间,所以在Linux内核挂载完成,首先需要的就是建立这些文件所在的目录。而完成这些工作的程序就是本文要介绍的 init。
Init 是一个命令行程序,其主要工作之一就是建立这些与内核空间交互的文件所在的目录。当 Linux 内核加载完成,第一个要做的事就是调用 Init 程序,也就是说 init 是用户空间执行的第一个程序。
我们必须知道,Init 并不是由一个源文件组成的,而是由一系列源代码文件组成的目标文件链接。因此 init.rc 归根结底 只是一个语法文件,并不是程序。真正的入口其实是上面提到的 system/core/init/init.c
。
init.rc 文件有两个,分别位于:
./system/core/rootdir/init.rc
./bootable/recovery/etc/init.rc
这两个 init.rc 使用场景是不一样的,一个是为了刷机,也就是进入recorvery模式,而另一个则是正常启动才用得到;下面重点分析的是第一个,也是init.c关联的那个;
在初始化语言里,主要包含这四种类型的声明:
>
Actions(行动)、Commands(命令)、Services(服务) 和 Options(选项)。
对于 init.rc
- 它是一个可配置的初始化文件,通常定制厂商可以配置额外的初始化配置,
init.%PRODUCT%.rc
- 同时init.rc是在
$GINGERBREAD/system/core/init/init.c
中读取的,它基于“行”,包含一些用空格隔开的关键字(它属于特殊字符) - 除此之外,# 开头的表示注释
- 如果关键字中有空格,处理方法类似于C语言,使用/表示转义,使用“”防止关键字被断开,另外注意/在末尾表示换行
- 动作(Actions)和服务(Services)语句隐含表示一个新的段落(section)的开始。
- 所有的命令(commands)和选项(options)归属于上方最近的一个段落。
- 在第一个段落之前的指令(commands)和选项(options)是无效的。在服务(Services)之后的命令也是无效的。
- action 和 service 不能重名,否则忽略为 error
- import 语句导入其他的rc文件,例如
import /init.usb.rc
导入根目录下的 init.usb.rc 文件。
init.rc 语法介绍
Actions:一组被命名的命令序列
动作(Actions)就是在某种条件下触发一系列的命令,通常有一个trigger,如果匹配触发条件,则 Actions 将会被添加到预备执行的队列的尾部。
形式如下:
on <trigger>
<command>
<command>
trigger主要包括:
boot 发生在 init 启动时,当 /init.conf 加载完毕时触发
\
=\ 当\被设置为\ 时触发,例如 on property:sys.sensors=1
表示当环境变量sys.sensors被设置为1的时候触发。device-added-\
/device-removed-\ 当一个device node被添加/删除时。service-exited-\
当某个服务退出时触发。
Command
主要包括:
exec \
[ \ 执行指定路径下的程序,并传递参数.] export \
\ 设置全局环境参数,此参数被设置后对所有进程都有效.ifup \
使指定的网络接口”上线”,相当激活指定的网络接口 hostname \
设置主机名 chdir \
改变工作目录. chmod \
\ 改变指定文件的读取权限.chown \
\ 改变指定文件的拥有都和组名的属性.\ chroot \
改变进行的根目录. class_start \
启动指定类属的所有服务,如果服务已经启动,则不再重复启动. class_stop \
停止指定类属的所有服务. domainname \
设置域名 insmod \
[ \ 安装指定路径的模块,以及指定参数.] mkdir \
[mode] [owner] [group] 用指定参数创建一个目录,在默认情况下,创建的目录读取权限为755.用户名为root,组名为root.mount \
\ 类似于linux的mount指令\ [ \ ] setprop \
\ 设置属性及对应的值.setrlimit \
\ 设置资源的rlimit(资源限制),不懂就百度一下rlimit\ start \
如果指定的服务未启动,则启动它. 例如”start ueventd “ ueventd 是服务名. stop \
如果指定的服务当前正在运行,则停止它. symlink \
\ 创建一个符号链接.sysclktz \
设置系统基准时间. trigger \
启动某个触发条件,例如trigger firmware_mounts_complete,那么on firmware_mounts_complete段的动作将会执行 write \
\ 往指定的文件写字符串.[ \ ]
Services:需要在系统初始化时就启动或退出时自动重启的在后台执行的程序
形式如下:
service <name> <pathname> [ <argument> ]
<option>
<option>
说明:name 可以随便定义一个有意义的名字,但是这个名字在rc文件里面要是唯一的,如果有重名的,那么之后的将会忽略掉。
pathname 该应用程序在系统中的绝对路径 argument是传给该应用程序的参数。
Options
主要包括:
critical 据设备相关的关键服务,如果在4分钟内,此服务重复启动了4次,那么设备将会重启进入还原模式。
disabled 该服务不能通过启动一类服务来启动,例如 即使该服务有定义option “class core” 也不能用class_start core来启动,只能以单独的名字来启动 start name.
setenv \
\ 设置环境变量socket \
\ 在\ [ \ [ \ ] ] /dev/socket/
下创建一个unix domain
的 socket,并传递创建的文件描述符fd给服务进程.其中 type 必须为dgram
或stream
,seqpacket
. 用户名和组名默认为0user \
在执行此服务之前先切换用户名。当前默认为root. group \
[ \ 类似于user,切换组名 默认为root] oneshot 当此服务退出时不会自动重启. 如果没有这个选项,只运行一次。
class \
给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default. onrestart 当服务重启时执行一条指令, 例如
“onrestart exec /system/bin/myapp”
则表示在服务重新启动的时候执行/system/bin/myapp
这个应用。