VMware vSphereにはPCI接続のデバイスを直接仮想マシンに認識させることができる「VMDirectPath I/O」という機能があります。この機能を使うと、仮想化のオーバーヘッドを極力減らした状態で物理デバイスを利用できます。今回、VMDirectPath I/Oをコマンドラインでうまく認識させることが出来なかったので、調べた情報などをまとめておきたいと思います。
1. VMDirectPath I/Oでデバイスを利用するための事前設定
まずはVMDirectPath I/Oの動作確認をするための環境を用意します。今回は以下のような環境で検証を行いました。
項目 | 値 |
---|---|
機種 | Fujitsu Primergy TX100 S3P |
CPU | Xeon E3 1225 (4Core/4Thread) |
BIOS | VT-dを有効化 |
Hypervisor | VMware ESXi 6.0 Update2 (build 3620759) |
PCIデバイス | Intel SSD 910 400GB |
VMDirectPath I/Oの設定はvSphere Clientでの「構成」>ハードウェア枠内の「詳細設定」から行うことが出来ます。
詳細設定画面の右上にある「編集」をクリックするとVMDirectPath I/Oで利用する対象デバイスを選択できます。
ここではIntel SSD 910にチェックをつけてOKボタンをクリックします。設定はホストの再起動後に反映されます。以上で、VMDirectPath I/Oでデバイスを利用するための事前準備が完了します。
2. vSphere Clientを利用した仮想マシンへのPCIデバイスの接続
2-1. 前提条件
vSphere ClientやWeb ClientなどのGUI経由ではVMDirectPath I/Oの設定は簡単に実行でき、正常に完了します。なお、仮想マシンへのPCIデバイスの追加には以下の条件を満たす室用があります。
- 仮想マシンが停止状態であること
- 仮想マシンの予約メモリ容量が上限メモリ容量と一致していること(「すべてのメモリ領域を予約」にチェックをつける必要はない)
- BIOSモードの仮想マシンで1VMあたりの接続可能PCIデバイスの数はPCI BARサイズの合計が1GBまで
- uEFIモードの仮想マシンで1VMあたりの接続可能PCIデバイスの数はPCI BARサイズの合計が32GBまで
- 1ESXiホストあたり利用可能なPCIデバイスの数はPCI BARサイズの合計32GBまでに制限される
ここで出てきた「PCI BARサイズ」とは、PCIデバイスがそれぞれ持っているアドレス空間のサイズです。なおPCI BARには5つの領域があり、上記のBARサイズは5つの領域の合計容量です。BARサイズはLinux OSではlspci
コマンドで、ESXiではシェルログインしたうえでesxcfg-info
で確認可能です。
# esxcfg-info | less
(省略)
\==+PCI Device :
(省略)
|----Device Id.......................................0x0072
|----Sub-Vendor Id...................................0x8086
|----Sub-Device Id...................................0x3700
|----Vendor Name.....................................LSI Logic / Symbios Logic
|----Device Name.....................................Intel(R) SSD 910 Series
(省略)
\==+BAR Info :
\==+BAR0 :
|----Type......................................0x00000001
|----Address...................................0x000000000000e000
|----Size......................................256
|----Flags.....................................0x00000001
\==+BAR1 :
|----Type......................................0x00000003
|----Address...................................0x00000000f7dc0000
|----Size......................................16384
|----Flags.....................................0x00000004
\==+BAR2 :
|----Type......................................0x00000004
|----Address...................................0
|----Size......................................0
|----Flags.....................................0
\==+BAR3 :
|----Type......................................0x00000003
|----Address...................................0x00000000f7d80000
|----Size......................................262144
|----Flags.....................................0x00000004
\==+BAR4 :
|----Type......................................0x00000004
|----Address...................................0
|----Size......................................0
|----Flags.....................................0
\==+BAR5 :
|----Type......................................0
|----Address...................................0
|----Size......................................0
|----Flags.....................................0
(省略)
2-2. 仮想マシンへのPCIデバイスの接続(vSphere Client)
あらかじめ何らかの仮想マシンが作成されている前提で以下の説明を進めます。まず、仮想マシンの「設定の編集」を開始します。設定画面で「追加」ボタンをクリックします。
次に追加するデバイスとして「PCIデバイス」を選択します。
プルダウンリストにあらかじめ設定していたデバイスが表示されるので、接続したいデバイスを選択して次へ進みます。
設定内容を確認して「終了」ボタン句をクリックします。
仮想マシンの設定自体も完了させて、PCIデバイスの接続を確認します。
仮想マシンを起動する前に、メモリの割り当てと予約が同じ値になっていることをリソース設定から確認します。
メモリの予約の値が割り当てと一致していることを確認したら、仮想マシンを起動します。起動が完了したら、デバイスが認識されていることを確認します。
[root@localhost ~]# lsscsi
[0:0:0:0] disk VMware Virtual disk 1.0 /dev/sda
[0:0:1:0] disk VMware Virtual disk 1.0 /dev/sdb
[1:0:0:0] disk INTEL(R) SSD 910 200GB a424 /dev/sdc
[1:0:1:0] disk INTEL(R) SSD 910 200GB a424 /dev/sdd
[2:0:0:0] cd/dvd NECVMWar VMware IDE CDR00 1.00 /dev/sr0
以上でGUIからはVMDirectPath I/Oの設定が成功しました。
3. PowerCLIからのVMDirectPath I/Oの設定
VMwareの操作を行うコマンドラインツールにはいくつかの種類がありますが、今回取り上げるのはPowerCLIです。PowerCLIはPowerShellでVMware ESXiの操作ができるため、Windows版のvCenter Serverと相性が良く、私はよく業務で使っています。しかし、VMDirectPath I/Oの設定ではバグにより設定がうまくいきませんでした。
3-1. PowerCLIによるVMDirectPath I/Oの設定方法
仮想マシンにPCIデバイスを接続するためには、対象VMとデバイスのオブジェクトを作成し、Add-PassthroughDevice
コマンドレットで接続設定を行います。
PowerCLI C:\> Connect-VIServer (ESXiホスト名) PowerCLI C:\> $VM = Get-VM (VM名) PowerCLI C:\> $PCIDEVICE = Get-PassthroughDevice -VMHost (ESXiホスト名) -Name "(デバイス名)" PowerCLI C:\> Add-PassthroughDevice -VM $VM -PassthroughDevice $PCIDEVICE Key Name VendorName Type --- ---- ---------- ---- 13000 Intel(R) SSD 910 Series LSI Logic / Symbios Logic Pci
設定反映後に仮想マシンの電源を入れると以下のようなエラーが出て起動に失敗してしまいます。
3-2. 起動失敗の原因
原因はPowerCLIでPCIデバイスを設定する際に、「DeviceID」を間違って設定していることにあります。2-1.節で書いていたesxcfg-info
の結果によると、今回のPCIデバイスの「Device ID」は0x0072となります。この設定は仮想マシンのVMXファイルにも記述されます。しかし、PowerCLIで設定を行うと以下のようにPCIデバイスのDevice IDが間違った値で設定されてしまいます。
### GUIで設定した場合 ###
# grep pciPassthru0.deviceId (vmxファイル)
pciPassthru0.deviceId = "0x0072"
### PowerCLIで設定した場合 ###
# grep pciPassthru0.deviceId (vmxファイル)
pciPassthru0.deviceId = "0x0114"
これは、PowerCLIでPCIデバイスの情報を仮想マシンに追加する際にDevice IDを10進数から16進数に修正しないで設定変更リクエストを行っているためと思われます。0x72=114だからです。
4. 参考文献など
VMDirectPath I/Oの制限事項や今回の不具合に関する情報は、以下のようなコミュニティのやり取りに記述があります。PowerCLI 4.0のころからずっとこのままのようですので、そろそろ直してほしいものです。
- VMware ESX/ESXi ホスト上の VMDirectPath I/O パススルー デバイスの構成 (2078748)
- VMware vSphere VMDirectPath I/O:プラットフォームとデバイスの要件 (2144754)
- VMware DirectPath I/O – adding passthrough PCI devices to VM
さて、どうしたものかな・・・・・・