init
Linuxで最初に起動されるプロセスが"init"。このプロセスがファイルをmountしたり,deamonを起動したりしている。
Android init Language
アクション,コマンド,サービス,オプションのクラスがある。
- これらの全ては,行単位で空白で区切られたトークンから構成される。
- Cスタイルのバックスラッシュエスケープが,トークンに空白を挿入するために使用される。
- ダブルクォートは,複数トークンに分割したテキストから空白を防止するために使用される。
- バックスラッシュが行の最後の文字であるときは,行を折りたたむために使用される。
- #(先頭の空白は許可します)で始まる行はコメントになる。
- アクションとサービスは暗黙的に新しいセクションを宣言する。
- 全てのコマンドあるいはオプションは,直近に宣言されたセクションに所属する。
- 最初のセクションより前のコマンドとオプションは,無視される。
アクションとサービスは一意の名前を持つ。もし二番目のアクションもしくはサービスが
既に存在するものと同じ名前を宣言したら,エラーとして無視される。
アクション
アクションは,コマンドのシーケンスで名づけられる。アクションはトリガを持っている。
トリガはアクションがいつ発生するべきかを決定するために使用される。
アクションのトリガに一致したイベントが発生した時,アクションは実行されるキューの末尾に追加される。(それアクションが既にキュー上に存在しない限りは)
キュー内のそれぞれのアクションは,順に取り出され,各コマンドは順に実行されて行く。
initは,アクティビティ内のコマンドの実行する間に,他のアクティビティ(デバイスの作成/破棄,プロパティの設定,プロセスの再起動)を処理する。
アクションは以下の形をとる。
on <trigger>
<command>
<command>
<command>
サービス
サービスは,initが起動して,サービスが終了したときに再起動させるプログラムです。
サービスは以下の形をとります。
service <name> <pathname> [ <argument> ]
<option>
<option>
...
オプション
オプションは,サービスへの修飾子です。オプションは,initがサービスをいつ,どのように実行するかに影響を与える。
- critical
これはデバイスクリティカルサービスです。4分間に4回以上終了した場合,その装置はリカバリーモードで再起動する。
- disable
このサービスは,そのクラスと共に自動で起動しません。これは明示的に名前で起動しなければならない。
- setenv <name> <value>
プロセスの起動時に,環境変数<name>に<value>を設定する。
- socket <name> <type> <perm> [ <user> [ <group> ] ]
/dev/socket/<name>という名称のUNIXドメインソケットを作成し,起動したプロセスにソケットのfdを渡す。
<type>は"dgram"か"stream"にしなければなりません。<user>と<group>は,デフォルト0です。
- user <username>
このサービスを<username>で実行する。デフォルトはrootになると思う。(ほんとうはデフォルトは,nobodyにすべき)
- group <groupname> [ <groupname> ]
このサービスを<groupname>で実行する。追加の<groupname>は,最初のグループ(必須)を超えてプロセスの補助グループを設定(setgroups()を介して)するために使われる。
デフォルトは,rootになると思う。(デフォルトは,nobodyにすべき)
- oneshot
サービスが終了した場合に,再起動をさせないようにする。
- class <name>
サービスのクラス名を指定する。同じクラス名の全てのサービスは,一緒にスタートあるいは停止すると思われる。
classオプションを指定されていないサービスのクラスは,"default"。
- onrestart
サービスを再起動するようにする。
トリガー
トリガーは,文字列です。
アクションを発生させるためのトリガーとして指定する。特定種類のイベントを使うことが出来る。
- boot
initが起動した時に発生する最初のトリガー。この後で,/init.confが読み込まれる。
- <name>=<value>
プロパティ<name>に<vlaue>で指定した値が設定された時に,発生する。
- device-added-<path>,device-removed-<path>
デバイスノードが追加あるいは削除された時に発生する。
- service-exited-<name>
指定したサービスが終了した時に発生する。
コマンド
- exec <path> [ <argument> ]
forkしてプログラムを実行します(<path>で指定した)。プログラムが実行を完了を待つ。
組み込みコマンドとは異なり,使用を避けることを勧める。initのスタックを取得するリスクを冒すんで。
- export <name> <value>
グローバル環境の中の環境変数<name>に<value>を設定する。このコマンドを実行した後に,起動する全てのプロセスに継承される。
- ifup <interface>
ネットワークインターフェース<interface>を,オンラインにする。
- import <filename>
初期設定ファイルを解析し,現在の設定を拡張する。
- hostname <name>
ホスト名を設定する。
- chdir <directory>
作業ディレクトリを移動する。
- chmod <octal-mode> <path>
ファイルのパーミッションを変更する。
- chown <owner> <group> <path>
ファイルのオーナーとグループ権を変更する。
- chroot <directory>
プロセスのルートディレクトリを変更する。
- class_start <serviceclass>
既に実行中でなければ,指定したクラスのサービスを起動する。
- class_stop <serviceclass>
現在実行中であれば,指定したクラスの全てのサービスを停止する。
- domainname <name>
ドメイン名を設定する。
- insmod <path>
<path>のモジュールを読み込む。
- mkdir <path> [mode] [owner] [group]
<path>にディレクトリを作成する。オプションで,モード,オーナー,グループを指定する。
ディレクトリは,パーミッション755で作成される。また,rootユーザとrootグループで作成される。
- mount <type> <device> <dir> [ <mountoption> ]
<device>を<dir>にマウントする。<device>はmtd@nameという形で,名前でmtdブロックを
指定することが可能。<mountoption>は,"ro","rw","remount","noatime"などがある。
- setprop <name> <value>
システムプロパティ<name>に,<value>を設定する。
- setrlimit <resource> <cur> <max>
リソースに,rlimitを設定する。
- start <service>
既に実行していなければ,サービスを実行する。
- stop <service>
現在実行中であれば,サービスを停止する。
- symlink <target> <path>
<path>に,<target>のシンボリックリンクを作成する。
- sysclktz <mins_west_of_gmt>
システムクロックベースを設定する。(0は,システムクロックがGMT)
- trigger <event>
トリガーとなるイベント。他のアクションからのキューアクションとして使われる。
- write <path> <string> [ <string> ]
<path>のファイルを開いて,文字列を書き込む。
プロパティ
initは,いくつかのシステムプロパティを更新する。それは,それが何をしているかの足跡を残すため。
- init.action
アクション名と等しいプロパティは,現在実行されているか。
- init.command
コマンドと等しいプロパティは,実行されているか。
- init.svc.<name>
サービスの状態。("stopped","running","restarting")
init.confの例
# not complete -- just providing some examples of usage
#
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib
mkdir /dev
mkdir /proc
mkdir /sys
mount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /sys
write /proc/cpu/alignment 4
ifup lo
hostname localhost
domainname localhost
mount yaffs2 mtd@system /system
mount yaffs2 mtd@userdata /data
import /system/etc/init.conf
class_start default
service adbd /sbin/adbd
user adb
group adb
service usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666
service runtime /system/bin/runtime
user system
group system
on device-added-/dev/compass
start akmd
on device-removed-/dev/compass
stop akmd
service akmd /sbin/akmd
disabled
user akmd
group akmd
Debugging notes
デフォルトでは,initにより実行されたプログラムは,標準出力と標準エラー出力を,/dev/nullに捨てる。
デバッグの為に,自分のプログラムをAndroid program logwrapperを介して,起動することが出来る。これは,標準出力/標準エラー出力を,Android logging system(logcatを介してアクセス可能)にリダイレクトする。
例えば,
service akmd /system/bin/logwrapper /sbin/akmd
ていうように使用する。
Counter: 577,
today: 1,
yesterday: 1
最終更新: 2020-12-26 (土) 16:08:10 (JST) (1215d) by yuji
Copyright©2008 Yuji Ueno All Rights Reserved.
新しくコメントをつける