コンピュータのリソースを有効に活用する/アプリ間の干渉を避けるために、OSの仮想化技術が発展しました。
関連
- ◯
- コンピュータとOS
OSの仮想化:ハイパーバイザ型、ホスト型
これまでのパソコンやサーバでは、OSをひとつだけ動かすのがふつうでした。
しかしコンピュータの各リソース(プロセッサ、メモリ、ストレージ、……)の性能・容量が大きくなってきたことで、そのような使い方が非効率になってきます。もしこれらのリソースを有効に使うことができれば、コストを抑えることができます(導入、電力、場所、……)
このような背景から、コンピュータを複数のOSで共有するための<仮想化ソフト>が提供され始めました。単体のプロセッサで複数のOSを動かす技術を、OSの仮想化といいます:[※1]
OSの仮想化には、パソコン/サーバの上で直接仮想化ソフトを動かすハイパーバイザ型、パソコン/サーバのOSの上で仮想化ソフトを動かすホスト型の、2つのタイプがあります。
- ※1
- OSの仮想化ソフトは、いわゆるエミュレータとはすこし違いますーーエミュレータを使えば、ある機種(パソコン、サーバ、携帯端末、ゲーム機、……)で動くアプリケーションを、べつの機種で動かすことができますーーいっぽうOSの仮想化ソフトは、OSからプロセッサへの命令は、そのまま物理プロセッサに伝えるだけです。なので仮想化技術を使っても、そのOSがサポートするプロセッサ以外では、そのOSを動かすことはできません。
OSの仮想化:コンテナ(アプリごとにOSを分ける)
パソコンやサーバには、いろいろなアプリをインストールできます。ただ使い方によっては、アプリの特定のバージョンを使いたいことがありますよね? また、あるアプリを使うとべつのアプリが使えない、といったことも起こります。そもそもアプリをたくさんインストールすると、パソコンやサーバを交換するときに、移行が大変です:
こういった問題は、そもそもコンピュータで<ひとつだけ>動いているOSと、アプリが結びついていることから起こります。
なら1コのコンピュータで、アプリごとに分けた複数のOSを使えるようにすればいい、という発想が生まれますーーそれがOS仮想化のひとつ、コンテナですーーハイパーバイザ型やホスト型のOS仮想化は(OSのコアのレベルで仮想化を行うので)使うのはそれなりに面倒ですが、コンテナはOSのコア部分は共有します。なので<気軽に>、複数のOSを取り込み〜切り替えて使うことができます。これが、<アプリごとのOS>という考え方を容易にしています:
コンテナを使うことで、アプリ間の干渉を避けられます。またパソコンやサーバを移行するときも、それぞれのコンテナの<イメージ>(コンテナの実体ファイル)をコピーするだけで済むようになります。
- ※1
- コンテナの技術は、ユーザごとにルートフォルダを分ける「chroot」の技術がもとになっています。これを極限まで推し進め、ひとつの「chroot」がほぼ独立したOSにみえるものを「コンテナ」と呼ぶようになりました(なので仮想化といっても、完全なものではありませんーー動かせるOSは、そのコア部分が同じOSにかぎられます。また管理者モードでのアクセス権にかかわるような操作も、コンテナ上のOSでは行えません)。
- ※2
- コンテナの威力は、コンテナ上のアプリケーションを透過的にあつかえる、というところにあります。たとえば次の一連のコマンドは、コンテナ上のOS(Ubuntu)で動くアプリケーション(Tidy)を、パイプラインを通して<手元にあるアプリケーションのように>実行し、ファイルの形式を変換しています:
cat index.html | docker run -i --rm ubuntu:vir117 tidy > index.xhtml
ネットワークの仮想化
OSが1コのパソコンやサーバで1コしか動かないなら、複数のOSの間でやり取りがあるサービスを試したり作ったりするには、そのOSの数だけコンピュータが必要になります。
しかし1コのコンピュータで複数のOSを動かし、それらのOSを<仮想の>ネットワークでつなぐことができれば、そのような手間を省くことができます。
OSの仮想化技術を使えば、1コのパソコンで複数のサーバやクライアントを動かし、それらの間でネットワークを組むことも可能です: