LoginSignup
1
0

Linuxのシステムアーキテクチャ

Last updated at Posted at 2023-08-10

基本的なハードウェア

CPUやメモリ、ストレージなどのハードウェア情報を確認したり、設定したり、問題発生時の調査のためのコマンドやオプションがいくつか用意されている。

デバイスファイル

デバイスを表すファイルのこと。デバイスファイルは/devディレクトリ以下に配置される。これらのデバイスファイルは、udevという仕組みによって自動的に作成される

Linuxカーネルが認識しているデバイスに関する情報の一部は、/procディレクトリ以下のファイルで確認できる。これらはファイルとして実体がない仮想的なファイルで、一部のファイルはテキストファイルとして閲覧可能

ファイル名 説明
/proc/cpuinfo CPU情報
/proc/interrupts IRQ情報
/proc/ioports I/Oアドレス情報
/proc/meminfo メモリ情報
/proc/bus/usb/* USBデバイス情報
/proc/bus/pci/* PCIデバイス情報
/proc/dma 使用中のDMAチャネルに関する情報

・DMA(Direct Memory Access)とは??
CPUを介することなくメインメモリと周辺機器の間で直接的に情報転送を行う方式

udev(Userspace Device management)

ホットプラグデバイスを接続した際、/devディレクトリ以下のデバイスファイルを自動的に作成する。デバイスが接続されるとカーネルがそれを検知し、/sysディレクトリ以下にD-Bus(Desktop Bus:デバイス情報)を作成する。
設定情報ファイルは/etc/udev/rules.dに配置される

・ホットプラグデバイスとは??
システムが起動している状態でもデバイスの差し替えができるデバイスのこと。プラグアンドプレイデバイスとも呼ばれる。USBやPCカード(PCMCIA)などがある

・コールドプラグデバイスとは??
システムが停止している状態でのみデバイスの差し替えができるデバイスのこと。システム起動時にデバイスを認識する。NIC(ネットワークカード)などがある

lspciコマンド

PCIバスに接続されているデバイスを一覧表示するコマンド。オプションを使えばIRQ情報やバススピード、ベンダーIDなど、デバイスに関するさまざまな情報を取得できる。

オプション 内容
-s バス番号、デバイス番号、ファンクション番号を指定し、該当するデバイスのみを表示する
-v 詳細な情報を表示する
-vv より詳細な情報を表示する

・PCI(Peripheral Component Interconnect)バスとは??
PCIは拡張ボードを差し込むための接続規格で、バスはコンピューター内のデバイス間でデータをやり取りするための通信路。これらを合わせてコンピューターと拡張ボードをPCIを利用してつなぐバスのことをPCIバスという。

・IRQ(Interrupt Request)とは??
割り込み要求のことで、デバイスがCPUに信号を送り、現在実行中の処理を中断して指定した処理を行うように強制すること。/proc/interruptsファイルで情報が確認できる

・バススピード??
マザーボードのスピードのこと。CPU がそれ以外のパーツとデータをやり取りするスピード

D-Bus(Desktop Bus)

プログラム同士が情報を伝達するプロセス間通信機構の一つ。Linuxではdbus-daemonなどがプロセス間通信の中継を行う。
新しいデバイスの認識情報を他のアプリケーションに伝達し、そのアプリケーションが新しいデバイスをすぐに使えるようになるなどのシステム管理上の利便性も向上する。

USB(Universal Serial Bus)デバイス

周辺機器を接続するために広く普及している規格。USBにはいくつかのバージョンがあり、最大データ転送速度などが異なる。クラスドライブ(Linuxに最初から搭載されている汎用のドライブ)で対応できるため、専用のデバイスドライブをインストールする必要はない

  • 最大127台まで接続可能
  • 同一のコネクタで接続可能
  • 電源を入れたままの接続・取り外し対応(ホットプラグ)
  • USBポートから電源供給可能
バージョン 最大データ転送速度
USB 1.0 12Mビット/秒
USB 1.1 12Mビット/秒
USB 2.0 480Mビット/秒
USB 3.0 5Gビット/秒
USB 3.1 10Gビット/秒
デバイスクラス デバイス
HID(Human Interface Device) キーボード、マウス、ジョイスティックなど
Mass Storage Class ハードディスク、USBメモリーなど
ACM Communication Device Class モデム、TAなど
Audio Class スピーカー、マイクなど

lsusbコマンド

接続されているUSBデバイスの情報を一覧表示するコマンド。
/proc/bus/usb/devicesには接続されたUSBデバイスの情報が格納されている。

オプション 内容
-v 詳細な情報を表示する
-t USBデバイスの構造を階層ツリー上に表示する

デバイスドライバ

デバイスを利用するために必要な制御プログラムのこと。コンピューター内のストレージに保存される。Linuxではカーネルモジュールとして提供されていて、カーネルに取り込むことを「ロードする」という。

・カーネルモジュールとは??
Linuxカーネルに追加できるプログラムのこと。カーネルの機能を拡張することができる

lsmodコマンド

modは「module」の意味で、ロードされているカーネルモジュールを一覧表示するコマンド。/proc/modulesファイルの内容が読み込まれて表示される。

modprobeコマンド

書式:modprobe [オプション] モジュール名
probeは「調査」を意味し、カーネルモジュールを手動でロード・アンロードするコマンド。
blasklist(ブラックリスト)を設定することにより、「ロードすると問題が発生するモジュールや不要なモジュールを、システム起動時にロードしない」ようにできる。
その際は、modprobeの設定ファイルであるetc/modprobe.d/ディレクトリ配下の.confの拡張子を持つファイルでblacklistを指定する

オプション 説明
options 各カーネルモジュールのデフォルトパラメータを指定する
alias カーネルモジュールに別名をつける
install 特定のカーネルモジュールのロード時に実行されるコマンドを指定する
-r(remove) モジュールを削除する
blacklist ロードしたくないカーネルモジュールを指定する

システム起動までの流れ

ブートシーケンス

システムを立ち上げる処理を「boot」と呼び、電源を入れてからログイン画面あるいはログインプロンプトが表示されるまでに、カーネルの初期設定、ファイルシステムのマウント、システムの様々な管理をするプログラム(デーモン)の起動、ネットワークの設定など、OSが起動するために必要なすべての設定までの一連の流れのこと。

キャプチャ9.PNG

1.BIOS(Basic Input/Output System)/UEFI(Unified Extensible Firmware Interface)が起動する

ハードディスクの先頭領域に書き込まれたブートローダをメモリに読み込み起動させる。

BIOSとは「基本入出力システム」のことで、コンピューター内のハードウェアを制御するNVRAM(Non Volatile RAM:不揮発性メモリ)に格納された最も基本的なプログラムのこと。マザーボード上のROM(Read only memory:読み出し専用メモリ)に書き込まれている。電源を入れて最初に起動され、コンピューターに接続されているハードウェアをチェックした後使用できる状態に準備する。
そして、ストレージ上からブートローダーを読みだした後ブートローダーに制御を移していく。

UEFIはファームウェアとOSの間の通信仕様を定めた規格の1つで、現在ではBIOSの後継として普及している。

BIOSのセットアップ画面では以下の設定が行える。設定の保存後に再起動すれば変更が有効になる。

  • ハードウェア構成の確認
  • 認識しているハードウェアの有効・無効化
  • 日付や時刻(ハードウェアクロック)
  • 電源管理
  • 起動ドライブの順序設定
  • 自己診断プログラムの実行
  • IRQの割り当て

2.ブートローダー(Bootloader)が起動する

ブートローダーとはOSを起動するためのプログラムで、OS本体であるカーネルをストレージ上からメモリ上に読み込む役割を持つ。
ブートローダーはHDDの最初のセクタ(512バイト)にあるMBR(マスターブートレコード)に格納されている。以下のように使用する領域が決まっている

  • ブートストラップローダ(446バイト)
  • 第1パーティション情報(16バイト)
  • 第2パーティション情報(16バイト)
  • 第3パーティション情報(16バイト)
  • 第4パーティション情報(16バイト)
  • ブートシグニチャ(2バイト)

MBRにインストールされるGRUBのプログラム(stage1と呼ばれる)のサイズは440バイトのため、MBRにあるGRUBのstage1を読み書きする場合はbs=440と指定することもできる

GRUB(Grand Unified Bootloader)

書式:grub> linux カーネルイメージ [オプション]
一般的に利用されているブートローダー。多数のファイルシステムを認識し、シェル機能を搭載しコマンドによる高度な管理が可能。
通常はデフォルトでインストールされている。うまくインストールができなかった場合、以下のコマンドを使用しインストール先を指定する。

起動オプション 説明
init=パス initの代わりに指定コマンドを実行
root=デバイス名 ルートパーティションを設定
数字(0‐6) 指定したランレベルで起動
quiet 起動中のカーネルからの情報出力を抑制する

起動時にカーネルに渡された引数を確認するには/proc/cmdlineファイルで確認できる。

grub-install /dev/sda
設定項目 内容
default デフォルトで起動するブートエントリの番号や名前などを指定。titleでエントリされた何番目の物かを表す。最初は0番目
timeout OSを自動起動するまでの待機時間(単位:秒)を定義する
title 起動するOSに対して名前を定義する
karnel カーネルのイメージファイルとカーネルオプションを指定する
initrd 初期RAMディスクのイメージファイルを指定する
CMDLINE_LINUX カーネルに渡される起動オプションを指定する

GRUB Legacy(GRUB1)

バージョン0.9系のGRUBバージョン。設定ファイルは「/boot/grub/menu.lst」、ディストリビューションによっては「/boot/grub/grub.conf」になる。

下記コマンドで起動するカーネルイメージと起動オプションを指定することが出来る

#/boot/grub/menu.lstにおいてシステム起動時のカーネルイメージ「/boot/vmlinuz-2.6.35 」と起動オプションを指定
# kernel /boot/vmlinuz-2.6.35 root=/dev/hda1

ルートパーティションを指定するには、「root (hdディスク番号,パーティション番号)」と指定し、その際番号はどちらも0から数える

  • root (hd0,0):1番目のディスクの1番目のパーティション
  • root (hd0,1):1番目のディスクの2番目のパーティション
  • root (hd1,1):2番目のディスクの2番目のパーティション

GRUB2

バージョン1.9系のGRUBバージョン。設定ファイルは「/boot/grub/grub.cfg」だが、このファイルを直接編集することはない。「/etc/default/grub」ファイルおよび「/etc/grub.d」ディレクトリ内のファイルに記述し、以下コマンドで設定内容をファイルに反映させる

パーティションを指定する際は、「(hdディスク番号,パーティション番号)」のように指定する。ディスク番号は0から、パーティション番号は1から数える。

主なディレクトリと設定ファイル 説明
/boot/grub 設定ファイルとモジュールの置かれたディレクトリ。ディストリビューションによっては/boot/grub2
/boot/grub/grub.cfg 設定ファイル。ディストリビューションによっては/boot/grub2/grub.cfg
/ust/lib/grub/i386-pc モジュールの置かれたディレクトリ
/etc/grub.d 設定ファイルgrub.cfgの生成時に実行されるスクリプトが置かれたディレクトリ
  • menuentry:各項目の名前としてメニューに表示するエントリ名
  • insmod:ロードするモジュールの名前を指定する項目
  • set:設定項目を指定するキーワード

grub-mkconfigコマンド

設定ファイルgrub.cfgを生成するコマンド。引数なしで実行すると設定ファイルの内容を標準出力に出力する。

## Debian系の場合2つのうちどちらか
update-grub
grub-mkconfig -o /boot/grub/grub.cfg

## Red Hat系の場合
grub2-mkconfig -o /boot/grub2/grub.cfg

GRUB2では機能ごとにモジュールが用意されており、モジュールを使う際にはinsmodでロードするモジュールを指定する

  • オプション設定
    ブートローダー起動時に、システムの動作をしているするための様々なオプションを指定することが出来る。起動時の画面でEキーを押すと画面が表示される
パラメーター 説明
root=デバイス ルートパーティションとしてマウントするデバイス
nousb USBデバイスを使用しない
single シングルユーザーモードで起動する
1~5 指定したランレベルで起動する

3.カーネルが起動する

initramfs(初期RAMディスク)という圧縮アーカイブファイルを展開し、ファイルシステムへアクセスするために必要なドライバやスクリプトを使用してルートファイルシステムをマウントする。
initまたはsystemdプロセスを生成する(OS起動の仕組みにSysVinitを採用している場合はinitプロセス、systemdの場合はsystemdプロセス)

  • ファイルシステムへアクセスするのに必要なドライバやスクリプトが含まれている
  • /bootディレクトリに格納される
  • カーネルのバージョンごとに内容が異なる

SysVinit(SystemV Init)

OS起動の仕組みの1つで、SystemV(システムファイブ)と呼ばれるUNIXの仕組みに基づいている。
あらかじめ決められた順にサービスが起動していくため、あるサービスの起動に手間取るとそれ以後に起動するサービスが待たされてしまい、最終的な起動完了まで時間がかかってしまう。

  • initプロセス
    SystemVinitにおいてシステムで最初に実行されるプロセスのこと。最初に実行されるプロセスなのでPIDは1となり、実行されるプログラムは/sbin/initになる。

  • /etc/inittabファイル
    デフォルトのランレベルやinitが起動するプログラムが記述されており、initが設定に従ってシステムに必要なサービスを順次起動していく。最終行の数字を変更することでデフォルト設定を変更することが出来る
    「ctrl+alt+del」キーを押すとシステムの動作を設定することができる

/etc/inittabの記述に基づいて、自動起動するべきプロセスを立ちあげるなど、アプリケーションレベルの初期化を行う。

id:5:initdefault:

スクリプトのファイル名は次の規則で命名される

  • 1文字目:S(Start,サービスを起動)、K(Kill,サービスを停止)
  • 数字:実行優先順位、若番のものが先に実行される
  • サービス名:任意の名前を付ける

以下コマンドを実行することで、システムを再起動せずに再読み込みさせ即座に変更を反映させることが出来る

# init q
# init Q
# telinit q
# telinit Q

Upstart,systemdは/etc/inittabを設定ファイルとして使用しないinitプログラムである

runlevelコマンド

左側に1つ前のランレベル、右側に現在のランレベルを表示する。ランレベルと呼ばれる動作モードごとに、どのサービスを起動するかしないかを決めることができる。一般的なランレベルは以下の通りとなる。

ランレベル 説明
0 システムの停止
1(Sまたはs) シングルユーザーモード
2 マルチユーザーモード(テキストログイン・ネットワークなし)
3 マルチユーザーモード(テキストログイン)
4 未使用
5 マルチユーザーモード(グラフィカルログイン)
6 システムの再起動
N 1つ前のランレベルが存在しない

/etc/rc0.d/etc/rc6.dディレクトリに各ランレベルごとに起動するスクリプトファイルが格納されている。
rc=run commandの略で、d=daemon(メモリ上に常駐しているサービスを提供するプロセス)の略

・シングルユーザーモードとは??
rootユーザーだけが利用できる特殊な状態のこと。一般ユーザーはログインできないため、システムのメンテナンスなど一般ユーザーが利用しては困る場合などに使われる

通常、ランレベルは3または5を使用する。2と3はCUIで、5はGUIでシステムを使用する。

initコマンド

書式:init ランレベルの数字
ランレベルを変更することができる。ランレベルが切り替わるとユーザー名とパスワード名を求められる。

telinitコマンドでもランレベルを変更することが出来る。

wallコマンド

書式:wall 'メッセージ文'
ログイン中のユーザー(自分自身も含めて)に一斉にメッセージを送るコマンド

$ wall 'This system is going into maintenance mode, please log out!'

Broadcast message from taro@localhost.localdomain (pts/0) (Wed Nov 30 22:05:44 2022):

This system is going into maintenance mode, please log out!

Upstart

SysVinitを改善した新しいinitの仕組み。サービスの依存関係を適切に設定し、並列で起動することで短時間でシステムを起動したりすることが出来るようになった

  • サービスやタスクを「ジョブ」という単位で扱う

  • イベント駆動型
    前提条件がすべて成立した時点でジョブを実行する。SysVinitの順次起動と異なり不要な待機時間が無くなる

  • サービスの並列起動処理が可能
    各ジョブの実行が並列に行われるため、関連のない独立したサービスは同時に起動させることができる

起動スクリプト

SysVinitでは各種サービスの起動には、/etc/init.dディレクトリ以下に用意されているスクリプトが使われる。ランレベルが異なれば起動するサービスも異なる。
起動スクリプトは、システムサービスや各種サーバを起動・再起動・終了したりする場合に利用する

#httpdを起動する場合
# /etc/init.d/httpd start

#httpdを終了する場合
# /etc/init.d/httpd stop

ACPI(Advanced Configuration and Power Interface)

コンピュータの電源管理や構成に関する規格のこと。OS上でシャットダウンや再起動などを行う際の命令は、ACPIイベントとして通知される。
acpidデーモンはACPIイベントを監視し、イベントに対応する処理を実行する。

  • Power/Sleep/Suspend ボタンなど、特殊なキーを押す
  • ノートパソコンのフタを閉じる
  • ノートパソコンに AC 電源アダプタを接続 (切断) する
  • イヤフォンジャックを接続 (切断) する

キャプチャ7.PNG

4.initまたはsystemdプロセスを実行する

systemdとは?

SysVnitに代わって導入されたOS起動の仕組みであり現在の主流。複数のデーモンプロセス(常駐プロセス)が連携して動作する。
今まではサービスを1つずつ順番に起動しなければならなかったが、必要なサービスを必要なタイミングで起動できるようになった。また、並列起動を行うことができシステムの起動時間が短いという特徴がある。

  • 扱う処理をUnitという単位で管理する
  • サービスの並列起動によって高速なシステム起動や停止が行える
  • cgroupsでプロセスのリソースを管理する
拡張子 機能
device 各種デバイスを管理するUnit
mount ファイルシステムのマウントを管理するUnit
service サービスを制御するUnit
swap スワップ領域を制御するUnit
target 複数のサービスを一つのグループにするためのUnit

・デーモン(daemon)とは??
メモリ上に常駐してシステムサービスやサーバサービスを提供するプロセス

systemdの起動処理

システムの起動処理をUnit(ターゲット)と呼ばれる単位に分けて管理をし、まず/etc/systemd/system/default.targetというUnitを起動する。

サーバとして動作させる場合はランレベル3を指定するので、runlevel3.target,multi-user.targetとなる

  • graphical.target
    グラフィカルログイン(従来のランレベル5)で起動するサービスをまとめたUnit。グラフィカルログインをデフォルト環境にするには
    /lib/systemd/system/graphical.targetへのシンボリックリンクdefault.targetを作成する。

・ターゲットとは??
SystemVinitのランレベルに該当する。各ターゲットには起動するサービスがUnitとしてまとめられており、起動することでランレベルと同じ役割を果たす。

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

systemctlコマンド

書式:systemctl サブコマンド Unit名
サービスを管理(Control)するためのコマンド。以下のサブコマンドが存在する。

サブコマンド 説明
start サービス起動
stop サービス停止
restart サービス再起動
reload サービスの設定を再読み込みする
status サービスの稼働状態を表示
is-active サービスが稼働中か確認する
enable システム起動時にサービスを自動的に起動
disable システム起動時にサービスを自動的に起動しない
is-enabled サービスの自動起動が有効か確認する
mask 指定したUnitをマスクし手動でも起動できないようにする
unmask 指定したUnitのマスクを解除する
list-dependencies Unitの依存関係を表示する
list-unit 起動している全てのUnitを表示する
list-unit-files 全てのUnitファイルを表示する
reboot システムの再起動
halt システムを停止しhalt状態(ホールト:システムを停止し電源を切れる状態)にする
poweroff システムを停止しシャットダウン
get-default 現在のデフォルトモードを確認
set-default システム起動時のデフォルトのターゲットを変更
rescure 現在のランレベルをシングルユーザーモード(systemdの rescue.target 起動に相当)に変更する

# systemctl rescueから通常の起動状態に戻る場合

  • Ctrl-Dを入力する
  • systemctl reboot コマンドを実行する
  • systemctl default コマンドを実行する
#メールサーバのPosfixサービスを起動する場合
# systemctl start postfix.service

dmesg、journalctlコマンド

書式:dmesg(journalctl) | head 表示する行数
書式:journalctl -k[オプション]
システム起動時にカーネルが出力したメッセージを一時的に蓄えておくバッファ内容を確認することができる。長時間稼働している場合、起動時のメッセージは残っていないことがある。

メッセージは/var/logディレクトリ内のファイルにも保存されている。閲覧にはroot権限が必要の場合がある。systemdであればjournalctlコマンドも使用可能で「-b」オプションでシステム起動時のメッセージを表示できる。

[root@ip-10-0-2-18 ~]# dmesg | head -5
[    0.000000] Linux version 6.1.34-56.100.amzn2023.x86_64 (mockbuild@ip-10-0-39-17) (gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4), GNU ld version 2.39-6.amzn2023.0.6) #1 SMP PREEMPT_DYNAMIC Tue Jun 20 20:55:54 UTC 2023
[    0.000000] Command line: BOOT_IMAGE=(hd0,gpt1)/boot/vmlinuz-6.1.34-56.100.amzn2023.x86_64 root=UUID=0bfb954f-5412-4d5a-8d40-3a2596532c79 ro console=tty0console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet
[    0.000000] KASLR disabled
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'

journalctlコマンドの「-k」オプション、または「--dmesg」オプションで、dmesgコマンドと同じ情報(起動時にカーネルが出力したメッセージ)が出力される

システムの終了と再起動

shutdownコマンド

書式:shutdown [オプション] 時間[メッセージ]
PCと同じでシステムを終了させるにはシャットダウンが必要。rootユーザーのみ実行が可能になる。
分単位の場合は「+」、時刻の場合はダブルコロンで記載する。
systemdであればpoweroff,rebootのサブコマンドを使用してシャットダウンや再起動が可能

オプション 説明
-h シャットダウンする
-r シャットダウン後にシステムを再起動する
-f 次回起動時にfsckをスキップする(-hまたは-rと組み合わせて利用)
-F 次回起動時にfsckを必ず実行する(-hまたは-rと組み合わせて利用)
-k 実際にシャットダウンせず警告メッセージを通知する
-c 現在実行中のシャットダウンをキャンセルする
#ただちにシステムを停止する場合
$ shutdown -h now

#警告メッセージの表示
$ shutdown -k 'Please logout immediately'

#10分後にシステムを再起動
$ shutdown -r +10

#22時30分にシステムを再起動
$ shutdown -r 22:30
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0