こんにちは。今回の記事ではLinuxの起動とシャットダウンについてお話しします。
スポンサードサーチ
システムが起動するまでのフロー
システムの電源を入れてからOS(Opepration System)が起動するまではの流れは、コンピューターのアーキテクチャによって異なります。

1.電源を入れるとBIOE/UEFIが起動する。BIOS/UEFIはハードウェアのチェックや初期化を行う
2.起動デバイス(HDD,SDD)に書き込まれたブートローダ(boot loader)を読み出し
3.ブートローダに制御を移す。ブートローダの主な役割は起動デバイスからカーネルをメモリ上に読み込むこと。
4.カーネルはメモリの初期化やシステムクロックの設定などを行い、仮のルートファイルシステム(intramfs:初期RAMディスク)をマウント。
ここで、初期RAMにはシステム起動に必須なデバイスドライバが組み込まれていて、HDDなどのデバイスにアクセス可能となる。
5.ルートファイルシステムが使えると、カーネルは最初のプロセスであるinit(systemd)プロセス実行。
6.initは必要なサービスを順次起動して、最後にログインプロンプトを表示して起動処理を完了する。

ちなみに、電源を入れてからシステムを起動するまでの処理の流れをブートまたはブートストラップという。
スポンサードサーチ
起動時のイベントを確認してみる
dmesgでシステム起動時のカーネルの処理を確認しよう

ctrl + l で画面はクリアできるぞ
スポンサードサーチ
システムのシャットダウンと再起動
システム上のプログラムを適切に終了してシステムを安全に停止させるためにはシャットダウンを使おう。
shut down [option] 時間 [message]
オプション
-h
-r
-f
-F
-k
-c
説明
シャットダウン
再起動
次回起動時にfsckを無視する
次回起動時にfsckを必ず実行
実際にはシャットダウンせず、警告メッセージを通知
現在実行中のシャットダウンをキャンセルする
例えば、22時にシステムをシャットダウンしたい場合は
$ shutdown -h 22:00
直ちに再起動したい場合は
$ shutdown -r now
shutdownコマンドが実行されると、それ以後はユーザーがログインできなくなります。
他にも、halt、poweroffといったコマンドでシステムを停止していたり、rebootコマンドで再起動したりすることも可能です。
Ctrl+Alt+Deleteでも再起動されている場合があります。

