linuxOSのコンピュータ起動処理


コンピュータ起動処理の流れ

電源ON

BIOS起動

ハードウェアチェック、初期化(BIOS)

boot loader起動

起動デバイスからカーネルをメモリ上にロード(boot loader)

メモリ初期化、ルートファイルシステムマウント、デバイスドライバ設定(カーネル)

init(旧来OS)/systemd(最近のOSの主流)プロセス起動(カーネル)

ログインプロンプト起動

起動時のログ出力

システム起動時のログ参照方法は以下。

  • dmesgコマンド
  • var/log/messages,var/log/dmesg,var/log/boot.logの内容を参照

BIOSについて

  • ハードウェアの制御を行う。
  • 実体はマザーボード、拡張カードのフラッシュROMなどに書き込まれているプログラム。

デバイスドライバについて

  • 接続されたデバイスを制御するために必要な制御プログラム。カーネルモジュールに標準で含まれているものがシステム起動時には設定される。
  • ロードされているカーネルモジュールを確認するにはlsmodコマンドを使う。もしくは/proc/modulesファイルの内容を参照する。
  • アプリケーションからデバイスにアクセスするにはデバイスファイルも必要。/devディレクトリに、アプリケーションから扱うデバイスを抽象化したデバイスファイルを作成する必要がある。
    • 手動でデバイスファイルを作成する必要はなく、udevという仕組みによりカーネルがデバイス追加を検知すると/sysディレクトリにデバイス情報を作成し、それを参照して/devディレクトリにデバイスファイルを作成する。

boot loaderについて

  • 主要なboot loaderはGRUB
    • 設定ファイルは/boot/grub/grub.conf,/boot/grub/menu.lst
  • ハードディスクなどのストレージからOSを読み込んで起動するプログラム
  • 多数のファイルシステムを認識可能
  • シェル機能が搭載されているため、コマンドによる管理が可能

systemdプロセス起動処理について

systemdプロセスを起動するのが最近のOSの主流のため、その起動プロセスのみ記載。

systemdでは以下のプロセスが連携して動作する。

プロセス 説明
systemd メインプロセス
systemd-journald ログ管理プロセス
systemd-logind ログイン処理プロセス
systemd-udevd デバイス動的検知プロセス

systemdではUnitという処理単位で起動処理が行われる。
以下がUnitの拡張子の種類。

拡張子 説明
service 各種サービスを表す
device 各種デバイスを表す
mount ファイルシステムのマウントを行う
swap swap領域を有効にする
target 複数のUnitをグループ化したもの
  • systemdはシステム起動時にdefault.targetというUnitを実行する。
  • default.targetの設定ファイルは/etc/systemd/systemディレクトリにある。

実際にcentosのdockerコンテナを起動して、default.targetの実体を見てみた。

[root@7ed61ce4c547 system]# cd /etc/systemd/system
[root@7ed61ce4c547 system]# ls -la
total 24
drwxr-xr-x 6 root root 4096 Dec  5 01:37 .
drwxr-xr-x 4 root root 4096 Dec  5 01:36 ..
lrwxrwxrwx 1 root root   37 Dec  5 01:37 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x 2 root root 4096 Dec  5 01:36 default.target.wants
drwxr-xr-x 2 root root 4096 Dec  5 01:36 getty.target.wants
drwxr-xr-x 2 root root 4096 Dec  5 01:37 multi-user.target.wants
drwxr-xr-x 2 root root 4096 Dec  5 01:36 system-update.target.wants
[root@7ed61ce4c547 system]# cat /lib/systemd/system/multi-user.target
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

default.target/lib/systemd/system/multi-user.targetへのシンボリックリンクになっている。
multi-user.targetを覗いてみると、また別のtargetを呼び出している。

このmulti-user.targetcentos6(systemdではなくinitで起動処理を行う)で言うところのランレベル3に該当するtarget
initプロセスでは起動時処理のランレベルを設定することで起動処理を切り替えていたが、systemdプロセスではtargetを設定することで起動処理を切り替える。

ランレベル target
0 poweroff.target
1 rescue.target
2,3,4 multi-user.target
5 graphical.target
6 reboot.target

現在のsystemdプロセスのtargetは何なのか確認

[root@7ed61ce4c547 system]# systemctl get-default
multi-user.target

これをgraphical.targetに切り替えてOS再起動すると、GUIでのログイン画面が起動されるはず。

root@7ed61ce4c547 system]# systemctl set-default graphical.target
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target, pointing to /usr/lib/systemd/system/graphical.target.
[root@7ed61ce4c547 system]# systemctl get-default
graphical.target

ただDockerコンテナだとOSのrebootが実行できなかったので実際にGUIログイン画面は起動できなかった。