仮想化技術に関する世界観です。
自分の書いたブログ「神々とともに生きる詩人」2021/01/27より。
ネットワークにおいては、仮想化と呼ばれる仕組みを使うこともある。
これは、OSの上で仮想マシンや仮想CPUをエミュレートし、OSの上で別のOSを実行できる機能。
VM型の仮想化では、OSそのものを仮想化するため、たとえばWindows上でLinuxを実行できる。
VM型仮想化としては、Virtualboxなどが有名。
これに対して、Linux上でLinuxの仮想化を行うDockerなどでは、カーネルを共有するコンテナ型の仮想化を行うため、軽量でパフォーマンスがいい。
コンテナ型の仮想化では、プロセスを専用のコンテナプロセスとして「隔離」することができ、それを「コンテナイメージ」とすることができる。
Docker Hubなどのホスティングサイトでは、このコンテナイメージをインターネットからダウンロードでき、たとえば何の設定や導入もしなくても、簡単にRuby on Railsの環境をDockerだけで実現することができる。
また、必要がなくなったら、簡単に仮想サーバごと削除できる。
こうしたコンテナ型の仮想化は、システムの開発(DevOps)においてはとても便利で、本番環境を開発環境で再現するために使えるほか、レンタルサーバなどでは、簡単にroot権限のある仮想サーバを利用者に与えることができる(VPS)。
仮想化とは、「OS環境の上で別のOS環境を再現できる」技術。
主に、サービスを開発する際、試験環境で実際の本番環境と同等の環境を構築し動くかどうかを試す用途や、レンタルサーバなどでroot権限を得られる仮想サーバーを作って提供したりするために使う。
仮想化にはVM型の仮想化とコンテナ型の仮想化がある。
VM型の仮想化では、VM(仮想マシン)の上でホストのOSとは別のOSを動かせる。
これに対して、コンテナ型の仮想化では、ホストはLinuxカーネルで、その上でLinuxカーネルを共有しながら、Dockerというコンテナの上で別のマシン(Linux仮想環境)を動かすことができる。
Dockerはパフォーマンス上のメリットや手軽さが優れており、「インスタンスにいつでも作って不要になれば削除できる」代わり、Windowsなど別のOSは実行できない。
後日注記:実際にはLinux仮想環境と言うよりも、隔離されたコンテナプロセスが動く。軽量かつハイパフォーマンスでプロセスを動かせるため、ホストに直接MySQLを入れるのではなく、仮想マシンのMySQLコンテナを入れ、開発や試験環境と本番環境を同じにすることも多くなってきている。
たとえば、ホストのLinuxカーネルの上で、Dockerの仮想マシン上のコンテナOSとしてRHELを動かすことも、SUSEを動かすことも、Ubuntuを動かすこともできる。一台だけではなく何台も動かせる。
このため、レンタルサーバーの仮想サーバーなどにおいて、ホストのシステムをLinuxで構築し、その上でコンテナOSをさまざまに動かすことで、「一台のパソコンの上で何台ものOSシステムを無限に動かす」ことができる。
また、Dockerは通常ひとつのホストに制限されているが、Kubernetesを使うことで、ネットワーク上に分散するさまざまなホストを一台のホストであるかのように仮想化することができる。
DockerとKubernetesを使うことで、パソコンは複数のネットワークホストが一台になり、その仮想ホスト一台が仮想的な無限台のシステムになる。必要になった段階でシステムを増やし、要らなくなったらすぐに削除できる。
Dockerは、実際の本番環境と同等の環境を仮想環境上に構築し、試験やテストを行いながら開発をする「DevOps」と相性がいい。
VM型の仮想化よりも、コンテナ型の仮想化の方が、Linuxカーネルを共有する分パフォーマンスが良く、軽いという特徴がある。
後日注記:Dockerでは、Dockerfileを使うことでコンテナのイメージを簡単に作り、別の環境に適応したり配布することが簡単である。Web上のDocker Hubではこうしたイメージが配布されており、NginxやMySQLを入れるのであれば、「docker run」コマンドで簡単に導入することができる。
既存のシステムやアプリケーションがWindows 10で動かず、過去のWindowsのバージョンを継続して使わざるを得ないが、それでもセキュリティの問題からWindows 10に更新したい場合、仮想環境にWindowsの過去のバージョンを入れる、という方法があります。
たとえば、僕は過去に親が購入したVisual Studio 6.0 Enterprise Editionを持っています。コンパイラやデバッガ、フォームデザイナーやリソースエディタなどが含まれたとても高価なソフトウェアですが、残念ながらWindows 10では動作しません。このような時、仮想環境に昔のWindowsを入れて、そこからVS 6.0を使うことができます。
同じことは、マルチブートでも実現できますが、マルチブートと違い、同時に複数のOSを実行できます。このため、Linuxの開発用のサーバを仮想環境に入れて、Windowsから仮想サーバにアクセスしたりできます。
広く使われている仮想ソフトウェアのVirtualBoxはオープンソースで、無料で使えます。Linuxデスクトップを使うなら、Windowsを仮想環境に導入し、Windowsアプリケーションを使う必要がある時に仮想環境のWindowsを使うこともできます。
ネット上には、過去の全てのバージョンのWindowsを入れて、博物館のようにしている人も居ます。
ただし、仮想環境はエミュレータと同じで、普通に使うよりも速度が遅くなります。特にLinuxをWindowsの上で動かすなら、LXDEのような軽量デスクトップ環境がおすすめです。
(在導万創のブログより。2020.03.08)
仮想化とは、OSの上で別のOSを実行したり、複数のOSを並列実行したりすることができる技術。
「コンピュータの中で仮想的なコンピュータを実現する」と考えると分かりやすい。実際にはWindowsの上でLinuxを動かしたり、Linuxの上でLinuxを動かしたりすることができる。
Windowsにおいては、VirtualBoxを導入することで、Windowsの上でLinuxを実行したりできる。Xen、KVM、QEMUなどを使うことで、Linuxの上で別のOSを実行したりすることもできる。
クラウドでは、仮想化技術は便利である。以下に挙げる以外にも、Dockerを使うことで、Linuxの上で仮想Linuxをコンテナとして実行することもできる。
また、実際のデプロイ環境と同じ環境を、作業中の環境で再現する用途にも使える。
さまざまなOSを同時に動作させることで、ひとつの「リレーション環境」を作ることができるし、その際にOSのシステム構成などを柔軟に構成できる。レンタルサーバーを提供したり、社内システムを構築したりする時に、仮想化技術は無くてはならない。僕が思うに、さまざまなOSと言語でコンポーネントがネットワーク通信を行う、CORBAと似ていると思う。
仮想化ソフトウェア。複数のOSを並列実行出来る。
Xenでは、XenスーパーバイザはLinuxやWindowsのようなOSよりも低い階層で動作し、LinuxやWindowsをXenの上で並列に動作させる。これは、VMwareのようなホストOSとゲストOSが分かれて実行されるタイプの仮想化ソフトウェアとは異なる。
Linuxカーネルに組み込まれた仮想化技術。
CPUエミュレータ。Intel CPUなどで別のCPUをエミュレートできる。
仮想化ソフトウェア。ホストOSの下でゲストOSを実行出来る。Windowsの上で任意のLinuxディストリビューションを実行したりすることが可能。
後日注記:VirtualBoxにはホストOSとゲストOSの間でファイルを簡単に共有するような機能もあり、WindowsとLinuxの間でのやり取りをする上で使いやすい。Windows上で仮想環境を構築するなら、オープンソースなVirtualBoxが事実上の標準である。
VirtualBox/Vagrantを参照のこと。
VirtualBoxと一緒にVagrantというソフトウェアを使うことで、VirtualBoxに導入したOSの環境を整備したり、サーバーをインストールしたりすることを自動化することができる。この時、環境のテンプレート(ひな形)であるVagrant boxを簡単に導入できる。Vagrant boxは簡単に削除・再作成することもできる。Laravelの開発環境の導入に使うこともできる。
商用の仮想化ソフトウェア。
Microsoftによる仮想化機構。どうしてもWindowsの上で他のOSを動かしたい場合は、Hyper-Vが使える。
たとえば、Windowsの上でHyper-Vを使ってUbuntuを動かすことができる。最近はWindowsの上でネイティブにUbuntuが動くようにもなったが、Hyper-Vを使うことで、VMwareのように簡単にOSの上で別のOSを試したり削除したりすることもできる。UbuntuをWindowsの上でちょっと試してみたい人にはおすすめ。
さまざまな仮想化技術に対する、統一されたAPI。
GNOME Boxesは、libvirtとQEMUとKVMを用いた、仮想化システムのGNOME用のフロントエンド。
特徴は手軽であること。VirtualBoxのように高度な設定はできないが、簡単に仮想化環境とイメージを作成・削除できる。ISOイメージファイルやリモートマシンのURLなどから簡単に仮想マシンを作れる。
たとえば、DistroWatch.comに書かれているようなさまざまなLinuxディストリビューションを導入して試すなどの用途に向いている。
仮想環境の管理機能やリモートシステムのファイルブラウジングができるほか、VNCを経由してリモートデスクトップのクライアントになる。
Box86はx86のエミュレータ。LinuxのARM環境(たとえばRaspberry Pi)でx86のバイナリを実行できる。
2023.05.23
コンテナの歴史としては、FreeBSDで開発されたjailsという技術がある。また、SolarisにはZoneというコンテナの技術がある。
FreeBSDも参照のこと。
Dockerを参照のこと。
Kubernetesを参照のこと。
Parallels Virtuozzo Containers for Linuxのオープンソース版のサーバ仮想化ソフト。ホストのLinuxカーネルを共有するため、オーバーヘッドが少ないとされる。
Linuxカーネル向けの仮想化技術によるバーチャルプライベートサーバ。Webホスティングサービスに利用される。
ProxmoxVEはDebianをベースとした仮想化プラットフォーム。
2023.08.14
coLinuxはWindows上で動くLinuxカーネル。
Windows Subsystem for Linux (WSL)はLinuxのバイナリ実行ファイルをWindowsで動かすための互換レイヤー。
新バージョンのWSL2では、互換レイヤーではなく、LinuxカーネルをOSにまるごと内蔵させた。
WSLも参照のこと。
Cygwinも参照のこと。
LinuxでWindowsアプリケーションを動かすためにはWineを用いる。