service vold /system/bin/vold \
--blkid_context=u:r:blkid:s0 --blkid_untrusted_context=u:r:blkid_untrusted:s0 \
--fsck_context=u:r:fsck:s0 --fsck_untrusted_context=u:r:fsck_untrusted:s0
class core
socket vold stream 0660 root mount
socket cryptd stream 0660 root mount
ioprio be 2
writepid /dev/cpuset/foreground/tasks
class core
service关键字声明了你要定义一个service,而vold就是这个service的名字,至于后面的目录则是这个service对应的可执行文件在系统中的位置。注意:这里是说在系统中的位置,也就是在开发板运行你的Android源码编译的系统后的目录,而不是源码的目录。
定义为核心service,当core服务启动时,这个vold启动。
下面转载http://www.cnblogs.com/hangxin1940/archive/2011/10/01/2196964.html
init.rc的语法分为行为(Actions),、命令(Commands) 、服务(Services)、选项(Options)。
类别 |
名称 |
描述 |
SECTION | on | 触发条件 |
同上.. | service | 解析service |
COMMAND | chdir | 更改当前工作目录 |
同上.. | chroot | 更改参考的根目录位置 |
.. | class_start | 启动某个设置了class名称的服务 |
.. | class_stop | 停止某个设置了class名称的服务 |
.. | domainname | 域名 |
.. | exec | 调用程序并转移进程 |
.. | export | 提交变量 |
.. | hostname | 主机名 |
.. | ifup | 激活网卡 |
.. | insmod | 挂载模块 |
.. | import | 引入配置,比如etc下的一些rc文件,和java中的import差不多 |
.. | mkdir | 建立目录 |
.. | mount | 挂载文件系统 |
.. | setkey | 从源码看,应该是设置一个命令的关键字缩写,比如可以将domainname映射为dn |
.. | setprop | 设置一个属性 |
.. | setrlimit | 设置当前程序可以打开的最大文件数到系统规定程序可以打开的最大文件数 |
.. | start | 启动服务 |
.. | stop | 停止服务 |
.. | trigger | 不清楚,难道是自定义触发器? |
.. | symlink | 建立符号链接 |
.. | sysclktz | 设置基准时间 |
.. | wait | 等待文件准备好?Linux中这是进程调度的函数 |
.. | write | 向文件、设备写个什么东西。肯定不是传消息的那个wirte |
.. | copy | 不解释 |
.. | chown | 更改所有者 |
.. | chmod | 更改权限 |
.. | loglevel | Log输出级别,低于这个级别的就输出 |
.. | restart | 重启服务 |
OPTION | capability | 能力,也就是系统对进程的一种权限控制。 |
同上.. | class | 设置class name |
.. | console | 启用控制台 |
.. | critical | 是否关键,也就是4分钟之内重启超过4次的话,重启之后就进入recovery模式 |
.. | disabled | 不随class自动启动 |
.. | group | 组归属 |
.. | keycodes | 不明白。。。。。 |
.. | oneshot | 只启动一次,意外退出后不必重启 |
.. | onrestart | 重启时 |
.. | setenv | 增加环境变量 |
.. | socket | 申请socket资源 |
.. | user | 用户归属 |
.. | ioprio | io调度优先级 |
(很多属性与命令用法都与linux中同名命令差球不多)
init是分段(section)解析init.rc的,在keywords.h中可以查看关键字的定义。init是以什么标志来分段解析init.rc呢?结合init.rc的内容,可以看出,分段标记是以on 和 service来标记的。下面详细说明。
on 啥时候干什么
on属于行为。
on early-init
init之前、加载完所有rc文件后即执行,在miui的rom中,init.rc在early-init执行的是start ueventd,根据keywords.h的定义,start是个命令(COMMAND)。
这里顺便说下ueventd,android中底层(一般指驱动)通知上层的事件,用的是uevent,java层通过观察者模式实现,用到的类为 UEventObserver,使用intent来传递;native层用的是android_os_UEventObserver.cpp,使用uevent.c通过socket传递。当然,这是framework及以下的层面,一般开发不经常用到,更何况这几个类都没有被暴露出来。
on init
加载propety各项属性文件之前执行,在init变为propety service之前都属于init阶段。
on early-boot
启动属性服务后即执行。
on boot
boot的时候执行。
on property:xxxxx=x
当某个属性设置为预期值时执行。
关于init.rc,其实结合/src/system/core/init/* 源码和init.rc文件来看,会明白许多。
下面转载自https://blog.csdn.net/kc58236582/article/details/52042331
init语言
init语言包括四个部分:(Actions)动作 commands(命令) Services(服务) Options(选项)
Actions和Services属于一个新的section,而所有的Commands和options都必须属于一个section。
Actions和Servics有一个独立的名字。如果有重复的名字出现,那么会被认为是错误的。
Actions
Actions由几行Commands组成,也有一个trigger用来决定Action的发生。当有事件发生且符合Action的trigger,会把Action加入执行队列
Actions形式如下:
- on
-
-
-
on
Services
Services可以通过options 当它退出时重启
- service
[ ]*
service []*
Options
Options用来初始化Service的
critical
当它在4分钟内退出4次以上,设备重启进入recovery模式
disabled
Service不会自动开启当它的class启动时,必须显示的started by name(用其名字)
setenv
设置环境变量
socket
创建一个socket named /dev/socket/
user
改变username当执行这个Service之前
group
改变groupname当执行Service之前
seclabel
改变seclabel在执行Service之前
onshot
不要重启Service当退出时
class
为这个Service指定class。所有的Service可以用class name同时开启和结束
onrestart
执行一个命令 当Service重启时
writepid
当fork一个子进程时,写子进程的pid到一个给定的文件。是给cgroup/cpuset使用
Triggers
Triggers被用来匹配事件,然后加入执行队列。
boot
当init开启时,这是第一个执行的trigger
这种形式的触发器当属性满足条件时触发
属性可以多个,如:
- on property:test.a=1 && property:test.b=1
- setprop test.c 1
on property:test.a=1 && property:test.b=1
setprop test.c 1
Commands
bootchart_init
开启bootcharting
chmod
改变文件执行权限
chown
改变文件的owner group
class_start
开启class start all services
class_stop
停止&disable all services
class_reset
停止all services
copy
copy一个文件 类似 write,但是对二进制大容量文件有用
domainname
设置domain 名字
enable
将一个disabled的service变成enabled。且start
exec [
Fork一个进程然后执行命令
export
设置环境变量into global
hostname
设置host name
ifup
使网络 interface online
import
引入init文件
insmod
安装一个module
load_all_props
加载system vendor的属性
load_persist_props
加载data下面的persist属性
loglevel
设置kernel的log level
mkdir
创建目录
mount_all
挂载fstab中的设备
mount
挂载设备
powerctl
对sys.powerctl属性的respond
restart
类似stop 但是不会disable service
restorecon
恢复文件到sercurity context在file_contexts配置的
restorecon_recursive
递归的恢复目录中的文件到sercurity context
rm
rm path
rmdir
rmdir 目录
setprop
设置系统属性
setrlimit
设置资源的rlimit
start
开启service
stop
关闭service
swapon_all
调用fs_mgr_swapon_all on the fstab文件
symlink
创建软链接
sysclktz
设置系统clock base
trigger
触发触发器
verity_load_state
加载dm-verity state
verity-update_state
update dm-versity state
wait
poll for 给定的文件 或者 timeout时间到。如果时间没有设定,默认为5秒
write
打开文件,write string到给定文件。没有文件会被创建。有的话,会truncated