ログ日記

作業ログと日記とメモ

Xenライブマイグレーション失敗の原因を探るログ

http://d.hatena.ne.jp/n314/20130226/1361901155
Xenのライブマイグレーションのエラー原因探索編。


もう一度データセンター側にプライマリ&セカンダリ指定してインスタンスを作り、マイグレーションを往復してみたけれどエラーは起きなかった。
なんか深みにハマっている。


メーリングリストを見つけた。
つまみ読み。
別にマイグレーションとは関係なさそうだけれども。

I just tried d-i 6beta1 and booted Squeeeze and its 2.6.32 kernel for
the first time on my usual server hardware (Dell R410).

(snip)

It seems very prone to crashing at any APIC/ACPI bugs, of
which there seem to be quite a bit of in both Dell and IBM.

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=603632

DellIBMでクラッシュ報告がよくある?


今回失敗したのもDell R410だねぇ…。
このスレの内容は直接は関係なさそうだが、軽く調べた程度では原因は特定できなさそうってことと、アップデートで直ってる可能性があるってことが予想できる。


古いから関係ないけど
http://xen.1045712.n5.nabble.com/DomU-crashes-after-live-migration-td3238441.html
lennyのxenカーネルはバグだらけ?


カーネルバージョンの詳細を調べる。

# ls /var/cache/apt/archives/linux-image-2.6.32-5*
/var/cache/apt/archives/linux-image-2.6.32-5-xen-amd64_2.6.32-34squeeze1_amd64.deb

なんか32-34ってのが古い気がする。最近入れた方は48だったような…。


コマンドを調べてみると、apt-cache showを使うらしい。aptitudeでもあるような気がするが

# apt-cache show linux-image-2.6.32-5-xen-amd64 |grep Version
Version: 2.6.32-48
Version: 2.6.32-48squeeze1
Version: 2.6.32-34squeeze1


ちょっと近づいた気がする。
データセンター側のカーネルは最近入れたから 2.6.32-48 だ。移動の方向ではなくてdomUを起動するノードのカーネルバージョンが関係している可能性が高くなってきた。
起動しているカーネルバージョン詳細ってどうやって見るんだろう。unameだと2.6.32-5としか出ない。

gnt-cluster command "apt-cache show linux-image-2.6.32-5-xen-amd64 |grep Version"

# 各ノードで
ls /var/cache/apt/archives/linux-image-*
  1. 一番古いカーネルを持っているノードを探す。
  2. そこにテスト用インスタンスを移す。
  3. その古いカーネルdomU起動
  4. マイグレーション


再現しない…。
ある程度CPUが動いていないとダメなのかもしれないので、社内サーバーマイグレーションで往復してみる。


  1. 2.6.32-48で起動中
  2. migration往復
    • エラーなし
  3. migrationでカーネルが古いノードに移動
  4. poweroff => インスタンス起動 (2.6.32-35)
  5. migration往復

カーネルパニック再現した!


念のため2.6.32-48でマイグレーションを2往復してマイグレーション中に書き込み処理などをやってみたがエラーなし。
希望的な推測をすると、2.6.32-35から2.6.32-48の間のバグ修正で今回の事例が入っていたという可能性が高くなった。
これで解決?



結局、今回の環境では移動自体は無停止で出来そうだがカーネルアップデートのために一度は再起動しないといけない。

Debian squeezeでGanetiを使ってXen + DRBD

仮想化環境管理ツールのGanetiがDebianのパッケージになってるよ!ということで。
本家は http://code.google.com/p/ganeti/ ここ。


日本語情報はほとんどないのね。
http://d.hatena.ne.jp/naruoga/20081201/1228140473
http://trac.mizzy.org/public/blog?year=2007&month=11




では、OSインストール後から。
※ 6/22追記:インストール時のinitramfs作成で汎用ではなく目的別にしていたら、xenがディスクを認識しなかった。



ベースシステム。

aptitude install ssh

cat > /etc/sysctl.d/windowscale.conf
net.ipv4.tcp_rmem = 4096 65536 65536
net.ipv4.tcp_wmem = 4096 65536 65536

sysctl -p /etc/sysctl.d/windowscale.conf


Xen

aptitude install xen-linux-system xen-tools
# reboot


