発明のための再発明スマートフォン用の表示で見る発明のための再発明Webプログラマーが、プログラムの内部動作を通してプログラムを作る時の参考になるような情報を書くブログ(サーバーサイドやDevOpsメイン)2018-05-04gVisorのechoを読むプログラミングgVisorが面白そうだったので、どんな風に動いているか書きます。c400a0356b856e71fd30e3fe10372d7bb94356cbです。gVisor概要gVisorは、先日googleが公開した、アプリケーションとホストの分離を目指したコンテナランタイムです。システムコールをコンテナから直接実行するのではなく、システムコールをgVisorが受け取って実行を制御することで、コンテナをより安全に動かせるようにしています。GitHubは、ここgithub.comgVisorのコードは短くはないのですが、色々な機能を実装するために多くなっているだけで、各機能に必要なコードはそれほど多くなく、つまみ食いにはちょうど良い大きさという印象です。動かし方bazelでビルドして、Dockerでランタイムを指定すれば動きます。READMEに詳しく書かれているので、簡単に動かせると思います(https://github.com/google/gVisor#building)gVisorのechoの動き本題の、コンテナ内でechoを実行したときに何が起きているか見ていきます。"Hello"を実行しました。簡単に図にすると、下のように動いています。コマンドを実行したところから始まります。gVisorが気づくechoが動かすWriteのシステムコールにgVisorが反応するところから、gVisor仕事が始まります。Task#run(pkg/sentry/kernel/task_run.go)という関数がループの中でシステムコールを待っています。システムコールの内容をptraceで取得するまず、gVisorがどんなシステムコールが実行されたかを知る必要が有ります。そのために、Task#setRegsからptraceを呼び出します。PTRACE_GETREGSを使用することで、対象プロセスのレジスタをコピーします。これによって、gVisorはシステムコールの内容を把握できます。Orig_raxにあるシステムコールの番号や、rdiなどにある引数などが取得できる情報です。実行するべきでないものを除外システムコールの番号がわかったので、それを実行するべきかどうかを判定します。Task#checkSeccompSyscallという関数が実行処理の判定をし、許可していないシステムコールを弾いています。前処理システムコール(ここでは、Write)を実行するとなったら、まずは前処理として、.bootにログを出したりします。システムコールに対応した処理を実行gVisorはホストにシステムコールを直接投げるのではなく、gVisor自身が別のシステムコールを実行します。処理が書かれています。全部の処理が実装されているわけではなく、TODOがあったり、318までしかシステムコール候補がなかったりします。Writeを実行echoの出すWriteは当然実装されていて、pkg/sentry/syscalls/linux/sys_write.goに処理内容が書かれています。ホストへWriteする処理を実行sys_writeのwriteには共通処理が書かれているのですがechoはホストに書く処理なので、続いて個別処理としてpkg/sentry/fs/host/file.goのWriteが実行されます。コマンドプロンプトに表示される。"Hello"が表示されます。このように、gVisorはコンテナがシステムコールを直接実行するのではなく、gVisorがホストの間に入っています。この機能がsentryで、怪しいコンテナが変なシステムコールを実行するのをブロックしてくれます。そのおかげで、コンテナがより安全に動かせるようにできるようになっているというわけです。201...2018-04-29DBマイグレーションを行う技術データベースのスキーマを変更するということはデータをいじる...2018-04-07grpcの動きgrpcがどんな風に動いているかを覗いてみます。(2)月別アーカイブ検索リンクGitHubTwitterはてなブログをはじめよう!mrasuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。