brand new note

ジャズ屋が技術の話をするところ

試して理解-Linuxのしくみを読んだ

twitterで賑わいを見せている武内覚氏の新書「試して理解 Linuxのしくみ」を購入しました。 予想外でしたが、読んでいく中で本に書いてないエンジニアの一歩まで学べたので、ここで少しまとめておこうと思います。書評から少し外れますが、個人的な1ヶ月の進捗報告ということで境遇が近い人の参考になればと思います。

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

読む前

研究室で1年ほどLinux(主にCentOS6.8)を触っていました。授業でもLinuxの使い方は学んでいましたが、仮想で触ったことがある程度。これといってこの1年以外に好きでLinuxを触っていたことはありませんでした。その程度の実力といえばその程度ですが、基本的なコマンドやディレクトリ構成の理解、ちょっとしたログ解析やrm -rf /*したシステムのバックアップ経験有、シェルスクリプトを少し、vimを少し、くらいの実力と思っていただければいいと思います。また、プログラミングスキルは皆無です。

併読していたもの

この本と同じ時期に読んでいたのが「Linuxカーネル2.6解読室」。twitterの強い人たちがこぞってカーネルはいいぞ~って言ってるのを見て憧れ読み始めました。オライリーの「詳解Linuxカーネル」も手元に置くには置いていましたが、心がカーネルっていいな状態になるまでのお守りに過ぎなかった気がします。

Linuxカーネル2.6解読室

Linuxカーネル2.6解読室

詳解 Linuxカーネル 第3版

詳解 Linuxカーネル 第3版

2.6解読室のおかげでプロセススケジューリングの話はわりとすんなり入ってきました。Linuxカーネルの中で最も学びやすいとも言われている部分?とのうわさを聞いているので、やはり大事かつとっつきやすいといったところなのでしょう…。

また、なんでもそうですが同系列の技術書は複数冊自分なりに良さそうなものを見つけて併読するのがいいなーと感じました。一冊だとそういうもんなの?で挫折しますので、いろんな本を読んで「あ!これは読んだことあるから知ってる!」「これは知らなかった!」という気づきを大事にして楽しむと良さそうです。人の事は言えませんが、駆け出しの部分での挫折は難しくないので、その先を楽しめることが大事だと思います。

カーネルに関しては実際どちらも深い理解を得るにはまだまだ自分に足りないものが山程あるので、この2冊はある種のゴールというか、長期的に読んで理解できるようになれたらなーと思っています。まだ0.01%しか理解してませんし、ここにある知らない知識を補強するように他の本を読み進めていくことになりそうです。

2/26 家に届く

脱線しました、本題に戻ります。この日Amazonで購入した本書が家に届きます、溢れ出る流行に乗ってやったぞ感。読みだしてすぐ「これはすごい」と直感しました。図が分かりやすく、手を実際に動かして納得させてもらえるからです。入門者にとって難しいことをできるだけ親切に教えてくれ、またこれからもっと深い所に連れて行ってくれる、そんな感じを受けました。好きでlinuxいじるってどんなもんなんだろう…と思っていた段階をこえて、実際に手を動かすのが一歩好きになれたというか。

年末年始にノートPCにArchLinuxをインストールして悶絶していたのですが、結局その上で色々動かすのはしんどかったのでCentOS7.4に変えました。7系ではコマンド体系が結構変わっていると聞いていたので、さすがに6系だけ触ってるのはそろそろまずいかな、とも思っており。 また、CやPythonも本書に出てくるので実行環境をPCに入れました。ぼくはPython3.5をやります(まだやってない)

ここで学んだ知識は以下です。

  • システムはソフト寄りなものとハード寄りなものがあり階層的に分かれている
  • 実行プログラムからシステムコールを記録し確認するにはstraceコマンド
  • sarコマンドでユーザモードかカーネルモードどちらで実行されているか確認可能
  • ライブラリはシステムが動くために必要な便利なパーツで、コマンド実行時にも使われており後ろで随時呼び出されている(glibc等)

3/7 プログラムを書き始める

少し本に書いてあるプログラムが長くなってきたので、あんまりできないgithubをちょこちょこ使い始めました。また写経もやってみました。ただ写経するだけでも能がないので、これまではvimに矢印キーを使っていたのをこの機会に矯正することにしました。

また、この本だけ写経しても能がないので昔買ったC言語基礎の本を引っ張りだしてプログラミングをリベンジすることにしました。ちょうどご縁があってそろそろインフラだけやってるのもあれかな...という時期に差し掛かっているのもありますが。また、一人でやってるとくだらない質問ができないので、ここでteratailを初めて使い始めました。皆さん優しくて涙が出そうです。ありがとう。

本は4章、プロセススケジューリングまで読みました。このあたりまでに実感した知識は以下です。

  • 1つのCPUを使えるのは1度に1プロセスのみ

  • リソース確認時、userは論理CPU使用中、sysはシステムコール呼び出し中を表す

  • niceでプロセスがCPUを占有する時間の優先度を変更

この「実感した」というのが本書の大事なところだと読みながら毎回思います。

3/12 読了...?

メモリ管理の5章を一日かけて読んでいたのですが、もっと効率的に頭に入る方法はないのか...と考えていたところある勉強法の記事を発見しました。記事は、本は7回は読まないと頭に入らないという内容のものでした。なるほど頭のいい人は反復して何度も頭に刷り込むのかなあと感じました。

「私だったら300ページの本は最初の一回は30分位で読みますねー」

...嘘を言うのは良くないだろと思いつつ残りの百数十ページを一気に目で追ってみることにしました。

とりあえず「試してみる」部分はすっ飛ばしましたが、1周目は読了した、ということになりました。知っている言葉がでてくるぶんだけ読みながら頭には所々ひっかかってくれたかなーと思いますが、後半はHDDとSSDで読み書き速度の比較をしていたこと、様々なファイルシステムの違いが説明されていたことをざっくり理解しただけとなりました。しかし今までこれほどのスピードで読書をして、読みきったことはありませんでした。アタマガイタイ。

これでほんとに頭に入るのか疑念を抱きましたが、2周目以降は他の用事もやりつつ読んでいくことにしました。

3/20 一段落

さすがにまだ7周できるほど要領良く読書はできませんが、後半部分をちらほら手を動かしながらもう一度見返しました。これまではやったことを忘れないようになんでも非常に遅いペースで1周読んで満足していたんですが、だんだん目を動かすスピードが速くなってきたように感じます。

どちらが吸収率が高いのかは分かりませんが、反復して読み込んだ時に新たな気づきがあるのも確かです。

また先日自分の研究に関する打ち合わせがあったのですが、より技術的に突っ込んだ内容が頭に入ってくるようになったかなーという実感はあったので、読んで良かったなと思います。今後は実験系の記事を増やすとかしてやっていきたいですね。。。

おわりに

とりあえず春休みを使って読んでみましたが、linuxの中身をもっと身近に感じたい方にはすごくおすすめできると思います。皆様もぜひ。

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識