LFCS — Linux Foundation認定システム管理者
起動の流れとプロセスシグナル
目標
起動の段階とGRUB・ターゲットの概念を文書にまとめ、/procを直接読んでシステムの要約を作り、バックグラウンドのプロセスにシグナルを送って状態の変化を確認します。
なぜ重要なのか
起動が失敗したときにどこを見るかは、「制御がどこまで渡ったか」で決まります。画面に何も出なければファームウェアとブートローダーの間、メニューは出るのにカーネルパニックならカーネルとinitramfsの間、ログインプロンプトの直前で止まるならinit以降です。そのため、順序を暗記するのではなく、境界ごとに何が変わるかを知っている必要があります。カーネルパラメーターをGRUBに入れるときも、通常のエントリだけに適用するか、復旧エントリまで適用するかによって、ディレクティブが分かれます。後半のシグナルのラボは、前の読み物の状態表を手で確認する過程です。停止は終了ではなく、シグナルは指定したPIDにだけ届きます。
ステップ
/root/lfcs-boot/boot-order.txtに、起動の段階4つを順に1行ずつ書いてください:firmware、bootloader、kernel、init。/root/lfcs-boot/grub.defaultに、GRUB_TIMEOUT=5、GRUB_DEFAULT=0、GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"、GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"の4行を書いてください。/proc/cmdlineの内容を、そのまま/root/lfcs-boot/cmdline.txtに入れてください。/root/lfcs-boot/sysinfo.txtに、kernel=<커널 릴리스>、memtotal_kb=<MemTotal 값>、swaptotal_kb=<SwapTotal 값>の3行を書いてください。値は数字だけを書きます(プレースホルダーは順に、カーネルのリリース、MemTotalの値、SwapTotalの値です)。/root/lfcs-boot/targets.txtに、ランレベルとターゲットの対応を4行で書いてください:0=poweroff.target、1=rescue.target、3=multi-user.target、5=graphical.target。sleep 4000をバックグラウンドで起動して、そのPIDを/root/lfcs-boot/stopped_pid.txtに書き、そのプロセスに停止シグナルを送ってください。そして、/root/lfcs-boot/stopped.txtにstate=<현재 상태 문자>の1行を書いてください(プレースホルダーは現在の状態を表す文字です)。- 2つ目の
sleep 4000を起動して、そのPIDを/root/lfcs-boot/term_pid.txtに書き、そのプロセスにだけ終了シグナルを送って消してください。そして、/root/lfcs-boot/term.txtに、pid=<그 PID>とalive=noの2行を書いてください(プレースホルダーはそのPIDです)。ステップ6で停止させたプロセスは、そのまま生きている必要があります。
参考
- バックグラウンドで起動したばかりのプロセスのPIDは、特殊変数
$!に入っています。 - 状態の文字は、
ps -o stat=でも、/proc/<PID>/statの3番目の項目でも読めます。 - 停止シグナルと強制終了シグナルは、アプリケーションが捕捉することも無視することもできません。
- よくある間違い: ステップ7で名前でシグナルを送ると、ステップ6の
sleepまで一緒に死んで、採点が失敗します。PIDを指定してください。
起動段階の整理
/root/lfcs-boot/boot-order.txtに、起動の段階4つを順に1行ずつ書いてください: firmware、bootloader、kernel、init。
電源が入ったあとに制御が渡っていく順序を、4つの段階で書きます。小文字の1語ずつ、1行に1つです。
GRUBの基本設定ファイル
/root/lfcs-boot/grub.defaultに、GRUB_TIMEOUT=5、GRUB_DEFAULT=0、GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"、GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"の4行を書いてください。
カーネルパラメーターを入れるディレクティブが2つあります。1つは通常のエントリだけに、もう1つは復旧エントリまで含めて適用されます。値に空白があれば、引用符で囲んでください。
今カーネルが受け取ったパラメーター
/proc/cmdlineの内容を、そのまま/root/lfcs-boot/cmdline.txtに入れてください。
起動時にカーネルに実際に渡された文字列は、procの下の1つのファイルにそのまま入っています。加工せず、そのまま入れてください。
/procからシステムの要約を作る
/root/lfcs-boot/sysinfo.txtに、kernel=<커널 릴리스>、memtotal_kb=<MemTotal 값>、swaptotal_kb=<SwapTotal 값>の3行を書いてください。値は数字だけを書きます(プレースホルダーは順に、カーネルのリリース、MemTotalの値、SwapTotalの値です)。
カーネルのリリースはunameで、メモリの総量とスワップの総量はmeminfoの該当行から読み取ります。単位はkBで、数字だけを書きます。
ランレベルとターゲットの対応
/root/lfcs-boot/targets.txtに、ランレベルとターゲットの対応を4行で書いてください: 0=poweroff.target、1=rescue.target、3=multi-user.target、5=graphical.target。
SysVのランレベルの数字と、systemdのターゲットユニット名を対にして書きます。停止・シングルユーザー・マルチユーザー・グラフィカルの4つです。
プロセスを停止させる
sleep 4000をバックグラウンドで起動して、そのPIDを/root/lfcs-boot/stopped_pid.txtに書き、そのプロセスに停止シグナルを送ってください。そして、/root/lfcs-boot/stopped.txtにstate=<현재 상태 문자>の1行を書いてください(プレースホルダーは現在の状態を表す文字です)。
バックグラウンドで起動した直後のPIDが入る特殊変数があります。停止シグナルはアプリケーションが捕捉できず、状態の文字はprocのstatからも読めます。
2つ目のプロセスだけを終了する
2つ目のsleep 4000を起動して、そのPIDを/root/lfcs-boot/term_pid.txtに書き、そのプロセスにだけ終了シグナルを送って消してください。そして、/root/lfcs-boot/term.txtに、pid=<그 PID>とalive=noの2行を書いてください(プレースホルダーはそのPIDです)。ステップ6で停止させたプロセスは、そのまま生きている必要があります。
新しくもう1つ起動して、そのPIDにだけ終了シグナルを送ります。前のステップで停止させたプロセスは、必ず生きている必要があります。