0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【書評】 入門 モダンLinux ―オンプレミスからクラウドまで、幅広い知識を会得する

0
Posted at

はじめに

『入門 モダンLinux』を一通り読みました。結論から言うと、「Linuxを使いこなすための地図」として、設計やアーキテクチャに関心のあるエンジニアにこそ読んでほしい一冊です。

コマンドの使い方を並べた本ではありません。カーネル、シェル、ファイルシステム、ネットワーク、コンテナ、可観測性といった要素が、どのような抽象化の積み重ねで成り立っているのかを、順を追って理解できる構成になっています。

この記事では、章ごとの要約に加えて、設計者の視点で特に面白かった点と、読む上での注意点をまとめます。

こんな方に向けて書いています。

  • 普段Linux上でアプリやサービスを動かしているが、足元の仕組みは曖昧なエンジニア
  • コンテナ、systemd、eBPFなどの用語は知っているが、なぜそう設計されているかまで説明できない方
  • 設計やアーキテクチャの判断に、OSレベルの理解を活かしたい方

書籍情報

項目 内容
書名 入門 モダンLinux ―オンプレミスからクラウドまで、幅広い知識を会得する
原著 Learning Modern Linux(Michael Hausenblas 著、2022年)
訳者 武内 覚、大岩 尚宏
出版社 オライリー・ジャパン(2023年)
想定読者 開発者、アーキテクト、QA、DevOps/SRE など、業務でLinuxを使う人

本書の特徴

読んでいて印象に残った特徴は次の4点です。

  1. 各章の前半は定番、後半は新しい話題という構成になっています。前半はLinuxエンジニアなら押さえておきたい基礎、後半はeBPF、cgroup v2、不変性のあるディストリビューションなど、最近の話題です。
  2. 管理者向けではなく、日々の作業で使う側の視点で書かれています。GUIではなくコマンドラインが中心です。
  3. 章同士が相互参照で緊密につながっているため、最初から通読すると効果が大きいです。
  4. 日本語版では、訳者による補足(訳者補・訳注)が本文中に入っています。現場での注意点や互換性の補足が多く、原書の記述を鵜呑みにせずに済みます。

また、原書の副題は「クラウドネイティブな実践者のためのハンドブック」ですが、内容はクラウドに限定されません。IoTや組み込み機器など、Linuxが動くあらゆる環境に通じる基礎が中心です。

全体像:Linuxは「層」で理解する

本書の1.6節にあるLinuxの全体像を、自分なりに整理すると次のようになります。

各層の境界にインターフェースがあり、上の層は下の層の実装詳細を知らずに済みます。この「境界の置き方」こそが、本書を貫く隠れたテーマだと感じました。

章ごとの要約

1章 Linuxの入門

本書でいう「モダン」とは、スマートフォンからクラウド、Raspberry Piのような組み込み機器までを含む環境のことです。CPUもx86だけではなく、ARMやRISC-Vへと多様化しています。

OSの役割は、ハードウェアを抽象化し、システムコールというAPIを提供することです。高水準言語のプログラムも、最終的にはシステムコールの上に載っています。

後半で大事になるのがリソースの可視性という考え方です。

  • 既定では、すべてのプロセスがシステムのリソースをすべて見られる
  • namespace は「何が見えるか」を制限する
  • cgroup は「どれだけ使えるか」を制限する
  • 仮想マシンは、さらに強く完全に分離する

この3段構えは、後の章でコンテナを説明するときの土台になります。

2章 Linuxカーネル

カーネルの主な構成要素は、プロセス管理、メモリ管理、ネットワーク、ファイルシステム、デバイスドライバです。

設計の観点で面白かったのは、次の点です。

  • カーネルはモノリシックだが、機能領域と責任範囲は整理されている
  • スレッドは、カーネル内部ではプロセスとほぼ同じ扱いで実装されている
  • 仮想メモリは、プロセスごとのページテーブルで物理メモリに対応付ける仕組みで、TLBが変換を高速化する
  • システムコールは、ユーザ空間とカーネルの唯一の正式な接点である

