Linuxの起動とシャットダウン

こんにちは。今回の記事ではLinuxの起動とシャットダウンについてお話しします。

スポンサードサーチ

システムが起動するまでのフロー

システムの電源を入れてからOS(Opepration System)が起動するまではの流れは、コンピューターのアーキテクチャによって異なります。

まっと

ここでは、一般的なPC(x86/x86_64アーキテクチャを見てみる。

1.電源を入れるとBIOE/UEFIが起動する。BIOS/UEFIはハードウェアのチェックや初期化を行う

2.起動デバイス(HDD,SDD)に書き込まれたブートローダ(boot loader)を読み出し

3.ブートローダに制御を移す。ブートローダの主な役割は起動デバイスからカーネルをメモリ上に読み込むこと。

4.カーネルはメモリの初期化やシステムクロックの設定などを行い、仮のルートファイルシステム(intramfs:初期RAMディスク)をマウント。

ここで、初期RAMにはシステム起動に必須なデバイスドライバが組み込まれていて、HDDなどのデバイスにアクセス可能となる。

5.ルートファイルシステムが使えると、カーネルは最初のプロセスであるinit(systemd)プロセス実行。

6.initは必要なサービスを順次起動して、最後にログインプロンプトを表示して起動処理を完了する。

まっと

ちなみに、電源を入れてからシステムを起動するまでの処理の流れをブートまたはブートストラップという。

スポンサードサーチ

起動時のイベントを確認してみる

dmesgでシステム起動時のカーネルの処理を確認しよう

initial@DESKTOP-QH475PH:/proc$ dmesg

[ 0.000000] Linux version 5.10.16.3-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Apr 2 22:23:49 UTC 2021

[ 0.000000] Command line: initrd=\initrd.img panic=-1 nr_cpus=12 swiotlb=force pty.legacy_count=0

[ 0.000000] KERNEL supported cpus:

[ 0.000000] Intel GenuineIntel

[ 0.000000] AMD AuthenticAMD [ 0.000000] Centaur CentaurHauls

[ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: ‘x87 floating point registers’

[ 0.000000] x86/fpu: Supporting XSAVE feature 0x002: ‘SSE registers’

まっと

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での起動時の挙動についてまとめてました。

コメントを残す

メールアドレスが公開されることはありません。