本バージョンの LFS では SysVinit という特別なブート機能を利用しており、ランレベル (run-levels) という考え方に基づいています。 ブート処理はシステムによって大きく異なります。 つまり特定の Linux ディストリビューションにおける 1 つの処理方法がうまく動作しているからといって、LFS においても全く同じように動くわけではありません。 LFS では独自の方法でこれを取り入れることにします。 ただし標準として受け入れられるような方法を取ります。
ブート処理の別方法として systemd があります。 ここではブート処理に関して、これ以上のことを述べません。 詳しくは https://www.linux.com/training-tutorials/understanding-and-using-systemd/ を参照してください。
SysVinit (これ以降は「init」と表現します) はランレベルという仕組みを利用しています。 ランレベルには 7
つのレベル、0 から 6 があります。 (実際にはランレベルはそれ以上あるのですが、特殊な場合であって普通は利用されません。 詳しくは
init(8)
を参照してください。)
各レベルは、コンピューターの起動時や終了時における処理動作に対応づいており、デフォルトのランレベルは 3 となっています。 LFS
において実装されるランレベルの詳細を以下に説明します。
0: コンピューターの停止
1: シングルユーザーモード
2: 拡張用として予約されています。 拡張がなければ 3 と同じです。
3: マルチユーザーモード、ネットワークあり
4: 拡張用として予約されています。 拡張がなければ 3 と同じです。
5: 4 と同様。通常 (GNOME の gdm や LXDE の lxdm のような) GUI ログインに用いられます。
6: コンピューターの再起動
従来より、上のランレベル 2 は「ネットワークなしにおけるマルチユーザーモード」として定義されていました。 ただしこれは相当以前の話として、シリアルポートを介して複数ユーザーがシステムにログインするケースだけを表しています。 今日のコンピューター環境においてこれは意味をなしません。 そこでここでは「拡張用の予約」としています。
カーネルの初期化にあたって最初に起動するプログラムは(コマンドラインから指定されていなければ)init です。 このプログラムは初期設定ファイル
/etc/inittab
を読み込みます。
そのファイルは以下のようにして生成します。
cat > /etc/inittab << "EOF"
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc S
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S06:once:/sbin/sulogin
s1:1:respawn:/sbin/sulogin
1:2345:respawn:/sbin/agetty --noclear tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
EOF
この初期化ファイルに関することは inittab の
man ページにて説明されています。 LFS において重要となるコマンドは rc です。 初期化ファイルは rc コマンドに対してスクリプトの実行を指示します。
実行されるスクリプトは /etc/rc.d/rcS.d
ディレクトリにて
S で始まるスクリプトです。 そしてその後に /etc/rc.d/rc?.d
ディレクトリにて、同じく S で始まるスクリプトも実行されます。
ここで ? は、初期化を行う際の数値を示します。
扱いやすさを考慮して、rc スクリプトは
/lib/lsb/init-functions
ディレクトリにあるライブラリ群を読み込む形にしています。 このライブラリは、さらにオプションで設定ファイル /etc/sysconfig/rc.site
を読み込みます。
本節以降に説明している、各種の設定パラメーターは、上のファイルにて設定することもできます。
上のファイルは、システム上のパラメーターを1つのファイルに集約して設定できるようになっています。
デバッグがしやすいように、各ライブラリの関数スクリプトは、すべて /run/var/bootlog
にログを出力するようになっています。 /run
ディレクトリは tmpfs であることから、/run/var/bootlog
ファイルはブート前後にて恒常的なファイルではありません。
ただしブート処理の最後には、恒常的なファイルである /var/log/boot.log
に情報が出力されます。
ランレベルを変更するには init <runlevel>
を実行します。 <runlevel>
はランレベルを示す数字です。
例えばコンピューターを再起動するには init
6 コマンドを実行します。 これは reboot コマンドのエイリアスとなっています。 同様に
init 0 は
halt のエイリアスです。
/etc/rc.d
ディレクトリの配下には複数のサブディレクトリがあります。 そのディレクトリ名は rc?.d
のようになっています。 (? はランレベルの数字を表します。) また
rcS.d
というサブディレクトリもあります。
それらサブディレクトリ内には数多くのシンボリックリンクがあります。 シンボリックリンクの先頭一文字には K や S が用いられ、続いて二桁の数値文字がつけられています。 K
はサービスの停止 (kill)、S はサービスの起動 (start) を意味します。
二桁の数字はスクリプトの起動順を定めるもので、00 から 99 までが割振られ、小さな数字から順に実行されます。
init
コマンドによってランレベルが変更される時は、そのランレベルに応じて必要なサービスが起動するか停止することになります。
スクリプトファイルは /etc/rc.d/init.d
ディレクトリにあります。 実際の処理はここにあるファイルが用いられます。 これらに対してはシンボリックリンクが用意されています。
サービスの起動 (S で始まる) と停止 (K で始まる) を行うシンボリックリンクは /etc/rc.d/init.d
ディレクトリにあるスクリプトを指し示しています。
このようにしているのは、各スクリプトが start
、 stop
、 restart
、 reload
、 status
といったさまざまなパラメーターにより呼び出されるためです。 K の名前を持つシンボリックリンクが起動されるということは
stop
パラメーターをつけて該当するスクリプトが実行されるということです。 同様に S
の名前を持つシンボリックリンクが起動されるということは start
パラメーターをつけて呼び出されるということになります。
スクリプトに対するパラメーターは以下のとおりです。
start
サービスを起動します。
stop
サービスを停止します。
restart
サービスをいったん停止し再起動します。
reload
サービスの設定ファイルを更新します。 設定ファイルが変更されたものの、サービスの再起動は必要ではない場合に利用します。
status
サービスがどの PID 値で動いているかを表示します。
ブート機能を動作させる方法は自由に取り決めて設定して構いません。 このシステムはつまるところあなた自身のシステムだからです。 上に示したファイル類はブート機能を定めた一例に過ぎません。
初期起動スクリプト /etc/rc.d/init.d/udev
は
udevd
を起動し、カーネルにより既に生成されている "コールドプラグ" のデバイスをすべて稼動させます。
そしてすべてのルールが起動完了するのを待ちます。 このスクリプトは /sbin/hotplug
のデフォルトから uevent ハンドラーを取り除きます。
この時点でカーネルは、他の実行モジュールを呼び出す必要がないからです。 そのかわりに、udevdは、カーネルが起動する uevent
をネットリンクソケット (netlink socket) 上で待ち受けます。
/etc/rc.d/init.d/udev_retry
スクリプトは、サブシステムに対するイベントの再起動を行ないます。
そのサブシステムとはファイルシステムに依存するもので、mountfs が実行されるまでマウントされません。 (特に
/usr
や /var
がこれに該当します。) mountfs
スクリプトの後にこのスクリプトが実行されるので、(イベントが再起動されるものであれば) 二度目には成功します。 このスクリプトは
/etc/sysconfig/udev_retry
ファイルにより設定が可能で、コメントを除く記述項目はすべてサブシステム名を表わし、二度目の起動時のリトライ対象となります。
(デバイスのサブシステムを知るには udevadm info
--attribute-walk <device> を実行します。 ここで
<device> は、/dev や /sys から始まる絶対パスであり /dev/sr0 や /sys/class/rtc
などを表します。)
カーネルモジュールのロードや udev に関しては 「モジュールのロード」 を参照してください。
setclock
スクリプトはハードウェアクロックから時刻を読み取ります。 ハードウェアクロックは BIOS クロック、あるいは CMOS
(Complementary Metal Oxide Semiconductor) クロックとしても知られているものです。
ハードウェアクロックが UTC に設定されていると setclock スクリプトは /etc/localtime
ファイルを参照して、ハードウェアクロックの示す時刻をローカル時刻に変換します。 /etc/localtime
ファイルは hwclock
プログラムに対して、ユーザーがどのタイムゾーンを利用するかを伝えます。 ハードウェアクロックが UTC
に設定されているかどうかを知る方法はないので、手動で設定を行う必要があります。
setclock スクリプトは udev によって起動されます。この時というのはブート時であり、カーネルがハードウェアを検出する時です。 停止パラメータを与えて手動でこのスクリプトを実行することもできます。 その場合 CMOS クロックに対してシステム時刻が保存されます。
ハードウェアクロックが UTC に設定されているかどうか忘れた場合は hwclock --localtime --show
を実行すれば確認できます。 このコマンドにより、ハードウェアクロックに基づいた現在時刻が表示されます。
その時刻が手元の時計と同じ時刻であれば、ローカル時刻として設定されているわけです。 一方それがローカル時刻でなかった場合は、おそらくは
UTC に設定されているからでしょう。 hwclock
によって示された時刻からタイムゾーンに応じた一定時間を加減してみてください。 例えばタイムゾーンが MST であった場合、これは
GMT -0700 なので、7時間を加えればローカル時刻となります。
ハードウェアクロックが UTC 時刻として設定されていない場合は、以下に示す変数 UTC
の値を 0
(ゼロ) にしてください。
以下のコマンドを実行して /etc/sysconfig/clock
ファイルを新規に作成します。
cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock
UTC=1
# Set this to any options you might need to give to hwclock,
# such as machine hardware clock type for Alphas.
CLOCKPARAMS=
# End /etc/sysconfig/clock
EOF
LFS において時刻の取り扱い方を示した分かりやすいヒントが https://www.linuxfromscratch.org/hints/downloads/files/time.txt
にあります。 そこではタイムゾーン、UTC、環境変数 TZ
などについて説明しています。
CLOCKPARAMS と UTC パラメーターは /etc/sysconfig/rc.site
ファイルにて設定することもできます。
この節ではブートスクリプト console
の設定方法について説明します。 このスクリプトはキーボードマップ、コンソールフォント、カーネルログレベルを設定します。 非アスキー文字
(例えば著作権、ポンド記号、ユーロ記号など) を使わず、キーボードが US 配列であるなら、本節は読み飛ばしてください。
console
ブートスクリプトの設定ファイルが存在しない場合 (あるいはこれと同等の設定が rc.site
にない場合) は、このスクリプトは何も行いません。
console スクリプトは、設定情報を
/etc/sysconfig/console
ファイルから読み込みます。
まずは利用するキーボードマップとスクリーンフォントを定めます。 さまざまな言語に応じた設定方法については https://tldp.org/HOWTO/HOWTO-INDEX/other-lang.html
を参照してください。 よく分からない場合は /usr/share/keymaps
ディレクトリや /usr/share/consolefonts
ディレクトリを見て、正しいキーマップとスクリーンフォントを探してください。 マニュアルページ loadkeys(1)
と setfont(8)
を見て、これらのプログラムに対する適切な引数を決定してください。
/etc/sysconfig/console
ファイルの各行には、変数 =
"値" という記述を行います。 そして変数には以下に示すものが利用可能です。
この変数は、コンソールに出力されるカーネルメッセージのログレベルを指定するもので dmesg -n コマンドにより設定されます。 有効な設定値は "1" (メッセージ出力なし) から "8" まであり、デフォルトは "7" です。
この変数は loadkeys プログラムに対する引数を指定します。 このプログラムは「it」などのキーマップをロードします。 この変数がセットされていない場合、ブートスクリプトは loadkeys プログラムを実行せず、デフォルトのカーネルキーマップが用いられます。 キーマップによっては同一名に対して重複した定義を持つものもあります。 (cz とその変形が qwerty/ と qwertz/ にあり、es は olpc/ と qwerty/ に、trf は fgGIod/ と qwerty/ にあります) こういった場合には、適切なキーマップがロードされるように、親ディレクトリを必ず指定する必要があります (qwerty/es など)。
この変数は (あまり利用されませんが) loadkeys プログラムを二度目に呼び出す際の引数を指定します。 普通のキーマップでは十分な設定にならない時の微調整を行うために利用します。 例えばユーロ記号がキーマップの中に含まれておらずこれを付け加える場合には、この変数に対して「euro2」を設定します。
この変数は setfont プログラムへの引数を指定します。 一般にこの変数にはフォント名、「-m」、アプリケーションキャラクターマップ (application character map) を順に指定します。 例えばフォントとして 「lat1-16」、アプリケーションキャラクターマップとして「8859-1」を指定する場合、この変数には「lat1-16 -m 8859-1」を設定します。 (これは米国にて適当な設定となります。) UTF-8 モードの場合、カーネルは UTF-8 キーマップ内の 8 ビットキーコードを変換するためにアプリケーションキャラクターマップを利用します。 したがって "-m" パラメーターには、キーマップ内キーコードのエンコーディングを指定する必要があります。
コンソールを UTF-8 モードにするには、この変数を「1」、「yes」、「true」のいずれかに指定します。 UTF-8 ベースのロケールであればこの設定を行います。 そうでないロケールにおいて設定するのは不適切です。
キーボードレイアウトの多くに対して、Kbd パッケージは標準的な Unicode キーマップを提供していません。 この変数にて UTF-8 ではないキーマップのエンコーディングが指定されていたら console ブートスクリプトは利用可能な UTF-8 キーマップに変換します。
以下はいくつかの設定例です。
Unicode を用いない設定では、普通は KEYMAP 変数と FONT 変数のみを定めます。 例えばポーランド語の設定であれば以下のようになります。
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
KEYMAP="pl2"
FONT="lat2a-16 -m 8859-2"
# End /etc/sysconfig/console
EOF
上で述べたように、普通のキーマップの設定に対して多少の修正を必要とする場合もあります。 以下の例はドイツ語のキーマップにユーロ記号を加える例です。
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
FONT="lat0-16 -m 8859-15"
UNICODE="1"
# End /etc/sysconfig/console
EOF
以下は Unicode を用いたブルガリア語の設定例です。 通常のキーマップが存在しているものと仮定しています。
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="bg_bds-utf8"
FONT="LatArCyrHeb-16"
# End /etc/sysconfig/console
EOF
上の例においては 512 個のグリフを持つ LatArCyrHeb-16 フォントを利用しています。 この場合、フレームバッファーを利用していなければ Linux コンソール上に鮮やかな色づけを行うことは出来なくなります。 フレームバッファーがない状態で文字フォントを変更することなく色づけを適切に行いたい場合は、以下に示すように 256 個のグリフを持った、この言語に固有のフォントを用いる方法もあります。
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="bg_bds-utf8"
FONT="cyr-sun16"
# End /etc/sysconfig/console
EOF
以下の例では ISO-8859-15 から UTF-8 へのキーマップ変換の自動化 (keymap autoconversion) を指定し、Unicode におけるデッドキー (dead keys) を有効にするものです。
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
LEGACY_CHARSET="iso-8859-15"
FONT="LatArCyrHeb-16 -m 8859-15"
# End /etc/sysconfig/console
EOF
キーマップにデッドキー (dead keys) を持つものがあります。 そのキー自身は文字を意味するものではなく、次のキー入力による文字に対するアクセント記号をつける目的のものなどです。 または複合的な入力規則を定義するもの、例えば「Ctrl+.、A、E を入力することで Æ を得るもの」があります。 Linux-6.4.12 ではキーマップに応じてデッドキーや複合的な入力規則を解釈します。 ただしこれが正しく動作するのは、元の文字がマルチバイトではない場合に限ります。 このような欠点は西欧のキーマップでは問題にはなりません。 アクセント記号なら、アクセント記号がついていない ASCII 文字を使ったり、ASCII 文字を二つ使って工夫したりするからです。 しかし UTF-8 モードでは問題になります。 例えばギリシャ語にて「alpha」の文字の上にアクセント記号を付けたい場合が問題です。 これを解決するには、一つには UTF-8 の利用を諦めることであり、もう一つは X ウィンドウシステムを使うことで、そのような入力処理の制約を解消することです。
中国語、日本語、韓国語などを利用する場合 Linux コンソールにはそれらの文字を表示できません。 この言語を利用するユーザーは X ウィンドウシステムを使ってください。 そこで用いるフォントは、必要となるコード範囲の文字を有しており、入力メソッドも用意されています。(例えば SCIM は数多くの言語入力をサポートしています。)
/etc/sysconfig/console
ファイルは Linux
のテキストコンソール上の言語設定を行うだけです。 X ウィンドウシステム、SSH
セッション、シリアルコンソールでのキーボードレイアウトや端末フォントの設定とは無関係です。
それらに対しては、上に列記した最後の二項目における制約は適用されません。
ブート時にファイルを生成したいときがあります。 例えば /tmp/.ICE-unix
ディレクトリが必要であったとします。 これは
/etc/sysconfig/createfiles
スクリプトに設定を行うことで実現できます。
このファイルの書式は、デフォルト設定ファイル内にコメントとして埋め込まれているので参照してください。
sysklogd
スクリプトは System V の一連の初期化に際して
syslogd プログラムを起動します。
オプション -m 0
により実行され、syslogd
がデフォルトで 20分おきにログファイルに対して周期的にタイムスタンプを書き込む機能を無効にします。 この機能を有効にしたい場合は
/etc/sysconfig/rc.site
ファイルを新たに作るか既存のものを編集して、SYSKLOGD_PARMS 変数を必要な値に設定してください。
例えばすべてのパラメーターを無効にする場合は、変数値をヌル値とします。
SYSKLOGD_PARMS=
詳しくは man syslogd
を入力して man ページを参照してください。
オプションファイル /etc/sysconfig/rc.site
は、System V の各ブートスクリプトにて自動的に設定される内容を含んでいます。 /etc/sysconfig/
ディレクトリにおける hostname
, console
,
clock
の各ファイルにて値の設定を行うこともできます。
関係する変数が、これらのファイルと rc.site
の双方に存在する場合、スクリプトにて指定されたファイル内の値が優先されます。
rc.site
では、起動時におけるその他の機能をカスタマイズするためのパラメーターも含まれています。 変数 IPROMPT
を設定すると、起動するブートスクリプトを選択することができます。
この他のオプションについては、このファイル内にてコメントとして記述されています。 このファイルのデフォルト版は以下のとおりです。
# rc.site # Optional parameters for boot scripts. # Distro Information # These values, if specified here, override the defaults #DISTRO="Linux From Scratch" # The distro name #DISTRO_CONTACT="lfs-dev@lists.linuxfromscratch.org" # Bug report address #DISTRO_MINI="LFS" # Short name used in filenames for distro config # Define custom colors used in messages printed to the screen # Please consult `man console_codes` for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles # These values, if specified here, override the defaults #BRACKET="\\033[1;34m" # Blue #FAILURE="\\033[1;31m" # Red #INFO="\\033[1;36m" # Cyan #NORMAL="\\033[0;39m" # Grey #SUCCESS="\\033[1;32m" # Green #WARNING="\\033[1;33m" # Yellow # Use a colored prefix # These values, if specified here, override the defaults #BMPREFIX=" " #SUCCESS_PREFIX="${SUCCESS} * ${NORMAL} " #FAILURE_PREFIX="${FAILURE}*****${NORMAL} " #WARNING_PREFIX="${WARNING} *** ${NORMAL} " # Manually set the right edge of message output (characters) # Useful when resetting console font during boot to override # automatic screen width detection #COLUMNS=120 # Interactive startup #IPROMPT="yes" # Whether to display the interactive boot prompt #itime="3" # The amount of time (in seconds) to display the prompt # The total length of the distro welcome string, without escape codes #wlen=$(echo "Welcome to ${DISTRO}" | wc -c ) #welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}" # The total length of the interactive string, without escape codes #ilen=$(echo "Press 'I' to enter interactive startup" | wc -c ) #i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup" # Set scripts to skip the file system check on reboot #FASTBOOT=yes # Skip reading from the console #HEADLESS=yes # Write out fsck progress if yes #VERBOSE_FSCK=no # Speed up boot without waiting for settle in udev #OMIT_UDEV_SETTLE=y # Speed up boot without waiting for settle in udev_retry #OMIT_UDEV_RETRY_SETTLE=yes # Skip cleaning /tmp if yes #SKIPTMPCLEAN=no # For setclock #UTC=1 #CLOCKPARAMS= # For consolelog (Note that the default, 7=debug, is noisy) #LOGLEVEL=7 # For network #HOSTNAME=mylfs # Delay between TERM and KILL signals at shutdown #KILLDELAY=3 # Optional sysklogd parameters #SYSKLOGD_PARMS="-m 0" # Console parameters #UNICODE=1 #KEYMAP="de-latin1" #KEYMAP_CORRECTIONS="euro2" #FONT="lat0-16 -m 8859-15" #LEGACY_CHARSET=
LFS のブートスクリプト類により、システムの起動および終了が適正に行われます。 ただし rc.site
ファイルにおいては改善の余地があって、処理性能を向上させたり出力メッセージを調整したりすることができます。
種々の設定は、上に示した /etc/sysconfig/rc.site
ファイルへの変更により実現します。
ブートスクリプト udev
の起動中には
udev settle
の呼び出しが行われます。
ただこの呼び出しは特定の場合において必要となるものであり、それはシステム上に存在するデバイスに依存します。
単純なパーティション設定を行っていて、またイーサネットカードを1つのみ利用している場合には、ブート時に上のコマンドを実行する必要はないかもしれません。
このコマンドの実行をスキップする場合は、変数の設定として OMIT_UDEV_SETTLE=y を記述します。
ブートスクリプト udev_retry
も同様に
udev settle
を実行します。 このコマンドはデフォルトでは、/var
ディレクトリが個別にマウントされている時にのみ必要となります。 それはクロックが /var/lib/hwclock/adjtime
ファイルを必要とするためです。
これ以外にも udev の処理を待つことが必要になるケースがありますが、本当に必要になることはまれです。
変数の設定として OMIT_UDEV_RETRY_SETTLE=y を行えば、コマンドをスキップすることができます。
デフォルトにおいてファイルシステムのチェックは、何も表示されることなく処理が行われるので、処理が遅延して行われているかのように見えます。 fsck による出力を有効とするには、変数の設定を VERBOSE_FSCK=y とします。
再起動時にはファイルシステムのチェック、つまり fsck
の実行を完全に行う必要はないと考えられる場合もあります。 そうであるなら、ファイル /fastboot
を生成するか、/sbin/shutdown -f -r now
というコマンドを実行します。 一方、ファイルシステムのチェックを必ず行うのであれば、ファイル /forcefsck
を生成するか、shutdown コマンドの実行において
-f
ではなく -F
というパラメーターをつける方法があります。
変数の設定として FASTBOOT=y を行えば、ブート時において fsck を実行しないようにすることができます。 この設定を恒常的に行うことは推奨されません。
通常 /tmp
ディレクトリ内にあるファイルは、ブート時にすべて削除されます。
ファイル数やディレクトリ数が膨大になっていた場合は、ブート処理が極端に時間を要することにもなります。 変数の設定
SKIPTMPCLEAN=y を行うと、ファイルの削除が行われなくなります。
シャットダウン時には init プログラムが稼働中のプログラム (agetty など) に対して TERM シグナルを送信し、一定時間 (デフォルトでは3秒) 待ちます。 そして各プロセスに対して KILL シグナルを送信して再度待ちます。 各プロセスが自身のスクリプト内にてシャットダウンしないようであれば sendsignals スクリプトにて上の処理が繰り返されます。 init が起動するまでの時間は、パラメーターにより制御することができます。 例えば init の遅延を無くす場合は、シャットダウンまたはリブート時のコマンドに -t0 パラメーターを与えます。 (つまり /sbin/shutdown -t0 -r now といったコマンド実行とします。) sendsignals スクリプトの遅延を無くすには、パラメーターの設定を KILLDELAY=0 とします。