= 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に。 * 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 }}} ハイバネートとレジューム {{{ 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からの操作