• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
もしCloudStackのKVMホストでPCIパススルーできるようになったら
 

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

on

  • 2,847 views

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

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

Statistics

Views

Total Views
2,847
Views on SlideShare
2,792
Embed Views
55

Actions

Likes
5
Downloads
11
Comments
0

1 Embed 55

https://twitter.com 55

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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