ねむみの極み

LPIC101あずき本の1章1節を解説してみた


こんにちは。あみぃです。
この記事はTechCommit Advent Calendar 2022 14日目の記事です。
前回は、iriyaさんのインストール済み VSCode 拡張機能一覧 2022-12 版でした。

昨年はこのブログではなくQiitaの方で無線LANのセキュリティについて図解したのでそちらも見てみてください☆

ところでみなさん、あずき本ってなんであんなに分かりにくい上に高いんですかね。
AWSなんて安くて分かりやすい本がたくさん出ているのに殿様商売しやがって。
この本で理解できる人はこの本の対象読者じゃないと思う。

LPICを受ける人はまず1週間でLPICの基礎が学べる本みたいなのを読んでからあずき本に進むと思うんですけど、前者から後者は一気にハードルがあがる(というかあずき本の記述が不親切すぎて多分理解できない)んですよね。

そもそもいきなり1章でシステムアーキテクチャを持ってこられると面食らうんです。

1ページからなんとか読み進めても、1.1.3で「Linuxは、ハードウェアのアクセスを抽象化するデバイスファイルを持っています」と来て絶望します。

順番的には3章でまず色んなコマンドを叩いてLinuxの操作に慣れてから、どういう仕組みになっているのかを学ぶ方が自然だと思います。

もし金銭的に余裕があるなら、[試して理解]Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】みたいな、カラフルで分かりやすい本でイメージをつかむのがいいんじゃないかと思います。(パラっと立ち読みしただけなので本当に初心者が読んで分かるかは保証しませんw)

しかし、お金がない!どうしてもあずき本で対策しなければいけない!という方のために、あずき本1章1節を解説してみたいと思います。ゆくゆくは全部解説できたらいいなぁ。そして下剋上を・・・w

(ついでに言うと同じシリーズの白本もクソ分かりにくいですよね。
明らかに必要のない説明をダラッダラ続けているページがあって腹が立ちます。)

想定読者

『1週間でLPICの基礎が学べる本』程度の知識を持っている人

なぜハードウェアから入るのか

では早速始めましょう。

あずき本の1章はハードウェアからスタートします。
LinuxはOSなのに、なぜハードウェアについて学ぶのでしょうか。

それはOSが、ハードウェアという資源を制御するための仕組みだからです。

コンピュータに入っているアプリケーションは、ディスクからデータを読み出したり、CPUに処理をさせたり、キーボードから入力を受け付けたり画面に文字を表示させたりなど、常にハードディスクとの何らかのやり取りを行っています。

例えばChromeを立ち上げてYouTubeを流しながらWordで文書を作っているとします。もしそれぞれのアプリが好き勝手にハードディスクを使おうとすると、取り合いになってしまいます。

分かりやすくイメージするためにChromeとWordを挙げましたが、コンピュータは起動しているだけで「プロセス」と呼ばれるものがたくさん動いています。ざっくりプロセス=プログラムと考えてよいです。
そのプロセスが全部ハードウェアにアクセスする訳です。何もしないと大混乱に陥ってしまいますね。

そこで交通整理をしてくれるのがOSという訳です。

しかしその交通整理役が、ハードウェアを正しく認識していなかったらどうでしょう。
アプリからOSに対して、「Aというディスクに入っているデータを読み込んでね」と指示を出しても、OSがそれを認識していなければ、「そんなデータないよ~」となってしまう。

そこで、Linuxがちゃんとハードウェアを認識しているかを確認できるファイルコマンドがあります。

/procディレクトリ

まずは、「Linuxが認識しているハードウェア情報」を確認できるファイルについて。これは、/procというディレクトリの中にあります。
/proc/cpuinfoであればCPU情報、/proc/meminfoであればメモリ情報、といった具合です。

ちなみに/procディレクトリについて正確に説明すると、

プロセスやメモリーなどのLinuxシステム上のリソース関連情報を,あたかもファイルであるかのように配置した仮想的なファイル・システム
(出典:日経クロステック /proc)


です。
実際にファイルが存在している訳ではなく、ファイルのように見えるものがある、といった感じです。

/procディレクトリ内のファイルで試験に問われるのは以下のようなものです。
余裕があれば、catコマンドで中身を見てみると良いでしょう。

