KVM/QEMU Linux VM管理: 仮想マシンのインストール、設定、最適化に関する包括的ガイド

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

仮想化の力:Linux環境でKVM/QEMUが優れている理由

ITの世界では、仮想化は単なる流行語ではなく、日々の必需品となっています。私たちは常に複数の開発環境をやりくりし、重要なサービスを分離したり、実験的なセットアップのために安全なサンドボックスを必要としています。これには、タスクごとに専用の物理ハードウェアにかかる費用と複雑さなしに、新しいマシンを迅速にプロビジョニングし、廃止し、リソースを効率的に管理する能力が求められます。

数多くの仮想化プラットフォームが魅力的な機能を提供する一方で、Linuxエコシステムとのより深い統合、ほぼベアメタルに近いパフォーマンス、そして完全な制御を求めるシナリオもあります。まさにここで、KVM (Kernel-based Virtual Machine) と QEMU が不可欠となります。

ITエンジニアとして、私はその本質的なパワー、柔軟性、そしてそれらをサポートする強力なオープンソースコミュニティのために、これらのツールを一貫して信頼しています。これらは共に、Linuxサーバーインフラストラクチャに直接組み込まれた、費用対効果の高い高性能な仮想化ソリューションを提供します。

コアコンセプト:KVMとQEMUを解き明かす

KVM/QEMUを真に習得するには、それぞれの役割と、それらがどのように相互作用するかを理解することが重要です。KVMとQEMUが何であるか、そしてそれらの強力な連携がどのように高性能な仮想化を実現するかを探ります。

KVM: ハードウェア仮想化エンジン

KVMは、従来の意味でのスタンドアロンのハイパーバイザーではありません。むしろ、Linuxカーネルを本格的なハイパーバイザーに変えるLinuxカーネルモジュールです。これにより、システムは仮想化ホストとして機能することができます。KVMは、最新のCPUで標準となっているIntel VT-xやAMD-Vなどのハードウェア仮想化拡張機能を利用します。この直接的なハードウェアアクセスにより、ゲストOSはCPU命令をほぼネイティブに実行でき、優れたパフォーマンスをもたらします。

QEMU: マシンエミュレータと仮想化ソフトウェア

QEMU、Quick Emulatorの略で、多機能なオープンソースのマシンエミュレーター兼仮想化ソフトウェアです。QEMU単独でも、システム全体をエミュレートできます。この機能により、あるアーキテクチャ(例:ARM)向けに設計されたオペレーティングシステムやプログラムを、全く異なるアーキテクチャ(例:x86_64)上で実行できます。しかし、QEMUはKVMと統合されたときに真価を発揮します。

KVMがアクティブな状態では、QEMUはユーザー空間コンポーネントとしての役割を担います。ネットワークカード、ディスク管理、グラフィックカードなど、CPU以外のハードウェアのエミュレーションを管理します。さらに、仮想マシン (VM) のライフサイクル操作を処理し、VMとの対話のためのユーザーインターフェースを提供します。要するに、KVMがCPU仮想化を処理し、QEMUがそれ以外のすべてを管理します。これは、基盤となるハードウェアをゲストOSから抽象化し、完全に仮想化された環境を提示します。

この強力なパートナーシップは、両方の長所を提供します。重要なCPU操作のためのハードウェアアクセラレーションされたパフォーマンスと、広範なゲスト互換性と柔軟性のための包括的なハードウェアエミュレーションです。

実践:KVM/QEMU仮想マシンのインストール、設定、最適化

理論は不可欠ですが、実践的な応用こそが真の学習の場です。ここからは、ターミナルに入り、仮想化環境をセットアップします。このセクションでは、ホストの準備、必要なコンポーネントのインストール、最初のVMの作成、管理、そして最も重要なこととして、特定のニーズに合わせたパフォーマンスの最適化について説明します。

ホストシステムの準備

最初の重要なステップは、Linuxホストマシンがハードウェア仮想化をサポートしていることを確認することです。ほとんどの最新のCPUはサポートしていますが、常に確認することが賢明です。

CPUがIntel VT-x (VMX) またはAMD-V (SVM) 拡張機能をサポートしているかを確認するには、ターミナルを開いて次を実行します。

grep -E 'svm|vmx' /proc/cpuinfo

このコマンドが何らかの出力を返した場合、お使いのCPUはハードウェア仮想化をサポートしています。何も返さない場合、CPUがサポートしていないか、システムのBIOS/UEFI設定でこれらの機能が無効になっています。後者の場合は、そこで有効にする必要があります。

KVM、QEMU、Libvirtのインストール

