Linux KVM環境として、CentOS6.4 上に、KVM+QEMU環境でサーバー仮想化環境を構築しています。
Linux KVM環境の構成要素について軽く整理してみましたので、その記録と、コマンドラインでゲストOSとハイパーバイザーを管理できる「virsh」の実行結果について記載しています。
Linux KVM の実行環境
KVMを動かしているハードウェアは、「HP ProLiant MicroServer N54L」です。CPUは「AMD Turion(tm) II Neo N54L Dual-Core Processor」で、メモリは増設して8GB積んでいます。
CPU仮想化支援機能(AMD-V)は有効です。OSインストール後に以下のコマンドを投入すると、赤文字で「svm」と表示されます。
# grep --color svm /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt nodeid_msr npt lbrv svm_lock nrip_save flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nonstop_tsc extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt nodeid_msr npt lbrv svm_lock nrip_save #
OSは、CentOS 6.4(64bit)をインストールしました。インストールはベースは「デスクトップ」とし、カスタマイズで仮想化関連のソフトウェアコンポーネントをインストールしました。
インストール後のlsmod コマンド結果は以下です。
# lsmod | grep kvm kvm_amd 41702 0 kvm 316506 1 kvm_amd #
KVM + QEMU
Linux KVM では、KVMだけで仮想化構成が動いているわけではなく、QEMUというオープンソースのCPUエミュレータが必要です。KVMはQEMUのCPU演算処理を仲介しています。
関連するrpmは以下などが該当します。
# rpm -qa | grep qemu-kvm qemu-kvm-tools-0.12.1.2-2.355.el6.x86_64 qemu-kvm-0.12.1.2-2.355.el6.x86_64 #
その他にも様々な仮想化関連rpmが導入されます。
libvirt
libvirt は、仮想マシン(VM)を管理するAPIを提供するライブラリです。VMだけではなく、仮想ネットワークやストレージなども管理できます。libvirtd というデーモンで実行されます。
# /etc/init.d/libvirtd status libvirtd (pid 2236) is running... # ps -awef|grep libvirtd | grep -v grep root 2236 1 2 15:56 ? 00:07:03 libvirtd --daemon #
rpm はデフォルトで、様々な言語用のlibvirtライブラリなどがインストールされています。
# rpm -qa | grep libvirt fence-virtd-libvirt-0.2.3-13.el6.x86_64 libvirt-client-0.10.2-18.el6.x86_64 libvirt-0.10.2-18.el6.x86_64 libvirt-java-0.4.9-1.el6.noarch libvirt-python-0.10.2-18.el6.x86_64 libvirt-cim-0.6.1-4.el6.x86_64 libvirt-snmp-0.0.2-3.el6.x86_64 #
このlibvirtを利用した様々なプログラムがデフォルトで導入されています。これは後述します。
Linux KVM のコアとなるプログラムは、kvm、qemu、libvirt となると思います。
ネットワーク関連
KVMを動かしている(ホストLinux)CentOSでは、NICが一枚の場合は、以下のようなネットワークインターフェース状態になります。
# ifconfig -a eth0 Link encap:Ethernet HWaddr C8:CB:B8:xx:xx:xx inet addr:192.168.0.100 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::cacb:b8ff:fec5:a60c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2182 errors:0 dropped:0 overruns:0 frame:0 TX packets:2625 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:157560 (153.8 KiB) TX bytes:2314533 (2.2 MiB) Interrupt:18 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:44 errors:0 dropped:0 overruns:0 frame:0 TX packets:44 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3000 (2.9 KiB) TX bytes:3000 (2.9 KiB) virbr0 Link encap:Ethernet HWaddr 52:54:00:97:B9:07 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) virbr0-nic Link encap:Ethernet HWaddr 52:54:00:97:B9:07 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) #
上の「virbr0」はデフォルトで作成される仮想ブリッジです。「192.168.122.1」はデフォルトで設定されるIPアドレスです。
GUI画面の「Virtual Machine Manager」で確認すると、デフォルトで設定されるネットワーク情報が分かりやすく表示されます。
デフォルトで「default」という仮想ネットワークが構成されており、仮想ブリッジ「virbr0」が設定されています。仮想ブリッジもlibvirtdサービスが管理します。
「brctl」コマンドでブリッジの管理が可能です。以下、一例です。
# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.52540097b907 yes virbr0-nic #
なお、KVMでは、dnsmasq がDNSサーバとDHCPサーバとして導入されています。dnsmasqプログラムによって、IP情報をゲストOSに割り当てる役目が行われています。
virsh
virsh(virtual shell) はコマンドラインでゲストOSとハイパーバイザーを管理できるツールです。Virtual Machine Manager(virt-manager)の代わりとして利用できます。
virsh は libvirtを利用しています。
# virsh version Compiled against library: libvirt 0.10.2 Using library: libvirt 0.10.2 Using API: QEMU 0.10.2 Running hypervisor: QEMU 0.12.1 #
virshコマンドで、稼働しているノード情報を見てみます。
# virsh nodeinfo CPU model: x86_64 CPU(s): 2 CPU frequency: 800 MHz CPU socket(s): 1 Core(s) per socket: 2 Thread(s) per core: 1 NUMA cell(s): 1 Memory size: 8191732 KiB #
MicroServer の情報がちゃんと出力されています。
では、VMの状態を確認しながら、VMの操作を行ってみます。ハイパーバイザー上でゲストOSは2台ある状態で、1台を起動します。
# virsh list --all Id Name State ---------------------------------------------------- - VM01 shut off - vm02 shut off # virsh list Id Name State ---------------------------------------------------- # virsh start VM01 Domain VM01 started # virsh list --all Id Name State ---------------------------------------------------- 1 VM01 running - vm02 shut off # virsh list Id Name State ---------------------------------------------------- 1 VM01 running #
次に、virsh でVM情報を見てみます。
# virsh domuuid VM01 92e28e52-eb75-3c85-a9f9-65f88718a964 # # virsh dominfo VM01 Id: - Name: VM01 UUID: 92e28e52-eb75-3c85-a9f9-65f88718a964 OS Type: hvm State: shut off CPU(s): 1 Max memory: 1048576 KiB Used memory: 1048576 KiB Persistent: yes Autostart: disable Managed save: no Security model: selinux Security DOI: 0 #
次にネットワークの状況も見てみます。
# virsh net-list Name State Autostart Persistent -------------------------------------------------- default active yes yes #
コマンドラインで操作できるのは便利です。「virsh –help」で多くのオプションが使える事が分かります。
virt-top
virt-top コマンドは、Linuxの top コマンドと同じようなコマンドで、VMの稼働状況を確認できます。
# virt-top
実行時の状況は以下のような情報がリフレッシュされながら表示されます。
virt-top 23:34:31 - x86_64 2/2CPU 2200MHz 7999MB 33.1% 2 domains, 2 active, 2 running, 0 sleeping, 0 paused, 0 inactive D:0 O:0 X:0 CPU: 72.1% Mem: 2048 MB (2048 MB by guests) ID S RDRQ WRRQ RXBY TXBY %CPU %MEM TIME NAME 2 R 321 0 1172 0 39.5 12.0 0:14.32 VM01 3 R 177 0 0 0 32.6 12.0 0:09.71 vm02
「virt-top –help」で実行時に使えるオプションが表示されます。
その他、「virt-***」系のコマンドが多くあります。この辺はあらためて機会があれば紹介します。