blob: bf440c2b78a090c5d0caf81c867547f28f06e71f [file] [log] [blame]
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -07001
2Android Init Language
3---------------------
4
Tom Cherry3be66ed2015-09-01 14:49:38 -07005The Android Init Language consists of five broad classes of statements,
6which are Actions, Commands, Services, Options, and Imports.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -07007
8All of these are line-oriented, consisting of tokens separated by
9whitespace. The c-style backslash escapes may be used to insert
10whitespace into a token. Double quotes may also be used to prevent
11whitespace from breaking text into multiple tokens. The backslash,
12when it is the last character on a line, may be used for line-folding.
13
14Lines which start with a # (leading whitespace allowed) are comments.
15
16Actions and Services implicitly declare a new section. All commands
17or options belong to the section most recently declared. Commands
18or options before the first section are ignored.
19
Tom Cherry3be66ed2015-09-01 14:49:38 -070020Actions and Services have unique names. If a second Action is defined
21with the same name as an existing one, its commands are appended to
22the commands of the existing action. If a second Service is defined
23with the same name as an existing one, it is ignored and an error
24message is logged.
25
26
27Init .rc Files
28--------------
29The init language is used in plaintext files that take the .rc file
30extension. These are typically multiple of these in multiple
31locations on the system, described below.
32
33/init.rc is the primary .rc file and is loaded by the init executable
34at the beginning of its execution. It is responsible for the initial
35set up of the system. It imports /init.${ro.hardware}.rc which is the
36primary vendor supplied .rc file.
37
38During the mount_all command, the init executable loads all of the
39files contained within the /{system,vendor,odm}/etc/init/ directories.
40These directories are intended for all Actions and Services used after
41file system mounting.
42
43The intention of these directories is as follows
44 1) /system/etc/init/ is for core system items such as
45 SurfaceFlinger and MediaService.
46 2) /vendor/etc/init/ is for SoC vendor items such as actions or
47 daemons needed for core SoC functionality.
48 3) /odm/etc/init/ is for device manufacturer items such as
49 actions or daemons needed for motion sensor or other peripheral
50 functionality.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -070051
52
53Actions
54-------
55Actions are named sequences of commands. Actions have a trigger which
56is used to determine when the action should occur. When an event
57occurs which matches an action's trigger, that action is added to
58the tail of a to-be-executed queue (unless it is already on the
59queue).
60
61Each action in the queue is dequeued in sequence and each command in
62that action is executed in sequence. Init handles other activities
63(device creation/destruction, property setting, process restarting)
64"between" the execution of the commands in activities.
65
66Actions take the form of:
67
Tom Cherry3be66ed2015-09-01 14:49:38 -070068on <trigger> [&& <trigger>]*
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -070069 <command>
70 <command>
71 <command>
72
73
74Services
75--------
76Services are programs which init launches and (optionally) restarts
77when they exit. Services take the form of:
78
79service <name> <pathname> [ <argument> ]*
80 <option>
81 <option>
82 ...
83
84
85Options
86-------
87Options are modifiers to services. They affect how and when init
88runs the service.
89
90critical
Elliott Hughesd62f0602015-06-12 18:02:20 -070091 This is a device-critical service. If it exits more than four times in
92 four minutes, the device will reboot into recovery mode.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -070093
94disabled
Elliott Hughesd62f0602015-06-12 18:02:20 -070095 This service will not automatically start with its class.
96 It must be explicitly started by name.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -070097
98setenv <name> <value>
Elliott Hughesd62f0602015-06-12 18:02:20 -070099 Set the environment variable <name> to <value> in the launched process.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700100
Elliott Hughes8d82ea02015-02-06 20:15:18 -0800101socket <name> <type> <perm> [ <user> [ <group> [ <seclabel> ] ] ]
Elliott Hughesd62f0602015-06-12 18:02:20 -0700102 Create a unix domain socket named /dev/socket/<name> and pass
103 its fd to the launched process. <type> must be "dgram", "stream" or "seqpacket".
104 User and group default to 0.
105 'seclabel' is the SELinux security context for the socket.
106 It defaults to the service security context, as specified by seclabel or
107 computed based on the service executable file security context.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700108
109user <username>
Elliott Hughesd62f0602015-06-12 18:02:20 -0700110 Change to username before exec'ing this service.
111 Currently defaults to root. (??? probably should default to nobody)
112 Currently, if your process requires linux capabilities then you cannot use
113 this command. You must instead request the capabilities in-process while
114 still root, and then drop to your desired uid.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700115
116group <groupname> [ <groupname> ]*
Elliott Hughesd62f0602015-06-12 18:02:20 -0700117 Change to groupname before exec'ing this service. Additional
118 groupnames beyond the (required) first one are used to set the
119 supplemental groups of the process (via setgroups()).
120 Currently defaults to root. (??? probably should default to nobody)
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700121
Elliott Hughes8d82ea02015-02-06 20:15:18 -0800122seclabel <seclabel>
123 Change to 'seclabel' before exec'ing this service.
Stephen Smalley3fb61102012-11-02 15:22:34 -0400124 Primarily for use by services run from the rootfs, e.g. ueventd, adbd.
125 Services on the system partition can instead use policy-defined transitions
126 based on their file security context.
127 If not specified and no transition is defined in policy, defaults to the init context.
128
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700129oneshot
Elliott Hughesd62f0602015-06-12 18:02:20 -0700130 Do not restart the service when it exits.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700131
132class <name>
Elliott Hughesd62f0602015-06-12 18:02:20 -0700133 Specify a class name for the service. All services in a
134 named class may be started or stopped together. A service
135 is in the class "default" if one is not specified via the
136 class option.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700137
138onrestart
Elliott Hughesd62f0602015-06-12 18:02:20 -0700139 Execute a Command (see below) when service restarts.
140
141writepid <file...>
142 Write the child's pid to the given files when it forks. Meant for
143 cgroup/cpuset usage.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700144
Elliott Hughes841b2632015-02-12 14:28:54 -0800145
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700146Triggers
147--------
Tom Cherry3be66ed2015-09-01 14:49:38 -0700148Triggers are strings which can be used to match certain kinds of
149events and used to cause an action to occur.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700150
Tom Cherry3be66ed2015-09-01 14:49:38 -0700151Triggers are subdivided into event triggers and property triggers.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700152
Tom Cherry3be66ed2015-09-01 14:49:38 -0700153Event triggers are strings triggered by the 'trigger' command or by
154the QueueEventTrigger() function within the init executable. These
155take the form of a simple string such as 'boot' or 'late-init'.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700156
Tom Cherry3be66ed2015-09-01 14:49:38 -0700157Property triggers are strings triggered when a named property changes
158value to a given new value or when a named property changes value to
159any new value. These take the form of 'property:<name>=<value>' and
160'property:<name>=*' respectively. Property triggers are additionally
161evaluated and triggered accordingly during the initial boot phase of
162init.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700163
Tom Cherry3be66ed2015-09-01 14:49:38 -0700164An Action can have multiple property triggers but may only have one
165event trigger.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700166
Tom Cherry3be66ed2015-09-01 14:49:38 -0700167For example:
168'on boot && property:a=b' defines an action that is only executed when
169the 'boot' event trigger happens and the property a equals b.
170
171'on property:a=b && property:c=d' defines an action that is executed
172at three times,
173 1) During initial boot if property a=b and property c=d
174 2) Any time that property a transitions to value b, while property
175 c already equals d.
176 3) Any time that property c transitions to value d, while property
177 a already equals b.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700178
Elliott Hughes841b2632015-02-12 14:28:54 -0800179
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700180Commands
181--------
182
Elliott Hughes91a3be52015-03-20 11:00:15 -0700183bootchart_init
184 Start bootcharting if configured (see below).
185 This is included in the default init.rc.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700186
187chmod <octal-mode> <path>
188 Change file access permissions.
189
190chown <owner> <group> <path>
191 Change file owner and group.
192
193class_start <serviceclass>
194 Start all services of the specified class if they are
195 not already running.
196
197class_stop <serviceclass>
Elliott Hughes91a3be52015-03-20 11:00:15 -0700198 Stop and disable all services of the specified class if they are
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700199 currently running.
200
Elliott Hughes91a3be52015-03-20 11:00:15 -0700201class_reset <serviceclass>
202 Stop all services of the specified class if they are
203 currently running, without disabling them. They can be restarted
204 later using class_start.
205
206copy <src> <dst>
207 Copies a file. Similar to write, but useful for binary/large
208 amounts of data.
209
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700210domainname <name>
211 Set the domain name.
212
JP Abgrall3beec7e2014-05-02 21:14:29 -0700213enable <servicename>
214 Turns a disabled service into an enabled one as if the service did not
215 specify disabled.
216 If the service is supposed to be running, it will be started now.
217 Typically used when the bootloader sets a variable that indicates a specific
218 service should be started when needed. E.g.
219 on property:ro.boot.myfancyhardware=1
220 enable my_fancy_service_for_my_fancy_hardware
221
Elliott Hughes91a3be52015-03-20 11:00:15 -0700222exec [ <seclabel> [ <user> [ <group> ]* ] ] -- <command> [ <argument> ]*
223 Fork and execute command with the given arguments. The command starts
224 after "--" so that an optional security context, user, and supplementary
225 groups can be provided. No other commands will be run until this one
Mark Salyzyn17fff892015-06-02 11:11:02 -0700226 finishes. <seclabel> can be a - to denote default.
Elliott Hughes91a3be52015-03-20 11:00:15 -0700227
Elliott Hughes91a3be52015-03-20 11:00:15 -0700228export <name> <value>
229 Set the environment variable <name> equal to <value> in the
230 global environment (which will be inherited by all processes
231 started after this command is executed)
232
233hostname <name>
234 Set the host name.
235
236ifup <interface>
237 Bring the network interface <interface> online.
238
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700239insmod <path>
240 Install the module at <path>
241
Elliott Hughes91a3be52015-03-20 11:00:15 -0700242load_all_props
243 Loads properties from /system, /vendor, et cetera.
244 This is included in the default init.rc.
245
246load_persist_props
247 Loads persistent properties when /data has been decrypted.
248 This is included in the default init.rc.
249
Elliott Hughesf682b472015-02-06 12:19:48 -0800250loglevel <level>
251 Sets the kernel log level to level. Properties are expanded within <level>.
252
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700253mkdir <path> [mode] [owner] [group]
254 Create a directory at <path>, optionally with the given mode, owner, and
255 group. If not provided, the directory is created with permissions 755 and
Johan Redestig0b42ba22015-03-15 17:39:41 +0100256 owned by the root user and root group. If provided, the mode, owner and group
257 will be updated if the directory exists already.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700258
Elliott Hughes91a3be52015-03-20 11:00:15 -0700259mount_all <fstab>
260 Calls fs_mgr_mount_all on the given fs_mgr-format fstab.
261
Niklas Tibblingbc3f69f2012-08-01 13:15:38 +0200262mount <type> <device> <dir> [ <flag> ]* [<options>]
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700263 Attempt to mount the named device at the directory <dir>
264 <device> may be of the form mtd@name to specify a mtd block
265 device by name.
Niklas Tibblingbc3f69f2012-08-01 13:15:38 +0200266 <flag>s include "ro", "rw", "remount", "noatime", ...
267 <options> include "barrier=1", "noauto_da_alloc", "discard", ... as
268 a comma separated string, eg: barrier=1,noauto_da_alloc
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700269
Elliott Hughes91a3be52015-03-20 11:00:15 -0700270powerctl
271 Internal implementation detail used to respond to changes to the
272 "sys.powerctl" system property, used to implement rebooting.
273
274restart <service>
275 Like stop, but doesn't disable the service.
276
Stephen Smalley726e8f72013-10-09 16:02:09 -0400277restorecon <path> [ <path> ]*
Stephen Smalley3fb61102012-11-02 15:22:34 -0400278 Restore the file named by <path> to the security context specified
279 in the file_contexts configuration.
280 Not required for directories created by the init.rc as these are
281 automatically labeled correctly by init.
282
Stephen Smalley726e8f72013-10-09 16:02:09 -0400283restorecon_recursive <path> [ <path> ]*
284 Recursively restore the directory tree named by <path> to the
285 security contexts specified in the file_contexts configuration.
Stephen Smalley726e8f72013-10-09 16:02:09 -0400286
Elliott Hughes91a3be52015-03-20 11:00:15 -0700287rm <path>
288 Calls unlink(2) on the given path. You might want to
289 use "exec -- rm ..." instead (provided the system partition is
290 already mounted).
291
292rmdir <path>
293 Calls rmdir(2) on the given path.
294
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700295setprop <name> <value>
Elliott Hughesf682b472015-02-06 12:19:48 -0800296 Set system property <name> to <value>. Properties are expanded
297 within <value>.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700298
299setrlimit <resource> <cur> <max>
300 Set the rlimit for a resource.
301
302start <service>
303 Start a service running if it is not already running.
304
305stop <service>
306 Stop a service from running if it is currently running.
307
Elliott Hughes91a3be52015-03-20 11:00:15 -0700308swapon_all <fstab>
309 Calls fs_mgr_swapon_all on the given fstab file.
310
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700311symlink <target> <path>
312 Create a symbolic link at <path> with the value <target>
313
The Android Open Source Project35237d12008-12-17 18:08:08 -0800314sysclktz <mins_west_of_gmt>
315 Set the system clock base (0 if system clock ticks in GMT)
316
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700317trigger <event>
318 Trigger an event. Used to queue an action from another
319 action.
320
Elliott Hughes91a3be52015-03-20 11:00:15 -0700321verity_load_state
322 Internal implementation detail used to load dm-verity state.
323
324verity_update_state <mount_point>
325 Internal implementation detail used to update dm-verity state and
326 set the partition.<mount_point>.verified properties used by adb remount
327 because fs_mgr can't set them directly itself.
328
Patrick McCormick96d0a4d2011-02-04 10:51:39 -0800329wait <path> [ <timeout> ]
Elliott Hughes91a3be52015-03-20 11:00:15 -0700330 Poll for the existence of the given file and return when found,
331 or the timeout has been reached. If timeout is not specified it
332 currently defaults to five seconds.
Patrick McCormick96d0a4d2011-02-04 10:51:39 -0800333
Elliott Hughesf682b472015-02-06 12:19:48 -0800334write <path> <content>
335 Open the file at <path> and write a string to it with write(2).
336 If the file does not exist, it will be created. If it does exist,
337 it will be truncated. Properties are expanded within <content>.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700338
339
Tom Cherry3be66ed2015-09-01 14:49:38 -0700340Imports
341-------
342The import keyword is not a command, but rather its own section and is
343handled immediately after the .rc file that contains it has finished
344being parsed. It takes the below form:
345
346import <path>
347 Parse an init config file, extending the current configuration.
348 If <path> is a directory, each file in the directory is parsed as
349 a config file. It is not recursive, nested directories will
350 not be parsed.
351
352There are only two times where the init executable imports .rc files,
353 1) When it imports /init.rc during initial boot
354 2) When it imports /{system,vendor,odm}/etc/init/ during mount_all
355
356
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700357Properties
358----------
Tom Cherry3be66ed2015-09-01 14:49:38 -0700359Init provides information about the services that it is responsible
360for via the below properties.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700361
362init.svc.<name>
Tom Cherry3be66ed2015-09-01 14:49:38 -0700363 State of a named service ("stopped", "stopping", "running", "restarting")
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700364
365
Elliott Hughes841b2632015-02-12 14:28:54 -0800366Bootcharting
367------------
Elliott Hughes841b2632015-02-12 14:28:54 -0800368This version of init contains code to perform "bootcharting": generating log
369files that can be later processed by the tools provided by www.bootchart.org.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700370
Elliott Hughes59abac22015-03-28 12:12:51 -0700371On the emulator, use the -bootchart <timeout> option to boot with bootcharting
372activated for <timeout> seconds.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700373
Elliott Hughes841b2632015-02-12 14:28:54 -0800374On a device, create /data/bootchart/start with a command like the following:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700375
Elliott Hughes841b2632015-02-12 14:28:54 -0800376 adb shell 'echo $TIMEOUT > /data/bootchart/start'
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700377
Elliott Hughes841b2632015-02-12 14:28:54 -0800378Where the value of $TIMEOUT corresponds to the desired bootcharted period in
379seconds. Bootcharting will stop after that many seconds have elapsed.
380You can also stop the bootcharting at any moment by doing the following:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700381
Elliott Hughes841b2632015-02-12 14:28:54 -0800382 adb shell 'echo 1 > /data/bootchart/stop'
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700383
Elliott Hughes841b2632015-02-12 14:28:54 -0800384Note that /data/bootchart/stop is deleted automatically by init at the end of
385the bootcharting. This is not the case with /data/bootchart/start, so don't
386forget to delete it when you're done collecting data.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700387
Elliott Hughes841b2632015-02-12 14:28:54 -0800388The log files are written to /data/bootchart/. A script is provided to
389retrieve them and create a bootchart.tgz file that can be used with the
390bootchart command-line utility:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700391
Elliott Hughes841b2632015-02-12 14:28:54 -0800392 sudo apt-get install pybootchartgui
Elliott Hughes59abac22015-03-28 12:12:51 -0700393 # grab-bootchart.sh uses $ANDROID_SERIAL.
Elliott Hughes841b2632015-02-12 14:28:54 -0800394 $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700395
Elliott Hughes59abac22015-03-28 12:12:51 -0700396One thing to watch for is that the bootchart will show init as if it started
397running at 0s. You'll have to look at dmesg to work out when the kernel
398actually started init.
399
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700400
Ben Cheng50bbde02015-06-09 17:04:36 +0800401Comparing two bootcharts
402------------------------
403A handy script named compare-bootcharts.py can be used to compare the
404start/end time of selected processes. The aforementioned grab-bootchart.sh
405will leave a bootchart tarball named bootchart.tgz at /tmp/android-bootchart.
406If two such barballs are preserved on the host machine under different
407directories, the script can list the timestamps differences. For example:
408
409Usage: system/core/init/compare-bootcharts.py base_bootchart_dir
410 exp_bootchart_dir
411
412process: baseline experiment (delta)
413 - Unit is ms (a jiffy is 10 ms on the system)
414------------------------------------
415/init: 50 40 (-10)
416/system/bin/surfaceflinger: 4320 4470 (+150)
417/system/bin/bootanimation: 6980 6990 (+10)
418zygote64: 10410 10640 (+230)
419zygote: 10410 10640 (+230)
420system_server: 15350 15150 (-200)
421bootanimation ends at: 33790 31230 (-2560)
422
423
Yasuhiro Matsudaf93db4b2015-06-15 18:49:35 +0900424Systrace
425--------
426Systrace [1] can be used for obtaining performance analysis reports during boot
427time on userdebug or eng builds.
428Here is an example of trace events of "wm" and "am" categories:
429
430 $ANDROID_BUILD_TOP/external/chromium-trace/systrace.py wm am --boot
431
432This command will cause the device to reboot. After the device is rebooted and
433the boot sequence has finished, the trace report is obtained from the device
434and written as trace.html on the host by hitting Ctrl+C.
435
436LIMITATION
437Recording trace events is started after persistent properties are loaded, so
438the trace events that are emitted before that are not recorded. Several
439services such as vold, surfaceflinger, and servicemanager are affected by this
440limitation since they are started before persistent properties are loaded.
441Zygote initialization and the processes that are forked from the zygote are not
442affected.
443
444[1] http://developer.android.com/tools/help/systrace.html
445
446
Elliott Hughes841b2632015-02-12 14:28:54 -0800447Debugging init
448--------------
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700449By default, programs executed by init will drop stdout and stderr into
450/dev/null. To help with debugging, you can execute your program via the
Elliott Hughesf682b472015-02-06 12:19:48 -0800451Android program logwrapper. This will redirect stdout/stderr into the
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700452Android logging system (accessed via logcat).
453
454For example
455service akmd /system/bin/logwrapper /sbin/akmd
Elliott Hughesf682b472015-02-06 12:19:48 -0800456
457For quicker turnaround when working on init itself, use:
458
Elliott Hughes841b2632015-02-12 14:28:54 -0800459 mm -j
Elliott Hughesf682b472015-02-06 12:19:48 -0800460 m ramdisk-nodeps
461 m bootimage-nodeps
462 adb reboot bootloader
463 fastboot boot $ANDROID_PRODUCT_OUT/boot.img
464
465Alternatively, use the emulator:
466
467 emulator -partition-size 1024 -verbose -show-kernel -no-window
468
469You might want to call klog_set_level(6) after the klog_init() call
470so you see the kernel logging in dmesg (or the emulator output).