libvirtは、特にvirt-managerのようなグラフィカルツールを介して、KVM/QEMUとの対話を簡素化する強力な仮想化管理ツールキットとAPIとして機能します。これらの重要なコンポーネントすべてをUbuntu/Debianベースのシステムにインストールします。

sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $(whoami)
sudo usermod -aG kvm $(whoami)

これらのコマンドを実行した後、新しいグループメンバーシップを有効にするために、ログアウトして再度ログイン(または再起動)することを忘れないでください。これにより、virshコマンドにsudoを常時必要とすることなく、ユーザーアカウントが仮想マシンを管理するために必要な権限を持つことになります。

KVMが正しく動作しており、ユーザーがlibvirtと対話できることを確認するには、次を試してください。

virsh list --all

仮想マシンのリストが表示されるはずです(最初は空である可能性が高いです)。さらに、KVMカーネルモジュールがロードされていることを確認します。

lsmod | grep kvm

これにより、kvm_intelまたはkvm_amdのような出力が表示され、KVMがアクティブに動作していることを示します。

VMのネットワーク設定の基本

VMがローカルネットワークやインターネットと効果的に通信できるようにするには、通常、ホストにネットワークブリッジをセットアップします。libvirtは通常、デフォルトでNATベースのブリッジ(virbr0)を自動的に構成しますが、これはほとんどの基本的なシナリオに完全に適しています。

物理ネットワークへの直接アクセスなど、より高度な構成が必要な場合は、カスタムブリッジをセットアップします。他のリソースでは高度なネットワークブリッジ設定について深く掘り下げていますが、初期の目的では、デフォルトのNATブリッジで十分です。

最初のLinux仮想マシンの作成

libvirtを活用してVMを作成するコマンドラインツールであるvirt-installを使用します。まず、ゲストOS用のISOイメージを取得します。私は軽量性と自動化の容易さから、Ubuntu Server(例:22.04 LTS)をよく使用します。Ubuntu 22.04 LTSサーバーのISOをダウンロードします。

wget https://releases.ubuntu.com/22.04/ubuntu-22.04.4-live-server-amd64.iso -P /var/lib/libvirt/images/

次に、VMを作成します。2GBのRAM、2つのCPUコア、20GBのQCOW2ディスクイメージを割り当て、デフォルトのvirbr0ネットワークに接続します。

sudo virt-install \
--name my-ubuntu-vm \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/my-ubuntu-vm.qcow2,size=20,format=qcow2 \
--os-variant ubuntu22.04 \
--network bridge=virbr0,model=virtio \
--cdrom /var/lib/libvirt/images/ubuntu-22.04.4-live-server-amd64.iso \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--virt-type kvm
  • --name my-ubuntu-vm: VMの名前を設定します。
  • --ram 2048: 2048MB (2GB) のRAMを割り当てます。
  • --vcpus 2: 2つの仮想CPUコアを割り当てます。
  • --disk ...: 仮想ディスクを定義します。qcow2はスナップショットとシンプロビジョニングをサポートする柔軟なフォーマットです。
  • --os-variant ubuntu22.04: libvirtがUbuntu 22.04に合わせた設定を最適化するのに役立ちます。
  • --network bridge=virbr0,model=virtio: VMをvirbr0ブリッジに、高性能なVirtIOネットワークドライバーを使用して接続します。
  • --cdrom ...: インストールISOを指定します。
  • --graphics vnc,listen=0.0.0.0: VNCアクセスを有効にし、任意のIPからアクセスできるようにします(本番環境では制限することをお勧めします)。
  • --noautoconsole: 作成後にvirt-installが自動的にコンソールに接続するのを防ぎます。
  • --virt-type kvm: virt-installにハードウェア仮想化のためにKVMを使用するよう明示的に指示します。

このコマンドを実行するとVMが起動します。その後、VNCクライアント(例:virt-viewer)またはvirt-manager(グラフィカルインターフェースを提供し、VNCディスプレイを自動的に見つけます)を介してVNCコンソールに接続できます。通常通りゲストOSのインストールを進めてください。

グラフィカルなアプローチを好む場合は、virt-managerがVM作成のための直感的なウィザードを提供します。舞台裏では、基本的に同様のlibvirtコマンドを生成して実行しています。

KVM/QEMU仮想マシンの管理

