20110522kernelvm xen+virtio

23
Xen + Upstream QEMUが こんなに地雷原な訳がない 2011/5/22 Kernel/VM探検隊 Takeshi HASEGAWA (Twitter: @hasegaw) 本資料中の解説内容は、所属組織における 統一的な見解を示すものではありません。

description

Kernel/VM探検隊 2011/05/22

Transcript of 20110522kernelvm xen+virtio

Page 1: 20110522kernelvm xen+virtio

Xen + Upstream QEMUが こんなに地雷原な訳がない

2011/5/22 Kernel/VM探検隊

Takeshi HASEGAWA (Twitter: @hasegaw)   本資料中の解説内容は、所属組織における 統一的な見解を示すものではありません。

Page 2: 20110522kernelvm xen+virtio

プロフィール 長谷川 猛 (HASEGAWA Takeshi) twitter: @hasegaw

主にLinuxや仮想化技術を得意とする雑食系SE Xen/KVMを調査、FreeBSD virtioを実装等  興味範囲:仮想化、ストレージ

もんはんしようず ゚+.(・ω・)゚+.゚

2

Page 3: 20110522kernelvm xen+virtio

おもな著書・寄稿

3

Page 4: 20110522kernelvm xen+virtio

Webサイトの記事など

エンジニアなら知っておきたい仮想マシンのしくみ http://gihyo.jp/dev/serial/01/vm_work/

4

Page 5: 20110522kernelvm xen+virtio

今回参加の経緯

5

Page 6: 20110522kernelvm xen+virtio

Congratulations!! •  今月、本家QEMUに、最新のXen対応コードがマージされました •  KVMもXenハードウェアエミュレーションはQEMUに依存 •  XenでもQEMUが提供する最新機能が使える

o  例: virtio, SPICE

Linux KVM

qemu-kvm

Xen

domain-0 Guest OS

qemu-dm Guest OS

6

Page 7: 20110522kernelvm xen+virtio

新しいqemuを試すには? •  Xen

o  xen-unstableをビルド(Xen 4.1.0でもOK) •  qemu

o  下記のqemu-dm-v15ブランチをビルド git;//xenbits.xensource.com/people/aperard/qemu-dm.git

•  ドメイン定義ファイルの修正 o  device_model = path/to/new/qemu

•  参考 o  http://wiki.xen.org/xenwiki/QEMUUpstream

7

Page 8: 20110522kernelvm xen+virtio

[Xen-devel] vmport patch for run Fedora 14

diff --git a/hw/vmport.c b/hw/vmport.c index 19010e4..316cf1d 100644 --- a/hw/vmport.c +++ b/hw/vmport.c @@ -61,6 +61,9 @@ static uint32_t vmport_ioport_read(void *opaque, uint32_t addr) unsigned char command; uint32_t eax;

+ if (env == NULL) + return 0; + cpu_synchronize_state(env);

eax = env->regs[R_EAX]; @@ -85,6 +88,9 @@ static void vmport_ioport_write(void *opaque, uint32_t addr, uint32_t val) { CPUState *env = cpu_single_env;

+ if (env == NULL) + return; + env->regs[R_EAX] = vmport_ioport_read(opaque, addr); }

27 Lines

vmport(Xen未対応のゲストOS用インターフェイス)にアクセスがくるとQEMUがSegmentation Faultで落ちる問題を発見、修正

8

Page 9: 20110522kernelvm xen+virtio

virtioとは何ぞや •  リングバッファを使用したHost ‒ Guest間のインターフェイスを定義

•  Host/Guest OSの実装に非依存 o  qemu-kvm, VirtualBox がサポート

•  各デバイスは1つ1つが独立し動作 o  virtio Block x2→ PCIデバイス x2 o  例外あり(ドライバ実装に依存)

•  非常に高速 o  無駄なH/Wエミュレーションは不要

9

Host

Guest

Hardware

PCI Bus

virtio Ballon

virtio Block

virtio Block

virtio Net

virtio Ballon

virtio Block

virtio Block

virtio Net

【参考】 virtio: Linux の I/O 仮想化フレームワーク

http://www.ibm.com/developerworks/jp/linux/library/l-virtio/

