Google Code Prettify

ラベル KVM の投稿を表示しています。 すべての投稿を表示
ラベル KVM の投稿を表示しています。 すべての投稿を表示

2010年3月3日

libvirtd を終了時にGuestOSを保存する方法

libvirt+QEMU/KVM を使った仮想化の運用を続けていると、どうしても気になる事がある。

libvirtd の設定には、自動起動するGuestVMは登録できるのだが、 終了時には有無を言わさず GuestVM を強制終了してしまう事である。

自前で libvirt (0.7.2)を入れているので今のバージョンでは何らかのサポートが入ってかもしれない。 ただ「libvirt: Releases」を見る限り入って無さそうである。

それにQEMU/KVMドライバだけの挙動かもしれない。他とドライバ(Xen等々)だと状況は違うかもしれない。

まぁ。。。そのうち何らかの対応が入るんだろうなぁ。。。

そうは言っても、ホストマシンを終了するときイチイチ確認するのは難儀である(とくにACPIサポートが悪く電源断しないGuestOSタイプとかねぇ)。

さて、QEMUにはVMの状態を保存復帰(save/restore)がサポートされている。コイツとストレージ共有を組み合わせると、ライブマイグレーションが一丁上がりになるので、つい何年か前に小躍りしてる人がたくさんいた気がする。

まぁ普通にサスペンド/レジュームの仕組みなので、コイツをなんとか上手く使うスクリプトを組んでみた。

指定する項目は3つで、それぞれスクリプト冒頭に書かれている。

libvirt-start-stop-vm.sh

...
SAVEVMDIR="/var/lib/libvirt/save"            # 保存するVMの置き場所
LISTVM_SHUTDOWN="linux_sid linux_fedora"     # 終了時 shutdown するもの
LISTVM_SAVE="freebsd_cur netbsd_cur solaris" # 終了時 save するもの
...

やってる事は単純で virsh コマンドを叩いてるだけである。 ただ、LISTVM_なんたらで指定し無かったり、15分以内に正常に電源断しない奴は、 最後に念のためsaveしてある。

コイツを、/etc/init.d/libvirt-binのスクリプトの必要な部分に入れ込むだけ。

うん〜、これでマシンを立ち上げると前回マシンを落とした時の状態のままのSolaris10/FreeBSDが立ち上がるようになった。。。しかし、時刻が合わん。なんか、GuestOSが共通に取れるイベントの仕組みがあるのかなぁ。。。SNMPとかで叩くんかなぁ。。。SSHとかで叩くんかいなぁ。。。順当に cron でntp引っ張ってくるが原始的でいいのかぁ。。。でも、時刻合わせの精度は低いし、常時CPUをちょっとだけ使うのはなぁ。。。ぶつぶつ

あんまり、すっきりしないが個人で使う分には用は足りそうである。

2009年7月9日

debian lenny の kvm はバグってる?

以前 Ubuntu に乗り換え宣言したのだが、マイナーなパッケージが無かったり、古いままだったり(まぁコミュニティーベースだから仕方ない)で、Debian lenny に再度乗り換えた。

一番の難点は、、、言わないのが約束だなぁ。

Debian lenny だと kvm-72 がパッケージングされているので、サクサクインストールして使えるのだが、どうも2個以上のゲストOSを立ち上げると何故だか次のメッセージをだしてゲストOSがフリーズしてしまう。

 BUG: soft lockup - CPU#0 stuck for 4096s!

なんすかねぇ?

症状としては、下記のバグ報告と同じっぽい。

で、kvm-84 だと直ってるらしい。。。

ぐふぅ。取り敢えずは、適当に sid からkvm/libvirtのソースパッケージを取ってきてビルドして諸々更新したら、複数のゲストOSがフリーズせずに安定した、、、気がする。

またもや debian squeeze 待ちかなぁ

2008年7月24日

Solaris on Linux KVM はまだまだ?

KVM+libvirt の組み合わせは最高!Redhat6.2からFedora9まで起動し安定している。

