今はエンジニアではありませんが、いつかクラウドエンジニア/アーキテクトになりたい!わたしのひそかな目標でもあります。
プラットフォーム技術を生業にするためには、ハードウエア/OS/ネットワークの深い知識は欠かせません。 ということで、同人誌フレンズであり、かつ尊敬するカーネル開発者であるsatさんの「Linuxのしくみ」 を読ませていただきました。
わたしは、商用Unixしか基盤構築の実務経験が無く、Linuxは完全に独学でしかないため「プロ」ではなく完全に本書の対象読者です。
そんな私ですが、大変勉強になりプラットフォーム技術に携わる多くの方におすすめしたいので書評をまとめました。
前提読者
この本の前提読者は「Linuxの使い方」ではなくタイトルの通り「Linuxのしくみ」つまり内部構造を理解したいエンジニアを対象にしています。
本書を読むにあたり、特別なプログラミングの知識は不要ですが、「ふつうのLinuxプログラミング 第2版」の内容が頭に入っているとスムーズです。 あと、Linuxのインストール/セットアップが自力でできる、基本的なコマンドは問題なく操作できるレベルのLinuxユーザであることが必要です。
第1章 コンピュータシステムの概要
OSとハードウエアの関係、OSの概要について説明があります。カーネルがハードウエアのリソース管理をどのように行っているのか、プロセスとはなにか、デバイスドライバとなにか、など基本的なことが沢山の図とともに説明されています。非常に分かりやすい!
第2章 ユーザモードで実現する機能
ここではシステムコールが「実験」をベースに説明されています。たとえば、straceを介してPythonでHelloWorldしたときの挙動をみながら、write()システムコールが発行されてますよね!とか、親プロセスのプロセスIDを取得するコードを無限ループさせるとどうなるでしょう?などです。 あと、ラッパー関数、標準Cライブラリなどなどの説明もあります。
第3章 プロセス管理
ここでは、fork()関数とexecve()関数についての解説があります。図を用いてプロセス生成の流れを説明し、親プロセス/子プロセスがメモリ空間にどう展開され、どう終了されるかが分かります。 ここはややアセンブラの知識が必要になりますが、まったく知らない人も図をみてイメージできるので親切です。必要と言っても、情報処理技術者試験のCASLⅡぐらいの知識でぜんぜん大丈夫です。
第4章 プロセススケジューラ
40ページほどかけてプロセススケジューラの挙動を丁寧に解説されています。私もふくめて多くのLinuxユーザはカーネルがプロセススケジューラの機能を持っていて複数のプロセスを同時に動作させているのだなと理解していると思いますが、実際のところどのように「同時に動作させているようにみせかけている」かをたくさんの実験とともに解説されています。 個人的には、、、nice()の挙動とかとてもわかりやすっ。と思いました。
第5章 メモリ管理
おなじみのfreeコマンドの確認の方法から丁寧に始まり、多くの人を悩ますOut of Memoryの裏側でなにがおこっているのか、OOM Killerは何をやってくれる人なのかなどが解説されています。 ここでも実験がたくさんあり、ページフォルトの実験やmalloc()、スワップの挙動などは難しく、私の頭脳ではちょっと別途改めて勉強が必要でしたが、、後半のCoWは「あ、、あああぁあぁあ、、、これは3年前のあのとき!あの本書いたときに読んでおきたかった、、、本!」という感じでとても分かりやすかったです。
余談ですが、だいたい書籍では著者が書いたドラフト図を、初校でDTPのデザイナーの方が「いい感じ」に書いてくれるものなんですが、satさん本はすべての図が「殺風景」で、むしろこれはsatさん自らが「殺風景に書いてくれ!」とオーダーしないとできないレベルだと思われるので、いったい内部で何が起こっているのかが気になります。
第6章 記憶階層
ここでは、レジスタ/キャッシュ/メモリ/ストレージと記憶装置でどのようにデータが扱われているかが、ここでも「実験」をとおして見通せるようになっています。実際にファイルに書き出してどうなるかを追っていけるようになっています。
第7章 ファイルシステム
ここでは、そもそもファイルシステムとはなんぞやから始まり、ジャーナリングのしくみ、コピーオンンライトでのファイル更新の様子などが、図をつかって説明されています。講義で黒板をみているような感じで、この上なく殺風景な図であるがゆえ、むしろシンプルに伝わる。そんな感じです。
satさんらしく、Btrfsもしっかり解説がありました!スナップショットの挙動やデータ破損検知/修復のしくみなどです(そもそもBtrfs自体が難しいのでプロ向け内容で、私にはちょっと改めて勉強が必要です)
第8章 ストレージデバイス
HDDとSSDについてのしくみとデータの読み書きに関する実験が解説されています。エンジニアだった若いころ、某超エンタープライズ金融機関の基盤構築PJで一緒だった、Sunや富士通のエンジニアに教えてもらった(が、たいして頭に入っていない)のを思い出しました。スイングアームやプラッタの動きを居酒屋のお皿とお箸で早口のオタクが熱心に、、、そんな感じを煮詰めて本にした感じです。
まとめ
とても良い本でした。
タイトルや表紙が、明らかに自然派ママをターゲットとして意識している風なため、一見「本物のLinuxカーネルエンジニアたるものこうあるべき!」みたいなハードモードなものが綴られているのかなと思いましたが、中を開くとまったく異なるので正直驚きました。
これはsatさんの頭の良さでもあると思いますが、さまざまな「実験」を通してカーネルの挙動と全体像を確認していくという、今までにない新感覚の目線でまとめられているので、論旨展開や情報の整理の仕方など読み物としても非常におもしろく、とてもインスパイアされました。
早々に続編を期待です!
あらためて、Linux勉強せねば、楽しいなぁという感想🔥🔥🔥を持つとともに、2018年は、いよいよまじめにやっていきの年になるはず💪なので、よいバイブルです!
どうもありがとうございました!
おわり