CentOS 6.4でKVM仮想化基盤を作る

自宅サーバ(ノートPC)をフォーマットして、KVM仮想化基盤を作った。 これで1台の物理サーバで複数のOSを動かせるようになった。

CPUが仮想化支援機能を有しているか確認

すでにインストールされているOSがLinuxであれば、次のようにして確認できる。 Intelの場合はvmx、AMDの場合はsvmがフラグにあれば、仮想化支援機能を有している。

$ grep --color=auto -E '(vmx|svm)' /proc/cpuinfo

BIOSを立ち上げ、仮想化支援機能を有効にする。 BIOSにもよるが、有効にした後は一度シャットダウンする必要がある(再起動では不可)。

CentOS 6.4のインストール

DVD等からブートし、通常の手順にてインストール。 タイムゾーンを設定する画面でネットワーク設定(とくに自動接続の有効化)を済ませておく。 手動で行う場合は、下記のようにifcfgファイルを書き換え再起動する。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT="yes"
# reboot

一般ユーザを作成し、以降はsudoを用いて作業する。

# useradd -G wheel -a john
# passwd john
# visudo
%wheel        ALL=(ALL)       ALL
# logout

一般ユーザでログインし直した後、パッケージのアップデートを行う。

$ sudo yum update

NTPサービスをインストールし、時刻同期を行うようにしておくとよい。

$ sudo yum install ntp
$ sudo chkconfig ntpd on
$ sudo service ntpd start
$ ntpq -p

CentOSに仮想化関係のパッケージをインストール

groupinstallを使うと早い。インストール後は、一度再起動する必要がある。

$ LANG=C sudo yum grouplist | grep -i virt
$ LANG=C sudo yum groupinfo "Virtualization"
$ LANG=C sudo yum groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform" "Virtualization Tools"
$ sudo reboot

X Window Systemのインストール

virt-manager(libvirtdのGUIクライアント)を使うため、X11環境一式をインストールする。

$ sudo yum grouplist | grep -i x
$ sudo yum groupinfo "X Window System"
$ sudo yum groupinstall "X Window System"

なお、今回はSSH X11 Forwardingを利用して、リモートのXサーバ上でvirt-managerを動かすこととする。 常にリモートのXサーバを使うのであれば、このステップは省略してもよい。

virt-managerをリモートから使えるようにする

libvirtdはデフォルトで認証にpolkitを用いるが、polkitはリモートでの認証に対応していないため、ファイルパーミッションベースの認証を使う。 openSUSEのドキュメントが参考になる。

まず、グループlibvirtを新規作成し、ユーザをグループに加える。 グループ追加を有効化するため、一旦ログアウトする。

$ sudo groupadd libvirt
$ sudo usermod -G libvirt -a john
$ logout

再度ログインし、グループlibvirtに加わっていることを確認する。

$ id
uid=500(john) gid=500(john) groups=500(john),10(wheel),501(libvirt)

設定ファイルを書き換え、libvirtdを再起動する。

$ sudo vi /etc/libvirt/libvirtd.conf
unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"
auth_unix_rw = "none"
$ sudo service libvirtd restart

仮想マシンがブリッジ接続できるようにする

デフォルトでは仮想マシンはNAT接続となるが、不便なのでブリッジ接続できるようにする。

$ cd /etc/sysconfig/network-scripts
$ sudo cp ifcfg-eth0 ifcfg-br0
$ sudo vi ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
HWADDR=xx:xx:xx:xx:xx:xx
BRIDGE=br0
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"

$ sudo vi ifcfg-br0
DEVICE=br0
TYPE=Bridge
DELAY=0
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.10.2
PREFIX=24
GATEWAY=192.168.10.1
DNS1=192.168.10.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System br0"

$ sudo service network restart
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.001558c36208       no              eth0
virbr0          8000.525400084faa       yes             virbr0-nic

ここまでで、ホストOS側の準備は完了。

qcow2形式の仮想ディスクイメージを作る

virt-managerから仮想ディスクイメージを作成した場合raw形式となるが、qcow2形式のほうがスナップショットの作成などで取り回しがよいのでこれを使うことにする。 virt-managerは標準で /var/lib/libvirt/images に置かれたディスクイメージを参照するので、これに合わせて作成する。

$ cd /var/lib/libvirt/images
$ sudo qemu-img create -f qcow2 vm-ubuntu64.qcow2 80G

上記では最大容量80GBのディスクイメージを作成している。 qcow2形式では必要に応じてディスクイメージのサイズを拡大するため、作成時のサイズは256KB程度である(いわゆるthin provisioning)。

virt-managerを起動して仮想マシンを作る

とりあえず Ubuntu Server (64 bit) を入れた仮想マシンを1台作ってみる。

まず、インストールに使うISOイメージをホストOS上に準備する。 今回はscpで転送した。転送後、パーミッションを読み取り可能にしておく。

次に、手元のマシンでXサーバを立ち上げ、X11 Forwardingを有効にしてSSHログインする。 ログイン後、virt-managerを起動し、ウィンドウが表示されることを確認する。

$ ssh -X john@192.168.10.2
$ virt-manager &

ウィンドウ上の「New」ボタンから、ウィザードに従い仮想マシンを作成する。 ISOイメージ、仮想ディスクイメージは、それぞれ事前に準備したものを選択する。 また、ネットワーク設定でNATではなくbr0を使うようにすることでブリッジ接続ができる。 作成が終わると、新たにウィンドウが開き、仮想マシンが起動する。

virt-manager
WindowsCygwin-X上でvirt-managerを表示させている様子

仮想マシンのスナップショットを取る

qcow2形式のディスクイメージに対するスナップショットは、virt-managerではなくvirshコマンドを使って作成する。

$ virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------
 2     vm-ubuntu64                    running

$ virsh -c qemu:///system snapshot-create vm-ubuntu64
Domain snapshot 1371742467 created

$ virsh -c qemu:///system snapshot-list vm-ubuntu64
 Name                 Creation Time             State
------------------------------------------------------------
 1371742467           2013-06-21 00:34:27 +0900 running

最新のスナップショットの削除は、下記のようにして行える。 仮想マシン自体を削除する場合は、すべてのスナップショットを削除した上で virsh undefine により削除する必要があるので注意。

$ virsh -c qemu:///system snapshot-delete vm-ubuntu64 --current
$ virsh -c qemu:///system undefine vm-ubuntu64    # 仮想マシン自体を削除する場合

コマンドラインから仮想マシンを操作する

virshコマンドを使うことで、コマンドラインから仮想マシンの状態を操作することができる。 下の例では、一度シャットダウンした後、再び起動している。 また、virsh edit とすれば、仮想マシンの設定ファイルをエディタで修正することができる。

$ virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------
 2     vm-ubuntu64                    running

$ virsh -c qemu:///system shutdown 2
Domain 2 is being shutdown

$ virsh -c qemu:///system list --all
 Id    Name                           State
----------------------------------------------------
 -     vm-ubuntu64                    shut off

$ virsh -c qemu:///system start vm-ubuntu64
Domain vm-ubuntu64 started

$ virsh -c qemu:///system list --all
 Id    Name                           State
----------------------------------------------------
 3     vm-ubuntu64                    running

$ virsh -c qemu:///system edit vm-ubuntu64

その他の操作については、man virsh を参照。