がらくたネット


KVM

KVM

KVM(Kernel based Virtual Machine)で仮想化

CPUの支援機構が必要

IntelはIntel-VT
AMDはAMD-V
それぞれ、/proc/cpuinfoのflagsにvmx(intel)かsvm(amd)があるかで判断できる

インストール

SL6のばやいネ。 インストールする

yum install qemu-kvm qemu-img libvirt python-virtinst bridge-utils

例えばこんなものがインストールされる
qemu-kvm

qemuユーザ

libvirt

/usr/rc.d/init.d/libvirtd
/usr/sbin/libvirtd

libvirt-client

/usr/bin/virsh
/usr/bin/virt-pki-validate
/usr/bin/virt-xml-validate

qemu-img

/usr/bin/qemu-img
/usr/bin/qemu-io

python-virtinst

/usr/bin/virt-clone
/usr/bin/virt-convert
/usr/bin/virt-image
/usr/bin/virt-install
/usr/sbin/virt-install

bridge-utils

/usr/sbin/brctl

ブリッジを作る

ホストOSでブリッジインターフェースを作る
eth0をbr0としてコピーしてbr0のTYPEをBridgeに設定して eth0にBRIDGE=br0を追記するのだ

cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 ifcfg-br0

ifcfg-br0

DEVICE=br0
BOOTPROTO=none
ONBOOT=yes
TYPE=Bridge
IPADDR=172.16.1.100
NETMASK=255.255.255.0
GATEWAY=172.16.1.254
DNS1=172.16.1.254

ifcfg-eth0

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
BRIDGE=br0

作る

仮想マシンを作る

ディスクイメージ保存ディレクトリを決める

mkdir -p /var/kvm/images

作成

virt-install \
--name=hostname01 \
--ram=1024 \
--disk /var/kvm/images/hostname01.img,size=10 \
--vcpus=2 \
--os-type linux \
--network bridge=br0 \
--nographics \
--location='http://ftp.riken.jp/Linux/scientific/6/x86_64/os' \
--extra-args='console=tty0 console=ttyS0,115200n8' 

–name ホスト名
–ram メモリ量
–disk ディスクファイルやサイズ(GB)
–vcpus 仮想CPU数
–os-type OSタイプ linuxとかunixとかwindowsとか
–network ネットワークタイプ指定
–nographics グラフィックを利用しない宣言
–location インストール元指定
–extra-args kernelに渡すパラメタ

–extra-argsを指定しとかないとテキストモードインストール画面が表示されないので注意!

–pxe PXEから起動する
–cdrom インストール元をCDROMにする isoファイルでOK
–hvm 完全仮想化ゲストとして指定
–paravirt 準仮想化ゲストとして指定
–arch シュミレートするARCH i386とかx86_64とか

他の方法
これにより、ホスト側でVNCサーバが起動されるのでVNC接続できてインストールができる。
Windows等もこれで対応できる。 <shx bash> virt-install \ –name=kvm01 \ –ram=2048 \ –disk path=/var/lib/libvirt/images/kvm01.img,format=qcow2 \ –vcpus=2 \ –os-variant=win7 \ –network bridge=br0 \ –cdrom=win7.iso \ –graphics vnc,listen=0.0.0.0,password=XXXXXXXX </shx>

この場合、VNC接続した時にキーボードのキーマップがおかしくなって記号系がちゃんと打てない事があった。 色々調べてみると、みんな苦労しているようだ。

--graphics vnc,listen=0.0.0.0,password=XXXXXXXX,keymap=ja
とVNC設定部分にキーマップを明示的に指定して、VNCで接続する際にも指定すれば吉。 やってみよう。

-xオプションを指定するとkernelにオプションを渡せる。これでconsole接続とかKickstartファイル指定とかできる
これは–location指定している時だけ使える

-x="console=tty0 console=ttyS0,115200n8 ks=http://server/SL6.2_ks.cfg"

仮想ディスクはqcow2フォーマットだとスナップショットの機能が使える。
virt-installでフォーマット形式をqcow2にするとサイズが0となってうまく作れない。
なので、qemu-imgコマンドで事前に仮想ディスクファイルを作成しておいてvirt-installでそのファイルを指定すればよい。

消す

仮想マシンを削除

virsh undefine <domain-id>

停める

仮想マシンを強制停止

virsh destroy <domain-id>

停める(一時停止)

仮想マシンを一時停止

virsh suspend <domain-id>

一時停止を解除

一時停止している仮想マシンを起動

virsh resume <domain-id>

自動起動

仮想マシンの自動起動

virsh autostart <domain-id>
virsh autostart --disable <domain-id> 自動起動を無効化

