Proxmox VE 6.3でConnectX-3のSR-IOVを使う
試した環境
- Proxmox VE 6.3-3
- Supermicro X10DRi
- Mellanox ConnectX-3 Pro EN (MCX314A-BCCT)
手順
ConnectXカードのSR-IOV設定が有効になっていれば、confファイルを1つ作るだけでSR-IOVが使えるようになる。
カードのSR-IOVが有効になってない、有効か確認したい場合はページ後半を参照。
mlx4_coreモジュールの設定
/etc/modprobe.d/mlx4.confに以下の記述を追加する。
options mlx4_core port_type_array=2,2 num_vfs=4,0,0 probe_vf=0,0,0
パラメータの意味は下表のとおり。
パラメータ | 引数 | 説明 |
---|---|---|
port_type_array | p1, p2 | カードの物理ポートの通信プロトコルを指定する。 p1がポート1, p2がポート2を表し、値は1=InfiniBand、2=Ethernetを表す。 |
num_vfs | p1, p2, p1+2 | 物理ポートごとに生成されるVF数を指定する。 p1がポート1, p2がポート2, p1+2が両ポートに属するVFの数を表す。各値の合計はファームウェアのNUM_OF_VFS以下でなければならない。 |
probe_vfs | p1, p2, p1+2 | ホストでネットワークデバイスとして検出するVF数を指定する。 0以上を指定すると、VFがホスト側にネットワークデバイスとして認識されるようになる。 引数の意味と制約条件はnum_vfsと同様。加えて合計値はnum_vfs以下でなければならない。 |
initramfsの更新と確認
confファイルを作ったら、initramfsを更新しマシンを再起動する。
# update-initramfs -u -k all # reboot
上手く設定できてれば、指定数のVFがPCIデバイスとして生えてくる。
prove_vfを設定すると、ホスト側でネットワークデバイスとして認識される。下図はprobe_vf=4,0,0とした時のip linkの結果だが、物理ポート1に4つのVFを指定してるハズなのに、ens1とens1d1の両方にVFが出来てるのは何故…
カードのSR-IOV設定の有効化
上記の設定でVFが出てこない場合、カードのファームウェアのSR-IOVとVF数の設定を確認する。
PVEのホスト側にコンパイラやMFT (Mellanox Firmware Tools)を入れる事になるので、環境を汚したくなければ別マシンで確認&設定を行ってもよい。
ツールチェインのインストール
MFTのインストールに必要なツールチェイン類を入れる。
# apt install gcc make dkms pve-headers-$(uname -r)
もしかすると、非商用リポジトリを追加しとかないとダメかも?
# echo 'deb http://download.proxmox.com/debian/pve buster pve-no-subscription' >> /etc/apt/sources.list
MFTのインストール
公式サイトからMFTのDebian向けパッケージを取ってくる。本記事執筆時は4.16.0-105が最新だった。
# wget https://www.mellanox.com/downloads/MFT/mft-4.16.0-105-x86_64-deb.tgz
展開してインストールスクリプトを実行。
# tar -xvf ./mft-4.16.0-105-x86_64-deb.tgz # cd mft-4.16.0-105-x86_64-deb/ # ./install.sh
カードの状態の確認
MFTを使うにはmstを起動しておく必要がある。
# mst start Starting MST (Mellanox Software Tools) driver set Loading MST PCI module - Success Loading MST PCI configuration module - Success Create devices
mlxconfigでカードの状態を確認する。
表示されたConfigurationsで、SRIOV_ENがTrue、NUM_OF_VFSが1以上になっていれば、カードのSR-IOVは有効になっている。
# mlxconfig q Device #1: ---------- Device type: ConnectX3Pro Device: /dev/mst/mt4103_pciconf0 Configurations: Next Boot SRIOV_EN True(1) NUM_OF_VFS 8 LOG_BAR_SIZE 3 BOOT_OPTION_ROM_EN_P1 True(1) BOOT_VLAN_EN_P1 False(0) BOOT_RETRY_CNT_P1 0 LEGACY_BOOT_PROTOCOL_P1 PXE(1) BOOT_VLAN_P1 1 BOOT_OPTION_ROM_EN_P2 True(1) BOOT_VLAN_EN_P2 False(0) BOOT_RETRY_CNT_P2 0 LEGACY_BOOT_PROTOCOL_P2 PXE(1) BOOT_VLAN_P2 1 IP_VER_P1 IPv4(0) IP_VER_P2 IPv4(0) CQ_TIMESTAMP True(1)
カードのSR-IOVの有効化
カードのSR-IOVが有効になっていなければ有効化する。
NUM_OF_VFSには1~127を指定できるようだ。最大値はPCI BARサイズやシステムのリソース量に制限されるので、まぁほどほどに。
# mlxconfig -d /dev/mst/mt4103_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=16 Device #1: ---------- Device type: ConnectX3Pro Device: /dev/mst/mt4103_pciconf0 Configurations: Next Boot New SRIOV_EN False(0) True(1) NUM_OF_VFS 8 16 Apply new Configuration? (y/n) [n] : y Applying... Done! -I- Please reboot machine to load new configurations.