
Linuxシステムの高速init。 Claudio MatsuokaによってEeepc Fastinitからリバースエンジニアリング - 「カエルDNAで満たされたギャップ…」

図1:Finit Booting Alpine Linux(Howto)のスクリーンショット。
機能は次のとおりです。
/etc/rc.localサポート/etc/network/interfacesの組み込みサポートinitctl topの構成と監視の両方suloginを備えた適切な救助モードsyslogdが開始する前にカーネルリングバッファーへのロギングは、完全なロギング統合と、 loggerを使用してスクリプトからカーネルリングバッファーにログインする方法について推奨されるSysklogdプロジェクトを参照してくださいFINITはサーバーとデスクトップシステムでも完全に使用可能ですが、焦点は小さく埋め込まれたシステムにあります。作業例については、次のLinux分布のチュートリアルを含むContrib/セクションを参照してください。
注:さまざまなLinux分布のサポートは、すべてのアーキテクチャにFinitインストールを簡単にインストールすることを意味するものではありません。バンドルされたインストールスクリプトは、AMD64(x86_64)システムでテストされた標準インストールの例です。組み込みシステム用のカスタムセットアップは、Mylinux、Infix、またはPlain Br2-Finit-Demoのいずれかにあります。
この例/etc/finit.conf 、 /etc/finit.dの複数の.confファイルで分割することもできます。利用可能ですが、まだ有効になっていないサービスは、 /etc/finit.d/available finit.d/availableに配置し、initctlツールを使用してオペレーターが有効にすることができます。上記のLinuxディストリビューション、またはMylinuxを参照してください。
注: FINIT V4.4の時点で、.CONFラインは標準のUNIX継続文字(
)を使用して分割できます。また、トレーニングコメントもサポートされています。後者は、指令と説明(#)で使用されるハッシュを逃れる必要があることを意味します。これと例の詳細については、finit.conf(5)マニュアルまたはdoc/config.mdを参照してください。
# Fallback if /etc/hostname is missing
host default
# Runlevel to start after bootstrap, 'S', default: 2
# runlevel 2
# Support for setting global environment variables, using foo=bar syntax
# be careful though with variables like PATH, SHELL, LOGNAME, etc.
# PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Max file size for each log file: 100 kiB, rotate max 4 copies:
# log => log.1 => log.2.gz => log.3.gz => log.4.gz
log size=100k count=4
# Services to be monitored and respawned as needed
service [S12345] env:-/etc/conf.d/watchdog watchdog $WATCHDOG_OPTS $WATCHDOG_DEV -- System watchdog daemon
service [S12345] env:-/etc/conf.d/syslog syslogd -n $SYSLOGD_OPTS -- System log daemon
service [S12345] < pid /syslogd> env:-/etc/conf.d/klogd klogd -n $KLOGD_OPTS -- Kernel log daemon
service [2345] env:-/etc/conf.d/lldpd lldpd -d $LLDPD_OPTS -- LLDP daemon (IEEE 802.1ab)
# The BusyBox ntpd does not use syslog when running in the foreground
# So we use this trick to redirect stdout/stderr to a log file. The
# log file is rotated with the above settings. The condition declares
# a dependency on a system default route (gateway) to be set. A single
# <!> at the beginning means ntpd does not respect SIGHUP for restart.
service [2345] log:/var/log/ntpd.log <!net/route/default> ntpd -n -l -I eth0 -- NTP daemon
# For multiple instances of the same service, add :ID somewhere between
# the service/run/task keyword and the command.
service :80 [2345] merecat -n -p 80 /var/www -- Web server
service :8080 [2345] merecat -n -p 8080 /var/www -- Old web server
# Alternative method instead of below runparts, can also use /etc/rc.local
# sysv [S] /etc/init.d/keyboard-setup -- Setting up preliminary keymap
# sysv [S] /etc/init.d/acpid -- Starting ACPI Daemon
# task [S] /etc/init.d/kbd -- Preparing console
# Hidden from boot progress, using empty `--` description
# sysv [S] /etc/init.d/keyboard-setup --
# sysv [S] /etc/init.d/acpid --
# task [S] /etc/init.d/kbd --
# Run start scripts from this directory
# runparts /etc/start.d
# Virtual consoles run BusyBox getty, keep kernel default speed
tty [12345] /sbin/getty -L 0 /dev/tty1 linux nowait noclear
tty [2345] /sbin/getty -L 0 /dev/tty2 linux nowait noclear
tty [2345] /sbin/getty -L 0 /dev/tty3 linux nowait noclear
# Use built-in getty for serial port and USB serial
# tty [12345] /dev/ttyAMA0 noclear nowait
# tty [12345] /dev/ttyUSB0 noclear
# Just give me a shell, I need to debug this embedded system!
# tty [12345] console noclear nologin service Stanza、およびtask 、 runなどは、doc/config.mdで完全に説明されています。 UNIXデーモンを開始するために必要な最も一般的なコンポーネントのいくつかの簡単な概要を次に示します。
service [LVLS] <COND> log env:[-]/etc/default/daemon daemon ARGS -- Daemon daemon
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | `---------- Optional description
| | | | | | `------------------ Daemon arguments
| | | | | `------------------------- Path to daemon
| | | | `---------------------------------------------------- Optional env. file
| | | `-------------------------------------------------------- Redirect output to log
| | `--------------------------------------------------------------- Optional conditions
| `---------------------------------------------------------------------- Optional Runlevels
`------------------------------------------------------------------------------ Monitored application
一部のコンポーネントはオプションです:Runlevel(s)、条件、および説明。簡単なスタートスクリプトを簡単に作成でき、さらに高度な用途にも可能です。
service /usr/sbin/sshd -D
依存関係は、条件を使用して処理されます。最も一般的な条件の1つは、基本的なネットワークが利用可能になるのを待つことです。
service <net/route/default> nginx -- High performance HTTP server
syslogdが適切に開始するまでBusybox ntpdを開始しないようにFinitに指示する別の例を以下に示します。 Finitは、 syslogd /var/run/syslogd.pidでpidファイルを作成するのを待ちます。
service [2345] log <!pid/syslogd> ntpd -n -N -p pool.ntp.org
service [S12345] syslogd -n -- Syslog daemon
logキーワードに注目してください。BusyboxNTPD ntpd 、フォアグラウンドで実行されたときにロギングにstderrを使用します。 log Finitを使用して、コマンドラインlogger(1)ツールを使用して、 stdout + stderrシステムログデーモンにリダイレクトします。
サービス、またはタスクには、複数の依存関係がリストされています。ここでは、両方のsyslogdが開始し、基本的なネットワーキングが上がるのを待ちます。
service [2345] log <pid/syslogd,net/route/default> ntpd -n -N -p pool.ntp.org
いずれかの条件が失敗した場合、たとえばネットワーキングの損失、 ntpdが停止し、再び戻ってくるとすぐにntpdが自動的に再起動されます。
注:上記のOpensshの場合のように、Daemonsが制御TTY(通常は-nまたは-fフラグ、または-Dから自分自身をフォークして切り離さないようにしてください。それ自体が分離する場合、Finitはそれを監視することができず、代わりに再起動しようとします。
プロセス監督
サービスが失敗した場合は、サービスを開始、監視、再起動します。
ゲッティ
Finitは外部のゲッティをサポートしますが、非常に小さなシステムに役立つ限られた組み込みのゲッティも付属しています。ゲッティはTTYを設定し、ユーザー入力を待ち/bin/loginに引き渡す前に、実際の認証の処理を担当します。
tty [12345] /dev/tty1 nowait linux
tty [12345] /dev/ttyAMA0 noclear vt100
tty [12345] /sbin/getty -L /dev/ttyAMA0 vt100
組み込みシステムのユーザーは、特別な@consoleデバイスで自動シリアルコンソールを有効にすることをお勧めします。これは、システムがttyS0 、 ttyAMA0 、 ttyMXC0などを使用する天候に関係なく機能します。 FINITは、SYSFS: /sys/class/tty/console/activeクエリすることにより、それを把握します。
tty [12345] @console linux noclear
オプションのnoclear 、 nowait 、およびnologin Flagsに注目してください。後者は、ログインプロセスを完全にスキップするためのものです。詳細については、doc/config.mdを参照してください。
runlevels
SYSV InityスタイルのRunlevelsのサポートは、Finitの他のすべてと同じ最小限のスタイルで利用できます。 [2345]構文は、サービス、タスク、実行、およびTTYスタンザに適用できます。
予約されたランレベルは、それぞれSYSV initと同じように、それぞれ0と6、停止と再起動です。 Runlevel 1は自由に構成できますが、Finitはここでネットワークを開始しないため、システムシングルユーザーRunlevelとして保持することをお勧めします。構成されたrunlevel NUM from /etc/finit.confは、「シングル」(または「s」)がカーネルcmdlineに与えられない限り、bootstrapの後にFinitが変更するものです。
Runlevel S)のすべてのサービスが最初に開始され、その後、目的のランタイムランレベルが続きます。 run [S] cmdを使用して、Runlevel Sの実行タスクを順番に開始できます。実行時にRunlevelsを変更することは、他のinit、例えばInit 4と同様に行われますが、より高度なintictlツールも使用します。
条件
前述のように、Finitには、条件と呼ばれる同期を処理するための高度な依存関係システムがあります。多くの方法で使用できます。別のサービス、ネットワークの可用性などに依存します。
組み込みシステムに役立つ非常にクールな例の1つは、ボードにデバイスツリーにエンコードされた特定の機能がある場合、特定のスクリプトを実行することです。ブートストラップでは、次のidentスクリプトを実行します。
#! /bin/sh
conddir=/var/run/finit/cond/hw/model
dtmodel=/sys/firmware/devicetree/base/model
if ! test -e $dtmodel ; then
exit 0
fi
model= $( cat $dtmodel | tr " [A-Z] " " [a-z]- " )
mkdir -p $conddir && ln -s ../../reconf $conddir / $modelデバイスツリーノードが存在し、文字列である場合、他のスクリプトを開始するときに<hw/model/foo>を使用できます。これが例です:
run [S] /path/to/ident --
task [2] <hw/model/foo> /path/to/foo-init -- Initializing Foo board
Finit Progress Outputで
identための呼び出しを非表示にする空の説明でトリックに注目してください。
プラグイン
プラグインは、Finitとフックの機能をブートプロセスのさまざまな段階と実行時に拡張できます。プラグインはCで記述され、BootでFINITによって自動的にロードされた動的ライブラリにコンパイルされています。プラグインの基本セットは、 plugins/ディレクトリにバンドルされています。
機能:
/sbin/initシステムを開始するために必要なものに純粋に関連していない拡張と機能は、ブートプロセスに接続するか、さまざまなI/Oに応答するプラグインのセットとして利用できます。
詳細については、doc/plugins.mdを参照してください。
自動リロード
デフォルトでは、Finit Monitors /etc/finit.d/および/etc/finit.d/enabled/ .confファイルへの変更を登録します。変更をアクティブにするには、ユーザーがすべての変更されたファイルをリロードし、削除されたファイルを停止し、新しいサービスを起動し、変更されたファイルを再起動するinitctl reloadを呼び出す必要があります。サービスのコマンドライン引数が変更された場合、プロセスは終了し、更新された引数で再び開始されます。引数が変更されておらず、プロセスがSighupをサポートしている場合、プロセスは終了して開始されるのではなく、サイドアップを受け取ります。
一部のユースケースの場合、 initctl reloadを呼び出す余分なステップにより、不要なオーバーヘッドが作成されます。これは、ビルドタイムで削除できます。
configure --enable-auto-reload
cgroups
FinitはCGROUPS V2をサポートし、サービスとユーザーセッションが配置される次のデフォルトグループが付属しています。
/sys/fs/cgroup
|-- init/ # cpu.weight:100
|-- system/ # cpu.weight:9800
`-- user/ # cpu.weight:100
Finit自体とそのヘルパースクリプトとサービスは、また予約されているトップレベルのリーフノードグループinit/に配置されます。
すべての実行/タスク/サービス/SYSVプロセスは、 system/の独自のサブグループに配置されます。各サブグループの名前は、 /etc/finit.dからそれぞれの.confファイルから取得されます。
すべてのゲッティ/ TTYプロセスは、 user/に独自のサブグループに配置されます。各サブグループの名前は、ユーザー名から取得されます。
4番目のグループ、 rootグループも存在します。また、予約されており、主にRTタスクを対象としています。 RTタスクがある場合は、このようなサービスでそのように宣言する必要があります。
service [...] <...> cgroup.root /path/to/foo args -- description
または
cgroup.root
service [...] <...> /path/to/foo args -- description
service [...] <...> /path/to/bar args -- description
詳細については、グループごとの制限を構成する方法については、doc/config.mdを参照してください。
initctlツールには、cgroupのセットアップと監視をデバッグおよび最適化するのに役立つ3つのコマンドがあります。詳細については、 ps 、 top 、およびcgroupコマンドを参照してください。
注: CGROUPS、特にバージョン2をサポートしていないシステムは、自動的に検出されます。このようなシステムでは、上記の機能はブートで早期に無効になります。
ブーツの最後に、すべてのブートストラップ( S )タスクとサービスが開始されたが、ネットワーキングではなく、Finitは、構成されたrunparts <DIR>ディレクトリに組み込みのRun-Parts(8)コマンドを呼び出します。これは、構成されたRunlevel(デフォルト2)に変更する直前に発生します。 (単一のユーザーモードから変更する直前にネットワーキングが有効になります。)
runparts /etc/rc.d/すべてのサービスが適切に開始されたときにRunlevelが変更された直後、 /etc/rc.local rc.localが呼び出されます。
rc.localには/etc/finit.confの構成スタンザは必要ありません。 HOOK_SYSTEM_UPを呼び出す前に、それが存在し、実行可能なシェルスクリプトFinitがブーツの最後にそれを呼び出します。 doc/plugins.mdのフックについて詳細をご覧ください。
信号を介してFINITを呼び出したり、任意のrunpartsまたは/etc/rc.localスクリプトでinitctlを使用したりすることはできません。これは、Finitが単一のスレッドであり、Runlevel Sの終わりにこれらのスクリプトをブロックファッションで呼び出しているためです。その時点で、イベントループはまだ開始されていません。
イベントループは、Runlevel Sを除き、Finitが構築されているもの全体です。これは、多くのセットアップを通じてゆっくりとした行列であり、いくつかのフックと外部スクリプトへのコールアウトをブロックします。
ただし、すべてのinitctlコマンドが禁止されているわけではありません。サポートされているコマンド:
inictl cond : /run/finit/condinitctl enable/disable :enabled run/task/serviceがsから2へのRunlevelの変更でアクティブ化されますinitctl touch/show/create/delete/list :非対話モードを使用するとcreate 。initctl -f reboot/poweroff/halt : -fフラグを使用して直接カーネルコマンドを強制するために使用されます例: usr/条件を/etc/rc.localに設定し、Runlevel 2でサービス/タスクを実行することができます。
Runlevelsの基本的なサポートは、v1.8のFinitに含まれています。デフォルトでは、すべてのサービス、タスク、実行コマンド、およびRunlevelsのセットなしでリストされているTTYSは、デフォルトセット[234]を割り当てます。ブーツ後のデフォルトのrunlevelは2です。
Finitは、halt halt、6 Reboot、およびSがBootstrapでのみ実行されるために0個のRunlevels 0-9およびSをサポートします。 Runlevel 1は単一のユーザーレベルで、通常はネットワークが有効になっていません。 Finitでは、これはユーザーが定義するポリシーです。通常、Runlevels 1-6のみが使用され、さらに一般的には、デフォルトのRunlevelのみが使用されます。
service 、 runコマンド、 task 、またはttyに許可されているRunlevelsのセットを指定するには、 [NNN]を/etc/finit.confに追加します。
service [S12345] syslogd -n -x -- System log daemon
run [S] /etc/init.d/acpid start -- Starting ACPI Daemon
task [S] /etc/init.d/kbd start -- Preparing console
service [S12345] <pid/syslogd> klogd -n -x -- Kernel log daemon
tty [12345] /dev/tty1
tty [2] /dev/tty2
tty [2] /dev/tty3
tty [2] /dev/tty4
tty [2] /dev/tty5
tty [2] /dev/tty6
この例では、syslogdが最初に並行して開始され、その後、従来のSYSV initスクリプトを使用してACPIDが呼び出されます。実行コマンドで呼び出されます。つまり、KBDスクリプトを開始するための次のタスクコマンドは、ACPID INITスクリプトが完全に完了するまで呼び出されません。次に、キーボードセットアップスクリプトは、監視対象のサービスとしてKlogdと並行して呼び出されます。
繰り返しますが、タスクとサービスは並行して開始されますが、実行コマンドはリストされた順序で呼び出され、その後のコマンドは実行コマンドが完了するまで開始されません。また、タスクと実行コマンドはシェルで実行されるため、パイプとリダイレクトを使用できます。
次の例はこれを示しています。 Bootstrapタスクと実行コマンドも完了したときに削除されます。InitCtlShow initctl showそれらをリストしません。
task [S] echo "foo" | cat >/tmp/bar
run [S] echo "$HOME" >/tmp/secret
Runlevelsを切り替えることは、 Init 5 、またはinitctl runlevel 5単一の引数で呼び出すことで実行できます。どちらもRunlevel 5に切り替えます。RunlevelsFinitを変更すると、 /etc/finit.d/ finit.d/ディレクトリのすべての.confファイルも自動的にリロードします。したがって、新しいシステム構成を設定する場合は、Runlevel 1に切り替え、システム内のすべての構成ファイルを変更し、以前のRunlevelに戻す前に/etc/finit.dのすべての.confファイルをタッチします。
伝統的に、UNIXシステムの再起動と停止は、Runlevelを変更することで行われます。 FINITには、 shutdown 、 reboot 、 poweroff 、 suspendなどの独自のツールが付属していますが、次のセクションで詳述されているinitctlツールも付属しています。
互換性の理由から、FinitはBusybox initと同じ信号セットに耳を傾けます。これは、SYSV initと100%互換性がありませんが、明らかにFinitのより一般的な組み合わせです。詳細については、doc/signals.mdを参照してください。
また、Finitは最新のAPIをステータスをクエリに照会し、 initctlと呼ばれるサービスを開始/停止します。 telinitとは異なり、 initctlツールは、指定されたコマンドが完全に完了するまで戻りません。
Usage: initctl [OPTIONS] [COMMAND]
Options:
-b, --batch Batch mode, no screen size probing
-c, --create Create missing paths (and files) as needed
-f, --force Ignore missing files and arguments, never prompt
-h, --help This help text
-j, --json JSON output in 'status' and 'cond' commands
-1, --once Only one lap in commands like 'top'
-p, --plain Use plain table headings, no ctrl chars
-q, --quiet Silent, only return status of command
-t, --no-heading Skip table headings
-v, --verbose Verbose output
-V, --version Show program version
Commands:
debug Toggle Finit (daemon) debug
help This help text
version Show program version
ls | list List all .conf in /etc/finit.d
create <CONF> Create .conf in /etc/finit.d/available
delete <CONF> Delete .conf in /etc/finit.d/available
show <CONF> Show .conf in /etc/finit.d/available
edit <CONF> Edit .conf in /etc/finit.d/available
touch <CONF> Change .conf in /etc/finit.d/available
enable <CONF> Enable .conf in /etc/finit.d/available
disable <CONF> Disable .conf in /etc/finit.d/enabled
reload Reload *.conf in /etc/finit.d (activate changes)
cond set <COND> Set (assert) user-defined conditions +usr/COND
cond get <COND> Get status of user-defined condition, see $? and -v
cond clear <COND> Clear (deassert) user-defined conditions -usr/COND
cond status Show condition status, default cond command
cond dump [TYPE] Dump all, or a type of, conditions and their status
log [NAME] Show ten last Finit, or NAME, messages from syslog
start <NAME>[:ID] Start service by name, with optional ID
stop <NAME>[:ID] Stop/Pause a running service by name
reload <NAME>[:ID] Reload service as if .conf changed (SIGHUP or restart)
This allows restart of run/tasks that have already run
Note: Finit .conf file(s) are *not* reloaded!
restart <NAME>[:ID] Restart (stop/start) service by name
signal <NAME>[:ID] <S> Send signal S to service by name, with optional ID
ident [NAME] Show matching identities for NAME, or all
status <NAME>[:ID] Show service status, by name
status Show status of services, default command
cgroup List cgroup config overview
ps List processes based on cgroups
top Show top-like listing based on cgroups
plugins List installed plugins
runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot
reboot Reboot system
halt Halt system
poweroff Halt and power off system
suspend Suspend system
utmp show Raw dump of UTMP/WTMP db
SIGHUP reloadしていないサービスrunlevel場合、.confファイルの<!> <>より多くの条件を保持すると、これらはサービスの維持方法にも影響します。
注:現在のRunlevelに属していないサービスを開始することは可能ですが、これらのサービスは、退出(クラッシュ)の場合、Finitによって自動的に補助されません。したがって、Runlevelが2の場合、下のDropbear SSHサービスが殺害されたり、出口が出たりした場合、再起動しません。
statusコマンドはデフォルトで、監視されているすべての実行/タスク/サービスの概要を簡単に表示します。ここでは、スクリプトとドキュメントに適したinitctl -pを呼び出します。
alpine:~# initctl -p
PID IDENT STATUS RUNLEVELS DESCRIPTION
======================================================================
1506 acpid running [---2345----] ACPI daemon
1509 crond running [---2345----] Cron daemon
1489 dropbear running [---2345----] Dropbear SSH daemon
1511 klogd running [S-12345----] Kernel log daemon
1512 ntpd running [---2345----] NTP daemon
1473 syslogd running [S-12345----] Syslog daemon
alpine:~# initctl -pv
PID IDENT STATUS RUNLEVELS COMMAND
======================================================================
1506 acpid running [---2345----] acpid -f
1509 crond running [---2345----] crond -f -S $CRON_OPTS
1489 dropbear running [---2345----] dropbear -R -F $DROPBEAR_OPTS
1511 klogd running [S-12345----] klogd -n $KLOGD_OPTS
1512 ntpd running [---2345----] ntpd -n $NTPD_OPTS
1473 syslogd running [S-12345----] syslogd -n
上記の各サービスの環境変数は、Alpine Linux、 /etc/conf.d/ conf.d/の場合に読まれます。その他のディストリビューションには、他のディレクトリなど、Debian使用/etc/default/があります。
statusコマンドはオプションのNAME:ID引数。ここでは、このシステムに1つのインスタンスしかないdropbearのステータスを確認します。
alpine:~# initctl -p status dropbear
Status : running
Identity : dropbear
Description : Dropbear SSH daemon
Origin : /etc/finit.d/enabled/dropbear.conf
Environment : -/etc/conf.d/dropbear
Condition(s):
Command : dropbear -R -F $DROPBEAR_OPTS
PID file : !/run/dropbear.pid
PID : 1485
User : root
Group : root
Uptime : 2 hour 46 min 56 sec
Runlevels : [---2345----]
Memory : 1.2M
CGroup : /system/dropbear cpu 0 [100, max] mem [--.--, max]
|- 1485 dropbear -R -F
|- 2634 dropbear -R -F
|- 2635 ash
`- 2652 initctl -p status dropbear
Apr 8 12:19:49 alpine authpriv.info dropbear[1485]: Not backgrounding
Apr 8 12:37:45 alpine authpriv.info dropbear[2300]: Child connection from 192.168.121.1:47834
Apr 8 12:37:46 alpine authpriv.notice dropbear[2300]: Password auth succeeded for 'root' from 192.168.121.1:47834
Apr 8 12:37:46 alpine authpriv.info dropbear[2300]: Exit (root) from <192.168.121.1:47834>: Disconnect received
Apr 8 15:02:11 alpine authpriv.info dropbear[2634]: Child connection from 192.168.121.1:48576
Apr 8 15:02:12 alpine authpriv.notice dropbear[2634]: Password auth succeeded for 'root' from 192.168.121.1:48576
FINITは、通常、Busybox MDEVに付属するUDEVと組み込みシステムを備えたデスクトップ/サーバーシステムの両方で実行できます。一部のシステムには、元のUDEVの代わりにSystemD-UDEVまたはEUDEVがあり、実行時にすべてのFINITプローブを使用しており、 /dev/ devtmpfs使用してWRIBOLITIONファイルシステムになることを期待しています。必要に応じて、静的にセットアップ/devで実行することもできます。ただし、UDEVとMDEVの両方を同時にインストールすることをお勧めします。これにより、予測不可能な結果が得られます。
Boot Finitでmdevまたはudevdいずれかを呼び出して/dev開発すると、これはわずかに異なって行われます。UDEVを使用してシステムでは、 /etc/finit.confの早い段階で次のワンショットタスクを追加することができます。
run [S] udevadm settle --timeout=120 -- Waiting for udev
FinitにはTTYS用のGettyが組み込まれていますが、 /etc/finit.confでTTYが構成されていない場合、作業/bin/loginまたは/bin/shが必要です。
完全に動作するシステム/var 、 /runおよび/tmpの場合/etc/fstabで適切にセットアップする必要があります。これはブートで繰り返されます。
このプロジェクトは、eepc FastinitのSyscallsからリバースエンジニアリングされたClaudio MatsuokaによるオリジナルのFinitに基づいています - 「カエルDNAで満たされたギャップ…」
Finitは、GithubのJoachim Wibergによって開発および維持されています。バグレポートを提出したり、クローンを付けたり、バグ修正と提案された拡張機能のプルリクエストを送信したりしてください。