/proc/cpuinfo CPU情報
/proc/meminfo メモリ情報
/proc/interrupts IRQ情報
/proc/ioports I/Oアドレス情報
/proc/bus/usb/* USBデバイス情報
/proc/bus/pci/* PCIデバイス(拡張カード)情報
/proc/dma 使用中のDMAチャネルに関する情報
/proc/modules ロードされているカーネルモジュールに関する情報
/proc/scsi/scsi SCSIデバイスに関する情報

結構、知らない単語が多いと思います。
最後から2番目の「ロードされているカーネルモジュール」については後ほど解説しますが、それ以外で分からないものはググって調べてみてください。

ls○○○コマンド

次に、「Linuxが認識しているハードウェア情報」を確認できるコマンドです。
lsホニャララというコマンドがいくつか用意されています。

lscpu CPU
lsusb USBデバイス
lspci PCIデバイス(拡張カード)
lsmod ロードされているカーネルモジュール

これらのコマンドについても、余裕があれば実行してみてください。

BIOS/UEFI

とまぁここまでハードウェアの様子を調べるためのファイルやコマンドを見た訳ですが、実はOSが起動する前、コンピュータの電源を入れたら一番に起動する、ハードウェアを制御するためのプログラムがあります。

それが、BIOS(Basic Input Output System)です。

BIOSは一番最初に起動して、他のみんなをたたき起こす役割です。
普段BIOSをいじることなんてほとんどないですが、

・キーボードなど、デバイスを使うか使わないか
・起動するOSをどこから読み込むか

などを設定することができます。

>起動するOSをどこから読み込むか
というのは、最初はなかなかピンと来ないですよね。

私はこれの意味を急に分かった瞬間がありました。
それは、古くなったMacからMacOSを削除し、Linuxを入れた時です。

LinuxをあらかじめインターネットからダウンロードしてUSBメモリに入れておき、Macに差した状態で電源を入れ、optionキーを長押しすると、どのディスクからOSを起動するか選ぶ画面が出てくるんです。

そこで、「ああなるほど、大量記憶装置にOSが入っていて、それを読み込んで起動するのね」と実感しました。
普通にWindowsなりMacなりを使っているときはそんなの意識しないから、最初は分かりにくいんだと思います。

さてこのBIOSですが、最近はUEFI(Unified Extensive Firmware Extensive)というものに置き換わっているみたいです。進化バージョンですね。しかしUEFIもひっくるめてBIOSと言ったりもするみたいです。

デバイスファイルと/devディレクトリ

話を少し戻します。

最初の方で、/procディレクトリ以下のファイルを見たりlsホニャララコマンドを使ったりすることで、Linuxが認識しているハードウェアの情報を見ることができると説明しました。

では、Linuxはハードウェアのことをどうやって認識・操作しているのでしょうか。
どうやって、と言われても漠然としていますねw

我々人間で考えてみると、ハードウェアというのは「ブツ」です。マウスやキーボードであれば、転がしたりタイピングしたりと、実際に触って操作しますね。

でもLinuxはそんなことはできません。

じゃぁどうするかというと、Linuxは全てのハードウェアをファイルとして認識しているんです。これをデバイスファイルと言い、デバイスファイルに対して読み書きをすることで、ハードウェアを操作します。

デバイスファイルはどこにあるかというと、/devというディレクトリの中にあります。

デバイスファイルの作られ方

/devディレクトリの中のデバイスファイルは、udevという仕組みによって作られます。
ファイル作成係のudev君というのをイメージしてみると良いでしょう。

流れとしては、以下のようになります。

デバイスが接続される

Linuxカーネル(※)がそれを検知し、/sysディレクトリ以下にデバイス情報を作成する

udev君がデバイス情報を参照し、/dev以下にデバイスファイルを作成する
作成するとき、/etc/udev/rules.dディレクトリの中にある設定ファイルの設定を使う


※カーネルとは、Linuxの中核部分のソフトウェアのことです。

こうしてファイルが作られたら、D-Busと呼ばれる仕組みを使ってデバイス情報がアプリケーションに送られ、アプリケーションはデバイスを利用することができるようになります。

D-Busはプロセス間通信機構とか出てきて何やら難しそうですが、Busとついているくらいですから、コンピュータの中にあるバス路線とでもイメージすれば分かりやすいかと思います。

ちなみに/etcディレクトリの中のホニャララ.dというのは設定関連でよく出てくるので、整理しながら覚えると良いです。業務でもよく使います。

デバイスドライバとカーネルモジュール

Linuxはファイルの読み書きを通してデバイス(ハードウェア)を操作することが分かりましたが、操作のためにはもう一つ必要なものがあります。それが、デバイスドライバです。

よくPCに新しいプリンタなどを接続したら、インターネットから自動でドライバをダウンロードしてくれたりしますね。それです。デバイスを操作するためのプログラムです。

Linuxでは、デバイスドライバは必要に応じてカーネルに取り込めるようになっています。この「必要に応じてカーネルに取り込めるようになっているもの」の事をカーネルモジュールといいます。また、カーネルモジュールを取り込むことを「ロードする」と言います。

必要に応じて取り込むと聞いて、「え?どこから?どこにあるん?」って思いましたか?
実は「Linux」と言ったとき、中核部分の「カーネル」を指す場合と、カーネルに色々なソフトウェアを組み合わせてひとまとめにしたものを指す場合とがあります。

ひとまとめにしたものの中に「カーネルモジュール」があり、必要であればカーネルに取り込めるようになっているということです。

カーネルモジュールに関して覚えることは以下の2つです。

lsmod:ロードされているカーネルモジュールを確認するコマンド
modprobe:カーネルモジュールを手動でロードする時のコマンド

USBのデバイスドライバ

最後は唐突感がありますが、USBについてです。
ここではLinuxというよりUSBの規格についての話がメインになります。

USBは、その機能によっていくつかの種類に分かれています。その種類のことをデバイスクラスといいます。
それぞれのデバイスクラスに対し、クラスドライバと呼ばれるデバイスドライバがあります。
なので、どんなデバイスクラスがあるのかな~というのを押さえておく必要があるのです。

主なデバイスクラスは以下の通りです。

HID(Human Interface Device)
 マウスやキーボードなど

マスストレージデバイス
 USBメモリ、HDDなど

オーディオ
 マイク、スピーカー、サウンドなど

プリンタ
 プリンタなど

ワイヤレスコントローラー
 Wi-Fiアダプタ、Bluetoothアダプタなど

おわりに

さて、できるだけはてなが浮かばないように1章1節を解説してみましたが、いかがだったでしょうか。
あずき本と合わせて本記事を読んだら、ping-tに挑戦してみてください。
スムーズに解けるようになっていたら嬉しいです。