kvmによるライブマイグレーション
投稿日: | |
---|---|
タグ: |
目次
kvmのインストールからライブマイグレーションまでのメモ.
実行環境
ホストマシン
CPU | Intel(R) Xeon(R) CPU E3-1280 V2 @ 3.60GHz |
---|---|
OS | Linux 2.6.32-279.el6.x86_64 |
ディストリビュージョン | CentOS-6.3-x86_64 |
メモリ容量 | 32GB |
HDD容量 | 16TB |
ゲストマシン
OS | Linux 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 vncvncはクライアントさえあれば良い.
用語
- KVM
- Kernel-based Virtual Machineの略.ハイパーバイザー型の仮想マシンモニタでLinuxの機能の一部.
- QEMU
- エミュレーションを行う仮想化マシンソフトウェア.多彩な動的バイナリトランスレーションにより,さまざまな種類のバイナリコードをさまざまなアーキテクチャ上で実行できる.しかし処理速度は,KVMやXenのようなほとんどの命令を実際のマシンで処理するものと比べると遥かに遅い.
- libvirt
- KVMやXenなどののVMMを制御するための抽象化ライブラリ.Red Hat社が主体となって開発しており,オープンソース化している.後述するvirt-managerはPythonでこのライブラリを読み込んで使用している.
ゲストマシンの作成から実行まで
KVMで仮想マシンを管理するツールには次のようなものがある.
CUI
GUI
- virt-manager
- libvirtを使って仮想マシンを管理するGUIツール.
qemu-kvm(qemu)を使った方法
qemu-kvm(qemu)を使った場合の最初のOSの実行までの流れは次の通りである.
仮想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が指定可能)の指定. |
-m | 1024 | メモリのサイズ(MB単位)の指定. |
-boot | d | 最初のcdromから起動. |
c | 最初のhdaから起動. | |
order=dc | ブートの優先順位を指定.この例では最初のcdromを第1候補,最初のhdaを第2候補に指定. | |
-usbdevice | tablet | 本来の用途は不明だがVNCでアクセスした際にVMのマウスポインタとホストのマウスポインタのずれをなくすことができる. |
-name | test | ゲストマシンの名前を指定. |
-vnc | display[, 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
ライブマイグレーション
ライブマイグレーションにはlibvirtを使用する(qemu-kvmでできるのかは未確認).当然だがライブマイグレーションには2つ以上の接続(localhostを含めても良い)が必要である.また,仮想マシンはNFSマウントした場所に格納されており,2つの接続のdefaultストレージは全く同じパスで全く同じNFSマウントを行なっている.この前提の基でライブマイグレーションは次のように行う.
virt-managerを使った方法
- 実行中の仮想マシンを選択して右クリック.
- [マイグレーション]を選択.
- サブウィンドウが立ち上がって通信に関するオプションや接続先ホストなどを選択.
- [マイグレーション]を選択.
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