Page 10: 20110522kernelvm xen+virtio

virtio-net on Xen •  Xenのドメイン定義ファイルの作成 vif = [ 'type=ioemu, bridge=br0, mac=00:16:3e:09:ac:cd,model=virtio' ] •  ゲストOSでMSI(-X) を無効化

o  Linuxカーネルパラメータ pci=nomsi o  参考:割り込みの通知方式の違い

IRQ MSI(-X) その他

Xen ○ - eventchannel KVM ○ ○ -

10

Page 11: 20110522kernelvm xen+virtio

Xenに関連するGSoC 2011採択プロジェクト •  Add Xen PV block device support to SeaBIOS •  Recovery of crashed Linux •  Paravirtualized Audio •  Linux Based Stubdoms •  Porting Unix libc to Xen PV •  Porting VirtIO to Xen

Page 12: 20110522kernelvm xen+virtio

Porting VirtIO to Xen?? •  想像するに、彼らは、こんなことを考えている

•  準仮想化、完全仮想化の両方に対応 •  virtio-pciの代替として、Xen独自の通知機構であるeventchannelを利用する

virtio ファンクションドライバ (virtio-net等)

virtio リングバッファ (virtio-ring)

virtio-pci インターフェイス (virtio-pci)

仮想ハードウェア 12

Xenのeventchannel等で置き換える

Page 13: 20110522kernelvm xen+virtio

[Xen-devel] [PATCH] libxl: virtio-blk-pci support for FV domain

+++ b/docs/misc/vbd-interface.txt Sun May 08 12:46:00 2011 +0900 @@ -73,6 +73,7 @@

1 << 28 | disk << 8 | partition xvd, disks or partitions 16 onwards 202 << 8 | disk << 4 | partition xvd, disks and partitions up to 15 + 252 << 8 | disk << 4 | partition vd, disks and partitions up to 15 8 << 8 | disk << 4 | partition sd, disks and partitions up to 15 3 << 8 | disk << 6 | partition hd, disks 0..1, partitions 0..63 22 << 8 | (disk-2) << 6 | partition hd, disks 2..3, partitions 0..63 diff -r 4b0692880dfa tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Thu May 05 17:40:34 2011 +0100 +++ b/tools/libxl/libxl_device.c Sun May 08 12:46:00 2011 +0900 @@ -238,6 +238,13 @@ if (pdisk) *pdisk = disk; if (ppartition) *ppartition = partition; return (8 << 8) | (disk << 4) | partition; + } + if (device_virtdisk_matches(virtpath, "vd", + &disk, 15, + &partition, 15)) {

+ if (pdisk) *pdisk = disk; + if (ppartition) *ppartition = partition; + return (252 << 8) | (disk << 4) | partition; } return -1; } diff -r 4b0692880dfa tools/libxl/libxl_dm.c --- a/tools/libxl/libxl_dm.c Thu May 05 17:40:34 2011 +0100 +++ b/tools/libxl/libxl_dm.c Sun May 08 12:46:00 2011 +0900 @@ -418,6 +418,10 @@ if (strncmp(disks[i].vdev, "sd", 2) == 0) drive = libxl__sprintf (gc, "file=%s,if=scsi,bus=0,unit=%d,format=%s", + disks[i].pdev_path, disk, format); + else if (strncmp(disks[i].vdev, "vd", 2) == 0) + drive = libxl__sprintf + (gc, "file=%s,if=virtio,bus=0,unit=%d,format=%s", disks[i].pdev_path, disk, format); else if (disk < 4) drive = libxl__sprintf

43 Lines パッチの方針自体 受け入れられませんでした

仮想ブロックデバイス vda, vdb, … でvirtio-blkが使えるパッチ

13

Page 14: 20110522kernelvm xen+virtio

認識されるようになったが、動かない •  動かない

o  virtio-blkを使ったドライブにアクセスするとQEMUが即死

•  何が起きているかを調べてみた o  ゲストから要求されたI/Oリクエストがホスト側から見ると壊れている (分裂的な意味で)

o  期待値

o  実際の状態

o  KVMとXenでメモリマッピングの仕組みが違うことが原因と推測

14

Page 15: 20110522kernelvm xen+virtio

何が起きたか (1/2) •  virtioフロントエンドがリクエストをメモリ上に生成

上記バッファはLinuxカーネルが管理するブロックI/Oのバッファだったりskbだったりもする

•  virtioフロントエンドが、virtioバックエンドに、Guest-Physicalのどこにそのバッファがあるかを通知する

•  virtioバックエンドが上記通知を受け取り、必要なI/O処理を行う •  KVMの場合は、Guest-Physicalなメモリ空間はQEMUのHost-virtualなメモリ空間の一部であるので、これで全てがうまくいく

15

Page 16: 20110522kernelvm xen+virtio

何が起きたか (2/2) •  Xenの場合、仮想マシンのGuest-Physicalなメモリ空間の一部をQEMUのHost-Virtualなメモリ空間上にオンデマンドでマッピング この仕組みによって32bitのdomain-0でも64bitゲストをサポートできる

•  仮想マシンの物理メモリ空間をQEMUにマッピングする際、Host-Virtualなメモリ空間上に断片かした状態でマッピングされることが… 期待値 実際のマッピング

•  この結果 virtio-ring がハンドリングできずQEMUクラッシュ…orz •  QEMUのソースコードを調べた感じだと、この問題は virtio, および vhost (virtioの親戚)でしか発生しない。

16

Page 17: 20110522kernelvm xen+virtio

ヘボな俺がこんな問題をなんとかできる訳がない コレは自分の手には負えない。とりあえずxen-develに報告しよう

While tracing virtio-blk crash issues, I have found cpu_physical_memory_map() in upstream-qemu+xen behaves different with others. This prevents proper work of virtio-ring bundled in qemu.

When a caller requests more than 2 guest-physical pages, the function will map the pages in host-virtual, as possible. In kvm+qemu, the region residents always sequential in host-virtual, so it will work perfectly. However, in xen+qemu, the region mapping is sometimes fragmented and partial. (続)

17

Page 18: 20110522kernelvm xen+virtio

返事がキタ Citrixのエンジニアから、当初の想像を超えるポジティブな返事が

This is a very serious issue, thank you very much for

spotting it!

I am going to refactor cpu_physical_memory_map to fix the

problem, I‘ll send you a patch as soon as I have it ready.

•  しかし、これは序曲だった

•  デバッグは未だに進行中

18

Page 19: 20110522kernelvm xen+virtio

“Daily QEMU” 創刊のお知らせ ケンブリッジから毎晩届くQEMU用パッチ

呑んで帰宅するとパッチが届いている→夜中試してフィードバック 一日目

o  DMA転送が行われるとデータが破壊される恐怖のQEMU

二日目 o  パッチがcleanに適用できないと思って聞いてみたら、開発者側の o  作業用レポジトリが古かった。リベースしてもらう

三日目 o  なんとなく動いているがmkfsを繰り返すと2回目でQEMU死亡

四日目 (イマココ) o  開発者の手元(Debian HVM)では動作しているらしい o  しかし、手元(Fedora 14 HVM)では、起動時にudevで固まる 19

Page 20: 20110522kernelvm xen+virtio

まとめ •  XenとKVMの根本的な仕組みは同じと言える •  Xenでも、本家版のQEMUが利用可能になりつつある

o  最新版QEMUの機能(SPICE、virtio)を利用可能に •  XenとKVMで大きく違うところ

o  割り込みの通知方法 o  メモリのマッピング方法

•  現在私が取り組んでいるタスク o  Xenの上でvirtioを使うための修正(支援)

20

Page 21: 20110522kernelvm xen+virtio

個人的な今後の予定 •  Xen: virtioサポートのため可能な貢献をしていく予定

•  libxlツールスタックまわりの修正(支援) •  QEMUの修正支援

•  その他: 仮想マシン関連連載など 「エンジニアなら知っておきたい仮想マシンのしくみ」

• 予定しているトピック – メモリ管理 – デバイスI/Oのエミュレーション – virtio – ……

21

Page 22: 20110522kernelvm xen+virtio

質問はありますか?

22

Page 23: 20110522kernelvm xen+virtio

ありがとうございました

゚+.(・ω・)゚+.゚

23