DRBD

aptitude install drbd8-utils

DRBDはカーネルに含まれるようになったらしい。

find /lib/modules/ -name "drbd.ko"
/lib/modules/2.6.32-5-xen-amd64/kernel/drivers/block/drbd/drbd.ko
/lib/modules/2.6.32-5-amd64/kernel/drivers/block/drbd/drbd.ko


Ganeti
http://docs.ganeti.org/ganeti/2.1/html/install.html

aptitude install ganeti2

Debianパッケージのバージョンは2.1なので。


あとはドキュメントを参考に各種設定をする。
grubのオプション
http://groups.google.com/group/ganeti/browse_thread/thread/a18979bdd00f6461
ここを参考に。
/etc/default/grub

#GRUB_CMDLINE_XEN_KERNEL=dom0_mem=1024M maxcpus=1
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=1024M maxcpus=1"

6/28 追記: この指定は間違っていた。

GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=1024M"
GRUB_CMDLINE_LINUX_DEFAULT="maxcpus=1"

こう書いてupdate-grub2を実行すると、grub.cfgが

        multiboot       /boot/xen-4.0-amd64.gz placeholder  dom0_mem=1024M
        module  /boot/vmlinuz-2.6.32-5-xen-amd64 placeholder root=〜〜 ro  maxcpus=1

このように生成される。
xenカーネルで起動後にtopや/proc/cpuinfoでCPUが一つだけになっており、xm vcpu-list では複数のCPUが見えたらOK。

root@node1:~# gnt-instance modify -B vcpus=4 instance1
...
root@node1:~# xm vcpu-list
Name                                ID  VCPU   CPU State   Time(s) CPU Affinity
Domain-0                             0     0     1   r--      34.3 any cpu
Domain-0                             0     1     -   --p       0.0 any cpu
Domain-0                             0     2     -   --p       0.0 any cpu
Domain-0                             0     3     -   --p       0.0 any cpu
Domain-0                             0     4     -   --p       0.0 any cpu
Domain-0                             0     5     -   --p       0.0 any cpu
Domain-0                             0     6     -   --p       0.0 any cpu
Domain-0                             0     7     -   --p       0.0 any cpu
instance1.example.com                3     0     7   -b-      26.1 any cpu
instance1.example.com                3     1     2   -b-      13.1 any cpu
instance1.example.com                3     2     0   -b-      10.5 any cpu
instance1.example.com                3     3     5   -b-       5.5 any cpu


あと

gnt-instance modify -H cpu_mask=<cpu-pinning-info> <instance>
http://docs.ganeti.org/ganeti/master/html/design-cpu-pinning.html

このcpu pinningを試したくて
ganetiのバージョンを2.4.2に上げてみたが

root@node1:~# gnt-instance modify -B vcpus=4 -H cpu_mask=1:2:3:4 test1
Unhandled Ganeti error: Parameter 'cpu_mask' is not supported

無理なようだ。
xm vcpu-pin で一時的に固定はできるが、gnt-instance rebootすると割り当てが解除されている。
CPUを固定しなくても空いているCPUから割り振られているようなので、vCPU数が実CPU数を超えなければ特に問題はない?一つのCPUに対して仮想CPUを複数割り当てると体感速度が極端に落ちてコンソールが引っかかるような動きになったのでそういう構成はナシのつもり。CPU数以上に仮想マシンが欲しいときはバーチャルドメインで頑張る方向で。
追記ここまで



cd /etc/grub.d/
mv 10_linux 21_linux
update-grub2

reboot

片方のマシンでgnt-cluster init や gnt-node addを実行する。
その後instanceを作成。
http://serverfault.com/questions/242311/ganeti-fails-to-install-debootstrap-instances-on-squeeze
ここがかなりのハマりどころ。

gnt-cluster modify --hypervisor-parameter xen-pvm:root_path='/dev/xvda1'

gnt-instance add -n nodea1.example.com:nodeb1.example.com -t drbd \
  --disk 0:size=512M -B memory=1G,vcpus=2 -o debootstrap+default \
  -H xen-pvm:kernel_path=/boot/vmlinuz-2.6-xenU,initrd_path=/boot/initrd-2.6-xenU instance1.example.com