システムコールを実際に観察するには strace が使えます。

# どのシステムコールに時間がかかっているかを集計する
strace -c curl -s https://example.com > /dev/null

カーネルの拡張方法として、従来のカーネルモジュールに加え、eBPF が紹介されています。再コンパイルや再起動をせずに、安全にカーネル内で処理を動かせる仕組みです。ネットワーク、可観測性、セキュリティなど、用途が広がっています。

3章 シェルとスクリプト

シェルを「使いやすさ」の観点で見直す章です。

ストリームとパイプが基本になります。標準入力、標準出力、標準エラー出力の3本(ファイルディスクリプタの0、1、2)を、リダイレクトとパイプでつなぎます。

# 標準エラー出力だけ捨てて、標準出力の行数を数える
curl https://example.com 2> /dev/null | wc -l

変数には、シェル変数と環境変数の違いがあります。子プロセスに引き継がれるのは環境変数だけです。また、終了ステータスが0なら成功、それ以外は失敗という規約も、スクリプトの基本として確認されています。

モダンなコマンドとして、bat、rg、jq などが挙げられています。ただし、エンタープライズの本番環境に入れる場合は、検証済みのバージョンを使うことが勧められています。訳注でも、新しい実装は実績が少なく品質が不安定な場合があると補足されています。

シェルは bash 以外にも、fish や zsh が紹介されています。自動補完や履歴の扱いが優れており、設定も容易です。

ターミナルマルチプレクサは tmux が中心です。セッション、ウィンドウ、ペインという3つの単位で作業環境を管理でき、接続が切れても作業状態を保持できます。

章の後半では、シェルスクリプトを安全かつ移植性の高い形で書くための考え方や、lintとテストの方法が説明されています。

4章 アクセス制御

ユーザ、プロセス、ファイルの関係から始まる章です。

アクセス制御の種類として、次の2つが整理されています。

方式 考え方 例
任意アクセス制御(DAC) ユーザのIDに基づき、所有者が権限を渡せる 一般的なファイルパーミッション
強制アクセス制御(MAC) 管理者が厳格に権限を決め、所有者でも変更できない SELinux、AppArmor

従来のLinuxは「rootか、そうでないか」の二択に近い設計でした。この粗さを補うのが、後半で紹介されるケーパビリティと seccomp です。

  • ケーパビリティ:root権限を機能単位に分解し、必要な権限だけを与える
  • seccomp:プロセスが呼び出せるシステムコールを制限する

プロセスには、実UID、実効UID、保存set-user-ID、ファイルシステムUIDという複数のIDがあります。setuidビットがあると、実行中だけ実効UIDが変わります。ここは混乱しやすい箇所ですが、丁寧に整理されています。

章末のよい実践方法は、設計の原則としてそのまま使えます。

  1. 最小権限:必要な権限だけを与える。rootでの作業は避け、sudo を使う
  2. setuidを避ける:代わりにケーパビリティを使う
  3. 監査:誰がいつ何をしたかを、改ざんされない形で残す

5章 ファイルシステム

「すべてはファイル」というUNIXの考え方を、仮想ファイルシステム(VFS) という抽象化層で説明する章です。

VFSは、open、read、write といった共通の操作と、ファイルシステムごとの実装の間に挟まる層です。そのおかげで、次のような異なる実体が同じ操作で扱えます。

  • ディスク上のファイル(ext4、XFS など)
  • メモリ上のファイル(tmpfs)
  • カーネルの情報を見せる擬似ファイル(/proc、/sys、/dev)
  • ネットワーク越しのファイル(NFS など)

その他の要点です。

  • inode はファイルのメタデータを持ち、ファイル名はディレクトリ側が持つ。この分離がハードリンクの理解につながる
  • LVM は、物理ボリューム、ボリュームグループ、論理ボリュームの3層で、容量変更の柔軟性を確保する
  • コピーオンライトは、変更されたブロックだけを複製する仕組みで、OverlayFS やbtrfsで使われる

コピーオンライトは、後でコンテナイメージのレイヤ構造を理解する際の前提になります。

6章 アプリケーション、パッケージ管理、コンテナ

本書の山場の1つです。

起動プロセスは、UEFI/BIOS、ブートローダ、カーネル、initシステム、ユーザ空間の初期化という流れです。initシステムは今や systemd が標準で、依存関係が解決したサービスを並列に起動できる点が、従来のSysV initとの大きな違いです。service や timer などのユニットで、何をいつ実行するかを宣言的に書きます。

パッケージ管理は、RPMやdebといった従来型に加え、言語ごとのパッケージマネージャ、そして Snap、Flatpak、AppImage などのモダンな方式まで整理されています。

コンテナの定義が明快です。

コンテナ = namespace(見え方)+ cgroup(使用量の制限)+ コピーオンライトFS(イメージのレイヤ)

Dockerの新しさは、これらの要素そのものではなく、組み合わせて使いやすくした点とイメージの標準化にあった、という整理は腑に落ちます。OCI(Open Container Initiative)の3つの仕様(ランタイム、イメージ、配布)にも触れています。

また、cgroupのv1とv2の違い(v2は階層が1つで、管理が統一されている)も押さえられています。

7章 ネットワーク

TCP/IPスタックを4つの層(リンク層、インターネット層、トランスポート層、アプリケーション層)で説明します。

  • リンク層:NIC、MACアドレス、ARP
  • インターネット層:IPv4/IPv6、CIDR、ICMP、ルーティング、BGP
  • トランスポート層:ポート、TCP、UDP、ソケット
  • アプリケーション層:DNS、HTTP、SSH、ファイル転送、NFS など

DNSの節は、コンテナ環境のサービス検出にもつながる話として、時間をかけて説明されています。A、CNAME、SRV などのレコードの意味や、dig での調べ方も確認できます。

訳者補では、HTTP/3がUDP上のQUICを使うことなど、新しい話題も補足されています。

なお、本書はネットワーク機器の設定などの管理業務は対象外と明言しています。あくまでエンドユーザの視点です。

8章 オブザーバビリティ(可観測性)

「手探りを避ける」ための章です。

最初に、観測データから仮説を立てて検証するためのOODAループ(観察、状況判断、意思決定、行動)が示されます。たとえばアプリが遅いとき、メモリ、CPU、ネットワークI/Oのどれが原因かを、1つずつ変えて測るという進め方です。

シグナルの種類は3つに整理されています。

シグナル 性質 主な用途
ログ 人間が読むテキストのイベント 事象の把握
メトリクス 時系列の数値(カウンタ、ゲージ、ヒストグラム) 傾向の監視、アラート
トレース 実行時の動作の記録 デバッグ、性能解析

ログについては、syslog と journalctl の違い、ログローテーション、そして機密情報をログに残さないことの重要性が説かれています。

監視ツールは、uptime、free、vmstat、iostat といった単機能のものから、top、htop などの統合型まで幅広く紹介されています。高度な話題として、トレースとプロファイリング、そして Prometheus と Grafana を組み合わせた構成の手順も扱われています。

メトリクスの収集方式として、アプリが送り出す方式と、エンドポイントを公開して取りに来てもらう方式(スクレイピング)の比較も、設計の観点で参考になります。

9章 高度なトピック

誰にでも必須ではないが、知っておくと視野が広がる話題が集められています。

  • プロセス間通信:シグナル、名前付きパイプ、UNIXドメインソケット
  • 仮想マシン:KVM と、軽量な microVM を管理する Firecracker
  • モダンなディストリビューション:Flatcar、Bottlerocket など。パッケージマネージャを持たず、不変性と自動更新を重視する
  • セキュリティ:認証の仕組みである Kerberos と PAM
  • その他:NixOS、デスクトップLinux、組み込み、クラウドIDE

不変性の考え方は特に重要です。サーバに少しずつ変更を重ねるのではなく、変更が必要になったらイメージごと作り直して入れ替えるという発想で、コンテナの考え方とも一貫しています。

付録

付録Aは、訳者が日常的に新人に教えているという便利なコマンド集です。付録Bは、モダンなLinuxツールの一覧になっています。本文の補足として、手元に置いておくと役立ちます。

設計者の視点で面白かった5つのポイント

通読して、設計の考え方として持ち帰れそうな点を5つ挙げます。

1. 境界を定義するものとしてのシステムコール

ユーザ空間とカーネルの境界はシステムコールです。コンテナも、seccompでこの境界を絞ることで安全性を高めています。**「どこに境界を置き、何を通すか」**という設計の発想が、OSの中にそのまま見えます。

2. 同じインターフェースで異なる実体を扱う

VFSは、ディスク、メモリ、カーネル情報、ネットワークを、同じファイル操作に揃えました。インターフェースを揃えることで、ツールの再利用性が上がるという好例です。

3. コンテナは新発明ではなく「組み合わせ」

namespace、cgroup、コピーオンライトという既存の部品の組み合わせである、という整理は、新しい技術を見るときの視点として有用です。何が新しく、何が既存の再構成かを見極める助けになります。

4. 最小権限は個別の設定ではなく設計原則

パーミッション、ケーパビリティ、seccomp、MACは、いずれも「必要最小限だけ許す」という同じ原則の表れです。粗い権限モデルを、段階的に細かくしてきた歴史として読めます。

5. 観測は設計の一部

「問題が起きてから見る」だけでなく、あらかじめ測れるように作る(インスツルメンテーション)という考え方が示されています。可観測性を後付けにしないことは、アーキテクチャ設計の基本姿勢として共感しました。

気になった点・読む際の注意

良い本ですが、読む上での注意点もあります。

  • 管理業務は範囲外:本書は使う側の視点です。ネットワーク機器の設定やLinuxの運用管理を深く学びたい場合は、別の書籍が必要です
  • 各トピックは入門レベル:ACL、ケーパビリティの詳細、ネットワーク設計などは、概要の紹介にとどまります。各章末の参考資料が次の一歩になります
  • ツールの状況は変わる:紹介されているツールには、執筆後に開発状況が変わったものもあり得ます。導入前に最新の状況を確認してください
  • 手を動かすことが前提:本書自身が「実際に試して、壊して、なぜを問う」ことを勧めています。読むだけでは効果が半減します

本書の例は、Linuxの環境を手元に用意して試すことを前提にしています。VM、クラウドのインスタンス、Raspberry Piなど、壊しても困らない環境を用意すると理解が進みます。

どんな人におすすめか

タイプ おすすめ度 理由
Linuxを業務で使い始めた方 ◎ 全体像を最短で押さえられる
コンテナを使っているが仕組みは曖昧な方 ◎ namespace、cgroup、CoWの関係が整理できる
設計やアーキテクチャに関わる方 ◎ 抽象化と境界の設計の実例が豊富
ベテランのLinuxエンジニア ○ 各章後半の新しい話題と付録が有用
運用管理を深く学びたい方 △ 管理系は範囲外のため、別書籍と併用

読み方の提案

最初から通読するのが基本ですが、目的に応じて次のように読むのも手です。

  1. まず1章と2章で、全体像とカーネルの役割をつかむ
  2. コンテナに関心があれば、4章(権限)、5章(ファイルシステム)、6章(コンテナ)を続けて読む
  3. 運用に関わるなら、7章(ネットワーク)と8章(可観測性)を優先する
  4. 余裕があれば9章で、不変性のあるディストリビューションなど、今後の流れをつかむ

どの順番でも、各章の最後にある参考資料から次の学習へ進めるのが便利です。

まとめ

『入門 モダンLinux』は、Linuxを「層」と「境界」で捉え直す機会をくれる本でした。

  • Linuxの基礎から、コンテナ、可観測性、不変性のある新しい潮流まで、一冊で見通しが得られる
  • コンテナは、namespace、cgroup、コピーオンライトの組み合わせとして理解できる
  • 最小権限や可観測性といった設計原則が、OSの仕組みとして具体的に見える
  • 訳者補・訳注が充実しており、日本語で読む価値が高い

足元のLinuxの理解を、一度整理し直したい方に、ぜひ手に取ってほしい一冊です。

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?