More Related Content Similar to もしCloudStackのKVMホストでPCIパススルーできるようになったら
Similar to もしCloudStackのKVMホストでPCIパススルーできるようになったら (20) More from Takuma Nakajima
More from Takuma Nakajima (12) もしCloudStackのKVMホストでPCIパススルーできるようになったら1. 1/35第 15 回 CloudStack ユーザ会
CloudStack on KVM での
PCI&USB パススルー
電気通信大学
中島 拓真
@penguin2716
2. 2/35第 15 回 CloudStack ユーザ会
今日は PCI パススルーのお話をします
( USB …パススルーは準備できませんでした )
3. 3/35第 15 回 CloudStack ユーザ会
もし CloudStack の KVM ホストで
PCI パススルーできるようになったら
電気通信大学
中島 拓真
@penguin2716
4. 4/35第 15 回 CloudStack ユーザ会
自己紹介
■ 所属:電気通信大学
情報システム学研究科( M1 )
■ 研究:クラウド上の VM での GPU 利用,
OpenFlow 関連(予定)
■ 開発: mikutter プラグイン,
CloudStack 3 行スクリプト
■ Twitter :ぺんぎんさん
@penguin2716
5. 5/35第 15 回 CloudStack ユーザ会
Agenda
■ PCI/USB パススルーのお話
■ CloudStack の VM で PCI パススルーするには
■ ソースの書き換え
■ ビルドと認識テスト
6. 6/35第 15 回 CloudStack ユーザ会
{PCI,USB} パススルーのイメージ
■ 通常:リソースプールのリソースを利用
■ パススルー:仮想マシンがデバイスに
直接アクセスする
Hypervisor
Device
Resource Pool
Device Device Device
VM VM VM VM
7. 7/35第 15 回 CloudStack ユーザ会
パススルーする利点 / 欠点
■ 利点
– デバイスを占有できる
– オーバーヘッドが小さくパフォーマンスが良い
■ 欠点
– デバイスに関連付けられるので
VM のマイグレーションができなくなる
– クラウドの利点であるはずのリソース共有が
できなくなる
– 動かないデバイスもある気がする
8. 8/35第 15 回 CloudStack ユーザ会
どんなときに利用するの?
■ GPU を VM から利用したい
– NVIDIA GRID みたいな感じ
■ NIC を占有させたい
– 高速なネットワークを分離して提供
■ FPGA ボードが使いたい
– 研究用途とか
■ USB メモリ使いたい
– USB-IP とか使えよ
9. 9/35第 15 回 CloudStack ユーザ会
CloudStack で PCI パススルーするには
■ CloudStack の VM はどうやって作られるか
– ユーザが WebUI から操作
– Libvirt に VM を作る命令が飛ぶ
– qemu-kvm で VM を作る
CloudStack WebUI
Libvirt
KVM Xen ESXi
Libvirt で指定できれば
パススルーできそう
10. 10/35第 15 回 CloudStack ユーザ会
Libvirt による VM 生成
■ ハイパーバイザによって異なる
コマンドや API を抽象化
– どのハイパーバイザでも同じコマンドが利用可能
– CloudStack からは Libvirt のコマンドが叩かれる
■ CloudStack では VM が起動する度に
VM の設定ファイルが再生成される
– 起動中の VM の設定ファイルを書き換えても
あまり意味がない
11. 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>
12. 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>
# lspci
00: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...
13. 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
14. 14/35第 15 回 CloudStack ユーザ会
PCI デバイスを使う大まかな流れ
■ ホストからデバイスを detach
■ VM で利用
■ VM を終了
■ ホストにデバイスを reattach
← この間はホストで利用不可
15. 15/35第 15 回 CloudStack ユーザ会
CloudStack で管理された VM で
PCI パススルー使いたい!
16. 16/35第 15 回 CloudStack ユーザ会
ヒント: CloudStack は OSS です
18. 18/35第 15 回 CloudStack ユーザ会
もし OSS が大好きな大学院生が
CloudStack のソースを書き換えて
PCI パススルーの初期実装をしたら
19. 19/35第 15 回 CloudStack ユーザ会
構築環境
■ 物理マシン 1 台で作ります
■ IP アドレス 30-50 個くらい
– なければ OpenBlockS とかで LAN を作ろう
■ Proxy を通過しなくて良いネットワーク
20. 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 も多分必要
21. 21/35第 15 回 CloudStack ユーザ会
構築手順
■ CentOS のインストール
■ IOMMU の有効化
■ CloudStack のソース書き換え
■ CloudStack のビルドとインストール
■ PCI パススルーのテスト
22. 22/35第 15 回 CloudStack ユーザ会
CentOS のインストール
■ 何も難しいことはありません
23. 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
24. 24/35第 15 回 CloudStack ユーザ会
IOMMU の有効化
■ 再起動後 dmesg で確認します
# dmesg | grep IOMMU
Intel-IOMMU: enabled
dmar: IOMMU 0: reg_base_addr fed90000 ver 1:0 cap c9008020660262 ecap
f0105a
IOMMU 0xfed90000: using Queued invalidation
IOMMU: 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 LPC
IOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0x1000000]
25. 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
26. 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/LibvirtComputing
Resource.java
# patch -p0 < ../patches/LibvirtVMDef.java.patch
patching file
plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
# cd packaging/centos63
Generating RPMs is done using the package.sh script:
# ./package.sh
27. 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
28. 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.jar
mex-1.5.4-impl.jar: Zip archive data, at least v1.0 to extract
29. 29/35第 15 回 CloudStack ユーザ会
CloudStack のビルド
■ 再ビルドします
error って出てますが動作します
# cd /root/apache-cloudstack-4.1.1-src/packaging/centos63/
# ./package.sh
Wrote: /root/apache-cloudstack-4.1.1-src/dist/rpmbuild/RPMS/x86_64/cloudstack-
awsapi-4.1.1-0.el6.x86_64.rpm
Executing(%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 0
error: File /root/apache-cloudstack-4.1.1-src/dist/rpmbuild/ is not a regular file.
30. 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 pkgs
Workers Finished
Gathering worker results
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
31. 31/35第 15 回 CloudStack ユーザ会
CloudStack のビルド
■ /etc/yum.repos.d/cloudstack.repo
[apache-cloudstack-4.1]
name=Apache CloudStack 4.1 with PCI Pass-through support
baseurl=file:///root/apache-cloudstack-4.1.1-
src/dist/rpmbuild/RPMS/x86_64
enabled=1
gpgcheck=0
32. 32/35第 15 回 CloudStack ユーザ会
/var/local/pci-attach-list
■ ここに VM のインスタンス名と
アタッチする PCI デバイスのアドレスを記述
– デバイスのアドレスは lspci で確認
# lspci | grep -i audio
00:1b.0 Audio device: Intel Corporation 7 Se
ries/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-list
i-2-3-VM 00:0b.0
33. 33/35第 15 回 CloudStack ユーザ会
仮想マシンを起動して確認
■ Intel High Definition Autio
$ lspci
00: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 5446
00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
00:04.0 SCSI storage controller: Red Hat, Inc Virtio block device
00: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
34. 34/35第 15 回 CloudStack ユーザ会
仮想マシンを起動して確認
■ NVIDIA GeForce GT 640
35. 35/35第 15 回 CloudStack ユーザ会
まとめ
■ CloudStack 上の VM で PCI パススルーしたい
■ Libvirt の設定ファイルを書き換えれば良い
■ CloudStack のソースを書き換えて実現
■ VM 上で NVIDIA GeForce GT 640 を認識
■ パッチはここにあります
https://gist.github.com/penguin2716/6547798