labunix's blog

labunixのラボUnix

Xenの設定

■Xenの設定
 ログ
 virshのためのxend-http-serverの有効化
 virshでCPU関連の制御
 xentopをバッチモードで動作、CSV出力
 virshのsaveとrestore
 virshの一時停止と再開
 virsh/xmシャットダウン
 virshのテンプレート生成、編集、テンプレートからdomain-Uの生成
 Xenの仮想マシンの自動起動(シンボリックリンク/virsh autostart)
 domain-Uの一括停止/domain-Uの一括起動

■デフォルトではDEBUGログが出力される。
 設定できるログレベルはmanにある。

$ grep "^#(log" /etc/xen/xend-config.sxp 
#(logfile /var/log/xen/xend.log)
#(loglevel DEBUG)

$ man xend-config.sxp | grep -A 2 loglevel
       loglevel
           Filters out messages below the specified level.  Possible values
           are DEBUG, INFO, WARNING, ERROR, CRITICAL.  Defaults to DEBUG.

■ログレベルをINFOに変更する。
 ログファイルの場所はデフォルトのままだが、明示的に指定する。

$ sudo sed -i s/"^#(log"/"(log"/g /etc/xen/xend-config.sxp
$ sudo sed -i s/"^(loglevel DEBUG"/"(loglevel INFO"/g /etc/xen/xend-config.sxp

$ grep "^(log" /etc/xen/xend-config.sxp 
(logfile /var/log/xen/xend.log)
(loglevel INFO)

■反映。tailでしばらくDEBUGレベルのログが出なくなったことを確認。

$ sudo /etc/init.d/xen restart
$ sudo tail -f /var/log/xen/xend.log 

■virshについて

$ apt-cache show libvirt-bin | grep -A 6 ^Description-ja
Description-ja: libvirt ライブラリ用のプログラム
 libvirt は最近のバージョンの Linux (や他の OS) の仮想化機能と連携する C の
 ツールキットです。このライブラリは、異なる仮想化機構に対して長期にわたり変
 わらない C の API を提供することを目的としています。現在のところ QEMU, KVM,
 XEN, OpenVZ, LXC と VirtualBox をサポートしています。
 .
 このパッケージには libvirt を利用するための補助バイナリが含まれます。

$ dpkg -L libvirt-bin | grep bin/ | grep -v doc/
/usr/sbin/libvirtd
/usr/bin/virt-xml-validate
/usr/bin/virt-pki-validate
/usr/bin/virt-host-validate
/usr/bin/virsh

■xend-http-portを有効にして、virshコマンドを使用可能にする。
 対象は以下。

$ grep "(xend-[hap]" /etc/xen/xend-config.sxp 
#(xend-http-server no)
#(xend-port            8000)
#(xend-address '')
#(xend-address localhost)

■設定しないと接続拒否のエラーとなる。

$ sudo virsh list
error: Failed to reconnect to the hypervisor
error: no valid connection
error: unable to connect to 'localhost:8000': 接続を拒否されました

■xend-http-serverの設定変更

$ sudo sed -i s/"#\((xend-[hap]\)"/"\1"/ /etc/xen/xend-config.sxp
$ sudo sed -i s/"(xend-address '')"/"#&"/ /etc/xen/xend-config.sxp
$ sudo sed -i s/"(xend-http-server no)"/"(xend-http-server yes)"/ /etc/xen/xend-config.sxp

$ grep "^(xend-[hap]" /etc/xen/xend-config.sxp
(xend-http-server yes)
(xend-port            8000)
(xend-address localhost)

$ sudo /etc/init.d/xen restart

■localhost:8000で待ち受けていることを確認。
 virsh listコマンドが正常に

$ netstat -an | grep 8000
tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN     

$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 0     Domain-0                       running
 1     vmvm2                          running

■virshでCPU関連の制御コマンドを確認

$ sudo virsh help domain | grep vcpu
    maxvcpus                       connection vcpu maximum
    setvcpus                       change number of virtual CPUs
    vcpucount                      domain vcpu counts
    vcpuinfo                       detailed domain vcpu information
    vcpupin                        control or query domain vcpu affinity

■最大で32個のCPUを割り当てることができる。
 domain-0が持つ2つのCPUのうち、1つがdomain-U(vmvm2)に割り当てられている。

$ sudo virsh maxvcpus
32

$ sudo virsh vcpuinfo 0
VCPU:           0
CPU:            0
State:          idle
CPU time:       51.9s
CPU Affinity:   yy

