ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

ID Mapping/User Namespace再入門 その(1)

前のシリーズが終わる前に新シリーズを書いていく。

皆さんのIDはマッピングされていますか?

User Namespace とは?

まず、TenForwardさんによる日本語でのとてもわかりやすい解説がすでに存在するので、そちらを参照してから...。

gihyo.jp

User Namespace自体は、Linux名前空間機能の一つであり、ホストのユーザID(グループIDも含むが、簡便のためこの記事では「ユーザID」とだけ表現する)の振り出し方とコンテナ(名前空間)内部のIDの振り出し方を分離する機能である。

実は、User Namespaceを(unshare(2)などで)分離しただけでは、ホストのユーザIDが見えなくなるだけで、コンテナ内部では全てのIDがnobodyになってしまい、現実のプログラムを動かせない。Network Namespaceにおいて、分離後vethなどを引き出さないと結局現実の環境で使えないのと同じイメージである。

ということでこの際にホストのユーザIDとコンテナ内部IDとの対応関係を指定する必要がある。例えば、ホストの ID=100000 ~ ID=165534 を、コンテナの ID=0 ~ ID=65534 に対応させる、ということができる。この機能がID Mappingである。

そして、これもまた重要なのであるが、この場合にコンテナ内部で ID=0 に割り振られたユーザには、そのプロセスでの特権が与えられる。とはいえ、(時刻など)ホスト全体であったり、ホストの名前空間の操作に関わることはできない。一方で、そのプロセスのために別の名前空間を分離している場合は、その名前空間での操作が可能になる。たとえば、Network Namespaceを一緒に分離していればネットワークデバイスの設定ができるし、UTS Namespaceを一緒に分離していればホスト名の変更ができる。

また、User Namespaceはホストの一般ユーザが作成できる。非特権コンテナにおいては、User Namespaceのこういった特徴を利用して一般ユーザがなるべく安全にコンテナを作成できるようにしている。

User Namespace が解決してくれる問題

主に以下の二つの課題が解決できる。

  • もし特権を付与したコンテナをunjailされた場合等に、ホストのファイルシステムを操作されるなどの被害を最低限にしたい
  • 一般ユーザで、なるべく安全にコンテナを作成したい

User Namespace をユーザランドの実装的にはどう実現しているのか

続きを読む

Ubuntu(などdeb系なLinux)でLinux 4.20 + PSIなカーネルを入れる

あけましておめでとう😂!

では、今日はLinux 4.20より導入された PSI を試していきたいわけですが、まずは環境構築からやっていきたいとおもいます。今後、「〜していきたい」と言う表現が続きますが、そこは任意のユーチューバーやゲーム実況者の声に置き換えてお読みください。

PSIは公式サイトがあります。

facebookmicrosites.github.io

Pressure Stall Information とは、各種リソース、CPU/メモリ/IO のプレッシャー状況を取得する方法で、具体的には /proc やcgroup2配下のファイルを経由してゲットできます。いわゆるロードアベレージのように参照できるのかどうかが気になっていて、色々試していきたいと思います。

ちなみに、TenForwardさんがすでに紹介記事を軽く書いていますので、僕はあれですね、フォロワーとしてやっていきたい。

tenforward.hatenablog.com

tenforward.hatenablog.com

続きを読む

CRIUがプロセス/コンテナをリストアした後のプロセスの扱いの話

Linux Advent Calendar 2018, 21日目の記事です。遅れて申し訳... しかし意外と皆様脱落者が... ともかく、やっていきます。

ちょいと最近やってることの話をしようと思っていて、今日はCRIUがプロセス/コンテナをリストアするときのプロセスツリーの戦略の話をします。

CRIUのコマンドラインモードとサーバクライアントモード

先日の発表 で少し触れたのですが、CRIUには大きく二つの利用方法があります。一つはコマンドラインツール criu(8) からプロセスをダンプリストアする方法、もう一つが、クライアントサーバ方式で、クライアントライブラリをプログラム内部に組み込んで利用する方法です。

続きを読む