書籍「入門 モダン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