突然起きた事件
まだ前職にいたある日、develop 環境の Linux が突然落ちました。
再起動することでことなきを得ましたが、再発防止のための原因調査は必要でした。
そこで同僚から教えられた journalctl を眺め、ログを追い、設定を疑い……
できることは一通りやったつもりでした。
しかし、
原因が、まったく分からない。
それっぽいエラーメッセージやログも見当たらない。
だから「なぜ起きたのか」「何が壊れたのか」が見えてこない。
「Linuxカーネルの気持ちが分からない...」
「Linuxを使っている」のに、
「Linuxの中身を何も分かっていない」ことを、強烈に突きつけられた瞬間でした。
反省と行動
これはさすがにまずい。
Linux カーネルについて、ちゃんと勉強しよう。
そう思い立ち、
Linux カーネルのソースコードを読むことにしました。
ただ、いきなり巨大なコードベースを前にしても歯が立たないので、
自作の VS Code 拡張機能 を使って、
- 関数の呼び出し関係を追う
- システムコールの入口から処理を辿る
といった形で、少しずつ読み進めることにしました。
万能感に浸るコードリーディング
最初は、とにかく楽しかったです。
「読める!読めるぞ、Linuxカーネル!」
もちろん、最初に読んだのは「write」システムコール。
なぜなら解説サイトがあったから(書いてくださりありがとうございます)。
-
writeシステムコールの流れが分かる - ファイル I/O の処理が追える
そうなると、不思議な万能感が湧いてきます。
「なんだ、意外といけるじゃん」と。
それ以降は、あまり検索エンジンで情報がひっからなかったので、ChatGPTと自作VSCodeに頼りながら進めていきました。
100時間コードリーディングに費やして、昔の成果物を見たら…
気づけば、100時間以上 コードリーディングに費やしていました。
そこでふと、
昔に自分が作ったコードリーディングの成果物 を見返してみたのです。
……正直、愕然としました。
全然、分かってない。
例えば、
-
writeシステムコールの探索 -
direct I/Oが絡む経路
当時は「ここまで追った」と思っていたものが、
今見ると 肝心な分岐や処理を全く見ていない。
「分かった気になっていただけだったんだな」と、はっきり分かりました。
どうすればよかったか
正直なところ、明確な答えは出ていません。
- 時間をかけて慣れるしかなかったのか
- 一度すべて忘れて、作り直すべきだったのか
今でも、
journalctl やメトリクスだけを見て
あの障害の原因が分かるかと言われると、怪しいです。
それでも一つだけ言えるのは、
「Linuxカーネルの気持ち」が、ほんの少しだけ分かるようになった
ということ。
完全に理解できていなくても、
「どこで何が起きていそうか」を想像できるようになった。
あの時「もっと Linux カーネルを勉強しておけば」と思った自分に、
今ならこう言える気がします。
遅くてもいいから、ちゃんと読みに行ってよかった。