containerd/runcまわり
ここらへんからrunc start叩く?
ここから
ここに来て、すでにここでコンテナ側のプロセスを開始してそうだが、そうなるとこれがruncのプロセス?
そして、この辺でcgroupsの名前が出ているが(何をやっているかは知らない)、そういうのはruncの仕事では?
このprocess自体はcontainerdの定義したタイプなのでもうちょっと中身を見る必要がありそう
Process interfaceの実装はexecProcessとInitの2つ

containerdのコードとruncのコードが直接行き来する箇所(の1つ) ここから以下を呼んでる
r.command(context, "start", id) がどうやらrunc startコマンドを呼んでそうだぞ、ということで細かく見ていく
まず、 command() はここ。
このなかでも29-32行目に、ダイレクトにexec.CommandContext() している
if command == "" {
command = DefaultCommand
}
cmd := exec.CommandContext(context, command, append(r.args(), args...)...)
では、この command がruncなのであろう、ということは30行目のDefaultCommandが以下の通り runc であることからも予測可能。
これで、以下の第二引数が(少なくともデフォルトでは) runc であることはわかった。
では、第三引数の append(r.args(), args...)...) を見ていく。
r.args() は以下で、オプションを主に管理していそう。
では、もう片方の args はなにか。これは、この関数((*Runc).command())の第二引数(可変長なので複数の可能性がある)。
つまり、一個前のポストにあるように今回のコンテキストでは "start", id の2つ。
ここまでの話を総合して大まかに以下のようなコマンドが発行されると予測される
runc SOME_OPTS start CONTAINER_ID
ここまででコンテナの起動まではわかった気がするので、起動したコンテナに対してどうやってstdout/stderrを吸い上げるパイプを紐付けるのか
とりあえずctrの --log-uriオプションに binary://$FILEPATH な感じでログハンドラを渡したときに来る場所がここっぽい
これはここに飛ぶ
ここで cmd.ExtraFiles いくつかのパイプを渡して実行しているがなぜか書き込みのパイプは閉じてしまっている。意図は不明(入力が何もない、という状態を作りたいとか?
開いたパイプ、結局deferで関数出るときにcloseしてるけどそれも謎
ExtraFilesにパイプいくつか追加してるが、これはfd3以降としてアタッチされる。
開いたパイプcloseしてるのは、あくまでログハンドラとコンテナ側が使うだけでcontainerd的には興味がないパイプだからっぽい?(パイプの使い方を見ていた
pio.io がどう使われるかを追えば良さそう
pioがなにか、という定義が以下(processIO struct)
ちなみに、binaryIO が runc.IO のinterfaceを満たすためのメソッドはこのあたりだが、Write/ReadCloserを返す処理は全部nilになっている
createIO()自体が呼ばれる箇所はいくつかあるが、とりあえず Init.Create() を見ていく。
以下でcreateIO()の戻り値全体をInit.ioとして格納してる
ここでopts.IO に p.io.IO() (InitのprocessIOがrunc.IOを返してる。命名が下手?????)を格納してる
では、この opts がなにかというと、 runc.CreateOpts struct
このoptsは、作られた直後でここに渡されて、これは runc.Create() なのでここらへんからcontainerd -> runcにコンテキストが移って行く雰囲気がある
ここで runc createコマンド打つときのExtraFilesに runc.IOから渡ってきたExtraFiles渡してるから、以降はruncコマンドの中の出来事になる
runc create
runc create 打ったらここに来る。
まず、コマンドに渡ってきたパイプをどこのタイミングで取得するかを見ていく
https://github.com/opencontainers/runc/blob/acab6f6416142a302f9c324b3f1b66a1e46e29ef/utils_linux.go#L227-L233 このあたり?
preservedFDは、今回のケースではcontainerdから渡したExtraFilesの数だけ指定されてるのでここには入る。
参考ツイート