ディスクサイズは大きく取るとかなり時間を食うので、最初にinstance作成が成功するのを確認してからじっくり考える。


何度か試行錯誤したり再インストールしたら動いたので間違いがあるかも。
ganetiの最新を使うためにソースから入れる場合は
http://stable-link.com/?p=417
ここを参考に。

GUIを入れてみる

vi /etc/xen-tools/xen-tools.conf
  dist   = etch

mkdir /var/xen/domains/xen02.example.com
xen-create-image --size=8G --ip=192.168.1.102 --hostname=xen02.example.com

mv /etc/xen/xen02.example.com.cfg /etc/xen/auto/
xm create /etc/xen/auto/xen02.example.com.cfg

xm console xen02.example.com

apt-get install locales
dpkg-reconfigure locales
  日本語をインストール

tasksel
  デスクトップにチェック


・・・・。
かなりあれこれいじってみたけど出来ない・・。検索したらgdmを立ち上げてvncで繋ぐとか普通に書いてるけどgdmが立ち上がらんし・・。保留にしようか。。


# 追記

悔しいからsargeに戻してroleを使ってみる。。

xen-create-image --size=8G --ip=192.168.1.103 --hostname=xen03.example.com --role=gdm

一応変なデスクトップは出たが・・重い・・・。なんでだろう。VMwareよりかなり重い?


で、role.d/gdm を見たらsarge用だとばっかり思ってたんだけど・・・・etchでも使えるじゃん!どういう仕組みなんだろ・・・?
etchでもいちいちデスクトップをtaskselで選択して・・ってやらなくて良かったのね。


# 更に追記
やっとetchでログイン画面が出るようになった。。なんでデフォルトの/etc/gdm/gdm.confファイルは空っぽなんだろうね。

apt-get install gnome-core
vi /etc/gdm/gdm.conf

[servers]
0=VNC
[server-VNC]
name=VNC server
command=/usr/bin/Xvnc -geometry 800x600 -depth 24
flexible=true


/etc/init.d/gdm start

日本語を入れるの忘れてた。

apt-get install locales
dpkg-reconfigure locales

あとはanthyを入れたり細々した設定を。



・・・ってxenを本格的に使うわけじゃないけどね。今やっとけば必要になった時に役に立つことを祈って。

Debian(etch)でxenをインストール

apt-get install xen-linux-system-2.6.18-3-xen-686 xen-tools libc6-xen
reboot

apt-getでgrubの設定までやってくれる。


取り敢えずDebian流のやり方を見る。

apt-get install perl-doc
xen-create-image --manual
vi /etc/xen-tools/xen-tools.conf
  dir = /var/xen
  debootstrap = 1
  passwd = 1
  kernel = /boot/vmlinuz-2.6.18-4-xen-686
  initrd = /boot/initrd.img-2.6.18-4-xen-686

mkdir -p /var/xen/domains/xen01.example.com

mkdir -p /etc/xen-tools/skel/root/.ssh
chmod -R 700 /etc/xen-tools/skel/root/
cat /root/.ssh/authorized_keys /root/.ssh/id_rsa.pub >> /etc/xen-tools/skel/root/.ssh/authorized_keys
chmod 644 /etc/xen-tools/skel/root/.ssh/authorized_keys

xen-create-image --ip=192.168.1.101 --hostname=xen01.example.com

固まったように感じるがプロセスはちゃんと動いているっぽい。

tail -f /var/log/xen-tools/xen01.example.com.log

で何が行われているか分かる。


4gb seg fixupとか出まくり・・・: ぺたぺたしてってください(^^;
これと同じ現象が・・・しかも解決しなかった・・。

mkdir /etc/xen/auto
mv /etc/xen/xen01.example.com /etc/xen/auto/
/etc/init.d/xendomains reload


エラーで起動できなかった・・。


http://w3.doshisha.ac.jp/~kueda/index.php?Debian%E3%81%ABXen を参考に

apt-get install bridge-utils
vi /etc/xen/xend-config.sxp
  (network-script network-bridge)

/etc/init.d/xend restart
/etc/init.d/xendomains reload

# 接続
xm console xen01.example.com


おぉぉ。
なんて簡単なんだ!
Debianすげーな。