VMがインストールされたら、効果的なライフサイクル管理が重要になります。ここでは、頻繁に使用するいくつかの一般的なvirshコマンドを紹介します。

  • すべてのVMを一覧表示(実行中および停止中の両方):
    virsh list --all
  • VMを起動する:
    virsh start my-ubuntu-vm
  • VMを正常にシャットダウンする:
    virsh shutdown my-ubuntu-vm
  • VMを強制停止(破棄)する(細心の注意を払って使用してください。これは電源プラグを抜くのと同義です):
    virsh destroy my-ubuntu-vm
  • 実行中のVMを一時停止する:
    virsh suspend my-ubuntu-vm
  • 一時停止したVMを再開する:
    virsh resume my-ubuntu-vm
  • VMのコンソールに接続する(ヘッドレスサーバーに非常に便利です。ゲストOSにシリアルコンソールが設定されていることを確認してください):
    virsh console my-ubuntu-vm

    コンソールを終了するには、Ctrl + ]を押してください。

仮想マシンパフォーマンスの最適化

VMを動作させることは簡単なタスクですが、効率的に動作させることは全く別の課題です。ここでは、私が大幅な改善をもたらすと見つけた実証済みの最適化のヒントをいくつか紹介します。

VirtIOドライバー:パフォーマンスブースター

VMを作成する際には、常にネットワークとディスクI/OにVirtIOドライバーを使用することを優先してください。virt-installコマンドで示されたように(model=virtio)、これらの準仮想化ドライバーは、ゲストOSがホストのハードウェア仮想化レイヤーと直接通信することを可能にします。この直接通信は、遅いエミュレーションを迂回し、ディスクとネットワークのスループットにおいて大幅なパフォーマンス向上をもたらします。

ディスクI/Oの最適化:キャッシュとネイティブI/O

ディスクパフォーマンスに高い要求があるワークロードの場合、ディスクI/O設定の微調整が非常に重要です。デフォルト設定は、多くの場合、データの安全性や広範な互換性を優先します。しかし、最高のパフォーマンスを得るためには、ディスクキャッシュをnoneに、I/Oモードをnativeに設定することを検討してください。このアプローチにより、ホストがディスク操作をキャッシュするのを防ぎ、I/O要求が基盤となるストレージデバイスに直接渡されるようになります。

4GBのRAMと特定の高I/Oアプリケーションを搭載した私の本番Ubuntu 22.04サーバーでは、この構成により、開発VMの処理時間が大幅に短縮されました。具体的には、大規模なコードベースのコンパイルやデータ集約型分析などのタスクにおいて、cache=noneおよびio=nativeとVirtIOディスクに移行することで、応答性とスループットが著しく向上しました。

これらの設定は、VMのXML構成(virsh edit my-ubuntu-vmを使用)内で変更できます。<disk>セクションを見つけ、これらの属性を追加または調整します。

  <disk type='file' device='disk'>
    <driver name='qemu' type='qcow2' cache='none' io='native'/>
    <source file='/var/lib/libvirt/images/my-ubuntu-vm.qcow2'/>
    <target dev='vda' bus='virtio'/>
  </disk>

編集後、変更を有効にするには、virsh define <path-to-xml-file>またはvirsh sync <domain-name>を実行することを忘れないでください。VMの再起動も必要です。

CPU割り当てとピン留め

多くのvCPUを割り当てるのは魅力的ですが、過剰なプロビジョニングは、CPUスケジューリングのオーバーヘッドの増加により、逆説的にパフォーマンスを低下させる可能性があります。VMが真に必要とするCPUリソースのみを割り当てるようにしてください。非常にパフォーマンスに敏感なアプリケーションの場合、VMのvCPUを特定の物理CPUコアに「ピン留め」することさえ可能です。この高度な技術は、コンテキスト切り替えを最小限に抑え、キャッシュの局所性を向上させますが、重要なワークロードでは慎重な検討が必要です。

virtio-balloonによるメモリバルーニング

メモリバルーニングにより、ホストはゲストVMから未使用のメモリを動的に回収し、他のVMやホスト自体に再割り当てすることができます。この機能は、メモリ需要が変動する複数のVMをホストする環境で特に価値があります。ゲストOSにvirtio-balloonドライバーがインストールされ、適切に構成されていることを確認してください。

結論:KVM/QEMUでITインフラを強化する

KVM/QEMUによるLinux仮想マシン管理を習得することで、強力で柔軟性があり、高性能な仮想化能力を身につけることができます。初期設定から最適なパフォーマンスのための微調整まで、これらのツールはITエンジニアが堅牢でスケーラブルなインフラストラクチャを構築するために必要な正確な制御と効率性を提供します。

基本的な概念を超えて実践的な実装に進むと、真に成熟した信頼性の高い仮想化スタックが現れます。libvirtの高度な機能を試し続け、多様なストレージバックエンドを探求し、複雑なネットワーク構成をさらに深く掘り下げることをお勧めします。KVM/QEMUを使用すると、単に仮想マシンを実行しているだけでなく、Linuxの可能性を最大限に活用して、運用上の要求に正確に応える洗練された高性能な仮想環境を構築しているのです。

Share: