もしcloudstackのkvmホストでpciパススルーできるようになったら

35
1/35 15 CloudStack ユーザ会 CloudStack on KVM での PCI&USB パススルー 電気通信大学 中島 拓真 @penguin2716

Upload: takuma-nakajima

Post on 18-Nov-2014

3.445 views

Category:

Technology


3 download

DESCRIPTION

第15回 CloudStackユーザー会 in 札幌

TRANSCRIPT

Page 1: もしCloudStackのKVMホストでPCIパススルーできるようになったら

1/35第 15回 CloudStackユーザ会

CloudStack on KVMでのPCI&USBパススルー

電気通信大学 中島 拓真

@penguin2716

Page 2: もしCloudStackのKVMホストでPCIパススルーできるようになったら

2/35第 15回 CloudStackユーザ会

今日は PCIパススルーのお話をします( USB …パススルーは準備できませんでした )

Page 3: もしCloudStackのKVMホストでPCIパススルーできるようになったら

3/35第 15回 CloudStackユーザ会

もし CloudStackの KVMホストでPCIパススルーできるようになったら

電気通信大学 中島 拓真

@penguin2716

Page 4: もしCloudStackのKVMホストでPCIパススルーできるようになったら

4/35第 15回 CloudStackユーザ会

自己紹介

■所属:電気通信大学   情報システム学研究科(M1)

■研究:クラウド上の VMでの GPU利用,   OpenFlow関連(予定)

■開発:mikutterプラグイン,     CloudStack 3行スクリプト

■ Twitter:ぺんぎんさん    @penguin2716

Page 5: もしCloudStackのKVMホストでPCIパススルーできるようになったら

5/35第 15回 CloudStackユーザ会

Agenda

■ PCI/USBパススルーのお話■ CloudStackの VMで PCIパススルーするには■ソースの書き換え■ビルドと認識テスト

Page 6: もしCloudStackのKVMホストでPCIパススルーできるようになったら

6/35第 15回 CloudStackユーザ会

{PCI,USB}パススルーのイメージ

■通常:リソースプールのリソースを利用■パススルー:仮想マシンがデバイスに直接アクセスする

Hypervisor

Device

Resource Pool

Device Device Device

VM VM VM VM

Page 7: もしCloudStackのKVMホストでPCIパススルーできるようになったら

7/35第 15回 CloudStackユーザ会

パススルーする利点 /欠点

■利点– デバイスを占有できる– オーバーヘッドが小さくパフォーマンスが良い

■欠点– デバイスに関連付けられるので

VMのマイグレーションができなくなる– クラウドの利点であるはずのリソース共有ができなくなる

– 動かないデバイスもある気がする

Page 8: もしCloudStackのKVMホストでPCIパススルーできるようになったら

8/35第 15回 CloudStackユーザ会

どんなときに利用するの?

■ GPUを VMから利用したい– NVIDIA GRIDみたいな感じ

■ NICを占有させたい– 高速なネットワークを分離して提供

■ FPGAボードが使いたい– 研究用途とか

■ USBメモリ使いたい– USB-IPとか使えよ

Page 9: もしCloudStackのKVMホストでPCIパススルーできるようになったら

9/35第 15回 CloudStackユーザ会

CloudStackで PCIパススルーするには

■ CloudStackの VMはどうやって作られるか– ユーザがWebUIから操作– Libvirtに VMを作る命令が飛ぶ– qemu-kvmで VMを作る

CloudStack WebUI

Libvirt

KVM Xen ESXi

Libvirtで指定できればパススルーできそう

Page 10: もしCloudStackのKVMホストでPCIパススルーできるようになったら

10/35第 15回 CloudStackユーザ会

Libvirtによる VM生成

■ハイパーバイザによって異なるコマンドや APIを抽象化– どのハイパーバイザでも同じコマンドが利用可能– CloudStackからは Libvirtのコマンドが叩かれる

■ CloudStackでは VMが起動する度にVMの設定ファイルが再生成される– 起動中の VMの設定ファイルを書き換えてもあまり意味がない

Page 11: もしCloudStackのKVMホストでPCIパススルーできるようになったら

11/35第 15回 CloudStackユーザ会

Libvirtの設定ファイル

