コンテンツにスキップ

2. システムアーキテクチャ

2.1. ハードウェア設定と構成

2.1.1. BIOSとUEFI

BIOS

BIOS(Basic Input Output System)はキーボードなどのデバイスを制御する基本的なプログラムでマザーボードや拡張カードのフラッシュROMに書き込まれている。 これはパソコンの起動時に最初に実行されるプログラムで、コンピュータの基本的なハードウェアを制御する役割を担っている。

BIOSの役割は以下の通り。

  • OSを起動するためのプログラムをディスクから読み込んで実行する
  • デバイスの動作を設定
  • 基本的な入出力の管理

UEFI

UEFI(Unified Extensible Firmware Interface)はBIOSの容量制限がなくなったり、GUIベースのセットアップ画面を利用できるなど拡張されたBIOSの後継規格。

UEFIはBIOSと異なり、C言語などのプログラミング言語を使用して開発された。 また、BIOSよりも高速で安定性が高く、セキュリティも強化されている。

UEFIには、BIOSに比べて多くの機能があり、起動ローダーやネットワークブート機能、セキュアブート機能などがある。

UEFIの特徴は以下の通り。

  • 起動ドライブの容量制限(2TB)の撤廃
  • GUIベースのセットアップ画面

UEFIとBIOSのセットアップ

OSがインストールされているコンピュータのBIOS/UEFIに入るにはコンピュータ起動後にBIOSに入るにはDeleteやF1、F2などを連打する必要がある。なお連打するキーはマザーボードのメーカによって異なる。

BIOS/UEFIでは以下項目を設定可能。

  • 日付や時刻(ハードウェアクロック)
  • ディスクドライブや各種デバイスのパラメータ
  • キーボードの使用/不使用
  • 電源管理
  • ブートデバイスの優先順位
  • デバイスへのIRQ(割り込み要求)の割り当て
  • 各種デバイスの使用/不使用

2.1.2. デバイスの情報確認

デバイスファイル

Linuxではハードウェアのアクセスを抽象化したデバイスファイルにて行う。デバイスファイルは/dev配下にある。

なおこれらはudevという仕組みにより自動的に生成される。

/procディレクトリ

Linuxカーネルが認識しているデバイス情報は/proc配下に格納される。

