01 / 読書ガイド
読書ガイド
引用
Ward, B. (2021). How Linux Works: What Every Superuser Should Know (3rd ed.). No Starch Press.
章の要約
第3版は17章と参考文献、索引(423ページから始まる)からなる。序文では、本書を読むべき人、前提知識、読み方、実際に手を動かすことについての注意、本書の構成を述べている。出版社によれば、この版では論理ボリュームマネージャー(LVM)、journaldロギングシステム、IPv6の解説が加わり、systemdの議論が拡充され、コンテナとcgroupsを含む仮想化の章が追加された。各章は、システムの層の概観からコマンドライン、デバイス、ディスク、ブートを経て、プロセス、ネットワーク、ユーザー環境、開発ツール、仮想化へと進み、多くの節でシステムが何をしているかを明らかにするコマンドやファイルを示している。
第1章:全体像
Linuxシステムにおける抽象化のレベルと層、すなわちハードウェアとメインメモリ、カーネル、ユーザー空間、ユーザーを扱う。この章が示す地図を、本書の残りの部分が埋めていく。
第2章:基本コマンドとディレクトリ階層
シェルの実用的な入門である。基本的なコマンドと中級のコマンド、ディレクトリの移動、環境変数とコマンドパス、特殊文字、エディタ、オンラインヘルプ、入出力のリダイレクト、エラーメッセージ、プロセス、ファイルのパーミッション、アーカイブ、ディレクトリ階層、スーパーユーザーとしてのコマンド実行を扱う。
第3〜4章:デバイス、ディスクとファイルシステム
デバイスファイル、sysfsのデバイスパス、dd、デバイスの命名とudevを扱い、カーネルにおけるSCSIを詳しく扱う節もある。第4章はパーティション分割、ファイルシステム、スワップ領域、論理ボリュームマネージャーを扱い、伝統的なファイルシステムの内部を見て終わる。
第5〜6章:Linuxカーネルはどのようにブートするか、ユーザー空間はどのように始まるか
無料のサンプル章は、ブートメッセージを見る方法(たとえばjournalctl -k)から始まり、カーネルの初期化とパラメータ、ブートローダー、GRUB、UEFIセキュアブートの問題、チェーンローディングを扱う。第6章はinit、systemdの詳細、System Vのランレベルとinit、シャットダウン、初期RAMファイルシステム、緊急時のブートを導入する。
第7章:システム設定:ロギング、システム時刻、バッチジョブ、ユーザー
システムのロギング、/etcの構造、ユーザー管理ファイル、gettyとlogin、時刻の設定、cron・systemdのタイマーユニット・atによるタスクのスケジューリング、ユーザーアクセスの話題、PAM(Pluggable Authentication Modules)を扱う。
第8章:プロセスとリソース利用の詳細
プロセスの追跡、lsofによる開いているファイルの確認、プログラムの実行とシステムコールのトレース、スレッド、リソースの監視、コントロールグループ(cgroups)を扱う。
第9〜10章:ネットワークとその設定を理解する、ネットワークアプリケーションとサービス
第9章は、層とパケットからIPルーティング、IPv6、ICMPとDNSのツール、カーネルのネットワークインターフェース、設定マネージャー、ホスト名の解決、TCPとUDP、DHCP、Linuxをルーターとして設定すること、NAT、ファイアウォール、ARPとNDP、無線ネットワークまでを積み上げていく。第10章はサービスへと上がり、ネットワークサーバー、古いinetd/xinetd、診断ツール、リモートプロシージャコール、ネットワークセキュリティ、ソケットを扱う。
第11章:シェルスクリプト入門
スクリプトの基本、クォート、特殊変数、終了コード、条件分岐、ループ、コマンド置換、一時ファイル、ヒアドキュメント、便利なユーティリティ、サブシェル、入力の読み取りを扱い、シェルスクリプトを使うべきでない場面で締めくくる。
第12〜14章:ネットワークによるファイル転送と共有、ユーザー環境、Linuxデスクトップと印刷の概観
rsyncによるファイルのコピーと、Samba、SSHFS、NFS、クラウドストレージによる共有。シェルの起動ファイルとその落とし穴。そしてデスクトップの構成要素として、WaylandとX Window Systemの比較、D-Bus、印刷を扱う。
第15〜16章:開発ツール、Cソースコードからのソフトウェアのコンパイル入門
Cコンパイラ、make、lexとyacc、スクリプト言語とJavaを扱い、続いてソースからのソフトウェアのビルド、すなわちビルドシステム、GNU Autoconf、インストールの実際、パッチの適用、トラブルシューティングを扱う。
第17章:仮想化
この版で新しく加わった章で、仮想マシン、コンテナ、ランタイムベースの仮想化を扱う。
主要概念
第1〜4章:層、シェル、ストレージ
- カーネルとユーザー空間:特権をもつカーネルと、それが管理するプロセスとの区分。
- デバイスファイルとudev:カーネルがハードウェアをファイルとして見せる仕組みと、デバイス名が作られる仕組み。
- ファイルシステム、スワップ、LVM:ディスクをパーティションに分け、フォーマットし、論理ボリュームにまとめる方法。
第5〜8章:ブートとプロセス
- ブートの流れ:ファームウェアとブートローダー(GRUB)、カーネルの初期化とパラメータ、そしてinit。
- systemd:サービス、タイマー、ロギングを起動・管理するinitシステム。
- システムコールとトレース:プロセスがカーネルにサービスを要求する様子を観察すること。
- コントロールグループ:プロセスのリソースを制限し計上するカーネルの仕組み。
第9〜12章:ネットワーク
- ネットワークの層:物理層、インターネット層、トランスポート層と、Linuxがそれぞれをどう設定するか。
- ルーティング、NAT、ファイアウォール:パケットがどのように転送され、変換され、フィルタされるか。
- ソケット:プログラムがネットワーク越しやローカルで通信するために使うインターフェース。
第13〜17章:ユーザー、開発、仮想化
- 起動ファイル:各ユーザーの環境を形づくるシェルの設定。
- ソースからのビルド:コンパイラ、
make、Autoconf、パッチ。 - コンテナと仮想マシン:マシンをエミュレートするか、ホストのカーネルを共有するかによって作業負荷を分離すること。
批判的分析
長所
- 実際のシステムを直接調べる。 サンプル章がその方法を示している。ブートの各段階が、読者が自分のマシンで観察できるコマンドとログ出力とともに説明される。これにより、カーネル、init、システムコールといった抽象的な考え方が具体的になる。
- 現代のLinuxの構成要素を扱う。 systemd、journald、cgroups、LVM、IPv6、Wayland、コンテナにはいずれも節があり、出版社が挙げる更新点を反映している。出版社が引用するSandra Henry-Stockerは、こうした変化こそ第3版が必要になった理由だと述べ、本書を徹底的で最新のものと評している。
- 参考書としても使える。 出版社が引用するLee Teschler(Microcontroller Tips)は、読者が必要なところまでだけ話題に踏み込めるよう本書が構成されていると述べ、Ian Bruntlettは C Vu(ACCU、第33巻第4号)での推薦の中で、本書をさらに深く掘り下げるための手がかりを備えた概観だと評している。
短所
- オペレーティングシステム一般ではなくLinux。 本書は一つのシステムがどう組み立てられ、どう管理されるかを説明する。スケジューリングアルゴリズム、メモリ管理の理論、同期、ファイルシステム設計の原理は章の主題になっていないので、オペレーティングシステムの教科書の代わりにはならない。
- 実務的な細部は古くなる。 本書の価値の多くは具体的なコマンド、ファイル、ツールにあるが、それらはディストリビューションやリリースによって変わる。出版社は正誤表を公開しており、読者は最新の文書を確認すべきである。
- 一部の話題は深さより幅。 デスクトップの概観や仮想化の章は、その題名(「概観(A Brief Survey)」)や節の数(仮想化は3節)が示すように、主題の大きさに比べて短い。
コースにおける位置づけ
本書はオペレーティングシステムのコースにおける実践的な副読本である。Silberschatz、Galvin、Gagneの Operating System Concepts、TanenbaumとBosの Modern Operating Systems、そしてArpaci-Dusseau夫妻の無料の Operating Systems: Three Easy Pieces は、概念(プロセス、スケジューリング、メモリ、並行性、ファイルシステム)を一般的な形で教える。Wardは、そうした概念が実際に動いているLinuxマシンのどこに現れ、どう調べられるかを示す。これらのいずれかと並行して読むとよい。教科書の章がプロセスやファイルシステムを扱うときには、本書の第4章と第8章でそれらを実際に確かめる。
SaltzerとKaashoekの Principles of Computer System Design はより一般的なレベルで、抽象化、モジュール性、命名、保護、通信をコンピュータシステムの設計原理として扱う。Wardの層、ネットワーク、仮想化の章は、それらの考え方の具体的なLinuxでの例を提供する。
本書の使い方
本書は、オペレーティングシステムやネットワークの講義を支えるためにLinuxの実地経験を必要とする学生、新任のシステム管理者、自分がデプロイするマシンを理解したい開発者に向いている。始めるには基本的なコンピュータの知識とコマンドラインを使う意欲があれば十分で、第15〜16章ではプログラミングの経験が役立つ。
実際的な読み方:
- 中核: まず第1〜2章、次に第3〜8章を順番に。ハードウェアからブート、設定、プロセスまでシステムを積み上げる部分で、オペレーティングシステムの講義の話題に最も直接対応する。
- ネットワーク: 第9〜10章。サーバーを運用する人には必須であり、第12章はその上に成り立つ。
- 技能: シェルスクリプトの第11章とユーザー環境の第13章。端末を開いて読むのがよい。
- 関心に応じて任意: 第14章(デスクトップ)、第15〜16章(開発とソフトウェアのビルド)、第17章(仮想化)。最後の章はコンテナへの有用な橋渡しになる。
安全に壊せるLinuxマシンか仮想マシンの上で本書を読み進めること。各節が示すコマンドを実行して出力を本と比べ、違いがあればディストリビューションの文書と出版社の正誤表を確認する。各章を、オペレーティングシステムの教科書の対応する概念の章と組み合わせるとよい。
