コンピュータが起動して使えるようになるまでは、様々なハードウェア・ソフトウェアが段階的に処理していき、オペレーティングシステムが完全に起動して初めて使えるようになります。ここではPC(x86 アキテクチャ)を例にとってその起動シーケンスを見てみます。PCの起動シーケンスは大きく以下のようになります。
● BIOSの場合PCの電源を投入すると、マザーボードのフラッシュROMに書き込まれたBIOS(Basic Input/Output System)というソフトウェアが起動します。このBIOSの初期化プログラムが、PCに接続されている各種デバイスの初期化を行います。この過程を POST(Power On Self Test)といいます。POSTの段階で最初に初期化が行われるのはビデオカードです。
このビデオカードの初期化が終わるとよく目にするBIOSの初期化状況を表示する画面になります。
各種デバイスの初期化が終了すると、BIOSは次の段階に入り、起動するためのドライブを探します。起動ドライブとなるのは通常FDD、HDD、 CD-ROMなどです。BIOSは起動ドライブを見つけるとそのデバイスをファーストブートドライブとして起動を試みます。最初にブートドライブとして何のデバイスが認識されるかはBIOSの設定次第ですが、ここではHDDの起動を中心に見ていきます。HDDの接続については、IDEインターフェイスのHDDでは接続の場所によってブートの優先度が自動的に決まります。(優先度の最も高いのはプライマリのマスタです)こういったブートドライブとなりうるデバイスの中の最も優先順位が高いデバイスを、BIOSはブートドライブとして決定することになります。
ブートドライブが決定すると、BIOSはそのブートドライブの先頭セクタのロードという段階に移ります。HDDでは先頭セクタのことを MBR(Master Boot Record)といい、MBRは1台のHDDに1つしか存在しません。BIOSはこのMBRをメモリ上にロードし、MBR領域にあるプログラムに制御を移します。このMBR領域にあるプログラムを、一般的にブートストラップローダと呼びます。
ブートストラップローダは、実行のなかでパーティションテーブルから起動フラグのあるパーティションを探します。パーティションテーブルとは、複数のパーティションに関する情報が保存されているMBR内の1つの領域です。この起動フラグのあるパーティションにブートストラップローダから制御が移行します。そのとき、ブートストラップローダから呼び出されるのが各基本パーティションにあるブートセクタになります。ブートセクタは各基本パーティションの先頭セクタのことを指し、PBR(Partition Boot Record)とも呼ばれます。
PBRに制御が移行すると、そのPBRのプログラムコードが動作することになります。このPBRにあるプログラムコードが IPL(Initial Program Loader)と呼ばれるもので、OSを起動させるためのブートローダの残りの機能を呼び出す機能を持ちます。
MBRやPBRは512バイトと非常に小さな領域しかもっていません。そのなかの一部であるIPLのデータサイズはさらに小さなものになります。この小さなデータサイズにOSを起動させるためのブートローダのプログラムを全て格納することは困難です。そのためIPLはブートローダの一部のプログラムコードを持ち、ブートローダの残りに機能はPBRの後続セクタに置くかたちになっています。IPLから呼び出されたブートローダが後続のOSのファイルを読み込んでいき、最終的にOSが起動していくことになります。
Linuxの起動スクリプトを実行する方法に、SysVinit、Upstart、Systemdの3種類ある。
SysVinit では、Linux カーネルがロードされたあと init が一番最初のプロセスとして起動します。カーネルによって使われるデフォルトの init プログラムは /sbin/init です。 inittab は /etc に置かれた init の起動設定ファイルのことです。特定のランレベルに入ったときにどのプログラムやスクリプトを実行すればいいのか init に指定します。 システム起動時の initプロセス(/sbin/init)では、/etc/inittabファイルに従いシステムサービスを起動します。
SysVinitでは、各種サービスを起動するために /etc/init.d ディレクトリの配下に用意されている起動スクリプトが使われます。ランレベルが異なれば起動サービスも異なります。/etc/rc*.d ディレクトリでは、各ランレベルで起動するサービス、終了するサービスのスクリプトファイルが配置されています。
Upstart は、SysVinitの代わりになる init デーモンです。
SysVinit との違いは、SysVinit の init デーモンは、指定されたランレベルに必要なサービスを、 決められた順番で起動(あるいは停止)していきます。
Upstartは、サービスを順番に起動するのではなく、 サービスが起動できる状態になったとき(イベント)に、起動します。Upstartはイベント駆動型のinitです。
SysVinitでは、順番に起動するのに比べて、Upstartでは、並列で起動できるため全体の起動時間が早くなります。
イベントは、ハードウェアの変更、タスクの開始または停止、あるいはシステム上の他のプロセスなどです。
Upstartは,/etc/event.dディレクトリに格納されているファイル群で定義された「イベント・ジョブ」を実行する仕組みになっています。/etc/event.dディレクトリ内の各ファイルには「start on イベント名」という設定行があり,ここで指定されたイベントが発生すると,「exec コマンド名」という設定行で指定したコマンドが実行されます。
systemdは、SysVinitやUpstartではシェルスクリプトで行っていた起動処理を新しく作り直し、処理を分割して並列化することでシステム起動処理を高速化します。
systemdでは、様々な処理をそれぞれUnitとして定義して、実行時には各Unitを指定して実行します。つまり、従来、シェルスクリプトでシーケンシャルに実行されていた処理を複数のUnitに分解して並列実行します。
定義ファイルは、/etc/systemd/systemと/usr/lib/systemd/systemに配置されています。デフォルトの設定は/usr/lib/systemd/systemに、管理者が追加修正したものは/etc/systemd/systemに配置します。
デフォルト値の変更時は、/usr/lib/systemd/systemのファイルをコピーして /etc/systemd/systemに保存して編集します。
元に戻す場合は、 /etc/systemd/systemにあるファイルを削除します。
同じ名前のファイルがあった場合は、/etc/systemd/systemが優先されます。
Unitにはいくつか種類があり、拡張子によって判別されます。
![]() |
|
.service | プロセスの起動/停止に関する設定 ファイル名は「プロセス名.service」となる (httpd.service、sshd.serviceなど) |
![]() |
|
.mount | ファイルシステムのマウント/アンマウントに関する設定 ファイル名は「マウントポイント.mount」となる /etc/fstabの内容を元にSystemdが自動作成する |
![]() |
|
.socket | ソケットの監視設定 ”ソケットへの接続を検出すると特定のプロセスを起動”といった動作を実現可 (xinet.dの代替にできる) |
![]() |
|
.device | システムが認識しているデバイス情報を保持する udevデーモンによって自動作成される |
![]() |
|
.path | パスの監視設定 ”監視ディレクトリにファイルが置かれたらサービス起動”といった動作を実現可 |
![]() |
|
.target | 複数のUnitをとりまとめるUnit |
![]() |
|
.swap | スワップ領域の有効化 (etc/fstabから自動作成) |
![]() |
複数のUnitをグルーピングすることができるtargetと呼ばれるUnitがあります。
targetは他Unitとの関係を保持し、複数のUnitをとりまとめます。targetを利用することで、Unit同士の依存や起動順定義が楽に行うことができます。
Systemdでは全てがUnitで処理されるため、従来のランレベルというプロセスの管理体系はなくなり、ランレベルに相当する機能を target Unit を利用して処理しています。
ランレベルの目的は、ランレベル別に定義された状態でシステムを起動するために必要となるプロセスを管理することにあり、init/Upstartでは、/etc/rc.d/rc[runlevel].dにランレベルに応じたプロセス群を定義することでこれを実現していました。
Systemdでは、これらのプロセスをtargetとしてグルーピングすることでランレベルと同様のプロセス管理を実現しています。
従来のランレベルは0 – 6の7種類のみ定義されていたのに対し、targetは好きなだけ定義できるため、より柔軟になっています。
●主なtargetの種類
![]() |
||
target名 | 内容 | 従来のランレベル (RedHat) |
![]() |
||
poweroff.target | システム停止 | 0 |
![]() |
||
rescue.target | シングルユーザモード | 1 |
![]() |
||
multi-user.target | マルチユーザモード (コンソールログイン) | 3 |
![]() |
||
graphical.target | マルチユーザ+GUI | 5 |
![]() |
||
reboot.target | 再起動 | 6 |
![]() |
||
emergency.target | 緊急シェル rescue.targetよりも起動対象が少ない ルートファイルシステムですらマウントできない場合などに利用 | 無し |
![]() |
【 default.target 】
default.target とは、OS の起動シーケンスの起点となるユニットで(一番最初に起動される)、systemd は default.target に記述されている依存関係を満たすように、各種ユニットを立ちあげます。
defualt.target の実体はシンボリックリンクで、具体的な処理の中身はリンク先のターゲットによって決まります。
default.target にリンクされているtargetは、一般的にGUI のシステムでは graphical.target に、GUI 無しのシステムでは multi-user.target にリンクされています。
default.target に何がリンクされているかは systemctl get-default で確認できます。
$ systemctl get-default graphical.target |
systemctl set-default によって default.target にリンクするターゲットを変更できます。
# systemctl set-default multi-user.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target. |
【 現在のターゲットの変更 】
現在実行中のセッションで異なるターゲットユニットに変更するには、systemctl isolate のコマンドを実行します。
グラフィカルユーザーインターフェースを無効にし、現行セッションで multi-user.target ユニットに変更するには、
# systemctl isolate multi-user.target |
すぐに再起動するには、
# systemctl isolate reboot.target |
現状ではLinuxのデフォルトのブートローダにはLILO(LInux LOader)とGRUB(GRand Unified Bootloader)が採用されています。LILO、GRUBなどのブートローダの役目はOSの本体である、カーネルをロードすることにあります。この 2つはブートローダという点においては同じ物ですが、それぞれカーネルのロードまでの工程が異なります。
こういったLILOやGRUBの動作を経て、カーネルがロードされることになるわけですが、このカーネルがロードされてからがOS自身の起動シーケンスであり、カーネルの制御下でOSとして機能するための様々な処理が行われます。
GRUBなどのブートローダーから渡される起動オプションを解釈し機能を有効/無効にしたりデフォルトとは異なる設定で起動できます。
![]() |
|
1 | ランレベル1(シングルユーザモード)で起動します。rootユーザのみが使用可能な状態になり、ネットワークやNFSなどの設定は自動的には行われません。主にシステムの管理や復旧のときに使用します。 |
![]() |
|
3 | ランレベル3で起動します。通常のユーザも使用できます。コンソールからのログインになります。 |
![]() |
|
5 | ランレベル5で起動します。通常のユーザも使用できます。Xサーバが起動され、gdmなどのディスプレイマネージャが起動されます。ログイン後すぐにXウインドウ環境が使えます。 |
![]() |
|
root=/dev/hda1 | ルートファイルシステムのデバイス名を指定します。 |
![]() |
|
debug | ログレベルを10に設定する。( 全てのカーネルメッセージをコンソールに出力 |
![]() |
|
mem=数 | メモリーサイズを指定した値に設定する。 例:512mだと512Mバイト、2gだと2Gバイト。 |
![]() |
|
root=デバイスなど | ルートファイルシステムを指定したデバイスに設定する。 |
![]() |
|
console=デバイス | コンソールを指定したデバイスに設定する。 |
![]() |
|
init=プログラム | /sbin/initの代わりに指定したプログラムを起動する。 |
![]() |
|
initcall_debug | 初期化時の関数呼び出しの情報をカーネルメッセージに出力する | ![]() |
disable_ipv6=1 | IPv6を無効にする ( 0だと無効 ) |
![]() |
|
ip=dhcpなど | IPアドレスをDHCPなどに設定する | ![]() |
nosmp | SMPを無効にする |
![]() |
|
nr_cpus=数 | 指定した数のCPUを使用する | ![]() |
nousb | USBを使わない |
![]() |
|
single | シングルユーザモードでシステムを起動する | ![]() |
emergency | 緊急モードでシステムを起動する。 |
![]() |
|
text | テキストモードでシステムを起動する。 | ![]() |
init=/bin/sh | 起動時に実行させるプログラムを指定します。システムが破損され、全く起動できない非常事態のときにinit=/bin/shと指定すると、シェル/bin/shを起動させることができます。 |
![]() |
1.サーバー起動時のメッセージを表示する [ dmesg ] [ Ctrl +s,Ctrl + q ]
起動時にコンソール上に表示されるメッセージは、流れるのが早すぎて全てをじっくり見ることは不可能です。これらのメッセージは、サーバーが立ち上がってから、dmesg コマンドを使用する事で後でじっくり閲覧する事ができるようになります。但し、dmesg で表示されるメッセージは、起動時に表示されたものそっくりそのままではありません。
dmesgコマンドは、カーネルのリングバッファの内容を表示するためのコマンドで、システム起動時のメッセージや稼働中のカーネル情報などを得ることができます。
また、/var/log/dmesg ファイルや /var/log/messages 、 /var/log/boot.log を参照することで、同じような情報を得ることが可能です。
$ dmesg | more |
起動時にリアルタイムで確認するには、コンソール上のキーボード操作で確認する事ができます。まず、コンソール上の画面をストップさせるには、Ctrl + s、再開するには、Ctrl + qをタイプします。なお、上にスクロールする際には、Shift + PageUp 、下にスクロールさせるには、Shift + PageDown でできます。
コマンドラインからシャットダウンするには、shutdown, halt, reboot, poweroff コマンドを使います。
www.it-shikaku.jp