■ XML形式で保持<domain type='kvm'> <name>s-1-VM</name> <uuid>e08414ee-b237-3ef4-adcc-c1799cebe134</uuid> <description>Debian GNU/Linux 5.0 (32-bit)</description> <memory unit='KiB'>262144</memory> <currentMemory unit='KiB'>262144</currentMemory> <vcpu placement='static'>1</vcpu> <cputune> <shares>500</shares> </cputune> <os> <type arch='x86_64' machine='rhel6.4.0'>hvm</type> <boot dev='cdrom'/> <boot dev='hd'/> </os> <features>

Page 12: もしCloudStackのKVMホストでPCIパススルーできるようになったら

12/35第 15回 CloudStackユーザ会

Libvirtの設定ファイル

■ PCIパススルーするには <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </hostdev>

# lspci00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen ... 00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen ...00:14.0 USB controller: Intel Corporation 7 Series/C210 Series ...00:16.0 Communication controller: Intel Corporation 7 Series/C...00:1a.0 USB controller: Intel Corporation 7 Series/C210 Series C...00:1b.0 Audio device: Intel Corporation 7 Series/C210 Series Chip...

Page 13: もしCloudStackのKVMホストでPCIパススルーできるようになったら

13/35第 15回 CloudStackユーザ会

virsh(1)

■ Libvirtの APIを叩くシェル– VMの電源管理– VMの設定変更– デバイスのアタッチ /デタッチ

# virsh list Id Name State---------------------------------------------------- 1 s-1-VM running 2 v-2-VM running 3 r-4-VM running# virsh vncdisplay 2:1

Page 14: もしCloudStackのKVMホストでPCIパススルーできるようになったら

14/35第 15回 CloudStackユーザ会

PCIデバイスを使う大まかな流れ

■ホストからデバイスを detach

■ VMで利用■ VMを終了■ホストにデバイスを reattach

←この間はホストで利用不可

Page 15: もしCloudStackのKVMホストでPCIパススルーできるようになったら

15/35第 15回 CloudStackユーザ会

CloudStackで管理された VMでPCIパススルー使いたい!

Page 16: もしCloudStackのKVMホストでPCIパススルーできるようになったら

16/35第 15回 CloudStackユーザ会

ヒント: CloudStackはOSSです

Page 17: もしCloudStackのKVMホストでPCIパススルーできるようになったら

17/35第 15回 CloudStackユーザ会

ないなら書けばいいじゃない

Page 18: もしCloudStackのKVMホストでPCIパススルーできるようになったら

18/35第 15回 CloudStackユーザ会

もしOSSが大好きな大学院生がCloudStackのソースを書き換えてPCIパススルーの初期実装をしたら

Page 19: もしCloudStackのKVMホストでPCIパススルーできるようになったら

19/35第 15回 CloudStackユーザ会

構築環境

■物理マシン 1台で作ります■ IPアドレス 30-50個くらい

– なければOpenBlockSとかで LANを作ろう■ Proxyを通過しなくて良いネットワーク

Page 20: もしCloudStackのKVMホストでPCIパススルーできるようになったら

20/35第 15回 CloudStackユーザ会

物理リソースの準備

■物理マシン 1台で作ります■ IPアドレス 30-50個くらい

– OpenBlockS等で LANを作る■ Proxyを通過しなくて良いネットワーク

☑ Core i7 3770 ☑ 32GB RAM ☑ 2 x 2TB HDD ☑ Intel VT-x ☑ Intel VT-d

192.168.1.20 10.10.0.0/16

・ 4スレッド以上・ 8GB以上・ 500GB以上・ VT-x必須・ VT-dも多分必要

Page 21: もしCloudStackのKVMホストでPCIパススルーできるようになったら

21/35第 15回 CloudStackユーザ会

構築手順

■ CentOSのインストール■ IOMMUの有効化■ CloudStackのソース書き換え■ CloudStackのビルドとインストール■ PCIパススルーのテスト

Page 22: もしCloudStackのKVMホストでPCIパススルーできるようになったら

22/35第 15回 CloudStackユーザ会

CentOSのインストール

■何も難しいことはありません

Page 23: もしCloudStackのKVMホストでPCIパススルーできるようになったら

23/35第 15回 CloudStackユーザ会

IOMMUの有効化

■ /boot/grub/grub.conf

