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

5,137 views

Published on

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

Published in: Technology

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

  1. 1. 1/35第 15 回 CloudStack ユーザ会 CloudStack on KVM での PCI&USB パススルー 電気通信大学 中島 拓真 @penguin2716
  2. 2. 2/35第 15 回 CloudStack ユーザ会 今日は PCI パススルーのお話をします ( USB …パススルーは準備できませんでした )
  3. 3. 3/35第 15 回 CloudStack ユーザ会 もし CloudStack の KVM ホストで PCI パススルーできるようになったら 電気通信大学 中島 拓真 @penguin2716
  4. 4. 4/35第 15 回 CloudStack ユーザ会 自己紹介 ■ 所属:電気通信大学    情報システム学研究科( M1 ) ■ 研究:クラウド上の VM での GPU 利用,     OpenFlow 関連(予定) ■ 開発: mikutter プラグイン,     CloudStack 3 行スクリプト ■ Twitter :ぺんぎんさん      @penguin2716
  5. 5. 5/35第 15 回 CloudStack ユーザ会 Agenda ■ PCI/USB パススルーのお話 ■ CloudStack の VM で PCI パススルーするには ■ ソースの書き換え ■ ビルドと認識テスト
  6. 6. 6/35第 15 回 CloudStack ユーザ会 {PCI,USB} パススルーのイメージ ■ 通常:リソースプールのリソースを利用 ■ パススルー:仮想マシンがデバイスに 直接アクセスする Hypervisor Device Resource Pool Device Device Device VM VM VM VM
  7. 7. 7/35第 15 回 CloudStack ユーザ会 パススルーする利点 / 欠点 ■ 利点 – デバイスを占有できる – オーバーヘッドが小さくパフォーマンスが良い ■ 欠点 – デバイスに関連付けられるので VM のマイグレーションができなくなる – クラウドの利点であるはずのリソース共有が できなくなる – 動かないデバイスもある気がする
  8. 8. 8/35第 15 回 CloudStack ユーザ会 どんなときに利用するの? ■ GPU を VM から利用したい – NVIDIA GRID みたいな感じ ■ NIC を占有させたい – 高速なネットワークを分離して提供 ■ FPGA ボードが使いたい – 研究用途とか ■ USB メモリ使いたい – USB-IP とか使えよ
  9. 9. 9/35第 15 回 CloudStack ユーザ会 CloudStack で PCI パススルーするには ■ CloudStack の VM はどうやって作られるか – ユーザが WebUI から操作 – Libvirt に VM を作る命令が飛ぶ – qemu-kvm で VM を作る CloudStack WebUI Libvirt KVM Xen ESXi Libvirt で指定できれば パススルーできそう
  10. 10. 10/35第 15 回 CloudStack ユーザ会 Libvirt による VM 生成 ■ ハイパーバイザによって異なる コマンドや API を抽象化 – どのハイパーバイザでも同じコマンドが利用可能 – CloudStack からは Libvirt のコマンドが叩かれる ■ CloudStack では VM が起動する度に VM の設定ファイルが再生成される – 起動中の VM の設定ファイルを書き換えても あまり意味がない
  11. 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. 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. 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. 14/35第 15 回 CloudStack ユーザ会 PCI デバイスを使う大まかな流れ ■ ホストからデバイスを detach ■ VM で利用 ■ VM を終了 ■ ホストにデバイスを reattach ← この間はホストで利用不可
  15. 15. 15/35第 15 回 CloudStack ユーザ会 CloudStack で管理された VM で PCI パススルー使いたい!
  16. 16. 16/35第 15 回 CloudStack ユーザ会 ヒント: CloudStack は OSS です
  17. 17. 17/35第 15 回 CloudStack ユーザ会 ないなら書けばいいじゃない
  18. 18. 18/35第 15 回 CloudStack ユーザ会 もし OSS が大好きな大学院生が CloudStack のソースを書き換えて PCI パススルーの初期実装をしたら
  19. 19. 19/35第 15 回 CloudStack ユーザ会 構築環境 ■ 物理マシン 1 台で作ります ■ IP アドレス 30-50 個くらい – なければ OpenBlockS とかで LAN を作ろう ■ Proxy を通過しなくて良いネットワーク
  20. 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. 21/35第 15 回 CloudStack ユーザ会 構築手順 ■ CentOS のインストール ■ IOMMU の有効化 ■ CloudStack のソース書き換え ■ CloudStack のビルドとインストール ■ PCI パススルーのテスト
  22. 22. 22/35第 15 回 CloudStack ユーザ会 CentOS のインストール ■ 何も難しいことはありません
  23. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 34/35第 15 回 CloudStack ユーザ会 仮想マシンを起動して確認 ■ NVIDIA GeForce GT 640
  35. 35. 35/35第 15 回 CloudStack ユーザ会 まとめ ■ CloudStack 上の VM で PCI パススルーしたい ■ Libvirt の設定ファイルを書き換えれば良い ■ CloudStack のソースを書き換えて実現 ■ VM 上で NVIDIA GeForce GT 640 を認識 ■ パッチはここにあります https://gist.github.com/penguin2716/6547798

×