接続

仮想マシンの仮想シリアルコンソールに接続

virsh console <domain-id>

ステータス

virsh listをしたときのステータス。6種類ある。

running 起動してる
idle アイドルであり起動してない。IO処理を待ってたりsleepしてたり
paused 一時停止。リソースは確保しているけどハイパーバイザーの制御対象にならない
shutdown 停止してる
crashed クラッシュしてる
dying 死にかけ。shutdownやcrashも成功してない

virbr0を消す

libvirtdを起動したときデフォルトでvirbr0が作成されてiptablesにもルールが追加される。
これを消す!
定義ファイルは/var/lib/libvirt/network/default.xmlとなり、net-destroyした時点でファイルは削除されてます。
後で参照したい場合は該当ファイルを保存しておきましょー。

# virsh net-list --all
名前               状態     自動起動
-----------------------------------------
default              動作中  yes ←こいつが削除対象!
# virsh net-destroy default
ネットワーク default は停止されました
# virsh net-list --all
名前               状態     自動起動
-----------------------------------------
default              停止状態 yes ←停止された
# virsh net-undefine default
ネットワーク default の定義は削除されています ←ちょい日本語が変ですが...
# virsh net-list --all
名前               状態     自動起動
-----------------------------------------
 ←消えました!

default.xmlの中身。

<network>
  <name>default</name>
  <uuid>c2f04b21-b103-4f48-8c3a-b2539286c6fd</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='52:54:00:4D:58:4F'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
    </dhcp>
  </ip>
</network>

VNCとSirialConsole

virt-installの時は、–graphics vnc,listen=0.0.0.0,password=<パスワード>をつけておくと
VNCコンソールが使えて結構楽にインストールできる。
インストール後、仮想OSを停止した状態で、virsh edit <名前>で設定ファイルを開き、
graphicsオプション行を削除しておくと、以降VNCが起動しないのでOK。
後は、/etc/grub.confにシリアルコンソール行(kernelオプションにconsole=tty0 console=ttyS0,115200n8)を追記しておく。

ディスクイメージ変換

ディスクイメージ変換

#qemu-img info <イメージ名> 現在の情報表示
image: /var/kvm/images/test.img
file format: raw
virtual size: 50G (53687091200 bytes)
disk size: 2.6G

#qemu-img convert -O qcow2 <イメージ名> <出力イメージ名>

qemu-imgについてはここ

CD起動とか

一旦インストールしたOSに対してCD起動とかPXE起動とかしたい場合。
XMLを編集してブートメニューを出すと吉。

virsh edit [vdomname]
<os>
  <boot dev='cdrom'/>
  <bootmenu enable='yes' timeout='3000'/>
</os>

当然、<device>セクションでcdrom設定は必要。
VNCコンソールが開いていればそちらで表示しておくこと。
timeout値はミリ秒なので、要注意です

スナップショット

snapshotが便利です。
稼働中のゲストからスナップショットを作成した場合一時停止します

作成
virsh snapshot-create-as [Guest_Name] [Snapshot_Name] [Description]
復元
virsh snapshot-revert [Guest_Name] {Snapshot_Name]
リスト
virsh snapshot-list [Guset_Name]
削除
virsh snapshot-delete [Guset_Name] [Snapshot_Name]

名前変更

作成した仮想マシンの名前を変更する方法
普通にvirsh edit <仮想マシン>で名前を変更すると

エラー: operation failed: domain '仮想マシン名' is already defined with uuid xx-xx-xx-xx

とか言って変更できない

uuidgen
 UUIDを新規作成、表示された文字列をコピー
virsh edit 旧仮想マシン
 nameとUUIDを修正
virsh define /etc/libvirt/qemu/新仮想マシン.xml
 新仮想マシン名で定義ファイルが作成されているので読み込む
virsh list --all
 新仮想マシン名が表示される
virsh start 新仮想マシン
 ちゃんと起動することを確認する
virsh undefine 旧仮想マシン
 旧仮想マシン名を削除

os-variant list

osタイプのリスト表示

virt-install --os-variant list

glusterサポート

diskとしてglusterをサポートしてる
書式は次の通り 利点はGlusterマウントせずに利用できる
欠点はlocalhostのGluster Serverに接続することしか出来ないことかな

    <disk type='network' device='disk'>
      <driver name='qemu' type='qcow2' cache='none'/>
      <source protocol='gluster' name='kvm-disk1/51c5dd19-a913-4c35-860c-8e02537d8a3d-0.img'>
        <host name='localhost' port='24007'/>
      </source>
      <target dev='hda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>