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も成功してない |
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>
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についてはここ
一旦インストールした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タイプのリスト表示
virt-install --os-variant list
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>