最近の動向でわからないことがある。最近、クラウド(笑)とか称するマーケティング用語はともかく、クラウド(笑)のサーバー群の実装に、ハードウェアの仮想化技術がふんだんに使われていることだ。
完全にソフトウェアでハードウェアを実装するエミュレーターと違い、この手の仮想化技術は、ハードウェアに仮想化をサポートするための機能があり、それを使って、大きなオーバーヘッドが生じない仮想化を実現させている。
そのハードウェア仮想化の上で、ユーザーごとにゲストOSを実行している。つまり、これはOS外の仮想化である。
OSとは何だったのか。
我々は何十年も、OS内で仮想化を実装してきた。ひとつのコンピューターを複数人が使うという状況で、ユーザーとかアカウントという単位で仮想化を実現してきた。また、ファイルアクセスに権限を設け、ユーザーごとに柔軟に設定できるようにもした。プログラムはプロセスという単位で、他のプログラムとは隔離された。プロセスも仮想化技術の一つである。
それだけではない。何でもできる管理者とそうではない一般ユーザーという大雑把過ぎる権限を見直し、もっと細かい単位で権限を設定できるようにした。例えば、あるユーザーの動かすあるプログラムは、システムクロックを変更できる必要がある。しかし、カーネルに任意のコードを読み込ませて実行する必要はない。そのため、必要な権限だけ許可しておいて、もし、プログラムが誤作動を起こしたり、脆弱性により悪意ある者によって、そのプログラムを経由して任意のコードを実行されてしまったとしても、権限がないために、システムに深刻な影響を与える操作を防ぐことができる。これは、ユーザー単位やファイル単位やプロセス単位など、様々な仮想化単位で設定できる。
また、chrootとかjailといった仕組みは、ファイルシステム単位で、プロセスがアクセスできる範囲を制限できる。
LinuxカーネルにおけるSELinuxとかAppArmorなども、様々な仮想化単位で、権限を制限するためにある。
これらの、OS内での仮想化技術が、もう何十年も研究、実装されていながら、なぜ、ハードウェアといったOS外の仮想化技術を使うのか。ユーザーごとにゲストOSを実行するというのではなく、ユーザーごとにOS内のユーザーを作るというのではなぜだめなのか。ハードウェアに対する操作や、ファイルシステムに対する操作などは、様々な権限管理により、細かく設定できるはずだ。OS内の仮想化技術は、OS外の仮想化技術よりオーバーヘッドが少ないはずだ。
しかし、今やハードウェアの仮想化はすっかり市民権を得て、むしろOS側でハードウェア仮想化を効率的にする対応までしている始末。
一体、OSによるOS内の仮想化とは何だったのか。
思うに、この手のOS内の仮想化技術は、正しく設定するのが煩雑なのだろう。結局、OSまで含めて丸ごと仮想化してしまうのが楽なのだろう。
そんなことを、以下を読んでいて思った。
Rethinking the guest operating system [LWN.net]
ハードウェア仮想化によるゲストOSが一般的になってるけど、OSって重複多いよね。メモリ管理とかスレッド管理とかハードウェアアクセス管理とか。そういうのはホストOSに丸投げする軽いOSってのはどうかな。というものだ。
そして、現在のハードウェア仮想化によるゲストOSの流行を見ていると、なぜマイクロカーネルは流行らなかったのかという疑問にも悩まされる。マイクロカーネルはオーバーヘッドがあると言われ続けてきたが、今のハードウェア仮想化の上でのゲストOS実行の流行と比べたら、別にオーバーヘッドがあっても問題なかったのではないかとも思う。
追記:私はセキュリティや仮想化技術には詳しくない。なぜ技術fooや技術barを挙げないのかなどというコメントもあるが、単によく知らないだけだ。
5 comments:
ハードウェアの仮想化支援機能やハイパーバイザは年々進化していますし、コンテナ型に性能面で大きく劣っているとは言えません。
また、ハイパーバイザは異なるゲストOSの動作やライブマイグレーションの点で優れています。
一方、コンテナ型のゲストOSはホストOSに当たる、あるLinuxカーネル(or FreeBSD)のあるバージョンに依存するのでクラウドサービスとしては弱いのかもしれません。
ちなみにマイクロカーネルのアイデアはハイパーバイザに受け継がれていて、マイクロカーネル型のハイパーバイザが存在します。
ユーザー権限とクラウド(笑)のハードウェア仮想化は目的が違うと思います。
OSが、大量のハードウェア(CPU/メモリ/ディスク)を束ねて、ハードウェアの追加と削除ができて、どれかが破損してもアプリの実行環境が問題なく動作して、アプリが提供するサービスにかかる負荷に応じて消費電力を最適化しながらそれら大量のハードウェアを駆動させるような機能を提供していたら、それが使われたのかな、と。
ハードウエアの仮想化は仮想単位を消した時にゴミが残らない利点があります。
DLLヘルになったりしないのでかなり扱いやすいと思います。
少し与太を(笑)
言語にたとえて言えば、OS内のリソース群、
ポート/IPアドレス、ファイルシステム(/etc下の設定ファイル類なども)
こういったものはグローバル変数みたいな存在で、これを使うプログラム/プロセス
もシステムグローバルに近い存在になりやすいのかなと。
グローバル変数を使うプログラムをあまり手を入れずに並列動作させるなら、
(別スレッドではなく)別プロセスであるように、システムグローバルな
リソースを使っているなら、仮想OSを使った方が並列化させやすい、という面も
あるかなと。
とはいえ、普通にプロセスを起動したら、そこから見た世界は、/ 配下が独占利用
できる世界、ポート等も独り占め、といったパラダイムがあったとすると、
とても自由な世界なのか、(お隣さんが何も見えなくて)とても寂しい世界なのか
良くわかりませんが…
コンテナ型の仮想化のDockerが最近盛り上がってるの見ると、扱い易いのがなかっただけなのかもね。
Post a Comment