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コマンド
デバイスの情報を確認するためのコマンド。
オプション | 説明 |
---|---|
-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デバイスの情報を表示するためのコマンド。
オプション | 説明 |
---|---|
-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コマンドはロードされたカーネルモジュールの一覧を表示するためのコマンド。 カーネルモジュールは、カーネル内で動作するドライバーやファイルシステムなどの機能を提供している。
modprobeコマンド
modprobeコマンドはカーネルモジュールを手動でロードするためのコマンド。modprobeコマンドを使用すると、特定のカーネルモジュールをロードしたり、モジュールの依存関係を自動的に解決したりすることができる。
2.2. システムの起動とシャットダウン
2.2.1. Linuxのシステム起動フロー
OSが起動するまでの流れは基本的には以下の通り。(x86アーキテクチャ構成の場合)
- BIOS/UEFIが起動し、ハードウェアチェックや初期化を行い、ブートローダを読み出し制御を移す
- カーネルはメモリの初期化、システムクロックの設定を行い、初期RAMディスクをマウントする
- カーネルは最初のプロセスであるinit(またはsystemd)プロセスを実行する
2.2.2. システム起動時のイベント確認方法
システム起動時にカーネルがどのような処理を行ったかはログファイルである/var/log/message
、/var/log/dmesg
、/var/log/boot.log
などに保存される。
これらのファイルはテキストファイルなのでcatコマンドで閲覧可能となる。なお閲覧にはroot権限が必要な場合がある。
dmesgコマンド
dmesgはシステム起動時にカーネルがどのような処理を行かったか確認できるコマンド。
journalctl -kコマンド
systemdを採用したシステムにおいてdmesgコマンドと同様にカーネルのバッファを表示することができるコマンド。 bオプションでシステム起動時のメッセージの表示が可能。
2.2.5. シャットダウンと再起動
shutdownコマンド
shutdownコマンドはシステムのシャットダウンや再起動を行うことができるコマンド。
オプション | 説明 |
---|---|
-h | シャットダウン後にシステムを停止する |
-r | シャットダウン後にシステムを再起動する |
-k | シャットダウンを実際には行わず、ユーザーに警告メッセージを表示する |
-t | シャットダウンまでの待機時間(秒)を指定する |
-c | シャットダウン処理をキャンセルする |
-f | シャットダウン処理を強制的に実行する |
以下の例は30分後にシステムを停止し、ログインしているユーザに「Please logout now」とメッセージを表示するもの。
systemctlコマンド
systemdを採用したLinuxシステムではshutdownの代わりにsystemctl reboot
で再起動、systemctl poweroff
でシステムの終了が行える。
2.3. SysVinitとランレベル
2.3.1. SysVinitによる起動
SysVinitはかつて使用されていたLinuxの起動の仕組み。 現在はsystemdのほうが主流となっている。
SysVinitによる起動順序は以下の通り。
- initが/etc/inittabファイルを読み込む
- initが/etc/rc.sysinitnスクリプトを読み込む
- initが/etc/rcスクリプトを実行する
- /etc/rcスクリプトが /etc/rc<ランレベル>.dディレクトリ以下のスクリプトを実行する
SysVinitはサービスを順次起動に時間がかかる、依存関係を適切に処理できない問題があった。これらの問題を解決した起動の仕組みにはupstartやsystemdがある。
Upstart
UpstartはSysVinitを改善した新しいinitの仕組みで以下の特徴がある。
- 依存関係を適切に処理
- 並列起動
- イベント駆動
2.3.2. ランレベル
ランレベルはLinuxシステムの動作モードのこと。
システムのデフォルトのランレベルは/etc/inittab
に記載されている。
またこのファイルで起動する際のランレベルも設定できる。
ランレベル | RedHat系 | Debian系 |
---|---|---|
0 | 停止 | 停止 |
1 | シングルユーザモード | シングルユーザモード |
2 | マルチユーザモード(テキストログイン、NFSサーバは停止) | マルチユーザモード |
3 | マルチユーザモード(テキストログイン) | マルチユーザモード |
4 | 未使用 | マルチユーザモード |
5 | マルチユーザーモード(グラフィカルログイン) | マルチユーザモード |
6 | 再起動 | 再起動 |
S or s | シングルユーザーモード | シングルユーザモード |
runlevelコマンド
現在のランレベルの確認を行うコマンド。
表示は<以前のランレベル> <現在のランレベル>
で表示される。
init/telinitコマンド
ランレベルの変更を行うコマンドで実行にはroot権限が必要。
wallコマンド
wallコマンドはログインしているユーザー全員の端末画面に一斉にメッセージを送信するコマンド。再起動や停止を行う際にシステム利用者に通知するために使用する。
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におけるサービスを管理を行うコマンド。
サブコマンド | 説明 |
---|---|
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コマンドと組み合わせて使用することが多い。