勢い余って、Solarisをインストールしたが、どうもだめだめの状態

  1. Solaris 8/9 に関しては、CDブートでのインストールは出来るが、 初回のHDDの起動時に、しょっぱなから「Can't read gemotery」と出力されて先に進まない。どうも、ブート処理のかなり初期の段階 mboot か pboot のどっちかが巧く動かないようで、KVMの16bit命令のエミュレートの問題か、BIOSの挙動の問題のどちらのような気がする。
  2. Solaris 10/OpenSolaris に関しては、インストールも起動も出来る。ただし、ゲストOSがアイドル時にホスト側のエミュレータが 100% CPU を食いつぶしている状態で、ちょっといただけない。KVM/QEMU側のMONITOR/MWAITのエミュレートが巧くいっていないので busy wait になってるとか、なってないとからしい。 (参考「OpenSolaris Forums: QEMU and MWAIT/HLT? cpu idle loop ...」等々) どうも思い過ごしだったらしく、起動して暫くするとアイドル状態になりほぼ 0% になる。ただし、Solaris10は最新パッチまで当てると起動しなくなる。
Virtual Box とかではきっと動くんだから、そのうち、安定するんでしょうね。

2008年7月23日

FreeBSD 7.0 と Linux KVM

KVM 上に FreeBSD 7.0 をインストールした。

その前に、FreeBSD は CD 数枚組で配布されており、DVD は無い。 Creating Your Own FreeBSD 7.0 DVDを参考に作成してみた。

FreeBSD 7.0 DVD イメージの用意

近場のミラーサイトから

  • 7.0-RELEASE-i386-disc1.iso
  • 7.0-RELEASE-i386-disc2.iso
  • 7.0-RELEASE-i386-disc3.iso
  • 7.0-RELEASE-i386-docs.iso
を入手する。

DVDイメージの作成

下記コマンドは、Linux上で作業。

# mkdir /path/to/dvd-freebsd7
#
# for suffix in "disc1 disc2 disc3 docs"; do
#   iso="7.0-RELEASE-i386-$suffix.iso"
#   mount -oloop /path/to/$iso /mnt
#   tar -C /mnt -c . | tar -C /path/to/dvd-freebsd7 x
#   umount /mnt
# done
#
# rm -Rf /path/to/dvd-freebsd7/rr_moved
#
# sed -ie 's/|[123]$//' /path/to/dvd-freebsd7/all/packages/INDEX
#
# cat >> /path/to/dvd-freebsd7/cdrom.inf <<EOF
CD_VOLUME = 0
CD_VOLUME = 1
CD_VOLUME = 2
CD_VOLUME = 3
EOF
#
# mkisofs -v -V FreeBSD -J -R -no-emul-boot -b boot/cdboot -o /path/to/7.0-RELEASE-i386-dvd.iso /path/to/dvd-freebsd7

インストール

KVM上では、2点問題がでたが、それを除けば難なくインストールできた。

ACPI/APICが機能しない

ACPI/APICが上手く機能しいので、それを除けてインストールし、最後にブートローダ側での設定を行った。

/boot/loader.conf
/boot/device.hints

hint.acpi.0.disabled=1
hint.apic.0.disabled=1

libvirtではshutdown制御がACPI経由で行われるようなので、いちいちログインして終了する必要があり、自動でVMが終了しない。ちょっと嫌ですな。。。そのうちFreeBSD on Linux KVM でACPI対応するんだろうなぁ

追記(2008/07/24)

ACPIを無効にして、APMを使うようにすれば、自動でVMを終了することができる。但し、libvirtではshutdown制御は効かない。。。

  • /boot/device.hintsに、hint.apm.0.disabled=0
  • /boot/loader.confに、apm_load="YES"
  • /etc/rc.confに apm_enable="YES"

参考「FreeBSDでACPIを無効にしAPMを有効にする方法

NICが安定しない

また、KVMのデフォルトで選択される rtl8139では、FreeBSD側のドライバが安定してない。何か timeout とかのメッセージが出る。

libvirt 0.4.2 から NIC のmodel指定ができるようになったので、手動で最新ソース libvirt_0.4.4-0ubuntu1 からパッケージを構築し、NICのモデルに e1000 を指定したら安定して動くようになった。

