コンテナを学ぶ前に Linux を学べ ― 書評「入門 モダンLinux」

はじめに

書籍「入門 モダン Linux」を読んだので自分なりのまとめや感想などを書いておく。

入門 モダンLinux
Linuxはサーバ、組み込み機器、スーパーコンピュータなどにおいて存在感を示してきました。近年では、オンプレミスのシステムだけではなく、クラウドサービスでも広く使われています。本書は、前半でLinuxを使いこなす上で必要な基本知識を、後半で最新情報をまとめています。Linuxの知識を体系的に整理したい、最新動向が知りたい、運用を改善したい、効率的に開発を行いたい、といった要望をかなえる内容となっています。時代の変化に柔軟に対応できるLinux技術者を目指すなら必読の一冊です。
入門 モダンLinux favicon www.oreilly.co.jp
入門 モダンLinux

感想

本書を読んだきっかけとしては、コンテナ実行基盤としての Linux をもっと深く知りたいというモチベーションから手に取ってみた。僕は、新卒 1, 2 年目からコンテナを使う時代にエンジニアになったのだが、その仕組をろくに学ばずにあまりにも当たり前のようにコンテナを使っていた。

例えば、コンテナはホストの Linux カーネルとプロセスを共有し、コンテナごとに独立した隔離空間を実現している。それは何となく分かってはいるが、隔離空間と言っても具体的にどんな機能を使っているのかを掘り下げてみたい人などにはオススメできるのではないだろうか。

また、まずは Linux の概要的なところをざっくり体系的に学ぶという意味でも本書はいいチョイスになるのでは無いかと思った。

本書の要約

2 章 Linux カーネル

  • Linux の中核であるカーネルの話。ディストリビューションや環境に関わらず大まかな機能や構成は同じなのでざっくりでいいので知っておくと良いと思った。
  • Linux カーネルを拡張したい際やカーネル内で実行可能なタスクを実装した場合に利用する eBPF についても触れられている。

3 章 シェルとスクリプト

  • 普段からシェル芸をよくやるせいか知っている内容が多めだった。
  • モダンなコマンドとしては以下が紹介されていた。この辺は割りと普段から使っている。
    • ls の代替 exa
    • cat の代替 bat
    • find + grep の代替 rg
    • JSON 専用の整形コマンド jq
  • 広くデフォルトとして普及している bash に代わるモダンシェルとしてfish , zsh が紹介されていた。
  • シェルスクリプトの Good Practice
    • chmod +x よりも chmod 750 の方が望ましい。
    • set -o errexit, set -o pipefail で速やかに失敗し終了する。
      • 僕はよく set -eux としているので pipefail も入れるようにしようと思った。
    • 機密情報をスクリプトにハードコードしない
    • 入力のサニタイズと必要に応じて read コマンド経由で対話的にパラメータを受け取る
    • スクリプト内で前提となるコマンドなど依存関係は確認する
    • その他にも、エラー処理は分かりやすくメッセージを返す、ドキュメンテーション、Git 管理する、テストするなどその他のプログラミングと同様に気をつける点について述べられていた。
    • shellcheck による静的解析と shfmt による自動修正、bats によるテスト

4 章 アクセス制御

  • ユーザ管理やパーミッションについて
  • 高度な権限管理として、root が持つ絶対的な権限のうち必要なものだけを付与するケーパビリティや、システムコールを制限する seccompACL について触れられていた。
  • アクセス制御のいい実践方法としては以下が述べられていた。
    • 最小権限の原則
    • setuid を避けてケーパビリティを活用する
    • 監査ログを残す。読み取り専用にして改ざんを防ぐ。

5 章 ファイルシステム

  • 仮想ファイルシステム、擬似ファイルシステム、通常のファイルについてまとめられていた。
  • FHS(Filesystem Hierarchy Standard) を定義して Linux のトップレベルのディレクトリを標準化している。

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

  • 起動プロセスの流れ
    • UEFI/BIOS → ブートローダ → カーネル → init → 他のユーザ空間
  • init システムとしてデファクトとなっている systemd
  • コンテナの仕組みの説明
    • 今ではローカルのテストと開発から本番環境での分散システムと幅広く使われているが、コンテナは Linux カーネルが提供する namespace , cgroup などの基本的な機能を使って実行している。
    • namespace: プロセスごとにファイルシステム、ネットワーク、ユーザなど見え方を変更する機能。カーネル内で分離するわけではなく、あくまでも見え方を変えるだけ。
    • cgroup: リソースの使用を制限するもの。プロセスのグループに適用するもので階層構造になっている。
    • cgroup v2: v1 の設計とは異なり、1 つの階層で全てのコントローラは同じ方法で管理されている。
    • コンテナ関連ツールとしては Docker 以外にも buildah, podman, containerd, skopeo, nsenter, systemd-cgtop, unshare, lsns, cinf などコンテナエンジンからコンテナ関連のツールなど多くが紹介されていた。

7 章 ネットワーク

  • TCP/IP スタックや DNS について詳しく触れられている。
  • また、高度なトピックとして以下が紹介されていた。
    • whois , dhcpdump , ntpq などのコマンド
    • ネットワークトラフィックを解析するためのツールとして tshark , wireshark , tcpdump などのコマンドや、socat , geoiplookup などのツール

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

  • オブザーバビリティのトピックとしては、主にログとメトリクスが言及されていた。
    • ログでは古いログファイルを安価で低速なストレージにアーカイブすることで、ディスク容量の節約、高速な検索を実現するためログローテーションを行ったり、カーネルからデーモン、ユーザ空間までさまざまなソースのための標準的なロギング機能である Syslog、systemd の一部でバイナリ形式でログを保存する journalctl の紹介がされていた。
    • 監視では、システムメトリクス、I/O デバイスとネットワークインターフェース、統合パフォーマンス監視などシステムの状況を把握するためのさまざまな手法が書かれていた。
  • 高度なオブザーバビリティとしては、Prometheus と Grafana を組み合わせたメトリクス取得についても触れられていた。
  • Linux Performance

9 章 高度なトピック

結構マニアックな内容が盛り込まれていて、例えば、AWS のサーバーレスコンピューティングのための仮想化機能 firecracker やセキュリティに関するトピックとして Kerberos, PAM などが挙げられていた。この章は知らない言葉多く出てきて、ひとつひとつ深掘れていないが、一旦脳内にインデックスを張っておき必要になったら勉強したいと思う。

参考

入門 モダンLinux
Linuxはサーバ、組み込み機器、スーパーコンピュータなどにおいて存在感を示してきました。近年では、オンプレミスのシステムだけではなく、クラウドサービスでも広く使われています。本書は、前半でLinuxを使いこなす上で必要な基本知識を、後半で最新情報をまとめています。Linuxの知識を体系的に整理したい、最新動向が知りたい、運用を改善したい、効率的に開発を行いたい、といった要望をかなえる内容となっています。時代の変化に柔軟に対応できるLinux技術者を目指すなら必読の一冊です。
入門 モダンLinux favicon www.oreilly.co.jp
入門 モダンLinux
[試して理解]Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】
こちらの書籍は 2024/05/24 紙版の4刷に対応するため更新をおこないました。 (概要) ITシステムやソフトウェアの基盤OSとして幅広く使われているLinux。エンジニアとしてLinuxに関する知識はいまや必須とも言えますが、あなたはそのしくみや動作を具体的にイメージすることができるでしょうか。 本書では、Linux OS における、プロセス管理、プロセススケジューラ、メモリ管理、記憶階層、ファイルシステム、記憶階層、そして仮想化機能、コンテナなど、OS とハードウェアに関するしくみがどのように動くのか、実験とその結果を示す豊富なグラフや図解を用いてわかりやすく解説します。 改訂に際しては全面フルカラー化。グラフや図解がさらにわかりやすくなり、ソースコードはC言語から、Go言語とPythonにアップデートしています。さらに仮想化、コンテナなどの章が加わりました。今どきのLinuxのしくみを本書でしっかり理解しておきましょう。 (こんな方におすすめ) ・Linuxの動作や仕組みに興味があるエンジニア ・OSや仮想マシン、コンテナのしくみを手軽に学びたいと考えているエンジニア (目次) 序章 はじめに 第1章 Linuxの概要   プログラムとプロセス   カーネル   システムコール   ライブラリ 第2章 プロセス管理(基礎編)   プロセスの生成   プロセスの親子関係   プロセスの状態   プロセスの終了   ゾンビプロセスと孤児プロセス   シグナル   シェルのジョブ管理の実現   デーモン 第3章 プロセススケジューラ   前提知識:経過時間と使用時間   1つの論理CPUだけを使う場合   複数の論理CPUを使う場合   realよりもuser+sysが大きくなるケース   タイムスライス   コンテキストスイッチ   性能について   プログラムの並列実行の重要性 第4章 メモリ管理システム   メモリ関連情報の取得   メモリの回収処理   仮想記憶   プロセスへの新規メモリの割り当て   ページテーブルの階層化 第5章 プロセス管理(応用編)   プロセス作成処理の高速化   プロセス間通信   排他制御   排他制御の堂々巡り   マルチプロセスとマルチスレッド 第6章 デバイスアクセス   デバイスファイル   デバイスドライバ   デバイスファイル名は変わりうる 第7章 ファイルシステム   ファイルへのアクセス方法   メモリマップトファイル   一般的なファイルシステム   容量制限(クォータ)   ファイルシステムの整合性保持   Btrfsが提供するファイルシステムの高度な機能   データ破壊の検知/修復   その他のファイルシステム 第8章 記憶階層   キャッシュメモリ   Simultaneous Multi Threading(SMT)   ページキャッシュ   バッファキャッシュ   書き込みのタイミング   direct I/O   スワップ   統計情報 第9章 ブロック層   HDDの特徴   ブロック層の基本機能   ブロックデバイスの性能指標と測定方法   ブロック層がHDDの性能に与える影響   ブロック層がNVMe SSDの性能に与える影響 第10章 仮想化機能   仮想化機能とは何か   仮想化ソフトウェア   本章で使う仮想化ソフトウェア   仮想化を支援するCPUの機能   仮想マシンは、ホストOSからどう見えているか?   仮想化環境のプロセススケジューリング   仮想マシンとメモリ管理   仮想マシンとストレージデバイス   virtio-blkの仕組み 第11章 コンテナ   仮想マシンとの違い   コンテナの種類   namespace   セキュリティリスク 第12章 cgroup   cgroupが制御できるリソース   使用例:CPU使用時間の制御   応用例 終章 本書で学んだことと今後への生かし方 続きを読む
[試して理解]Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】  favicon amazon.co.jp
[試して理解]Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】
入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)
※この商品はタブレットなど大きいディスプレイを備えた端末で読むことに適しています。また、文字だけを拡大することや、文字列のハイライト、検索、辞書の参照、引用などの機能が使用できません。 さまざまな事情からLinuxを使い始める(学び始める)人が増えています。そうしたLinux初心者がまず戸惑うのは、コマンドを使って操作する点ではないでしょうか。WindowsやMacならマウスを使う操作を、なぜコマンドで行うのか。本書では、実際に数々のコマンドを打ち込みながら、その理由を学んでいきます。本格的にLinuxを学び始める前に知っておくと便利なことを、さくっと読める一冊です。
入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)  favicon amazon.co.jp
入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)

関連記事