自宅サーバ(ノート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を使うようにすることでブリッジ接続ができる。 作成が終わると、新たにウィンドウが開き、仮想マシンが起動する。
仮想マシンのスナップショットを取る
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
を参照。