...
   <interface type='bridge'>
     <mac address='xxxxxx'/>
     <source bridge='br0'/>
     <model type='e1000'/>
   </interface>
...

NetBSD on Linux KVM も似た感じで、ACPI無効で適当なNICモデルを選択すれば良い。

完全仮想化のときディスクの CHS 値がちょっとだけおかしい?

KVM / QEMU 等で、ちょっと古めの OS を入れて遊んでいたら、次のようなメッセージが出るが、 何事もなく動く場合がある。

kernel: hda: C/H/S=780/0/63 from BIOS ignored

多分、CHS変換が上手くいっていないがLBAモードでアクセスするので問題が起きていないんだろうが、 正直言うと気持ちが悪い。

Googleの検索だと6件くらい引っかかる

くよくよ調べてみた。

  1. 起動時にホスト側のエミュレータでディスクのCHS値から変換方法は自動的に最適な変換アルゴリズムが選択される。(「bochs: The Open Source IA-32 Emulation Project (New Bochs Documentation)」にあるnone, large, rechs, lbaの4種類)
  2. 仮想マシン上で実行されるBIOSの初期化処理で、論理CHSの最大値が計算される。
  3. エミュレータで指定された変換アルゴリズムで計算した値が EBDA(Extended BIOS Data Area)に保存されている。
  4. 上とは無関係な方法で計算した値がFDPT (Fixed Disk Parameter Table)に保存される。
    (「Enhanced Disk Drive Specification Ver 1.1」に基づいた方法。。。1995年に作成って)
  5. EBDAとFDPT上の論理CHSの最大値が一致しない場合がある。
  6. FDPTの計算に使われる方法は、Head値が256の可能性があり、古いシステムでは誤認識する場合もある。(おおよそディスクサイズが 4Gの以上の時かなぁ?)

変なメッセージが出るのが嫌なのでパッチを作ってみた。ただし、FDPTはどう扱うべきかイマイチ分からないので、正しい対処法かどうかは分からない。

--- kvm-62+dfsg/bios/rombios.c	2008-02-25 18:30:14.000000000 +0900
+++ ../rombios.c	2008-07-23 15:39:17.000000000 +0900
@@ -2450,6 +2450,15 @@
       write_word(ebda_seg,&EbdaData->ata.devices[device].lchs.cylinders, cylinders);
       write_word(ebda_seg,&EbdaData->ata.devices[device].lchs.spt, spt);
 
+      if (device == 0 || device == 1) {
+       Bit8u *fdpt = (device==0) ? EbdaData->fdpt0 : EbdaData->fdpt1;
+
+       write_word(ebda_seg, fdpt, cylinders);
+       write_byte(ebda_seg, fdpt+0x02, heads);
+      }
+
       // fill hdidmap
       write_byte(ebda_seg,&EbdaData->ata.hdidmap[hdcount], device);
       hdcount++;

パッチ書いた後、Googleって見たら、Virtual Box では同様のパッチ Changeset 6294 - VirtualBox が当たってるようである。(Sunの古いシステムで不具合とかあったのかなぁ。。。)

まとめ

FDPTの値に不整合があるが、相当古いシステムしか影響を受けないので、気にする必要は無いらしい。 そのうちKVM/QEMU等のrombios.cにも変更が下りて来るのかもしれない。。。

2008年7月22日

libvirt 経由で日本語キーボードを扱う

libvirt の管理下の仮想化ドメインから、virt-manager を使って、仮想グラフィック画面をVNC経由でアクセスすると、正しくキー入力ができない場合がある。

kvm/qemu のエミュレータに対してキーボードのレイアウトを指定するオプションを付ければ、対応が可能であるが、、、libvirt のドメイン設定ファイル 「libvirt: Domain XML format」にはどうも関連する設定項目が無いようである。(追記2009/04/14 記事の最後の方を参照)

まぁ、日本語キーボードの keycodes の問題なんで、英字キーボードを用意すれば済むのだが、 日本にいる以上、日本語配列には慣れていかないといけないわけで、、、

はて、どうしたもんだか?

まぁ、スクリプトを挿めばいい

