Linux システム起動プロセス

Linux起動時には多くの起動情報が表示されます。

Linuxシステムの起動プロセスは皆さんが想像するほど複雑ではなく、そのプロセスは5つの段階に分けることができます:

  • カーネルのブート。
  • initの実行。
  • システム初期化。
  • 端末の確立。
  • ユーザーのログイン。

initプログラムのタイプ:

  • SysV:init(CentOS 5以前)、設定ファイル: /etc/inittab。
  • Upstart:init(CentOS 6)、設定ファイル: /etc/inittab, /etc/init/*.conf。
  • Systemd:systemd(CentOS 7)、設定ファイル: /usr/lib/systemd/system、/etc/systemd/system。

カーネルブート

コンピューターの電源を入れると、まずBIOSのパワーオンセルフテストが行われ、BIOSで設定された起動デバイス(通常はハードディスク)に従って起動します。

オペレーティングシステムがハードウェアを制御した後、まず /boot ディレクトリのカーネルファイルを読み込みます。


initの実行

initプロセスはシステム内の全プロセスの起点であり、システムの全プロセスの元祖と例えることができます。このプロセスがなければ、システム内のどのプロセスも起動しません。

initプログラムはまず設定ファイル /etc/inittab を読み込む必要があります。

ランレベル

多くのプログラムは起動時に自動起動する必要があります。それらはWindowsでは「サービス」(service)と呼ばれ、Linuxでは「デーモン」(daemon)と呼ばれます。

initプロセスの大きな役割の一つは、これらの自動起動プログラムを実行することです。

しかし、用途によって起動すべきプログラムは異なります。例えばサーバーとして使う場合はApacheを起動する必要がありますが、デスクトップとして使う場合は必要ありません。

Linuxでは、用途に応じて異なる自動起動プログラムを割り当てることができ、これを「ランレベル」(runlevel)と呼びます。つまり、起動時に「ランレベル」に基づいて実行するプログラムを決定します。

Linuxシステムには7つのランレベル(runlevel)があります:

  • ランレベル0:システム停止状態。システムのデフォルトランレベルは0に設定できません。設定しないと正常に起動できません。
  • ランレベル1:シングルユーザーモード。root権限。システムメンテナンス用で、リモートログインは禁止。
  • ランレベル2:マルチユーザーモード(NFSなし)
  • ランレベル3:完全なマルチユーザーモード(NFSあり)。ログイン後、コンソールのコマンドラインモードに入ります。
  • ランレベル4:システム未使用、予約済み
  • ランレベル5:X11コンソール。ログイン後、グラフィカルGUIモードに入ります。
  • ランレベル6:システムを正常にシャットダウンして再起動。デフォルトランレベルは6に設定できません。設定しないと正常に起動できません。

システム初期化

initの設定ファイルには次のような行があります: si::sysinit:/etc/rc.d/rc.sysinit これは /etc/rc.d/rc.sysinit を呼び出して実行します。rc.sysinit はbashシェルスクリプトで、主にシステム初期化の作業を実行します。rc.sysinit はすべてのランレベルで最初に実行される重要なスクリプトです。

その主な作業には、スワップパーティションの有効化、ディスクのチェック、ハードウェアモジュールのロード、およびその他の優先的に実行する必要があるタスクが含まれます。

l5:5:wait:/etc/rc.d/rc 5

この行は、5をパラメータとして /etc/rc.d/rc を実行することを示します。/etc/rc.d/rc はシェルスクリプトで、5をパラメータとして受け取り、/etc/rc.d/rc5.d/ ディレクトリ内のすべてのrc起動スクリプトを実行します。/etc/rc.d/rc5.d/ ディレクトリ内のこれらの起動スクリプトは実際にはリンクファイルであり、本当のrc起動スクリプトではありません。本当のrc起動スクリプトは実際には /etc/rc.d/init.d/ ディレクトリに置かれています。

これらのrc起動スクリプトは似たような使い方をし、通常 start、stop、restart、status などのパラメータを受け付けます。

/etc/rc.d/rc5.d/ 内のrc起動スクリプトは通常、KまたはSで始まるリンクファイルです。Sで始まる起動スクリプトは start パラメータで実行されます。

一方、対応するスクリプトにKで始まるリンクも存在し、すでに実行状態にある場合(/var/lock/subsys/ 下のファイルをフラグとする)、まず stop をパラメータとしてこれらの起動済みデーモンを停止し、その後再実行します。

これにより、initがランレベルを変更する際に、関連するすべてのデーモンが再起動されることを保証します。

各ランレベルでどのデーモンを実行するかについては、ユーザーは chkconfig または setup の「System Services」で自分で設定できます。


端末の確立

rcの実行が完了すると、initに戻ります。この時点で基本的なシステム環境が整い、各種デーモンも起動しています。

initは次に、ユーザーがシステムにログインできるように6つの端末を開きます。inittab内の次の6行が6つの端末を定義しています:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

上記から、ランレベル2、3、4、5では respawn 方式で mingetty プログラムが実行されることがわかります。mingetty プログラムは端末を開き、モードを設定できます。

同時にテキストログイン画面を表示します。この画面は私たちがよく見るログイン画面で、ユーザー名の入力を求められます。ユーザーが入力したユーザー名は login プログラムにパラメータとして渡され、ユーザーの身元を検証します。


ユーザーのシステムログイン

一般的に、ユーザーのログイン方法は3つあります:

  • (1)コマンドラインログイン
  • (2)SSHログイン
  • (3)グラフィカルインターフェースログイン

ランレベル5のグラフィカル方式のユーザーの場合、ログインはグラフィカルなログイン画面を通じて行われます。ログイン成功後、直接 KDE、Gnome などのウィンドウマネージャーに入ることができます。

一方、この記事で主に説明するのはテキスト方式でのログインです:mingettyのログイン画面が表示されたら、ユーザー名とパスワードを入力してシステムにログインできます。

Linuxのアカウント検証プログラムは login です。login は mingetty から渡されたユーザー名をユーザー名パラメータとして受け取ります。

次に login はユーザー名を分析します:ユーザー名が root ではなく、/etc/nologin ファイルが存在する場合、login は nologin ファイルの内容を出力して終了します。

これは通常、システムメンテナンス時にroot以外のユーザーのログインを防ぐために使用されます。/etc/securetty に登録された端末でのみ root ユーザーのログインが許可されます。このファイルが存在しない場合、root ユーザーはどの端末でもログインできます。

/etc/usertty ファイルはユーザーに追加のアクセス制限を設けるために使用されます。このファイルが存在しない場合、他の制限はありません。


グラフィカルモードとテキストモードの切り替え方法

Linuxはデフォルトで6つのコマンドウィンドウ端末を提供しており、これらを使ってログインできます。

デフォルトでログインするのは最初のウィンドウ、つまり tty1 です。これら6つのウィンドウはそれぞれ tty1,tty2 … tty6 です。Ctrl + Alt + F1 ~ F6 を押すと切り替えられます。

グラフィカルインターフェースをインストールしている場合、デフォルトではグラフィカルインターフェースに入ります。その場合は Ctrl + Alt + F1 ~ F6 を押すと、いずれかのコマンドウィンドウインターフェースに入れます。

コマンドウィンドウインターフェースに入った後、グラフィカルインターフェースに戻るには Ctrl + Alt + F7 を押すだけです。

VMware 仮想マシンを使っている場合、コマンドウィンドウ切り替えのショートカットキーは Alt + Space + F1~F6 です。グラフィカルインターフェースの場合は Alt + Shift + Ctrl + F1~F6 を押してコマンドウィンドウに切り替えてください。


Linuxのシャットダウン

Linuxの分野では主にサーバーで使用されるため、シャットダウン操作に出会うことはほとんどありません。そもそもサーバー上でサービスを動かし続けることは終わりがなく、特別な事情がない限り、やむを得ずシャットダウンするだけです。

正しいシャットダウンの流れは次のとおりです:sync > shutdown > reboot > halt

シャットダウンコマンドは shutdown です。man shutdown でヘルプドキュメントを確認できます。

例えば、次のコマンドを実行してシャットダウンできます:

sync 将数据由内存同步到硬盘中。

shutdown 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机:

shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。

shutdown –h now 立马关机

shutdown –h 20:25 系统会在今天20:25关机

shutdown –h +10 十分钟后关机

shutdown –r now 系统立马重启

shutdown –r +10 系统十分钟后重启

reboot 就是重启,等同于 shutdown –r now

halt 关闭系统,等同于shutdown –h now 和 poweroff

最後にまとめると、システムを再起動する場合でもシャットダウンする場合でも、まず次のコマンドを実行する必要があります。syncコマンドを実行して、メモリ内のデータをディスクに書き込みます。

シャットダウンコマンドには次のものがありますshutdown –h now halt poweroffと init 0、システム再起動コマンドには次のものがありますshutdown –r now reboot init 6。


参考記事:

その他の拡張