魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

kvmによるライブマイグレーション

投稿日:
タグ:

目次

kvmのインストールからライブマイグレーションまでのメモ.

実行環境

ホストマシン
CPUIntel(R) Xeon(R) CPU E3-1280 V2 @ 3.60GHz
OSLinux 2.6.32-279.el6.x86_64
ディストリビュージョンCentOS-6.3-x86_64
メモリ容量32GB
HDD容量16TB
ゲストマシン
OSLinux 2.6.32-279.el6.x86_64
ディストリビュージョンCentOS-6.3-x86_64
debian 6.0.6 amd64
メモリ容量1GB
HDD容量40GB

KVMを使用するための準備

ハードウェアの設定

KVMはXenやVMwareとは異なり,仮想化支援機能と呼ばれるハードウェアサポートが必要不可欠なので,BIOSの設定で必ず有効化する.今回の環境は,Intelマシンなので,Intel VT-xを有効化する(AMDならAMD-Vかsvm).

必要なソフトウェアのインストール

今回のホストマシンの環境では,次のコマンドで必要なコマンドが揃う.

user# yum groupinstall kvm
user# yum install vnc
vncはクライアントさえあれば良い.

用語
KVM
Kernel-based Virtual Machineの略.ハイパーバイザー型の仮想マシンモニタでLinuxの機能の一部.
QEMU
エミュレーションを行う仮想化マシンソフトウェア.多彩な動的バイナリトランスレーションにより,さまざまな種類のバイナリコードをさまざまなアーキテクチャ上で実行できる.しかし処理速度は,KVMやXenのようなほとんどの命令を実際のマシンで処理するものと比べると遥かに遅い.
libvirt
KVMやXenなどののVMMを制御するための抽象化ライブラリ.Red Hat社が主体となって開発しており,オープンソース化している.後述するvirt-managerはPythonでこのライブラリを読み込んで使用している.

ゲストマシンの作成から実行まで

KVMで仮想マシンを管理するツールには次のようなものがある.

CUI
qemu-kvm
qemu
QEMUエミュレータを管理するためのツール.システムによってコマンド名が異なる.
virsh
libvirtのリファレンス実装として作られた対話型のシェルプログラム.
GUI
virt-manager
libvirtを使って仮想マシンを管理するGUIツール.
今回はCUIを使った方法でも仮想マシンを起動した後はGUIのツールでインストールを行う.

qemu-kvm(qemu)を使った方法

qemu-kvm(qemu)を使った場合の最初のOSの実行までの流れは次の通りである.

  1. 仮想HDDの作成.
  2. インストールCDのイメージをブート対象にしてVMを実行.
  3. 仮想HDDをブート対象にしてVMを実行.

仮想HDDの作成

仮想HDDはqemu-imgコマンドで作成できる.qemu-imgはQEMUの仮想イメージを扱うためのコマンドである. 実行方法は次のように行う.

user# qemu-img create -f qcow2 ./hda/test.img 40G
qemu-imgは第1引数でコマンド名,続けてオプションを指定する.
create
仮想HDDの作成.
-f qcow2
仮想HDDのフォーマット.qcow2は可変サイズの仮想HDD.
test.img
仮想HDDファイルの名前(パス).
40G
仮想HDDのサイズ.

インストールCDのイメージをブート対象にしてVMを実行

仮想HDDへのOSのインストールも仮想HDDからの起動も同じコマンドでできる.違いは,ブートの指定だけである.