title CentOS (2.6.32-358.18.1.el6.x86_64)root (hd0,0)kernel /vmlinuz-2.6.32-358.18.1.el6.x86_64 ro

root=/dev/mapper/vg_mami-lv_root nomodeset rd_NO_LUKS rd_LVM_LV=vg_mami/lv_root LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_mami/lv_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet intel_iommu=on

initrd /initramfs-2.6.32-358.18.1.el6.x86_64.img

Page 24: もしCloudStackのKVMホストでPCIパススルーできるようになったら

24/35第 15回 CloudStackユーザ会

IOMMUの有効化

■再起動後 dmesgで確認します

# dmesg | grep IOMMUIntel-IOMMU: enableddmar: IOMMU 0: reg_base_addr fed90000 ver 1:0 cap c9008020660262 ecap f0105aIOMMU 0xfed90000: using Queued invalidationIOMMU: Setting RMRR:IOMMU: Setting identity map for device 0000:00:1d.0 [0xdeb11000 - 0xdeb2d000]IOMMU: Setting identity map for device 0000:00:1a.0 [0xdeb11000 - 0xdeb2d000]IOMMU: Setting identity map for device 0000:00:14.0 [0xdeb11000 - 0xdeb2d000]IOMMU: Prepare 0-16MiB unity mapping for LPCIOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0x1000000]

Page 25: もしCloudStackのKVMホストでPCIパススルーできるようになったら

25/35第 15回 CloudStackユーザ会

CloudStackのビルド

■ビルドに必要なソフトウェアのインストール

# yum groupinstall "Development Tools"# yum install java-1.6.0-openjdk-devel.x86_64 genisoimage mysql mysql-server ws-commons-util MySQL-python tomcat6 createrepo# yum install git wget -y# wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/maven/maven-3/3.1.0/binaries/apache-maven-3.1.0-bin.tar.gz# tar xf apache-maven-3.1.0-bin.tar.gz # mv apache-maven-3.1.0 /usr/local/# echo 'export PATH=/usr/local/apache-maven-3.1.0/bin:$PATH' >> ~/.bashrc# echo 'export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/' >> ~/.bashrc# source ~/.bashrc

Page 26: もしCloudStackのKVMホストでPCIパススルーできるようになったら

26/35第 15回 CloudStackユーザ会

CloudStackのビルド

■パッチを当ててビルドするhttps://gist.github.com/penguin2716/6547798

# patch -p0 < ../patches/LibvirtComputingResource.java.patch patching file plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java# patch -p0 < ../patches/LibvirtVMDef.java.patch patching file plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java# cd packaging/centos63Generating RPMs is done using the package.sh script:# ./package.sh

Page 27: もしCloudStackのKVMホストでPCIパススルーできるようになったら

27/35第 15回 CloudStackユーザ会

CloudStackのビルド

■失敗しました

[ERROR] error: error reading /root/.m2/repository/org/apache/axis2/mex/1.5.4/mex-1.5.4-impl.jar; error in opening zip file[ERROR] error: error reading /root/.m2/repository/org/apache/axis2/axis2-mtompolicy/1.5.4/axis2-mtompolicy-1.5.4.jar; error in opening zip file[ERROR] error: error reading /root/.m2/repository/org/apache/ws/commons/axiom/axiom-dom/1.2.10/axiom-dom-1.2.10.jar; error in opening zip file[ERROR] error: error reading /root/.m2/repository/org/opensaml/opensaml1/1.1/opensaml1-1.1.jar; error in opening zip file[ERROR] error: error reading /root/.m2/repository/commons-lang/commons-lang/2.3/commons-lang-2.3.jar; error in opening zip file

Page 28: もしCloudStackのKVMホストでPCIパススルーできるようになったら

28/35第 15回 CloudStackユーザ会

CloudStackのビルド

■なぜか jarファイルのはずなのに HTML…

■別のサーバから wgetして対応

# file /root/.m2/repository/org/apache/axis2/mex/1.5.4/mex-1.5.4-impl.jar/root/.m2/repository/org/apache/axis2/mex/1.5.4/mex-1.5.4-impl.jar: HTML document text

# cd /root/.m2/repository/org/apache/axis2/mex/1.5.4/# mv mex-1.5.4-impl.jar mex-1.5.4-impl.jar.html# wget http://mirrors.ibiblio.org/maven2/org/apache/axis2/mex/1.5.4/mex-1.5.4-impl.jar# file mex-1.5.4-impl.jarmex-1.5.4-impl.jar: Zip archive data, at least v1.0 to extract

