#ハードウェアの基本知識と設定
##デバイス情報の確認
Linuxは、ハードウェアのアクセスを抽象化するデバイスファイルを持っている。全てのハードウェアはデバイスファイルとして表され、デバイスファイルの読み書きを通してハードウェアにアクセスできるように設計されている。デバイスファイルは「/dev」ディレクトリ配下にある。これらのデバイスファイルは、udev(Userspace DEVice management)という仕組みによって自動生成される。
$ ls /dev
Linuxカーネルが認識しているデバイスに関する情報は、「/proc」ディレクトリ配下のファイルで確認できる。
ファイル名 | 説明 |
---|---|
/proc/cpuinfo | CPU情報 |
/proc/interrupts | IRQ情報 |
/proc/ioports | I/Oアドレス情報 |
/proc/meminfo | メモリ情報 |
/proc/bus/usb/* | USBデバイス情報 |
/proc/bus/pci/* | PCIデバイス情報 |
##udev
/devディレクトリ配下のデバイスファイルは、udevという仕組みによって自動的に作成される。
udevの仕組みでは、デバイス(ハードウェア)を接続されると、カーネルがそれを検知し、/sysディレクトリ以下にデバイス情報を参照して、/devディレクトリ配下にデバイスファイルを作成する。その際に、「/etc/udev/rules.d」ディレクトリ配下の設定ファイルが使われる。設定ファイルを編集することで、例えばあるUSBメモリを「/dev/usbmemory」とする、といったように、特定のハードウェアを任意の名前のデバイスファイルとして扱えるようにすることもできる。
##デバイスドライバのロード
デバイスを利用するために必要な制御プログラムをデバイスドライバという。Linuxでは、デバイスドライバはカーネルの一部(カーネルモジュール)として提供されている。必要なデバイスドライバをカーネルに取り込むことを「ロードする」という。
# ロードされているカーネルモジュールを確認するコマンドは以下。
$ lsmod
# 手動でデバイスドライバをロードする場合のコマンド ※必要なデバイスドライバは自動的にロードされる
$ modprobe e 1000
#Linuxの起動とシャットダウン
システムが起動するまでの流れ
- 電源ON
- BIOS/UEFI起動(ハードウェアのチェック・初期化)
- ブートローダ起動
- カーネル起動
- init/systemd起動
※上記のようなシステムが起動するまでの処理の流れを、ブートまたはブートストラップという。
ブートローダー|
起動デバイス上からカーネルをメモリ上へ読み込む役割を担う
カーネル|
メモリの初期化やシステムクロックの設定などを行い、仮のルートファイルシステム(initamfs:初期RAMディスク)をマウントする。初期RAMには、システムの起動に必要なデバイスドライバが組み込まれており、これを使ってハードディスク等のデバイスへアクセスできるようになる。ルートファイルシステムが使えるようになると、カーネルは最初のプロセスであるinit(またはsystemd)プロセスを実行する。initは必要なサービスを順次起動していき、最後にログインプロンプトを表示して起動処理を完了する。
##起動時のイベント確認
dmesgコマンドを使うと、システム起動時にカーネルがどのような処理を行ったか確認することができる。
dmesgコマンドは、カーネルが出力したメッセージを一時的に蓄えて奥バッファの内容を表示する。システムが起動した後もカーネルが出力するメッセージが蓄えられていくため、バッファに収まりきらなくなった古いメッセージは消えていく。
$ dmesg
##システムのシャットダウンと再起動
shotdownnコマンドの主なオプション
オプション | 説明 |
---|---|
-h | シャットダウンする |
-r | シャットダウン後にシステムを再起動する |
-f | 次回起動時にfsckをスキップする(-hまたは-rと組み合わせて利用する) |
-F | 次回起動時にfsckを必ず実行する(-hまたは-rと組み合わせて利用する) |
-k | シャットダウンせず警告メッセージを通知する |
-c | 現在実行中のシャットダウンをキャンセルする |
#Linux起動の仕組み
システムの電源を入れてからLinuxが起動する手順は、これまでUNIX系OS全般で広く使われてきたSysVinit(System Five Init)が主流だった。現在では、systemdという新しい起動の仕組みが主流になってきている。
##SysVinit
SysVinitでは、Linuxシステムで最初に実行されるプロセスであるinitが、/etc/inittabファイルの設定に従い、システムに必要なサービスを順次起動していく。
- initが「/etc/inittab」ファイルを読み込む
- initが「/etc/rc.sysinit」スクリプトを読み込む
- initが「/etc/rc」スクリプトを実行する
- 「/etc/rc」スクリプが「/etc/rc<ランレベル>.d」ディレクトリ配下のスクリプトを実行する
SysVinitでは、あらかじめ決められた順にサービスが起動していくため、あるサービスの起動に手間取ると、それ以後に起動するサービスが待たされてしまい、最終的な起動完了まで時間がかかってしまう。そのため、現在では多くのディストリビューションがsystemdやUpstartといった新しい仕組みに切り替えている。
##systemd
systemdを採用したシステムでは、initプロセスの代わりにsystemdプロセスが起動し、各種サービスを管理する。systemdでは、以下のような複数のデーモンプロセスが連携して動作する。
プロセス名 | 説明 |
---|---|
systemd | systemdのメインプロセス |
systemd-journald | ジャーナル(ログ)管理プロセス |
systemd-logind | ログイン処理プロセス |
systemd-udevd | デバイス動的検知プロセス |
systemdでは、システムの起動処理は多数のUnitと呼ばれる処理単位に分かれている。Unitには、あるサービスを起動するUnitや、ファイルシステムをマウントするUnitなどがある。Unitは、いくつかの種類に分類でき、拡張子で種類を区別できる。
▼Unitの主な種類
拡張子 | 説明 |
---|---|
service | 各種サービスを起動する |
device | 各種デバイスを表示する |
mount | ファイルシステムをマウントする |
swap | スワップ領域を有効にする |
target | 複数のUnitをグループ化する |
###systemdの起動手順
systemdは、サービスAを起動するには先にサービスBを起動する、といった各種サービスの依存関係や順序関係を処理できる。SysVinitでは、サービスは順次起動していくため、デフォルトで起動するよう設定されたサービスは、その時点では必要がなかったとしても起動される。また、起動途中でサービス起動処理が遅滞すると、次のサービス起動処理が待たされてしまう。結果として、システム全体の起動時間が長くなる。systemdでは、必要なサービスのみが起動する。また、サービスの起動は並列的に行われるので、システムの移動はSysViitに比べて短縮される。
###systemctlによるサービスの管理
systemdでサービスを管理にするには、systemctlコマンドを使う。
サブコマンド | 説明 |
---|---|
start | サービスを起動する |
stop | サービスを終了する |
restart | サービスを再起動する |
reload | サービスの設定を再読み込みする |
status | サービスの稼働状況を表示する |
is-active | サービスが稼働しているかどうかを確認する |
enable | システム起動時にサービスを自動起動する |
disable | システム起動時にサービスを自動起動しない |
list-unit-files | 全てのUnitを表示する |
reboot | システムを再起動する |
poweroff | システムをシャットダウンする |
Unitの設定ファイル
「/etc/systemd/system/multi-user.target.wants/」ディレクトリ配下にある