user# qemu-kvm -cdrom ./img/CentOS-6.3-x86_64-bin-DVD1.iso -hda ./hda/test.img -boot d -m 1024 -usbdevice tablet -name test
オプションについては後で説明する.QEMUは,通常VGAの出力にSimple DirectMedia Layer(SDL)というグラフィックやサウンドを扱うライブラリを使用するが,qemu-kvmのオプションによりオフにしたりテキストモード(-curses)で入出力を行ったりすることができる.今回はVNCクライアントを使用する.qemu-kvmを実行すると次のようなものを出力する.
VNC server running on `::1:5900'
::1はlocalhostのことで:5900はポート番号を表す.これはVNCでアクセス可能なアドレスとポート番号である.ここにVNCクライアントでアクセスすれば,後は実際のマシンと同様インストールできる.
user# vncviewer localhost:5900

以下にqemu-kvmのオプションをいくつか紹介する.

オプション機能
-hda./hda/test.img使用する仮想HDDの指定.
-cdrom./img/CentOS-6.3-x86_64-bin-DVD1.iso使用する仮想cdrom(isoが指定可能)の指定.
-m1024メモリのサイズ(MB単位)の指定.
-bootd最初のcdromから起動.
c最初のhdaから起動.
order=dcブートの優先順位を指定.この例では最初のcdromを第1候補,最初のhdaを第2候補に指定.
-usbdevicetablet 本来の用途は不明だがVNCでアクセスした際にVMのマウスポインタとホストのマウスポインタのずれをなくすことができる.
-nametestゲストマシンの名前を指定.
-vncdisplay[, option, ..]vncの設定を変更.

インストールCDのイメージをブート対象にしてVMを実行.

基本的に先ほどのコマンドの-bootオプションのパラメータを変更しただけだが,-cdromのオプションが不要になるので,それも指定しない.

user# qemu-kvm --hda ./hda/test.img -boot c -m 1024 -usbdevice tablet


virt-managerを使った方法

libvirtを使ったGUIツールのvirt-managerを使えば,仕組みを知っているだけで簡単に仮想マシンの管理が行える.ただし私の環境では,標準では一般ユーザが扱えなかった.一般ユーザでも使用可能にするために取った策は「作業中に発生した問題」で説明する.

virt-managerでは,[New]によって新しい仮想マシンを作成することができ,基本的にそれに従っていけば仮想マシンの作成は容易である.しかしその前に接続について話す.

libvirtdへの接続

virshやvirt-managerは,別のマシンのlibvirtdに接続することで,リモートで管理することが可能である.上の画像では,接続はローカルマシン([localhost(QEMU)])だけである.virt-managerでは,接続を[ファイル]から[Add Connection]を選択することで,追加できる.ちなみに接続はssh経由で行うことができる.

ストレージ

[localhost[QEMU]]を右クリックして[詳細]を左クリックすると,次のような画面が出る(画像では一部隠しているが).

ここで,libvirtdに関する設定を行うことができる.私の環境では,標準で仮想HDDやisoファイルを管理するストレージプールに/var/lib/libvirt/imagesが設定されていた.

しかし今回はライブマイグレーションするためにNFSマウントした場所を使用するので,[ストレージ]タブを選んでそこからdefaultストレージプールをNFSでマウントした先のパスに変更する(というかGUIでの変更の仕方が分からないので削除してまたdefaultストレージプールを作成した).なお,試してはいないが,ストレージは/etc/libvirt/storage/でxml形式のファイルとして管理されており,それを修正しても変更はできるらしい.

新たにストレージプールを作る場合,タイプの指定を行う.その時,[netfs:Network Exported Directory]を指定してフォーマットをNFSに選択することで,NFSマウントすることも可能らしいが,今回は[dir:FileSystem Directory]を選んで既にNFSマウントしてあるパスを指定する.

仮想マシンの作成

libvirtdの設定を終わったところでvirt-managerでの仮想マシンの作成について触れるが,前述の通り[New]をクリックした後は簡単である.次のようなサブウィンドウが立ち上がり,基本的に指示に従うだけで良い.

なのでこれ以上の説明は行わない.

仮想HDDが作成される場所はストレージで設定した通りである.


libvirtを利用したCUIツールを使った方法

libvirtを利用したCUIアプリはさまざまある.管理のためにvirsh,インストールのためにvirt-install,GUIで仮想マシンをモニタリングするためにvirt-viewerらがある.virshだけでも仮想マシンの作成は可能そうだが,今回はvirt-installを使用する.

virt-installを使った仮想マシンの作成にはオプションを指定する方法と対話的に行う方法がある.使い方はそれぞれ次のような感じである.

  • uesr% virt-install \
    --connect qemu:///system --name test2 \
    --ram 1024 --disk path=./test2.img,size=40 \
    --cdrom /img/debian-6.0.6-amd64-DVD-1.iso
  • user# virt-install --prompt
    仮想マシンの名前は何ですか? test2
    どれだけの RAM を割り当てますか (メガバイト単位で)? 1024
    What would you like to use as the disk (file path)? ./test2.img
    どの位の大きさのディスク (./test2.img) にしたいですか(ギガバイト単位で)? 40
    インストール CD-ROM / ISO イメージ、もしくは URL の場所はどこですか? ./img/debian-6.0.6-amd64-DVD-1.iso
    
これらを設定した後,仮想マシンを起動させ,virt-viewerやVNCクライアント,テキストモードなどのインタフェースでインストールを行う.

ライブマイグレーション

ライブマイグレーションにはlibvirtを使用する(qemu-kvmでできるのかは未確認).当然だがライブマイグレーションには2つ以上の接続(localhostを含めても良い)が必要である.また,仮想マシンはNFSマウントした場所に格納されており,2つの接続のdefaultストレージは全く同じパスで全く同じNFSマウントを行なっている.この前提の基でライブマイグレーションは次のように行う.

virt-managerを使った方法

  1. 実行中の仮想マシンを選択して右クリック.
  2. [マイグレーション]を選択.
  3. サブウィンドウが立ち上がって通信に関するオプションや接続先ホストなどを選択.
  4. [マイグレーション]を選択.

virshを使った方法

virshコマンドを使った方法は次のような感じである.

user# virsh migrate --live test2 qemu+ssh://user@host/system
test2は仮想マシンの名前を,qemu+ssh://user@host/systemは移行先のホストマシンを指す.なお/systemは全面的アクセスが必要であることをlibvirtに伝えるために指定する.

作業中に発生した問題

最後に私が遭遇した問題(それほど大げさなものでもないが)を紹介する.

  • 仮想化支援機能が有効化されていない.
  • libvirtを利用した方法とqemu-kvmを利用した方法を併用すると管理が面倒.
  • qemu-kvmの場所
  • libvirtを利用したツールで接続ができない.

qemu-kvmの場所

私の環境では,qemu-kvmが/usr/libexec/にあった.

libvirtを利用したツールで接続ができない.

libvirtdが使用するソケットファイル(自分の環境では/var/run/libvirt/libvirt-sock)らは標準では一般ユーザがアクセスできない.そのためroot権限で使用する必要がある.ただし今回はssh経由の接続を行いたかったので,sshのrootログインを避けるために設定ファイルを修正し,補助グループを新たに追加した.変更後の設定ファイル(/etc/libvirt/libvirtd.conf)と変更前の設定ファイル(/etc/libvirt/libvirtd.conf.old)の差分は次の通りである.

user# diff /etc/libvirt/libvirtd.conf /etc/libvirt/libvirtd.conf.old
81c81
< unix_sock_group = "libvirt"
---
> #unix_sock_group = "libvirt"
88c88
< unix_sock_ro_perms = "0777"
---
> #unix_sock_ro_perms = "0777"
98c98
< unix_sock_rw_perms = "0770"
---
> #unix_sock_rw_perms = "0770"
101c101
< unix_sock_dir = "/var/run/libvirt"
---
> #unix_sock_dir = "/var/run/libvirt"
129c129
< auth_unix_ro = "none"
---
> #auth_unix_ro = "none"
138c138
< auth_unix_rw = "none"
---
> #auth_unix_rw = "none"
 
設定ファイルの81行目でソケットの所有グループをlibvirtに変更したので(標準ではroot),それに伴いそのグループの追加とユーザの所属するグループにlibvirtの追加を行う.2つの処理はそれぞれ次の通りである.
user# groupadd libvirt
user# usermod -aG libvirt user
最後にlibvirtdを再起動すれば設定が反映される.
user# /etc/init.d/libvirtd start

一覧