はじめに:KVM/QEMU – Linuxサーバーにおけるコア仮想化基盤
VirtualBox、VMware WorkstationからvSphereのようなエンタープライズレベルのソリューション、さらには12台のVMとコンテナを管理するために使っているProxmox VEのようなホームラボシステムまで、あらゆる種類の仮想化プラットフォームを長年経験してきました。これらは実際のデプロイ前にすべてを試すのに最適な「遊び場」です。しかし、Linux上でのKVM/QEMUは、特にCentOS/RHELサーバーにおいて、依然として最有力な選択肢です。
私はKVM/QEMUを高性能レーシングカーのエンジン、ProxmoxやOpenStackのようなソリューションをレーシングトラックとガレージの管理システムとよく例えます。KVMのパフォーマンスはほぼネイティブであり、重いアプリケーションをライセンス費用をかけずに実行したい場合に大きな利点となります。
CentOS/RHELサーバー向けに、効率的で安定した完全に無料の仮想化ソリューションを探しているなら、この記事はあなたのためにあります。インストール、基本的な設定から、パフォーマンスを最適化するための実践的なヒントまで、詳しく説明します。
クイックデプロイ:KVM/QEMUを5分でインストール
すぐに始めるために、KVM/QEMUの基本的な環境を数分で準備し、仮想マシンを実行できる状態にするための手順を以下に示します。これらのコマンドはCentOS/RHEL 8以降に適用されます。
1. ハードウェア仮想化サポートの確認
KVMは、CPUがハードウェア仮想化(Intel VT-xまたはAMD-V)をサポートしている必要があります。ほとんどの最新CPUはこれを備えていますが、念のため確認することをお勧めします。サーバーのBIOS/UEFIでこの機能が有効になっていることを確認してください。
lscpu | grep -E 'svm|vmx'
結果にvmx (Intel)またはsvm (AMD)が表示されていれば、CPUは準備万端です。次に、KVMモジュールがカーネルにロードされているかを確認します。
lsmod | grep kvm
結果が表示されなくても心配ありません。libvirtdサービスが起動すると、モジュールは自動的にロードされます。
2. 必要なパッケージのインストール
主要なパッケージをインストールする必要があります。これらはqemu-kvm(エミュレーションツール)、libvirt(KVM管理デーモン)、libvirt-client(virshコマンドラインツール)、virt-install(コマンドラインからVMを作成するツール)、そしてbridge-utils(ネットワークブリッジの設定に非常に役立ちます)です。
sudo dnf update -y
sudo dnf install qemu-kvm libvirt libvirt-client virt-install bridge-utils -y
3. libvirtdサービスの起動と有効化
libvirtdはハイパーバイザー(ここではKVM)を管理するサービスです。システム起動時に実行されるように、このサービスを起動して有効にする必要があります。
sudo systemctl enable --now libvirtd
サービスが安定して実行されていることを確認するために、そのステータスをチェックします。
sudo systemctl status libvirtd
すべてが順調であれば、出力にはactive (running)と表示されます。
4. ユーザーをlibvirtグループに追加
virshコマンドやvirt-managerを使用して、毎回sudoなしで仮想マシンを管理できるように、現在のユーザーアカウントをlibvirtグループに追加します。
sudo usermod -aG libvirt $(whoami)
実行後、変更を有効にするには、ログアウトして再度ログインするか(またはターミナルを再起動する)必要があります。
5. 最初の仮想マシンを作成する
インストールしたいオペレーティングシステム(例: CentOS-Stream-8-x86_64-latest-dvd1.iso)のISOファイルが/home/user/isos/ディレクトリにあると仮定します。
virt-installを使用して、基本的な設定の仮想マシンを作成します。ネットワークはlibvirtのデフォルトNATを使用し、このクイックスタートには十分です。
sudo virt-install \
--name my_centos_vm \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/my_centos_vm.qcow2,size=20,format=qcow2 \
--os-variant centos-stream8 \
--network default,model=virtio \
--cdrom /home/user/isos/CentOS-Stream-8-x86_64-latest-dvd1.iso \
--graphics spice \
--noautoconsole
--name my_centos_vm: 仮想マシンの名前を設定します。--ram 2048: VMに2GBのRAMを割り当てます。--vcpus 2: 2つの仮想CPUを割り当てます。--disk ...: 特定のパスにqcow2形式で20GBのディスクを作成します。--os-variant centos-stream8: CentOS Stream 8のインストールを最適化します。--network default,model=virtio: デフォルトのNATネットワーク(virbr0)とVirtIOドライバーを使用して、最高のパフォーマンスを実現します。--cdrom ...: インストールISOファイルへのパスを指定します。--graphics spice: グラフィカルインターフェースにアクセスするためにSPICEプロトコルを使用します。--noautoconsole: VM作成後にコンソールを自動的に開かないようにします。
コマンドの実行後、オペレーティングシステムのインストールを開始するためにvirt-viewerウィンドウが表示されます。ウィンドウが自動的に開かない場合は、virt-viewer my_centos_vmコマンドで手動で接続できます。
KVM/QEMUとLibvirtに関する詳細な説明
仮想マシンが安定して動作するようになったところで、この仮想化システムの動作メカニズムについてさらに深く掘り下げてみましょう。
KVMとは?QEMUとは?
私たちはKVM/QEMUをよくペアとして呼びますが、実際には互いに補完し合う2つの別々のコンポーネントです。
- KVM (Kernel-based Virtual Machine): KVMは完全な仮想化ソフトウェアではありません。これはLinuxカーネルのモジュールであり、Linuxカーネルをタイプ1ハイパーバイザー(またはベアメタルハイパーバイザー)に変える役割を持っています。KVMはCPUの仮想化機能(Intel VT-xやAMD-Vなど)に直接アクセスすることを可能にし、仮想マシンをほぼネイティブなパフォーマンスで実行するのに役立ちます。
- QEMU (Quick EMUlator): QEMUはオープンソースのコンピューターシステムエミュレーターソフトウェアです。CPU、メモリ、I/Oデバイス、BIOSを含むシステム全体をエミュレートできます。単独で実行する場合、QEMUはすべてをソフトウェアでエミュレートするため非常に遅くなります。しかし、KVMと組み合わせると、QEMUはKVMが提供するハードウェア仮想化機能を利用して、ゲストCPUの命令を物理CPUで直接実行します。これにより、パフォーマンスが大幅に向上します。
要するに、KVMはハードウェア仮想化の「力」を提供し、QEMUはデバイスエミュレーションとI/O管理を含む仮想マシンの「本体」を担当します。
Libvirt: 多機能な管理ツール
Libvirtは、KVM、Xen、VMware ESX、VirtualBoxなど、さまざまな仮想化プラットフォームを管理するためのソフトウェアライブラリ、デーモン、およびシステムです。これらのハイパーバイザーと対話するための統一されたAPIインターフェースを提供し、どのプラットフォームを使用しているかに関係なく、仮想マシンの管理を簡素化します。
libvirtdデーモン: バックグラウンドで実行されるサービスで、KVMとの通信と仮想マシンの管理を担当します。virshCLI:libvirtdと対話するための非常に効率的なコマンドラインインターフェースです。私はサーバーでKVMを使用する場合、非常に迅速でスクリプトによる自動化が容易なため、頻繁にvirshを使用します。virt-managerGUI: コマンドライン操作を望まない人にとって便利な、使いやすいグラフィカルインターフェース(GUI)です。このツールは、仮想マシンの視覚的な概要を提供し、VMの作成、編集、起動、停止を簡単に行うことができます。(virt-managerについては別の記事がありますが、初心者にとって良い選択肢としてここで紹介したいと思います)。
頻繁に使用する基本的なvirshコマンドをいくつか紹介します。
virsh list --all # 全ての仮想マシンをリスト表示(実行中および停止中の両方を含む)
virsh start my_centos_vm # 'my_centos_vm'という名前の仮想マシンを起動
virsh shutdown my_centos_vm # 仮想マシンを正常にシャットダウン(VM内のOSが自動的にシャットダウン)
virsh destroy my_centos_vm # 仮想マシンを「強制終了」(電源を抜くのと同様)
virsh console my_centos_vm # 仮想マシンのコンソールに接続(VM内でシリアル設定が必要)
virsh dominfo my_centos_vm # 仮想マシンの詳細情報を表示
virsh edit my_centos_vm # 仮想マシンのXML設定ファイルを編集
KVM/QEMUでのストレージ管理
ディスク管理は仮想化において極めて重要な側面です。KVMは多様なストレージタイプをサポートしています。
- ローカルディレクトリ: 物理サーバー上のディレクトリにディスクイメージファイルを保存します。これは始めるための最も簡単な方法です。
- LVM (Logical Volume Management): 論理ボリュームを仮想マシンのディスクとして使用し、優れたパフォーマンスと容量管理の柔軟性を提供します。
- NFS/iSCSI: ネットワーク経由でのストレージで、クラスター環境や高い拡張性が必要なシステムに最適です。
Libvirtは「ストレージプール」の概念を通じてこれらのストレージ領域を管理します。
virsh pool-list --all # 既存のすべてのストレージプールをリスト表示
virsh pool-define-as my_pool dir --target /data/kvm_disks # '/data/kvm_disks'を指す新しいストレージプール'my_pool'を定義
virsh pool-start my_pool # ストレージプールを起動
virsh pool-autostart my_pool # サーバー起動時にプールを自動起動するよう設定
ディスクイメージのフォーマットについては、主に2つの選択肢があります。
- RAW: 最もシンプルなフォーマットです。ファイルのサイズは仮想ディスクのサイズと固定されています。パフォーマンスは良好ですが、スナップショットやシンプロビジョニングなどの高度な機能はサポートしていません。
- QCOW2 (QEMU Copy-On-Write 2): より一般的で非常に柔軟なフォーマットです。ディスクイメージファイルは必要に応じて自動的に容量を拡張でき(シンプロビジョニング)、スナップショット、圧縮、暗号化をサポートします。ほとんどのユースケースでこのフォーマットをお勧めします。
新しいqcow2ディスクイメージファイルを作成するには:
qemu-img create -f qcow2 /var/lib/libvirt/images/new_vm_disk.qcow2 50G
KVMの高度な設定とパフォーマンス最適化
プロダクション環境とホームラボの両方で半年以上KVMを運用してきた経験から、仮想化システムをはるかにスムーズかつ効率的に動作させるためのいくつかの有用なヒントをまとめました。
1. VirtIOドライバーの最適化
これは、ほぼネイティブなI/Oパフォーマンスを達成するための鍵となる要素です。VirtIOは最適化されたドライバーセットであり、仮想マシンが従来のハードウェアデバイスをエミュレートするのではなく、ハイパーバイザーと直接通信できるようにします。これにより、CPUオーバーヘッドが大幅に削減され、ディスク(VirtIO-BLK)とネットワーク(VirtIO-NET)の両方のI/O速度が向上します。
virt-installでVMを作成する際は、ゲストOSがサポートしている場合、常にネットワークとディスクにmodel=virtioを指定してください。CentOS/RHEL、Ubuntu、Debianなどのほとんどの最新Linuxオペレーティングシステムには、VirtIOドライバーが組み込まれており、エミュレートされたドライバーよりも優れたパフォーマンスを提供します。
VMのXML設定ファイル(virsh edit my_centos_vmで確認)では、VirtIOが有効になっていると、次のような行が表示されます。
<interface type='network'>
<model type='virtio'/>
...
</interface>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<target dev='vda' bus='virtio'/>
...
</disk>
2. ネットワークブリッジの最適化
クイックスタートでは、シンプルであるためデフォルトのNATネットワーク(virbr0)を使用しました。しかし、プロダクション環境やホームラボでは、ネットワークブリッジがより最適な選択肢です。これにより、仮想マシンは物理サーバーと同じLAN上の物理デバイスとして機能し、ルーターからIPアドレスを受け取り、内部ネットワーク内の他のデバイスと直接通信できるようになり、より高い接続効率を提供します。
CentOS/RHEL 8以降でNetworkManagerを使用してネットワークブリッジ(例:br0)を作成するには:
sudo nmcli connection add type bridge con-name br0 ifname br0
sudo nmcli connection modify br0 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8
sudo nmcli connection modify br0 bridge.stp no
sudo nmcli connection add type ethernet con-name enp0s3 slave-type bridge master br0
sudo nmcli connection up br0
sudo nmcli connection up enp0s3
(注:enp0s3を物理ネットワークカードの名前に置き換え、IP情報を内部ネットワークに合わせて調整してください。または、ブリッジがDHCP経由でIPアドレスを受け取るようにしたい場合は、ipv4.methodをautoに変更するだけです。)
その後、VMを作成または編集する際に、--network default,model=virtioを--network bridge=br0,model=virtioに置き換えて、VMが新しいブリッジを使用するようにします。
3. ストレージの最適化
ストレージの最適化は、仮想マシン全体のパフォーマンスに大きく影響します。いくつかの注意点があります。
- キャッシュモード: VMのXMLファイルで、ディスクの
cacheモードを調整できます。cache='none'モードは、ホストOSのキャッシュをバイパスし、物理ディスクと直接通信するため、I/O負荷の高いアプリケーションに最高のパフォーマンスをもたらすことがよくあります。ただし、ホストが突然クラッシュした場合のデータ損失リスクは高くなります。cache='writeback'モードは、パフォーマンスとデータの安全性とのバランスが優れています。 - ダイレクトLVM/ディスクパススルー: 非常に重要で最大のI/Oパフォーマンスが必要なVM(例:データベースサーバー)の場合、論理ボリューム(LVM)または物理ディスク全体をVMに直接割り当てることができます。この方法はQEMUおよびファイルシステムの中間レイヤーをスキップし、ほぼ物理ディスクのパフォーマンスを実現し、場合によっては読み取り/書き込み速度を15〜20%向上させることができます。
- SSD/NVMeの使用: ディスクイメージファイルを使用する場合でもLVMを使用する場合でも、それらをホストのSSDまたはNVMeドライブに配置することで、VMのI/Oパフォーマンスが大幅に向上し、応答時間が短縮され、データ処理速度が向上します。
4. CPUとメモリの高度な管理
リソースを最大限に活用するために、以下のCPUとメモリ管理技術を適用できます。
- CPUピニング: 仮想マシンのvCPUを物理CPUの特定のコア/スレッドに固定します。これにより、「CPUオーバーサブスクリプション」の状態を回避し、「コンテキストスイッチング」を削減できます。特に遅延に敏感なアプリケーション(例:金融アプリケーション、ゲームサーバー)に役立ち、処理遅延を10〜15ms削減できます。
- メモリバルーニング: libvirtが実行中の仮想マシンから未使用のメモリを「回収」し、他のVMまたはホストに割り当てることを可能にします。この機能は、ホスト上のRAMの使用率を最適化するのに役立ち、RAM要件が変化する多数のVMを実行する場合に特に効果的です。メモリバルーニングが効果的に機能するには、VMのオペレーティングシステム内に
qemu-guest-agentをインストールする必要があります。
「プロ」からの実践的なヒント
私にとって、KVM/QEMUはホームラボにおける多くの重要なサービスの基盤です。新しいLinuxディストリビューション、データベースソフトウェア、さらにはミニKubernetesクラスターを構築する必要がある場合でも、すぐにKVM VMを起動します。それは速くて軽く、そして非常に柔軟です。
以前、特殊なタスクを処理するためにグラフィックカードをパススルーしたVMを実行する必要がありましたが、KVMは問題なくスムーズに動作しました。Proxmox(実際にはKVM/LXCのインターフェースレイヤー)で12台のVMとコンテナを管理した経験は、KVMが大規模にどのように動作するかについて全体的な視点を与えてくれました。私は常にその経験を独立したCentOS/RHELサーバーシステムに適用しようと努めています。
1. 仮想マシンの監視
VMのパフォーマンスを監視することは、システムが安定して動作することを保証するために非常に重要です。以下のツールを使用できます。
virsh list --all: すべてのVMのステータスを素早く確認できます。- ホスト上の
top、htop: 各VMに対応するQEMUプロセスのCPU、RAM消費レベルを監視します。 virt-top: 各VMが使用しているCPU、RAM、ネットワーク、ディスクI/Oリソースを表示する優れたツールです。topと同様に機能しますが、KVMに特化して最適化されています。
sudo dnf install virt-top -y
virt-top
2. 仮想マシンのバックアップ
データのバックアップは、すべてのシステムにとって極めて重要です。KVMの場合、以下の方法を適用できます。
- ディスクイメージファイルとXMLのバックアップ: 最も簡単な方法は、VMを停止し、
.qcow2ファイルとXML設定ファイル(通常/etc/libvirt/qemu/my_centos_vm.xmlにあります)を安全な場所にコピーすることです。 - スナップショット: KVM/QEMUはスナップショット機能をサポートしています。qcow2形式では、必要に応じて以前の状態に簡単に戻れるように、
virsh snapshot-create-asを使用して迅速にスナップショットを作成できます。例:
virsh snapshot-create-as my_centos_vm snapshot_lan1 --description "システムアップデート前のスナップショット"
- プロフェッショナルなソリューション: ホームラボでは、VMの自動バックアップにProxmox Backup Server (PBS)を使用しています。独立したKVMサーバー向けに、より強力なバックアップソリューションが必要な場合は、
rsyncやborgbackupなどのツールを統合してディスクイメージファイルを定期的にバックアップすることは非常に良い選択肢であり、データの安全性を保証するのに役立ちます。
3. 自動化とスクリプト作成
複数のVMを管理する場合、自動化は時間を節約し、一貫性を確保するための鍵となります。virshコマンドを使用して、VMの作成、起動、停止、または一括設定を自動化するシェルスクリプトを作成できます。私はまた、ホームラボでVMの設定とデプロイを管理するためにAnsibleをよく使用しており、すべてを同期させ、管理をはるかに容易にしています。
結論
CentOS/RHEL上のKVM/QEMUは、優れた仮想化パフォーマンスと高い柔軟性を提供する非常に効果的なソリューションです。初心者であっても経験豊富なシステム管理者であっても、KVMをマスターすることは、独自の仮想化インフラストラクチャを構築および管理するための無限の可能性を開きます。基本的なインストール手順から高度なパフォーマンス最適化のヒントまで、この記事がこのプラットフォームの能力を自信を持ってデプロイし、最大限に活用するための十分な情報を提供したことを願っています。
自由に「いじくり回して」たくさん試してください!これがテクノロジーを真に深く理解し、マスターするための最良の方法です。KVM/QEMUでの成功をお祈りします!