VCPU:           1
CPU:            1
State:          running
CPU time:       45.2s
CPU Affinity:   yy

$ sudo virsh vcpuinfo 1
VCPU:           0
CPU:            0
State:          idle
CPU time:       13.4s
CPU Affinity:   yy

■CPUの数を変更するには、setvcpusサブコマンドを使用するが、
 vcpucount以上に割り当てることはできない。

$ sudo virsh vcpucount 0
maximum      config         2
maximum      live           2
current      config         2
current      live           2

$ sudo virsh vcpucount 1
maximum      config         1
maximum      live           1
current      config         1
current      live           1

$ sudo virsh setvcpus 1 2
error: invalid argument: requested vcpus is greater than max allowable vcpus for the domain: 2 > 1

■VCPUとCPUの紐付けを変更するには、vcpupinサブコマンドを使用する。

$ sudo virsh vcpupin 1 0 1
$ sudo virsh vcpuinfo 1
VCPU:           0
CPU:            1
State:          idle
CPU time:       16.8s
CPU Affinity:   -y

$ sudo virsh vcpupin 1 0 0
$ sudo virsh vcpuinfo 1
VCPU:           0
CPU:            0
State:          idle
CPU time:       16.9s
CPU Affinity:   y-

■xentopをバッチモードで動作、CSV出力

$ sudo xentop -h
Usage: /usr/lib/xen-4.1/bin/xentop [OPTION]
Displays ongoing information about xen vm resources 

-h, --help           display this help and exit
-V, --version        output version information and exit
-d, --delay=SECONDS  seconds between updates (default 3)
-n, --networks       output vif network data
-x, --vbds           output vbd block device data
-r, --repeat-header  repeat table header before each domain
-v, --vcpus          output vcpu data
-b, --batch	     output in batch mode, no user input accepted
-i, --iterations     number of iterations before exiting
-f, --full-name      output the full domain name (not truncated)

Report bugs to <xen-tools@lists.xensource.com>.

■5秒単位で2回取得

$ sudo xentop -b -i 2 -d 5 | sed s/"no limit"/"no_limit"/g | sed s/"  *"/"\",\""/g | sed s/"^\|\$"/"\""/g
"","NAME","STATE","CPU(sec)","CPU(%)","MEM(k)","MEM(%)","MAXMEM(k)","MAXMEM(%)","VCPUS","NETS","NETTX(k)","NETRX(k)","VBDS","VBD_OO","VBD_RD","VBD_WR","VBD_RSECT","VBD_WSECT","SSID"
"","Domain-0","-----r","84","0.0","901124","86.0","no_limit","n/a","2","0","0","0","0","0","0","0","0","0","0"
"","vmvm2","--b---","8","0.0","131072","12.5","131072","12.5","1","1","0","0","2","0","1212","37","33130","568","0"
"","NAME","STATE","CPU(sec)","CPU(%)","MEM(k)","MEM(%)","MAXMEM(k)","MAXMEM(%)","VCPUS","NETS","NETTX(k)","NETRX(k)","VBDS","VBD_OO","VBD_RD","VBD_WR","VBD_RSECT","VBD_WSECT","SSID"
"","Domain-0","-----r","84","1.3","901124","86.0","no_limit","n/a","2","0","0","0","0","0","0","0","0","0","0"
"","vmvm2","--b---","8","0.5","131072","12.5","131072","12.5","1","1","0","0","2","0","1212","37","33130","568","0"

■確認方法。
 20列目が最後のデータでその値はSSIDの列のものと一致する。
 後は、calcなりexcelなりで確認する。

$ sudo xentop -b -i 2 -d 5 | \
  sed s/"no limit"/"no_limit"/g | \
  sed s/"  *"/"\",\""/g | \
  sed s/"^\|\$"/"\""/g | \
  awk -F\, '{print NF,$NF}'
20 "SSID"
20 "0"
20 "0"
20 "SSID"
20 "0"
20 "0"

■saveとrestoreは、手動のマイグレーションのようなもの。
 稼働中の仮想マシンの状態をメモリからステータスファイルに保存し、
 仮想マシンを停止するsaveサブコマンドと、
 状態ファイルから復元するrestoreサブコマンド。

$ sudo virsh help domain | grep "save\|restore"
    managedsave                    managed save of a domain state
    managedsave-remove             Remove managed save of a domain
    restore                        restore a domain from a saved state in a file
    save                           save a domain state to a file
    save-image-define              redefine the XML for a domain's saved state file
    save-image-dumpxml             saved state domain information in XML
    save-image-edit                edit XML for a domain's saved state file

