= KVMメモ =
このページは、KVMのメモです。簡単に使いたい人は、virt-managerを使ってください。
== Windowsゲストドライバ ==
Windowsゲストドライバを利用すると、ネットワークI/OやディスクI/Oが速くなります。
ゲストドライバの取得とインストール方法は下記のURLを参照。
* [http://www.linux-kvm.org/page/WindowsGuestDrivers Windows guest drivers]
== 準備 ==
kvmを利用するのに、libvirtを利用します。libvirtをインストールしておきます。virt-managerをインストールすると必要なパッケージが一通り入って便利です。また、kvmで仮想マシンを実行するのに必要なqemu-kvmもインストールしておきます。
{{{
# yum install virt-manager
# yum install qemu-kvm
}}}
次に、kvmのモジュールをカーネルにロードします。AMDの場合は、kvm_intelの代わりにkvm_amdを使ってください。
{{{
# modprobe kvm
# modprobe kvm_intel
}}}
libvirtを利用するには、libvirtdの起動が必要です。libvirtdを起動しておきます。
{{{
# /etc/init.d/libvirtd start
}}}
その他、下記のパッケージを入れておくとよいかもしれません。
{{{
# yum install virt-top
# yum install qemu-kvm-tools
}}}
== virshを利用したKVM仮想マシンの作り方 ==
=== イメージ作成 ===
{{{
# qemu-img create -f raw ubuntu.img 10G
}}}
=== libvirt XMLファイルの作成方法 ===
下記のXMLを適当に編集。特に、
* name(他の仮想マシンとユニークな名前になるように)
* memory(メモリ容量)
* vcpu(CPUの数)
* diskとcdromのsource file
* clock offsetをWindowsの場合localtimeに。
* acpiを有効にしないと、Windows7移行でインストールできない。また、virshからshutdownコマンドでシャットダウンできない。
* mac addressを他と被らないように
辺りに注意しておく。
{{{
UbuntuVM
524288
524288
1
hvm
/usr/bin/qemu-kvm
}}}
=== virshに登録して起動 ===
{{{
# virsh (virsh実行。以下、virshのコンソールで実行)
virsh # define virt-kvm.xml
}}}
defineで仮想マシンを定義したXMLを登録すると、/etc/libvirt/qemuディレクトリに定義ファイルが作られる。
{{{
# ls /etc/libvirt/qemu
UbuntuVM.xml hoge.xml kvmtest.xml networks
}}}
{{{
virsh # start UbuntuVM
virsh # list
Id 名前 状態
----------------------------------
1 UbuntuVM 実行中
}}}
VNCクライアントのスクリーン1で接続可能(vnc://localhost:1)
停止はshutdownを使う。
{{{
virsh # shutdown UbuntuVM
}}}
'''acpiが有効になっていないと、virshからのシャットダウンを受け付けない。'''また、linuxの場合、acpidをインストール/起動しておく必要がある。
ハイバネートとレジューム
{{{
virsh # save UbuntuVM UbuntuVM.mem
virsh # restore UbuntuVM UbuntuVM.mem
}}}
== ネットワーク接続 ==
* ゲスト側のネットワークを適当設定(例えば192.168.100.2,GWを192.168.100.1)。ネットワークセグメントはホストと別にする。
* ホスト側のネットワークを設定する。
{{{
# ifconfig vnet0 192.168.100.1 netmask 255.255.255.0
}}}
IPフォワードの設定をしていなければ、IPフォワードの設定を行う。
{{{
# echo 1 > /proc/sys/net/ipv4/ip_forward
}}}
図で説明すると、上記の設定で次のようなネットワークが構築できる。
{{{
+--------------+ +---------------+
+--+-+ +-+---+ +--+-+ |
LAN---|eth0| ホストOS |vnet0|-----|eth0| 仮想マシン |
+--+-+ +-+---+ +--+-+ |
+--------------+ +---------------+
vnet0:192.168.100.1 eth0:192.168.100.2
}}}
== NATによるLAN上のIPからの接続 ==
{{{
+--------------+ +---------------+
+--+-+ +-+---+ +--+-+ |
LAN---|eth0| ホストOS |vnet0|-----|eth0| 仮想マシン |
+--+-+ +-+---+ +--+-+ |
+--------------+ +---------------+
vnet0:192.168.100.1 eth0:192.168.100.2
}}}
* eth0に10.8.99.6でアクセスするとホストOSに接続。
* eth0に10.8.99.7でアクセスすると仮想マシン(192.168.100.2)に接続。
するように設定してみる。普通にeth0に10.8.99.6を設定しておく。
次にNAT用のnat.iptファイルを用意する。
{{{
*nat
:PREROUTING ACCEPT [5318:237514]
:POSTROUTING ACCEPT [162:9112]
:OUTPUT ACCEPT [14132:847744]
-A PREROUTING -d 10.8.99.7 -j DNAT --to-destination 192.168.100.2
-A POSTROUTING -d ! 192.168.100.0/255.255.255.0 -j MASQUERADE
-A POSTROUTING -s 192.168.100.2 -j SNAT --to-source 10.8.99.7
-A OUTPUT -d 10.8.99.7 -j DNAT --to-destination 192.168.100.2
COMMIT
}}}
NATを読み込む。
{{{
# cat nat.ipt | iptables-restore
}}}
eth0に10.8.99.7を割り振らないとLAN上のマシンからアクセスできないので、ipコマンドでNICにIPを割り振る。
{{{
# ip addr add 10.8.99.7 dev eth0
}}}
=== ブリッジによるホストのNICと同じセグメントへの設定 ===
ホストのNICと同じセグメントのネットワークに仮想マシンを所属させるには、ブリッジを利用する。
まず、/etc/network/interfacesに次のように記述し、ブリッジを有効にする。
{{{
auto sharebr0
iface sharebr0 inet static
address 192.168.1.5
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge_ports eth0
}}}
eth0を無効にし、ブリッジを有効にする。
{{{
# ifdown eth0
# ifup sharebr0
}}}
libvirt.xmlのinterface定義にブリッジに含めるように定義
{{{
}}}
仮想マシンを起動すると、ブリッジに含まれた形で起動してくる。
{{{
# brctl show
bridge name bridge id STP enabled interfaces
sharebr0 8000.0016d32ff458 no eth0
vnet0
}}}
=== ポートフォワードによる仮想マシンIPを利用したルートコンソールの接続 ===
ゲストOSの5900番(VNCのデフォルトポート)をホストOS上の仮想マシンのコンソールのポートに転送するようにすれば、VNCで仮想マシンに接続するとルートコンソールが取れるようになる。
{{{
*nat
:PREROUTING ACCEPT [5318:237514]
:POSTROUTING ACCEPT [162:9112]
:OUTPUT ACCEPT [14132:847744]
-A PREROUTING -d 10.8.99.7 -p tcp --dport 5900 -j DNAT --to-destination 10.8.99.6:5900
-A PREROUTING -d 10.8.99.7 -j DNAT --to-destination 192.168.100.2
-A POSTROUTING -d ! 192.168.100.0/255.255.255.0 -j MASQUERADE
-A POSTROUTING -s 192.168.100.2 -j SNAT --to-source 10.8.99.7
-A OUTPUT -d 10.8.99.7 -j DNAT --to-destination 192.168.100.2
COMMIT
}}}
=== ブリッジによる接続 ===
下準備。eth0で外に繋いでいたのをbr0経由に変更する。
{{{
# brctl addbr br0
# brctl addif br0 eth0
# ifconfig br0 192.168.1.25 netmask 255.255.255.0
# route del default
# route add default 192.168.1.1
}}}
libvirt.xmlのネットワークの設定を下記のように変更。
{{{
}}}
あとは、仮想マシンを起動すればブリッジで接続される。仮想マシンには、192.168.1.xのアドレスを付与すればok。
=== DHCPでIPを付与 ===
/var/lib/libvirt/network/default.xmlを次のように編集。
{{{
default
631f86c8-5469-468a-a361-3a91d4b99a35
}}}
上記のネットワーク設定ファイルを再設定して、ネットワークを再起動(net-destroy,net-start)する。
{{{
virsh # net-define /var/lib/libvirt/network/default.xml
ネットワーク default が /var/lib/libvirt/network/default.xml から定義されました
virsh # net-destroy default
ネットワーク default は停止されました
virsh # net-start default
ネットワーク default が起動されました
}}}
== リソース取得 ==
下記のvirt-xxxコマンドにより、CPU、メモリ、ディスクのリソースを取得することができます。
||コマンド||説明||
||virt-top||仮想マシンのCPU使用率、メモリの使用率を表示||
||virt-df||仮想マシンのディスクの使用量を表示||
||virt-mem||仮想マシンのメモリの使用量を表示||
||virt-ctrl||??||
== KVMのもうちょっと高度な使い方 ==
そのうち書く予定
* リソースの取得方法
* iscsiのDISKから起動
* ライブマイグレーション
* block migration
* pythonからの操作