🐳

「[試して理解]Linux のしくみ【増補改訂版】」の実験環境を Docker で作成する方法と詰まったこと(M1Mac)

2023/08/14に公開

概要

「[試して理解]Linux のしくみ【増補改訂版】」を読みました。

https://gihyo.jp/book/2022/978-4-297-13148-7

その際、実験環境を物理的に用意できなかったため、Docker で作成しました。
本記事では、Docker 環境の作り方と、Docker 起因で詰まった点を記述します。

本記事は以下についてカバーしていないことにご留意ください。

  • 本書の解説内容をちゃんと理解するには、実験環境を物理的に用意することは必須です。雰囲気を理解するために、Docker 環境でとりあえず試してみた次第です
  • 本書の感想については、自身のブログに記述しました。興味がある方は、「「[試して理解]Linux のしくみ」感想【増補改訂版】」を参照してみてください

Docker で実験環境を作る

実験環境を作成する Dockerfile を以下のリポジトリに記載しました。

https://github.com/Msksgm/linux-in-practice-2nd-docker

README にも記述した、次のステップで実験に必要な Ubuntu:20.04 の環境を作成できます。
本書では、実験結果を画像に保存して確認する動作確認があります。
その場合は、コンテナを起動するときにマウントするか、VSCode の Remote Container を利用して VSCode 上で確認すると便利です。

git clone git@github.com:Msksgm/linux-in-practice-2nd-docker.git
cd linux-in-practice-2nd-docker
docker image build -t linux-in-practice-2nd-docker .
docker run --rm -it linux-in-practice-2nd-docker /bin/bash

docker image をビルドする際に以下を実施しています。詳細は、Dockerfile のコメントに記載しました。

  • 本書の冒頭で説明しているパッケージのインストールと設定
  • 本書の冒頭で説明していないが、Ubuntu:20.04 の docker image に含まれていないパッケージ

本書を読み進めるときに詰まった点

以降は、Docker で用意した実験環境で本書を読み進めときに詰まった点や動作できなかった点をまとめます。
内容に誤りがあったり、ほかにも動作できない点があったりしたら、コメントのほどお願いします。

第 2 章 プロセス管理(基礎編)

プロセスの親子関係

Docker だと、起動時のプロセスは systemd ではなく、Docker にはいるときのコマンドが親コマンドになります。

$ pstree -p
bash(1)---pstree(504)

以下で比較してある記事がわかりやすかったです。

https://genzouw.com/entry/2019/04/09/091427/1327/

シグナル

Docker の Ubuntu は軽量化されているため、一部のコマンドが使えないです。

man コマンドを実行したとき
$ man
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, including manpages, you can run the 'unminimize'
command. You will still need to ensure the 'man-db' package is installed.

その場合、unminimize コマンドで戻す必要があります。入力はすべて y で完了します。

$ unminimize

unminimize を実行してから、man コマンドを再インストールします。

$ apt install man

unminimize するとコンテナが肥大化するので、Dockerfile に unminimize コマンドを含めませんでした。

https://qiita.com/ssc-ynakamura/items/d69307a3d94bf81c363d

第 3 章 プロセススケジューラ

タイムスライス

sched.py で画像が保存されるので、VSCode の Remote Container でログインして、画像を表示すると良いです。
Remote Container を利用する記事は以下のような記事にまとめられているため、説明を省略します。

https://zenn.dev/yuchiki/articles/vscode-remote-container

https://qiita.com/yoshii0110/items/c480e98cfe981e36dd56

https://zenn.dev/bells17/articles/remote-ssh-devcontainer

性能について

詳細はわかりませんでしたが、/sys/devices/system/cpu/smt/control の修正ができませんでした。
おそらく、原因は Docker の環境では仮想ハードウェアがないことです。

$ cat /sys/devices/system/cpu/smt/control
notimplemented

第 6 章 デバイスアクセス

ブロックデバイス

おそらく、マウントするものがないので、うまくいきませんでした。

第 10 章 仮想化機能

仮想化を支援する CPU の機能

仮想化支援機能を確認すると、Docker だと無効化されていました。

$ egrep -c '^flag.*(vmx|svm)' /proc/cpuinfo
0

まとめ

「[試して理解]Linux のしくみ【増補改訂版】」は Linux の知見を得るのにお勧めの書籍でした。
本記事では、いきなり実験環境を物理的に用意するのはハードルが高いので、Docker で作成する方法と個人的に詰まった点を記述しました。
一読して思ったことは、1 回で完璧に理解できる内容でもないので、1 回 Docker を利用して手軽に試して雰囲気を理解してから、物理的に用意して再読した方が良いと思いました。
Docker を用いた動作確認だと制限が多かったので、時間がちゃんと理解するには物理環境は必須です。

Discussion