$ sudo virsh save 1 test.save

Domain 1 saved to test.save

$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 0     Domain-0                       running

$ sudo virsh restore test.save
Domain restored from test.save

$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 0     Domain-0                       running
 2     vmvm2                          idle

■一時停止と再開

$ sudo virsh suspend 2
Domain 2 suspended

$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 0     Domain-0                       running
 2     vmvm2                          paused

$ sudo virsh resume 2
Domain 2 resumed

$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 0     Domain-0                       running
 2     vmvm2                          idle

■シャットダウン

$ sudo virsh shutdown 2
Domain 2 is being shutdown

$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 0     Domain-0                       running

$ sudo xm shutdown vmvm0
$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   750     2     r-----    188.4
vmvm0                                            128     1                 9.6
vmvm2                                        3   128     1     -b----     12.4

$ sudo virsh list --inactive
 Id    Name                           State
----------------------------------------------------
 -     vmvm0                          shut off

$ sudo virsh list --all
 Id    Name                           State
----------------------------------------------------
 0     Domain-0                       running
 3     vmvm2                          idle
 -     vmvm0                          shut off

■テンプレートの作成

$ sudo virsh help domain | grep dumpxml
    dumpxml                        domain information in XML
    save-image-dumpxml             saved state domain information in XML

$ sudo virsh dumpxml vmvm2 > /tmp/template_guest.xml

■テンプレートの編集
 名前、UUID、MACアドレス、IPアドレス、ディスクなどをエディタで変更。
 ここではvmvm0とした。
 今回は名前を変えるので、直接エディタを起動したが、
 「virsh edit vmvm0」とすると、
 サブコマンドはEDITOR環境変数に設定されたエディタを起動する。

$ sudo uuidgen 
8b6dc072-ef7d-434c-9f51-d8f67aece5ea

 また、ディスクは設定に合わせてコピーしておく。

$ ls /var/local/domains/vmvm2/
disk.img  swap.img

$ sudo cp -r /var/localdomains/vmvm2/ /var/localdomains/vmvm0

■テンプレートからdomain-Uの生成

$ sudo virsh define  /tmp/template_guest.xml 
Domain vmvm0 defined from /tmp/template_guest.xml
*** glibc detected *** virsh: double free or corruption (out): 0x00000000011ba8d0 ***
======= Backtrace: =========
...
======= Memory map: ========
...

$ sudo virsh start vmvm0
Domain vmvm0 started

$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 0     Domain-0                       running
 3     vmvm2                          idle
 4     vmvm0                          idle

$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   752     2     r-----    167.9
vmvm0                                        4   128     1     -b----      5.1
vmvm2                                        3   128     1     -b----      8.6

■ゲストOS側でインターフェイスのIPを固定にしていたりすると、一度コンソールログインが必要になる。
 どちらのコマンドで入るかは問題ではない。
 インターフェイスのIPを修正、ifdown/ifupしてsshログインができることを確認。
 テンプレートとしての設計をするとこんなことにはならないはず。

 $ sudo xm console vmvm0
  $ sudo virsh conole vmvm0

■Xenの仮想マシンの自動起動
 シンボリックリンクを作成

$ test -d /etc/xen/auto || sudo mkdir /etc/xen/auto
$ sudo ln -s /etc/xen/vmvm2.cfg /etc/xen/auto/vmvm2.cfg

■domain-Uの一括停止

$ sudo /etc/init.d/xendomains stop
[ ok ] Saving Xen domain vmvm2 (3).........done.

$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   750     2     r-----    202.0
vmvm0                                            128     1                 9.6
vmvm2                                            128     1                 0.0

$ sudo virsh list --inactive
 Id    Name                           State
----------------------------------------------------
 -     vmvm0                          shut off
 -     vmvm2                          shut off

■domain-Uの一括起動
 ここで自動起動に設定したゲストだけ起動する。

$ sudo /etc/init.d/xendomains start
[ ok ] Restoring Xen domain vmvm2 (from /var/lib/xen/save/vmvm2)...done.

$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   750     2     r-----    208.0
vmvm0                                            128     1                 9.6
vmvm2                                        5   128     1     -b----      0.3

■virsh autostartサブコマンドで自動起動を設定する。

$ sudo virsh autostart vmvm0
Domain vmvm0 marked as autostarted

■自動起動の解除

$ sudo rm /etc/xen/auto/vmvm2.cfg
$ sudo virsh autostart --disable vmvm0
Domain vmvm0 unmarked as autostarted