blob: bacd6bdf20f2139b505519e819ac0ebb062e61cf [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)
Tom Cherrydbddb402015-12-11 12:54:50 -0800112 As of Android M, processes should use this option even if they
113 require linux capabilities. Previously, to acquire linux
114 capabilities, a process would need to run as root, request the
115 capabilities, then drop to its desired uid. There is a new
116 mechanism through fs_config that allows device manufacturers to add
117 linux capabilities to specific binaries on a file system that should
118 be used instead. This mechanism is described on
119 http://source.android.com/devices/tech/config/filesystem.html. When
120 using this new mechanism, processes can use the user option to
121 select their desired uid without ever running as root.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700122
123group <groupname> [ <groupname> ]*
Elliott Hughesd62f0602015-06-12 18:02:20 -0700124 Change to groupname before exec'ing this service. Additional
125 groupnames beyond the (required) first one are used to set the
126 supplemental groups of the process (via setgroups()).
127 Currently defaults to root. (??? probably should default to nobody)
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700128
Elliott Hughes8d82ea02015-02-06 20:15:18 -0800129seclabel <seclabel>
130 Change to 'seclabel' before exec'ing this service.
Stephen Smalley3fb61102012-11-02 15:22:34 -0400131 Primarily for use by services run from the rootfs, e.g. ueventd, adbd.
132 Services on the system partition can instead use policy-defined transitions
133 based on their file security context.
134 If not specified and no transition is defined in policy, defaults to the init context.
135
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700136oneshot
Elliott Hughesd62f0602015-06-12 18:02:20 -0700137 Do not restart the service when it exits.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700138
139class <name>
Elliott Hughesd62f0602015-06-12 18:02:20 -0700140 Specify a class name for the service. All services in a
141 named class may be started or stopped together. A service
142 is in the class "default" if one is not specified via the
143 class option.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700144
145onrestart
Elliott Hughesd62f0602015-06-12 18:02:20 -0700146 Execute a Command (see below) when service restarts.
147
148writepid <file...>
149 Write the child's pid to the given files when it forks. Meant for
150 cgroup/cpuset usage.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700151
Elliott Hughes841b2632015-02-12 14:28:54 -0800152
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700153Triggers
154--------
Tom Cherry3be66ed2015-09-01 14:49:38 -0700155Triggers are strings which can be used to match certain kinds of
156events and used to cause an action to occur.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700157
Tom Cherry3be66ed2015-09-01 14:49:38 -0700158Triggers are subdivided into event triggers and property triggers.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700159
Tom Cherry3be66ed2015-09-01 14:49:38 -0700160Event triggers are strings triggered by the 'trigger' command or by
161the QueueEventTrigger() function within the init executable. These
162take the form of a simple string such as 'boot' or 'late-init'.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700163
Tom Cherry3be66ed2015-09-01 14:49:38 -0700164Property triggers are strings triggered when a named property changes
165value to a given new value or when a named property changes value to
166any new value. These take the form of 'property:<name>=<value>' and
167'property:<name>=*' respectively. Property triggers are additionally
168evaluated and triggered accordingly during the initial boot phase of
169init.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700170
Tom Cherry3be66ed2015-09-01 14:49:38 -0700171An Action can have multiple property triggers but may only have one
172event trigger.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700173
Tom Cherry3be66ed2015-09-01 14:49:38 -0700174For example:
175'on boot && property:a=b' defines an action that is only executed when
176the 'boot' event trigger happens and the property a equals b.
177
178'on property:a=b && property:c=d' defines an action that is executed
179at three times,
180 1) During initial boot if property a=b and property c=d
181 2) Any time that property a transitions to value b, while property
182 c already equals d.
183 3) Any time that property c transitions to value d, while property
184 a already equals b.
Badhri Jagan Sridharan0b415122014-10-10 23:19:06 -0700185
Elliott Hughes841b2632015-02-12 14:28:54 -0800186
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700187Commands
188--------
189
Elliott Hughes91a3be52015-03-20 11:00:15 -0700190bootchart_init
191 Start bootcharting if configured (see below).
192 This is included in the default init.rc.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700193
194chmod <octal-mode> <path>
195 Change file access permissions.
196
197chown <owner> <group> <path>
198 Change file owner and group.
199
200class_start <serviceclass>
201 Start all services of the specified class if they are
202 not already running.
203
204class_stop <serviceclass>
Elliott Hughes91a3be52015-03-20 11:00:15 -0700205 Stop and disable all services of the specified class if they are
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700206 currently running.
207
Elliott Hughes91a3be52015-03-20 11:00:15 -0700208class_reset <serviceclass>
209 Stop all services of the specified class if they are
210 currently running, without disabling them. They can be restarted
211 later using class_start.
212
213copy <src> <dst>
214 Copies a file. Similar to write, but useful for binary/large
215 amounts of data.
216
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700217domainname <name>
218 Set the domain name.
219
JP Abgrall3beec7e2014-05-02 21:14:29 -0700220enable <servicename>
221 Turns a disabled service into an enabled one as if the service did not
222 specify disabled.
223 If the service is supposed to be running, it will be started now.
224 Typically used when the bootloader sets a variable that indicates a specific
225 service should be started when needed. E.g.
226 on property:ro.boot.myfancyhardware=1
227 enable my_fancy_service_for_my_fancy_hardware
228
Elliott Hughes91a3be52015-03-20 11:00:15 -0700229exec [ <seclabel> [ <user> [ <group> ]* ] ] -- <command> [ <argument> ]*
230 Fork and execute command with the given arguments. The command starts
231 after "--" so that an optional security context, user, and supplementary
232 groups can be provided. No other commands will be run until this one
Mark Salyzyn17fff892015-06-02 11:11:02 -0700233 finishes. <seclabel> can be a - to denote default.
Elliott Hughes91a3be52015-03-20 11:00:15 -0700234
Elliott Hughes91a3be52015-03-20 11:00:15 -0700235export <name> <value>
236 Set the environment variable <name> equal to <value> in the
237 global environment (which will be inherited by all processes
238 started after this command is executed)
239
240hostname <name>
241 Set the host name.
242
243ifup <interface>
244 Bring the network interface <interface> online.
245
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700246insmod <path>
247 Install the module at <path>
248
Elliott Hughes91a3be52015-03-20 11:00:15 -0700249load_all_props
250 Loads properties from /system, /vendor, et cetera.
251 This is included in the default init.rc.
252
253load_persist_props
254 Loads persistent properties when /data has been decrypted.
255 This is included in the default init.rc.
256
Elliott Hughesf682b472015-02-06 12:19:48 -0800257loglevel <level>
258 Sets the kernel log level to level. Properties are expanded within <level>.
259
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700260mkdir <path> [mode] [owner] [group]
261 Create a directory at <path>, optionally with the given mode, owner, and
262 group. If not provided, the directory is created with permissions 755 and
Johan Redestig0b42ba22015-03-15 17:39:41 +0100263 owned by the root user and root group. If provided, the mode, owner and group
264 will be updated if the directory exists already.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700265
Elliott Hughes91a3be52015-03-20 11:00:15 -0700266mount_all <fstab>
267 Calls fs_mgr_mount_all on the given fs_mgr-format fstab.
268
Niklas Tibblingbc3f69f2012-08-01 13:15:38 +0200269mount <type> <device> <dir> [ <flag> ]* [<options>]
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700270 Attempt to mount the named device at the directory <dir>
271 <device> may be of the form mtd@name to specify a mtd block
272 device by name.
Niklas Tibblingbc3f69f2012-08-01 13:15:38 +0200273 <flag>s include "ro", "rw", "remount", "noatime", ...
274 <options> include "barrier=1", "noauto_da_alloc", "discard", ... as
275 a comma separated string, eg: barrier=1,noauto_da_alloc
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700276
Elliott Hughes91a3be52015-03-20 11:00:15 -0700277powerctl
278 Internal implementation detail used to respond to changes to the
279 "sys.powerctl" system property, used to implement rebooting.
280
281restart <service>
282 Like stop, but doesn't disable the service.
283
Stephen Smalley726e8f72013-10-09 16:02:09 -0400284restorecon <path> [ <path> ]*
Stephen Smalley3fb61102012-11-02 15:22:34 -0400285 Restore the file named by <path> to the security context specified
286 in the file_contexts configuration.
287 Not required for directories created by the init.rc as these are
288 automatically labeled correctly by init.
289
Stephen Smalley726e8f72013-10-09 16:02:09 -0400290restorecon_recursive <path> [ <path> ]*
291 Recursively restore the directory tree named by <path> to the
292 security contexts specified in the file_contexts configuration.
Stephen Smalley726e8f72013-10-09 16:02:09 -0400293
Elliott Hughes91a3be52015-03-20 11:00:15 -0700294rm <path>
295 Calls unlink(2) on the given path. You might want to
296 use "exec -- rm ..." instead (provided the system partition is
297 already mounted).
298
299rmdir <path>
300 Calls rmdir(2) on the given path.
301
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700302setprop <name> <value>
Elliott Hughesf682b472015-02-06 12:19:48 -0800303 Set system property <name> to <value>. Properties are expanded
304 within <value>.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700305
306setrlimit <resource> <cur> <max>
307 Set the rlimit for a resource.
308
309start <service>
310 Start a service running if it is not already running.
311
312stop <service>
313 Stop a service from running if it is currently running.
314
Elliott Hughes91a3be52015-03-20 11:00:15 -0700315swapon_all <fstab>
316 Calls fs_mgr_swapon_all on the given fstab file.
317
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700318symlink <target> <path>
319 Create a symbolic link at <path> with the value <target>
320
The Android Open Source Project35237d12008-12-17 18:08:08 -0800321sysclktz <mins_west_of_gmt>
322 Set the system clock base (0 if system clock ticks in GMT)
323
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700324trigger <event>
325 Trigger an event. Used to queue an action from another
326 action.
327
Elliott Hughes91a3be52015-03-20 11:00:15 -0700328verity_load_state
329 Internal implementation detail used to load dm-verity state.
330
331verity_update_state <mount_point>
332 Internal implementation detail used to update dm-verity state and
333 set the partition.<mount_point>.verified properties used by adb remount
334 because fs_mgr can't set them directly itself.
335
Patrick McCormick96d0a4d2011-02-04 10:51:39 -0800336wait <path> [ <timeout> ]
Elliott Hughes91a3be52015-03-20 11:00:15 -0700337 Poll for the existence of the given file and return when found,
338 or the timeout has been reached. If timeout is not specified it
339 currently defaults to five seconds.
Patrick McCormick96d0a4d2011-02-04 10:51:39 -0800340
Elliott Hughesf682b472015-02-06 12:19:48 -0800341write <path> <content>
342 Open the file at <path> and write a string to it with write(2).
343 If the file does not exist, it will be created. If it does exist,
344 it will be truncated. Properties are expanded within <content>.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700345
346
Tom Cherry3be66ed2015-09-01 14:49:38 -0700347Imports
348-------
349The import keyword is not a command, but rather its own section and is
350handled immediately after the .rc file that contains it has finished
351being parsed. It takes the below form:
352
353import <path>
354 Parse an init config file, extending the current configuration.
355 If <path> is a directory, each file in the directory is parsed as
356 a config file. It is not recursive, nested directories will
357 not be parsed.
358
359There are only two times where the init executable imports .rc files,
360 1) When it imports /init.rc during initial boot
361 2) When it imports /{system,vendor,odm}/etc/init/ during mount_all
362
363
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700364Properties
365----------
Tom Cherry3be66ed2015-09-01 14:49:38 -0700366Init provides information about the services that it is responsible
367for via the below properties.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700368
369init.svc.<name>
Tom Cherry3be66ed2015-09-01 14:49:38 -0700370 State of a named service ("stopped", "stopping", "running", "restarting")
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700371
372
Elliott Hughes841b2632015-02-12 14:28:54 -0800373Bootcharting
374------------
Elliott Hughes841b2632015-02-12 14:28:54 -0800375This version of init contains code to perform "bootcharting": generating log
376files that can be later processed by the tools provided by www.bootchart.org.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700377
Elliott Hughes59abac22015-03-28 12:12:51 -0700378On the emulator, use the -bootchart <timeout> option to boot with bootcharting
379activated for <timeout> seconds.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700380
Elliott Hughes841b2632015-02-12 14:28:54 -0800381On a device, create /data/bootchart/start with a command like the following:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700382
Elliott Hughes841b2632015-02-12 14:28:54 -0800383 adb shell 'echo $TIMEOUT > /data/bootchart/start'
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700384
Elliott Hughes841b2632015-02-12 14:28:54 -0800385Where the value of $TIMEOUT corresponds to the desired bootcharted period in
386seconds. Bootcharting will stop after that many seconds have elapsed.
387You can also stop the bootcharting at any moment by doing the following:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700388
Elliott Hughes841b2632015-02-12 14:28:54 -0800389 adb shell 'echo 1 > /data/bootchart/stop'
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700390
Elliott Hughes841b2632015-02-12 14:28:54 -0800391Note that /data/bootchart/stop is deleted automatically by init at the end of
392the bootcharting. This is not the case with /data/bootchart/start, so don't
393forget to delete it when you're done collecting data.
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700394
Elliott Hughes841b2632015-02-12 14:28:54 -0800395The log files are written to /data/bootchart/. A script is provided to
396retrieve them and create a bootchart.tgz file that can be used with the
397bootchart command-line utility:
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700398
Elliott Hughes841b2632015-02-12 14:28:54 -0800399 sudo apt-get install pybootchartgui
Elliott Hughes59abac22015-03-28 12:12:51 -0700400 # grab-bootchart.sh uses $ANDROID_SERIAL.
Elliott Hughes841b2632015-02-12 14:28:54 -0800401 $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700402
Elliott Hughes59abac22015-03-28 12:12:51 -0700403One thing to watch for is that the bootchart will show init as if it started
404running at 0s. You'll have to look at dmesg to work out when the kernel
405actually started init.
406
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700407
Ben Cheng50bbde02015-06-09 17:04:36 +0800408Comparing two bootcharts
409------------------------
410A handy script named compare-bootcharts.py can be used to compare the
411start/end time of selected processes. The aforementioned grab-bootchart.sh
412will leave a bootchart tarball named bootchart.tgz at /tmp/android-bootchart.
413If two such barballs are preserved on the host machine under different
414directories, the script can list the timestamps differences. For example:
415
416Usage: system/core/init/compare-bootcharts.py base_bootchart_dir
417 exp_bootchart_dir
418
419process: baseline experiment (delta)
420 - Unit is ms (a jiffy is 10 ms on the system)
421------------------------------------
422/init: 50 40 (-10)
423/system/bin/surfaceflinger: 4320 4470 (+150)
424/system/bin/bootanimation: 6980 6990 (+10)
425zygote64: 10410 10640 (+230)
426zygote: 10410 10640 (+230)
427system_server: 15350 15150 (-200)
428bootanimation ends at: 33790 31230 (-2560)
429
430
Yasuhiro Matsudaf93db4b2015-06-15 18:49:35 +0900431Systrace
432--------
433Systrace [1] can be used for obtaining performance analysis reports during boot
434time on userdebug or eng builds.
435Here is an example of trace events of "wm" and "am" categories:
436
437 $ANDROID_BUILD_TOP/external/chromium-trace/systrace.py wm am --boot
438
439This command will cause the device to reboot. After the device is rebooted and
440the boot sequence has finished, the trace report is obtained from the device
441and written as trace.html on the host by hitting Ctrl+C.
442
443LIMITATION
444Recording trace events is started after persistent properties are loaded, so
445the trace events that are emitted before that are not recorded. Several
446services such as vold, surfaceflinger, and servicemanager are affected by this
447limitation since they are started before persistent properties are loaded.
448Zygote initialization and the processes that are forked from the zygote are not
449affected.
450
451[1] http://developer.android.com/tools/help/systrace.html
452
453
Elliott Hughes841b2632015-02-12 14:28:54 -0800454Debugging init
455--------------
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700456By default, programs executed by init will drop stdout and stderr into
457/dev/null. To help with debugging, you can execute your program via the
Elliott Hughesf682b472015-02-06 12:19:48 -0800458Android program logwrapper. This will redirect stdout/stderr into the
The Android Open Source Project4f6e8d72008-10-21 07:00:00 -0700459Android logging system (accessed via logcat).
460
461For example
462service akmd /system/bin/logwrapper /sbin/akmd
Elliott Hughesf682b472015-02-06 12:19:48 -0800463
464For quicker turnaround when working on init itself, use:
465
Elliott Hughes841b2632015-02-12 14:28:54 -0800466 mm -j
Elliott Hughesf682b472015-02-06 12:19:48 -0800467 m ramdisk-nodeps
468 m bootimage-nodeps
469 adb reboot bootloader
470 fastboot boot $ANDROID_PRODUCT_OUT/boot.img
471
472Alternatively, use the emulator:
473
474 emulator -partition-size 1024 -verbose -show-kernel -no-window
475
476You might want to call klog_set_level(6) after the klog_init() call
477so you see the kernel logging in dmesg (or the emulator output).