参考情報
まずは公式の情報を参考に実施すること推奨します。こちらの記事は私の環境の作業ログで色々不十分の可能があります。
- https://pve.proxmox.com/wiki/PCI(e)_Passthrough
- 公式フォーラム: https://forum.proxmox.com/threads/enabling-sr-iov-for-intel-nic-x550-t2-on-proxmox-6.56677/
環境
item | model | 必要機能 | 備考 |
CPU | intel 14900K | VT-d | ごく僅かにVT-d未対応CPUがあるので注意 |
Motherboard | MSI Z790 Carbon Wifi | SR-IOV | PCIEのパススルーはSR-IOVはZ790などチップセット側の機能も必要になります。 Gigabyte: ほぼ全て使えません ASRock: ほぼ全て使えます ASUS: ほぼ全て使えます MSI: 多分ほぼ全て使えます(Z790 Carbon Wifiの場合、BIOS右下のベータ用機能のところから有効にできます) |
SR-IOVでPCIEパススルーさせたいデバイス | intel X550-T2 | SR-IOV | intel NICの「Server」と名のつくやつは全機種使えるはずです。 (X550, X540, X520手元にありますが使えます) Mellanox ConnectX系もSR-IOV対応となっていますが、自分の環境だとうまくいきませんでした。カード側(ファームウェア)のSR-IOVを有効にする必要があるのと、一般人価格帯の古いカードはドライバアップデートが止まっており、少し値が貼るものの、intel NICが簡単で性能も十分良いのでおすすめです。 あと、X550とX540はWindowsで使う際に天と地の差があり、X550は結構古いカードですが、現行最新モデルとなってる都合上、未だ最新ドライバーアップデートが続いています。X540は止まっており、発熱も結構ありますのでなるべくX550を買うのを推奨します。 |
1. GRUBのkernelオプションを追加して、IOEMMUを有効化する
/etc/default/grub を青太字部分を以下の様に追加する。デフォルトは「”quiet”」のみのはず。
# vi /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt ixgbe.max_vfs=16"
GRUB_CMDLINE_LINUX=""
ixgbe(intel NICのドライバ)のmax_vfsを16→16個分仮想NICを作成(有効化)します。
この数の最大数は色々な制約条件で決定しますが、大量にしすぎても個人サーバレベルでは表示上かなり邪魔ですので、8~16くらいで十分と思います。不足してから変更すればよいと思います。
2. kernelモジュールを追加する
1.で指定したモジュール類が必ずロードされるように、/etc/modules へ明示的に列挙します。自分の場合は以下。
# vi /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
3. kernel initramfs 更新して再起動
update-initramfs -u -k all
ssssssssssssshutdown -r now
4. NICの有効化 *オプション
ホスト用のNICとゲスト用のNICが共通の場合は既に有効になってますので、この作業不要です。
自分の環境の場合、オンボードのNICをproxmoxホスト用ネットワーク、X550-T2をゲスト用としたい。
この場合、X550-T2は既定値ではNICが有効化されず、LANケーブルを差していようが、ゲストOS側から通信することができません。これを解消する為に、proxmoxホスト側でX550-T2(のポート)を有効にする必要があります。
色々、やり方あると思いますが、自分の場合簡単さから、birdgeネットワークを新しく一つ作って、適当なIPアドレスを割り当てることで、proxmosホスト側起動と同時にX550-T2のポートを有効化します。

たぶん、物理ポートのenp8s0f0もしくはenp8s0f1(使う方のポート)のどちらかを指定する必要があります。今回の場合、カード表から見て上のポートがenp8s0f0でしたのでこちらのポートをvmbr1のportに割り当てて適当(有効なIPですが)に振ってあります。これでOKです。
確認
再起動後、ネットワークインタフェースがめっちゃ増えているはず。
ip addr show | grep enp8
ip addr show | grep enp8s
3: enp8s0f0v0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
4: enp8s0f0v1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
5: enp8s0f0v2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
6: enp8s0f0v3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
7: enp8s0f0v4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
8: enp8s0f0v5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
9: enp8s0f0v6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
10: enp8s0f0v7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
11: enp8s0f0v8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
12: enp8s0f0v9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
13: enp8s0f0v10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
14: enp8s0f0v11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
15: enp8s0f0v12: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
16: enp8s0f0v13: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
17: enp8s0f0v14: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
18: enp8s0f0v15: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
19: enp8s0f0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
20: enp8s0f1v0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
21: enp8s0f1v1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
22: enp8s0f1v2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
23: enp8s0f1v3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
24: enp8s0f1v4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
25: enp8s0f1v5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
26: enp8s0f1v6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
27: enp8s0f1v7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
28: enp8s0f1v8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
29: enp8s0f1v9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
30: enp8s0f1v10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
31: enp8s0f1v11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
32: enp8s0f1v12: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
33: enp8s0f1v13: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
34: enp8s0f1v14: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
35: enp8s0f1v15: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
36: enp8s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
この増えたNIC(PCIEデバイス)をゲストにPCIEでアサインすると、PCIEパススルーの完成です。ホストのCPU負荷低減になり、結果的に速度向上します。
増えていない場合は、以下を確認してみてください。
- BIOSのSR-IOVが有効になっているか
- /etc/default/grubでIOEMMU有効化とIntel nicのVFS数デバイス数をちゃんと書いてるか
- /etc/modulesにモジュール追加と、update-initramfsなど、initramfsを更新しているか
- ホストOSを再起動させているか
- そもそも、CPUとマザーボード、NICがSR-IOVに対応しているのか?
コメント