実行バイナリを別名に変更し

# mv /usr/bin/kvm /usr/bin/kvm.bin
# mv /usr/bin/qemu-system-x86_64 /usr/bin/qemu-system-x86_64.bin

/usr/bin/kvm/usr/bin/qemu-system-x86_64の中身を次のラッパースクリプトに変更する。

#!/bin/sh

exec $0.bin -k ja $*

これにより、日本語キーボードでも正しく文字が入力できるようになる。

なんだろ?

VNCでkeycodes配列をネゴしないのが問題なのかなぁ、、、イマイチ分からん

追記 (2009/04/14)

ふと、気づいてみると XMLフォーマットの中で、VNCのキーマップの指定が出来るようになっている!

    <graphics type='vnc' port='-1' autoport='yes' listen='' keymap='ja'/>

開発サイトのデータを検索する 「libvirt.git/search: keymap」と、 どうもドキュメントに記載が無いだけで libvirt 0.4.1 位から使えてたようでした。 なので、このバッドノウハウは要らなくなりました。

2008年7月21日

Ubuntu + KVM + libvirt で仮想化

以前、Xenで完全仮想化ができるのでAthlon64x2 を購入したのだが、 ちょっとしか試していなかった。 変な結構制約があったりで比較的安定している VMware Server を使っていた。

時は経って、Linux KVM というのが活発に開発が行われており、前途有望である。 同時に、色々な仮想化技術を統一したAPIで扱えるlibvirtも整備されてきている。 特に、virt-managerは、 VMware Server Console を彷彿し、ローカルからリモートまで管理が可能になりつつある。

なので、Ubuntu+KVM+libvirt に移行してみようと思う。

インストール

KVM と virt-manager のパッケージをインストール。

# apt-get install kvm libvirt-bin virt-manager
# addgroup <自分> libvirtd

ついでに、QEMU/KQEMU も入れとくと何かと便利かも、、、仮想化命令をサポートしないCPUを使っている場合はこっちがメインになると思う。

# apt-get install qemu kqemu-source
# module-assistant prepare
# module-assistant build kqemu
# module-assistant install kqemu
# modprobe kqemu
# echo "kqemu" >> /etc/modules

あとは、virt-managerを使うと仮想化ドメインがGUIで簡単に作れるようになる。

20080721virt-manager

ブリッジの設定

何もしなければ、仮想化ドメインのネットワークは、専用のサブネットが割り当てられる。なので、NATで外に出るか、ルーティングをせっせと張ることになる。

外からサーバ用途としてアクセスしたければ、bridge が簡単でいい。 Ubuntu libvirt guide を参考にして。 そいつの設定をする

まず、現在のNetworkManager/dhcdbd等の自動ネットワーク設定機能切る。

# /etc/dbus-1/event.d/26NetworkManagerDispatcher stop
# /etc/dbus-1/event.d/25NetworkManager stop
# echo "exit" > /etc/default/NetworkManager
# echo "exit" > /etc/default/NetworkManagerDispatcher
# /etc/init.d/dhcdbd stop
# update-rc.d -f dhcdbd remove
# /etc/init.d/networking stop

固定IPアドレスと bridge の設定を行う。

/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
	address 192.168.1.123
	netmask 255.255.255.0
	network	192.168.1.0
	broadcast 192.168.1.255
	gateway 192.168.1.254
	bridge_ports eth0
	bridge_fd 9
	bridge_hello 2
	bridge_maxage 12
	bridge_stp off

ネットワークを有効化する。

# cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
EOF
# sysctl -p /etc/sysctl.conf
# /etc/init.d/networking start

virt-manager を使って新規の仮想化ドメインを作成時に、ブリッジが選択できるようになる。

20080720virt-manager.png

まとめ

Linux KVM よ〜、賢くな〜れ

久しぶりの投稿

かなり期間が空いてしまったが、ブログを再開してみようと思う。 2013年3月が直前の投稿だったが、頻繁に更新していた時期が 2011年11月までなので、8年間ぶりとなる。 8年間なにをしていたのかと言えば、2回転職して未だにIT技術者の職を得ている。 その...