SadServers解説 Medium No.5 「私はコンテナの中にいますか?」
問題概要
問題URL
シナリオ
私はコンテナの中にいますか?
問題詳細
コンテナ(たとえばDockerのようなもの)の内部にいるか、または仮想マシン(他のシナリオのように)の内部にいるかを見極めてください。
解決判定
このシナリオにテストはありません(したがって、check my solutionもありません)。
問題解決の方針
【表示する】
コンテナ内にいるかどうかを判断するには、コンテナ環境に特有の痕跡を探す必要があります。
具体的な解決の段取りを表示する
- コンテナ環境に固有の情報を確認する
ヒント
オリジナルヒント
ヒント
もしも今の環境がコンテナであるならば、initプロセスの環境変数に、コンテナに関するものが存在するかもしれません。
initプロセスの環境変数を確認しましょう。
実行コマンド
特定のプロセスの環境変数は、/proc/[プロセスID]/encironに保存されています。
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 2.1 100928 9988 ? Ss 12:27 0:00 /sbin/init
# cat /proc/1/environ|tr "\0" "\n"
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TERM=xterm
container=youlooked
HOME=/root
HOSTNAME=i-0df1e1e8a076a00ab
containerという環境変数があるので、今回の環境はコンテナ環境である可能性が高いですね。
SadServers公式ヒント(翻訳)
ヒント1
ヒントはありません。解答をすぐに明かさないようなヒントが思いつく方はご連絡ください。
解法
これは実際にはPodmanコンテナです :-) イメージは docker.io/fduran/venice で取得できます。
確認方法の一つは、PID=1のプロセスの環境変数を見て container 変数があるか調べることです。例: cat /proc/1/environ|tr "\0" "\n"|grep container。今回のケースでは container=podman ですが、値は変更されています。
もう一つの手がかりは、実行中のプロセスを見て [kthreadd] のようなカーネルスレッドが存在しないことです。
参考
Linuxでは、コンテナ内かどうかを判断する方法がいくつかあります。今回のように/proc/1/environにコンテナ関連の環境変数が設定されているかを確認する方法のほか、/.dockerenvファイルの存在を確認したり、/proc/1/cgroupの内容を調べる方法もあります。
「いきなり問題を解き始めても調べるばかりになってしまう…」 「やりたいことが分かっても、コマンドが分からない…」 という方は、下記の記事でLinuxのコマンドを復習してから、SadServersの問題に取り掛かってみてはいかがでしょうか。
余談
Podmanのアイコンは、一見アザラシのように見えますが、本当はセルキーという神話上の生き物らしいです。普段はアザラシの姿をしているが、陸に上がるときはアザラシの皮を脱いで人間になるとのこと(怖い…)。
問題一覧はこちら
Discussion