I. 仮想マシン
Linuxはパワフルであり、Linuxサーバーもそれにつれてパワフルになっています。コンピューティングにしろ、ネットワーキングにしろ、ストレージにしろ、どんどんパワフルになっています。例えば、メモリは数百ギガバイト、ネットワーク機器の1ポートの帯域幅は数十ギガバイトから数百ギガバイト、データセンターのストレージは少なくともペタバイトレベルになります。しかし、これには柔軟性の低さが伴います。
- 柔軟性に欠けるリソースサイズ:そんな大きなサイズのマシンは必要ない、新しいビジネスに挑戦したいから4コア8Gのサーバーを申し込もうと思っても、そんな小さなサイズのマシンを購入することは不可能な場合があります。各プロジェクトにどのようなサイズのマシンが必要であっても、会社は一律に購入できる数を数台に制限し、すべて上記のような大きなサイズのマシンを購入します。
- リソース要求の柔軟性:仕様が決まっているのならまだしも、マシンを要求するたびに再調達しなければならず、リードタイムが非常に長くなります。
- リソースの再利用は融通が利きません。私はとにかく多くのリソースを必要としないので、他の人とマシンを共有することになりますが、異なるプロセス間でコンフリクトが発生する可能性があります。もうひとつは、他の人のマシンには、そのマシンで何が行われたかを知らないという歴史的なお荷物がたくさんあり、それを再インストールするにはコストがかかりすぎるということです。
Linuxは物理マシンの上に仮想マシンを作成します。各仮想マシンはそれぞれ独立したオペレーティングシステムを持ち、柔軟な仕様を持ち、1つのコマンドで起動できます。仮想マシンを作成するたびに新しいオペレーティング・システムが作成されるため、上記の柔軟性の問題をうまく解決することができます。
しかし、仮想マシンを使うには、少し対処しなければならない問題があります。ご存知のように、オペレーティング・システムには、WordやExcelなどのユーザー状態のプログラムと、カーネルコードやドライバなどのカーネル状態のプログラムの2種類があります。
カーネルとユーザーの状態を区別するために、CPUは4つの特権レベル0、1、2、3を持っています。Linuxカーネルが書かれたとき、大手は仮想マシンが将来大きくなることを知らなかったのでしょう。
3種類の仮想化
VirtualBoxのデスクトップ版をインストールすれば、この仮想化ソフトを使って仮想マシンを作成し、仮想マシン内にLinuxをインストールし、外部のOSもLinuxにすることができます。 仮想化ソフトであるVirtualBoxは、Excelのようにタスクバーに並んでいる一般的なアプリケーションです。
仮想マシンに入ると、仮想マシン内のExcelも通常のアプリケーションです。
問題は、仮想マシンのカーネルの立場になって人生について考えたときに起こります。
最初のアプローチ、完全な仮想化を見てみましょう。はっきり言って、これは「トリック」です。仮想化ソフトウェアが私のために偽のCPU、RAM、ネットワーク、ハードディスクをシミュレートしてくれるので、私は自分自身を気持ちよく感じることができ、最終的にカーネルに戻ったように感じることができるのです。
しかし、実際のモデルは次のようなものです。
仮想マシンのカーネルがこう言います!
仮想化ソフトはこう言います:問題ありません、あなたはカーネルですから実行できます!
仮想化ソフトウェアが物理マシンカーネルに向かって、「報告、私が管理している仮想マシンの1つがCPU命令を実行する必要があるので、その代わりに命令を実行するためにCPUの空き時間を少し確保するのを手伝ってください」と言います。
物理マシンのカーネルは、「待ってください、もう1台が実行中です。それが終わったら、あなたの番です。
仮想化ソフトウェアが「私が代わりに実行します」と言うと、ようやく終了し、結果が出ます。
仮想化ソフトウェアは仮想マシンカーネルに向かって、「おい、終わったぞ、これが結果だ」と言います。私はあなたがカーネルであると言いました、右、絶対にアクセス権を持っている、問題ありません、私を見つけるために命令を実行するために次の時間ああ!
仮想マシンカーネルは言った:それは私が本当にカーネルだと思われるが、兄弟、それは少し遅いああ実行している命令のこの点を思われます!
仮想化ソフトウェアは、 "それは悪くない、それらのいくつかが並んでいます!
メモリ要求のパターンは以下のようになります。
仮想マシンのカーネルはこう言います:起動に4Gのメモリが必要なので、上のアプリケーションに分配してください。
仮想化ソフトウェアはこう言います。「問題ありません、たった4Gです。
仮想化ソフトウェアが物理マシンカーネルに向かってこう言いました。
物理マシンカーネルはこう言いました!わかりました、90、91、92、93号室をお渡しします。
仮想化ソフトウェアが仮想マシンカーネルに向かってこう言います。ほら、あなたはカーネルだから、リソースへの排他的アクセス権を持っていて、0からの数字はあなたのものです。
仮想マシンのカーネルは、「私は本当にカーネルなんだ。じゃあ、2号室の3番目のキャビネットに何か入れようかな!
仮想化ソフトはこう言います。しかし、仮想化ソフトウェアは、「この仮想マシンは90号室から始まるから、2号室に何かを置きたければ、92号室に何かを置くのと同じだ」と考えます。
仮想化ソフトウェアは物理マシン・カーネルに向かい、「報告、私の上の仮想マシンは92号室の3つ目のキャビネットに何かを置きたいと言っています。
まあ、CPUとメモリの例の後、ネットワークとハードディスクの詳細には行きませんが、状況も似ている、仮想マシンカーネルの仮想化ソフトウェアのシミュレーションは、実際には、どのようなことが再び仮想化ソフトウェアを有効にする必要があります参照してください。
この方法の悪い点は、時間がかかること、そしてしばしば耐えられないほど遅いことです。
そこで仮想化ソフトウェアは、私がメッセンジャーであることをやめて、VMカーネルに自分のアイデンティティを直視させることができないかと考えました。カーネルだなんて言わないでください。あなたは物理マシンではなく、仮想マシンです!
しかし、パーミッションレベルの問題をどう解決するか?だから、IntelのVT-xとAMDのAMD-Vは、ハードウェアレベルから助け。最初の場所では、誰があなたのカーネルのライターは、0を使用した後、レベルを使用するような贅沢を持って聞かせて、3ですが、いくつかの使用を保存しないので、我々は現在の状態は、仮想マシン、または実際の物理マシンカーネルにあることを示す、新しいフラグビットを作成する以外の選択肢はありません。
仮想マシンカーネルでは、フラグビットが仮想マシンの状態に設定されている限り、命令のほとんどは、特に敏感な命令に遭遇しない限り、言い換えの途中で仮想化ソフトウェアを必要とせずに、CPU上で直接実行することができ、それは大幅に効率を向上させる物理マシンカーネル状態の操作にフラグビットを設定する必要があります。
そのため、仮想マシンをインストールする際には、物理CPUに対してこのフラグビットをオンにしてください。オンになっているかどうかは、Intelの場合はgrep "vmx" /proc/cpuinfo、AMDの場合はgrep "svm" /proc/cpuinfoで確認できます。
これはハードウェア・アシスト仮想化と呼ばれます。
もうひとつは、ネットワークやハードディスクにアクセスする際に、より高いパフォーマンスを実現するためには、仮想マシンカーネルに特別なドライバをロードさせる必要があること、また、仮想マシンカーネルをコードレベルから再配置させる必要があることで、物理マシンと同じようにネットワークやハードディスクにアクセスするのではなく、特別な方法でアクセスできるようにすることです。
これは半仮想化と呼ばれています。
デスクトップ仮想化ソフトウェアでは、VirtualBoxが主に使用され、サーバー用の仮想化ソフトウェアを使用する場合は、他の選択肢があります。
サーバーの仮想化ソフトウェアには、主にqemuが使われており、emuというキーワードは、フルネームでエミュレータ、シミュレータと呼ばれています。つまり、qemuを単独で使用することで、完全に仮想化されたモデルが使用されます。
qemu はゲスト OS やその他のハードウェアに対して CPU をエミュレートします。 ゲスト OS はハードウェアを直接扱っていると思っていますが、実際には qemu によってエミュレートされたハードウェアを扱っており、qemu が実際のハードウェアに命令を変換しています。すべての命令は qemu を通過しなければならないため、パフォーマンスは低下します。上記のように、完全な仮想化は非常に遅いため、ハードウェア支援型の仮想化技術であるIntel-VT、AMD-Vが使用されます。そのため、CPUハードウェアでこのフラグビットをオンにする必要があり、通常はBIOS内で設定されます。
フラグビットの開始を確認した後、KVMを介して、ゲストOSのCPU命令は、Qemuの変換を経由する必要はありません、直接実行し、大幅に速度を向上させます。
したがって、KVMは、現在のCPUがゲストOSまたはホストOSを使用しているかどうかを設定するには、カーネル内のモジュールが必要です。
まとめ
- 仮想化の本質は、qemuのソフトウェアでハードウェアをエミュレートすることですが、エミュレーションは遅く、高速化が必要です;
- 仮想化は主にCPU、メモリ、ネットワーク、ストレージをシミュレートし、それぞれアクセラレーションへのアプローチが異なります;
- CPUとメモリは主にハードウェア支援型仮想化を使って高速化され、動作には特別なハードウェアが必要です;
- ネットワークとストレージは、主に特別な半仮想化ドライバを使用して高速化されます。