Page 29: もしCloudStackのKVMホストでPCIパススルーできるようになったら

29/35第 15回 CloudStackユーザ会

CloudStackのビルド

■再ビルドしますerrorって出てますが動作します# cd /root/apache-cloudstack-4.1.1-src/packaging/centos63/# ./package.shWrote: /root/apache-cloudstack-4.1.1-src/dist/rpmbuild/RPMS/x86_64/cloudstack-awsapi-4.1.1-0.el6.x86_64.rpmExecuting(%clean): /bin/sh -e /var/tmp/rpm-tmp.SPN9Hm+ umask 022+ cd /root/apache-cloudstack-4.1.1-src/packaging/centos63/../../dist/rpmbuild/BUILD+ cd cloudstack-4.1.1+ '[' /root/apache-cloudstack-4.1.1-src/dist/rpmbuild/BUILDROOT/cloudstack-4.1.1-0.el6.x86_64 '!=' / ']'+ rm -rf /root/apache-cloudstack-4.1.1-src/dist/rpmbuild/BUILDROOT/cloudstack-4.1.1-0.el6.x86_64+ exit 0error: File /root/apache-cloudstack-4.1.1-src/dist/rpmbuild/ is not a regular file.

Page 30: もしCloudStackのKVMホストでPCIパススルーできるようになったら

30/35第 15回 CloudStackユーザ会

CloudStackのビルド

■ createrepoコマンドでリポジトリ作成

# cd /root/apache-cloudstack-4.1.1-src/dist/rpmbuild/RPMS/x86_64# createrepo .Spawning worker 0 with 6 pkgsWorkers FinishedGathering worker results

Saving Primary metadataSaving file lists metadataSaving other metadataGenerating sqlite DBsSqlite DBs complete

Page 31: もしCloudStackのKVMホストでPCIパススルーできるようになったら

31/35第 15回 CloudStackユーザ会

CloudStackのビルド

■ /etc/yum.repos.d/cloudstack.repo

[apache-cloudstack-4.1]name=Apache CloudStack 4.1 with PCI Pass-through supportbaseurl=file:///root/apache-cloudstack-4.1.1-src/dist/rpmbuild/RPMS/x86_64enabled=1gpgcheck=0

Page 32: もしCloudStackのKVMホストでPCIパススルーできるようになったら

32/35第 15回 CloudStackユーザ会

/var/local/pci-attach-list

■ここに VMのインスタンス名とアタッチする PCIデバイスのアドレスを記述– デバイスのアドレスは lspciで確認

# lspci | grep -i audio00:1b.0 Audio device: Intel Corporation 7 Series/C210 Series Chipset Family High Definition Audio Controller (rev 04)01:00.1 Audio device: NVIDIA Corporation Device 0e1b (rev a1)

# cat /var/local/pci-attach-listi-2-3-VM 00:0b.0

Page 33: もしCloudStackのKVMホストでPCIパススルーできるようになったら

33/35第 15回 CloudStackユーザ会

仮想マシンを起動して確認

■ Intel High Definition Autio

$ lspci00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)00:02.0 VGA compatible controller: Cirrus Logic GD 544600:03.0 Ethernet controller: Red Hat, Inc Virtio network device00:04.0 SCSI storage controller: Red Hat, Inc Virtio block device00:05.0 Audio device: Intel Corporation Panther Point High Definition Audio Controller (rev 04)00:06.0 RAM memory: Red Hat, Inc Virtio memory balloon

Page 34: もしCloudStackのKVMホストでPCIパススルーできるようになったら

34/35第 15回 CloudStackユーザ会

仮想マシンを起動して確認

■ NVIDIA GeForce GT 640

Page 35: もしCloudStackのKVMホストでPCIパススルーできるようになったら

35/35第 15回 CloudStackユーザ会

まとめ

■ CloudStack上の VMで PCIパススルーしたい■ Libvirtの設定ファイルを書き換えれば良い■ CloudStackのソースを書き換えて実現■ VM上で NVIDIA GeForce GT 640を認識■パッチはここにあります

https://gist.github.com/penguin2716/6547798