間違ってもコンセントを抜かないようにね・・・
SysVinit
電源を入れてからLinuxが起動する手順は数年で大きく変更されています。SysVinitとsystemdです。
SysVinit | systemd | |
CentOS | 5以前 | 7.0(2014) |
Ubuntu | 6.9以前 |
15.04(2015)
|
現在の主流はsystemedがメインとなっています。
そのため私のUbuntu 20では/etc/inittabファイルが存在していませんでした。
SysVinitはあらかじめ決められた順番でサービスを起動します。そのため、あるサービスの起動に手間をかかると、それ以降のサービスで待たされてしまうため、多くのディストリビューションはsystemdやUpstartに切り替えています。
スポンサードサーチ
ランレベル
SysVinitでは、ランレベルと呼ばれるいくつかの動作モードがあります。
ランレベルごとにどのサービスを稼働し、稼働しないかを決定できます。
Ex.ランレベル3
各種サーバーソフトウェアを使ったネットワークサービスを提供可能
Ex.ランレベル5
ランレベル5ではクライアントPCとして必要なGUI環境を利用可能
Red Hat、CentOS,Fedora
0 | 停止 |
1 | シングルユーザーモード |
2 |
マルチユーザーモード(テキストログイン、NFSサーバは停止)
|
3 |
マルチユーザーモード(テキストログイン)
|
4 | 未使用 |
5 |
マルチユーザーモード(グラフィカルログイン)
|
6 | 再起動 |
Sまたはs | シングルユーザーモード |
Ubuntu、Debian GNU/Linuxでのランレベル
0 | 停止 |
1 | シングルユーザーモード |
2 |
マルチユーザーモード
|
3 |
マルチユーザーモード
|
4 |
マルチユーザーモード
|
5 |
マルチユーザーモード
|
6 | 再起動 |
Sまたはs | シングルユーザーモード |
シングルユーザーモードは、rootユーザーだけが利用可能。
シングルユーザーモードでは、一般ユーザはログインできないので、システムのメンテナンスなど、一般ユーザーがシステムをすると不都合が生じるものに使う。
ランレベルの確認と変更
ランレベルの確認には
initial@DESKTOP-QH475PH:/etc
$ runlevel
unknown
と出てしまいました。これはおそらく、私がubuntu on WSL2を使用して立ち上げているためでしょう・・・参考にならずにすいません。
スポンサードサーチ
systemdの概要
ubuntuの様にsystemdを採用したシステムは、initシステムの代わりにsystemmdプロセスが起動し、各種サービスを管理する。systemでゃ複数のデーモンプロセスが連携して動作する。
なので、systemdの中身をのぞいてみましょう。
$ find /etc/systemd/ -name “systemd*” -print
とコマンドを打つと下記のようなファイルが出てきますのでいくつか抜粋します。
/etc/systemd/ /etc/systemd/system/sysinit.target.wants/systemd-pstore.service /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service /etc/systemd/system/multi-user.target.wants/systemd-networkd.service /etc/systemd/system/multi-user.target.wants/systemd-resolved.service /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service /etc/systemd/system/sockets.target.wants/systemd-networkd.socket
プロセス | 説明 |
systemd | メインプロセス |
systemd-journald |
ジャーナル管理プロセス
|
systemd-logind |
ログイン処理プロセス
|
systemd-networkd |
ネットワーク管理プロセス
|
systemd-timesyncd |
システムクロック動悸プロセス
|
systemd-resoloved |
名前解決プロセス
|
systemd-udevd |
デバイス動作検知プロセス
|
systemdでは、システムの起動処理は多数のUnitと呼ばれる処理単位に分かれています。
ex.サービスを起動するUnit、ファイルシステムをマウントするUnit等
Httpd.Serviceはhttpd(webサーバ)サービスの起動に使われるUnitです。
Unitの主な種類
種類 | 説明 |
service |
各種サービスを起動
|
device |
各種デバイスを表す
|
mount |
ファイルシステムをマウント
|
swap |
スワップ領域を有効にする
|
target |
複数Unitをグループ化
|
timer |
指定した日時や感覚で処理する
|
〇systemd 速い
サービスAを起動する前にサービスBといった各種サービスの依存関係や順序関係を処理可能。必要なサービスのみ起動される。また、並列的に行われるので、システム起動時間はSysVinitに比べて速い。
〇SysVinit 遅い
サービスは順次起動していく。デフォルトでで起動するように設定されたサービスは必要なくても起動される。また、起動途中でサービス起動処理が遅延すると次のサービス処理は待たされる。
Systemdの起動手順
始めにdefault.targetというUnitが処理されるとのことなので、/etc/systemd/systemにあるので見に行く。
initial@DESKTOP-QH475PH:~$ ls -l /etc/systemd/system/default.target
ls: cannot access ‘/etc/systemd/system/default.target’: No such file or directory
何ということでしょう‥…WSL2で起動しているからないわ・・・(二回目

Linuxインストールだるいからええわ・・・
systemctlによるサービスの管理
systemdでサービスを管理するには、systemctlコマンドを使用しよう!
サブコマンド | 説明 |
start |
サービスを起動する
|
stop |
サービスを終了する。
|
restart |
サービスを再起動する
|
reload |
サービスの設定を再読み込みする
|
status |
サービスの稼働状況を表示する
|
is-active |
サービスが稼働しているかどうかを確認する
|
enable |
システム起動時にサービスを自動起動する
|
disable |
システム起動時にサービスを自動起動しない
|
mask |
指定したUnitをマスクし手動でも起動できないようにする
|
unmask |
指定したUnitのマスクを解除する
|
listdependencies |
Unitの依存関係を表示する
|
list-units |
起動しているすべてのUnitと状態を表示する
|
list-unit-flle |
すべてのUnitを表示する
|
reboot |
システムを再起動する
|
poweroff |
システムをシャットダウンする
|
とうわけで、
systemctl list-unit-files
ですべてのUnitを表示してみると以下の画像が出てくると思います。
initial@DESKTOP-QH475PH:~user@computer$ systemctl list-unit-files
UNIT FILE STATE VENDOR PRESET
proc-sys-fs-binfmt_misc.automount static enabled
dev-hugepages.mount static enabled
dev-mqueue.mount static enabled
proc-sys-fs-binfmt_misc.mount disabled enabled
まとめ
今回の記事ではLinuxの起動とシャットダウンを簡単にまとめるとともに、現行OSでの起動時の挙動についてまとめてました。
ここでは、一般的なPC(x86/x86_64アーキテクチャを見てみる。