主なファイル 説明
/proc/cpuinfo CPUの情報を格納したファイル
/proc/interrupts IPQなどの情報を格納したファイル
/proc/ioports デバイスの制御とデータの受け渡しを行うI/Oポートのアドレスを格納したファイル
/proc/meminfo メモリの情報を格納したファイル
/proc/bus/usb/* USBデバイスの情報を格納したファイル
/proc/bus/pci/* PCIデバイスの情報を格納したファイル
/proc/cmdline 起動時のカーネルオプションが格納したファイル

lspciコマンド

デバイスの情報を確認するためのコマンド。

lspci 
オプション 説明
-v 詳細に表示
-vv より詳細に表示

2.1.3. USBデバイス

USBはPCを周辺機器と接続するための規格。 特徴は以下の通り。

  • 最大127台のデバイスをUSB接続可能
  • 同一コネクタ
  • ホットプラグ
  • プラグ&プレイ
  • H/W、F/W、ドライバ、OS、アプリケーション間が自動的に協調し機器の組み込みと設定を自動的に行う
  • 電源供給

USBのバージョン

バージョン 最大転送速度
USB 1.0 12Mbps
USB 1.1 12Mbps
USB 2.0 480Mbps
USB 3.0 5Gbps
USB 3.1 10Gbps
USB 4.0 40Gbps

デバイスドライバ

ハードウェアの利用にはデバイスドライバが必要となる。 ドライバはベンダーが用意した専用ドライバとLinuxシステムが提供するクラスドライバに分けられる。

USBデバイスを使用するにはデバイスドライバが必要。これはUSBデバイスがデバイスクラスに応じて異なる方法で通信するために使用される。また、クラスドライバはデバイスクラスに準拠する。

デバイスクラス サポートするUSBデバイスの例
HID: Human Interface Devices kbd, mouse
USB Mass Storage Device USBメモリ、HDD、デジタルオーディオプレーヤー
オーディオ マイク、スピーカー、サウンドカード
プリンタ プリンタ
ワイヤレスコントローラー Wi-Fiアダプタ、Blutoothアダプタ

なお、デバイスクラスの使用に沿ったUSBデバイスはクラスドライバで対応するため、専用のデバイスドライバは不要となる。

lsusbコマンド

接続されたUSBデバイスの情報を表示するためのコマンド。

lsusb
オプション 説明
-v 詳細な情報を表示
-t ツリー形式でUSBデバイスを表示
-s [bus]:[device] 特定のバス番号とデバイス番号で指定されたUSBデバイスの情報を表示
-d [vendor]:[product] 特定のベンダーIDとデバイスIDで指定されたUSBデバイスの情報を表示

2.1.4. udev

udevはデバイスの管理とドライバの自動検出を行う仕組み。 udevはシステムに新しいデバイスが追加された場合、デバイスの属性情報を取得し、それに基づいて対応するデバイスドライバを自動的に読み込むことができる。

デバイスの情報は、D-Busと呼ばれるプロセス間通信(IPC)のための機構により、異なるアプリケーション間でデータやシグナルを送信したり、受信したりすることができる。

2.1.5. デバイスドライバのロード

lsmodコマンド

lsmodコマンドはロードされたカーネルモジュールの一覧を表示するためのコマンド。 カーネルモジュールは、カーネル内で動作するドライバーやファイルシステムなどの機能を提供している。

lsmod

modprobeコマンド

modprobeコマンドはカーネルモジュールを手動でロードするためのコマンド。modprobeコマンドを使用すると、特定のカーネルモジュールをロードしたり、モジュールの依存関係を自動的に解決したりすることができる。

modprobe <カーネルモジュール名>

2.2. システムの起動とシャットダウン

2.2.1. Linuxのシステム起動フロー

OSが起動するまでの流れは基本的には以下の通り。(x86アーキテクチャ構成の場合)

  1. BIOS/UEFIが起動し、ハードウェアチェックや初期化を行い、ブートローダを読み出し制御を移す
  2. カーネルはメモリの初期化、システムクロックの設定を行い、初期RAMディスクをマウントする
  3. カーネルは最初のプロセスであるinit(またはsystemd)プロセスを実行する

起動

2.2.2. システム起動時のイベント確認方法

システム起動時にカーネルがどのような処理を行ったかはログファイルである/var/log/message/var/log/dmesg/var/log/boot.logなどに保存される。

これらのファイルはテキストファイルなのでcatコマンドで閲覧可能となる。なお閲覧にはroot権限が必要な場合がある。

dmesgコマンド

dmesgはシステム起動時にカーネルがどのような処理を行かったか確認できるコマンド。

dmesg

journalctl -kコマンド

systemdを採用したシステムにおいてdmesgコマンドと同様にカーネルのバッファを表示することができるコマンド。 bオプションでシステム起動時のメッセージの表示が可能。

journalctl -k

2.2.5. シャットダウンと再起動

shutdownコマンド

shutdownコマンドはシステムのシャットダウンや再起動を行うことができるコマンド。

shutdown [オプション] 時間 <メッセージ>
オプション 説明
-h シャットダウン後にシステムを停止する
-r シャットダウン後にシステムを再起動する
-k シャットダウンを実際には行わず、ユーザーに警告メッセージを表示する
-t シャットダウンまでの待機時間(秒)を指定する
-c シャットダウン処理をキャンセルする
-f シャットダウン処理を強制的に実行する

以下の例は30分後にシステムを停止し、ログインしているユーザに「Please logout now」とメッセージを表示するもの。

shutdown -h +30 "Please logout now."

systemctlコマンド

systemdを採用したLinuxシステムではshutdownの代わりにsystemctl rebootで再起動、systemctl poweroffでシステムの終了が行える。

systemctl reboot //再起動
systemctl poweroff //システム終了

2.3. SysVinitとランレベル

2.3.1. SysVinitによる起動

SysVinitはかつて使用されていたLinuxの起動の仕組み。 現在はsystemdのほうが主流となっている。

SysVinitによる起動順序は以下の通り。

  1. initが/etc/inittabファイルを読み込む
  2. initが/etc/rc.sysinitnスクリプトを読み込む
  3. initが/etc/rcスクリプトを実行する
  4. /etc/rcスクリプトが /etc/rc<ランレベル>.dディレクトリ以下のスクリプトを実行する

SysVinitはサービスを順次起動に時間がかかる、依存関係を適切に処理できない問題があった。これらの問題を解決した起動の仕組みにはupstartsystemdがある。

Upstart

UpstartはSysVinitを改善した新しいinitの仕組みで以下の特徴がある。

  • 依存関係を適切に処理
  • 並列起動
  • イベント駆動

2.3.2. ランレベル

ランレベルはLinuxシステムの動作モードのこと。 システムのデフォルトのランレベルは/etc/inittabに記載されている。 またこのファイルで起動する際のランレベルも設定できる。

ランレベル RedHat系 Debian系
0 停止 停止
1 シングルユーザモード シングルユーザモード
2 マルチユーザモード(テキストログイン、NFSサーバは停止) マルチユーザモード
3 マルチユーザモード(テキストログイン) マルチユーザモード
4 未使用 マルチユーザモード
5 マルチユーザーモード(グラフィカルログイン) マルチユーザモード
6 再起動 再起動
S or s シングルユーザーモード シングルユーザモード

runlevelコマンド

現在のランレベルの確認を行うコマンド。

runlevel

表示は<以前のランレベル> <現在のランレベル>で表示される。

init/telinitコマンド

ランレベルの変更を行うコマンドで実行にはroot権限が必要。

init 1
telinit 1

wallコマンド

wallコマンドはログインしているユーザー全員の端末画面に一斉にメッセージを送信するコマンド。再起動や停止を行う際にシステム利用者に通知するために使用する。

wall [ -a ] [ -g Group ] <メッセージ>

2.3.3. 起動スクリプトのサービス管理

ランレベルごとに起動するサービスは異なり、確認は/etc/rcN,d(Nは数字)で確認できる。

例えば/etc/rc3.dではランレベル3の時に起動するスクリプトを確認できる。

2.4. Systemd

2.4.1. Systemdの概要

Systemdのシステムではinitの代わりにsystemdプロセスが起動し各サービスの管理を行う。またSystemdは処理を分割して並列化することでシステム起動処理を高速化している。具体的には以下のような複数のデーモンプロセスが連携して動作する

プロセス 説明
systemd systemdを統括するメインプロセス
systemd-journald ジャーナル管理、ログ管理
systemd-logind ログイン処理
systemd-networkd ネットワーク管理
systemd-timesyncd システムクロック同期
systemd-resolved 名前解決
systemd-udevd デバイス動的検知

またSystemdではUnitという処理単位でシステムの起動処理が行われる。

種類 説明
service 各種サービスの起動
device 各種デバイスの表現
mount ファイルシステムのマウント
swap スワップ領域の有効化
target 複数のUnitのグループ化
timer 指定した日時・間隔での処理実行

2.4.2. Systemdの起動順序

systemdにはランレベルの概念がない。 その代わりにシステム起動時には/etc/systemd/system/default.targetというUnitが処理される。

またグラフィカルログイン(ランレベル5)に相当するUnitは/etc/systemd/system/graphical.targetとなる。

SysVinitのランレベルでSystemdのUnitを置き換えると以下のようになる。

ランレベル ターゲット
0 poweroff.target
1 rescue.target
2 ~ 4 multi-user.target
5 graphical.target (multi-user.target + )
6 reboot.target

default.targetは、上記のターゲットのシンボリックリンクを作成することで設定することができる。

2.4.3. systemctlコマンド

systemctlコマンドはsystemdにおけるサービスを管理を行うコマンド。

systemctl [サブコマンド]
サブコマンド 説明
start / stop サービスの起動 / 終了
restart サービスの再起動
reload サービスの設定を再読み込み
status サービスの稼働状況の出力
is-active サービスが稼働しているかの出力
enable / disable システム起動時にサービスを自動で起動 / 自動で起動しない
reboot システムの再起動
list-units 起動している全てのUnitの状態を表示
list-unit-files 全てのUnitを表示
list-dependencies Unitの依存関係の表示

2.4.4. journalctlコマンド

journalctlコマンドはsystemd-journaldが収集したログを表示するためのコマンド。パイプやgrepコマンドと組み合わせて使用することが多い。

journalctl