更新:記事とスクリプトは2013年3月に更新されました(5年が経過し、古いスクリプトは現在のものと大差ありませんが、現在のコードを調査する方が良いです。また、システムブートロジックは長年にわたって少し変更されました。 devtmpfsのように、
/var/run
は
/run
などに移動しました。
Linuxをマスターしたとき、システムのブート時に何が起こるかに非常に興味がありました。 ブートプロセスを理解しようとすると、ブートスクリプト(
/etc/inittab, /etc/rc*, /etc/init.d/*, ...
/etc/sysconfig/*, /etc/cond.f/*, ...
/etc/inittab, /etc/rc*, /etc/init.d/*, ...
)とその構成(
/etc/sysconfig/*, /etc/cond.f/*, ...
)。 これらのスクリプトの深刻なサイズと複雑さに注目する価値があります-それらを理解するのに多くの時間がかかりました。 しかし当時は、ダウンロードは複雑なプロセスであり、ブートスクリプトのサイズと複雑さは正当であると私は心から信じていました。
RedHatがついに私を獲得した(2001年)とき、
LFSベースのディストリビューションを構築することにしました。 私のディストリビューションでは、ブートスクリプトを自分で開発する必要があり、その後、真実が明らかになりました。ブートプロセスに複雑なものはありません。
私のディストリビューション(PoWeR Linux)で2.5年間働いた後、Gentooに移行しました(質の高いサポートを提供するのに十分な時間がなかっただけです)。 Gentooブートスクリプトを学んだ後、私はぞっとしました! それらのサイズと複雑さは、古いRedHatよりもさらに大きかったです。 詳細な調査の後、理由が明らかになりました。LiveCDと通常のシステムの両方に同じブートスクリプトのセットが使用されました。 そこで、Gentooに切り替えたときに、PoWeR Linuxからブートスクリプトを使用し、標準のGentooスクリプトを使用しないことにしました(つまり、GentooのPortageのみを使用します)。 それから、さらに4年間、これらのスクリプトは自宅のワークステーションと多数のリモートサーバーで機能していました。
特徴
スクリプトのサイズ(すべて合わせて)は308行、8 KBです。 $ wc 1 3 lib.sh 201 769 5855 1 78 272 1726 3 29 118 771 lib.sh 308 1159 8352
短所:
- すべて1つのファイルで -アプリケーションを更新するとき、このアプリケーションの初期化コードを自動的に更新することはほとんど不可能です。 たとえば、ALSAが更新されると、パッケージは
/etc/init.d/alsasound, /etc/conf.d/alsasound, /etc/modules.d/alsa
ファイルを単純に置き換える場合があります。 そして私の場合、管理者はペンで/etc/runit/1
を編集する必要があります。 - 世界のすべてをサポートするものはありません。 たとえば、私はRAIDとLVMを使用していません。したがって、コマンドを追加して自分で初期化する必要があります。
- これらのスクリプトを個別にサポートする必要があります。 Gentooを更新するとき、私は通常(未使用の)
/etc/init.d/*
スクリプトの変更を調べ、何か重要な変更があればスクリプトを更新します。 しかし、実際には、このような変更の必要性は約2年ごとに発生します。
長所:
- すべて1つの小さなファイルで -必要なものを設定するためのスクリプトとその設定を探す必要はありません。 システムのすべての基本設定をすばやく簡単に確認できます。
- 私と私の友人が11.5 年間自宅のコンピューターとサーバーで必要としていたすべてのサポートがあります。
- Linux初期化プロセスの調査に最適です。 実際の基本的なLinuxコマンドを使用します。これは、すべてのディストリビューションで同じであり、ディストリビューション固有のスクリプトや構成ではありません。
- システムの読み込みを高速化します。 私のホームマシンは、 11秒でシングルユーザーモード(getty、syslog、klog、acpid、dnscache、tinydns、gpmを備えた6つのコンソール)でロードされます。 initngスタイルで並列ロードを試しました-スクリプトの複雑さと不要なプロセスの生成のため、効果はかなりマイナスです。 Initngは、多くの不要なアクションを実行する従来の肥大化したスクリプトの読み込みを高速化するのに適しています。私の場合、高速化するものは何もありません。 :)
サイズが小さいにもかかわらず、これらのスクリプトはシステムを確実かつ迅速にロードするだけでなく、管理者の生活を楽にするいくつかの機能もサポートしています。
- 実行可能なコマンドは、タイプごとにブロックにグループ化されます。 ブートプロセス中に、ブロックの名前が表示され、ブロックコマンドの実行時にエラーが発生したかどうかの情報が表示されます。
- コマンドブロックの実行中にエラーが発生した場合、詳細な情報がこのブロックのコマンドと発生したエラーに表示されます。その後、システムは、bashを開始してエラーを手動で修正するためにボタンが押されるまで5秒間待機します。 bashを終了した後、ロードを続行するかリブートすることをお勧めします。 何もクリックしないと、ダウンロードが続行されます。
- 画面のロードおよび無効化時に表示されるすべてのログ(コマンドブロックの名前と発生したエラーに関する情報)は、ファイル
/var/log/boot, /var/log/shutdown
保存されます。 これにより、リモートサーバーでダウンロード/シャットダウンがどのように行われたかを確認できます。
起動時に表示されるメッセージの例
+ UDEV
+モジュール
+ SYSCTL
+ MTAB
-マウント
++スワップオン-a
++ false
終了コード:1
++ mount -at nocoda、nonfs、noproc、noncpfs、nosmbfs、noshm
... 5秒以内に任意のキーを押してシェルを開きます...
+ CLEANTMP
+ランダムシード
+ HWCLOCK
+センサー
+ロードキー
+サウンド
+ HOST_NAME
+ ENVUPDATE
+ネットワーク
+ RUNIT
+ DMESG
単位
SysVinitの代わりに、Runitを使用して起動します。 Runitは
/etc/inittab
サポートしていません;代わりに、単純なスキームを使用します:
- ロードすると、スクリプト
/etc/runit/1
ます。 彼の仕事は、システムを完全に初期化することです。 - スクリプト
/etc/runit/1
が完了すると、スクリプト/etc/runit/1
/etc/runit/2
が起動され、必要なすべてのサービス(syslog、getty、ssh、apacheなど)が実行されます。 - ユーザーがシステムを停止/再起動すると、スクリプト
/etc/runit/3
これにより、システムをシャットダウンする準備ができます(すべてのプロセスを完了し、ディスクをマウント解除するなど)。
必要に応じて、同じスタイルで動作するようにSysVinitを構成できます。
SysVinitから/ etc / runit / {1,2,3}を実行:/ etc / inittab
id:3:initdefault:
rc :: bootwait:/ etc / runit / 1
l0:0:待機:/ bin / sh -c '/ etc / runit / 3; exec / sbin / halt '
l3:3:once:/ etc / runit / 2
l6:6:待機:/ bin / sh -c '/ etc / runit / 3; exec / sbin / reboot '
ca:12345:ctrlaltdel:/ sbin / shutdown -r now
サービス
すべてのサービス(getty、syslog、mysqlなど)を開始するには、同じrunitを使用します(実際には、わずかに改善された
daemontoolsのバージョンです)。 ただし、これは別の大きなトピックなので、この記事ではサービスを起動するためのスクリプトはなく、ここではシステムの初期化/シャットダウンのみを行うことを明確にします。
ソースコード
ヘルパー関数:/etc/runit/lib.sh
スタートアップ:/ etc / runit / 1
シャットダウン:/ etc / runit / 3