ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

Ubuntu 18.04 + HWE Kernelでvfio-pciが利用できない

UbuntuにはLTS Enablement Stacksという仕組みがあって、Ubuntuのバージョンを維持しつつ、カーネルを通常バージョンより新しいものを利用できます。 標準のカーネルは4.15ベースです。ハードウェアの都合で標準カーネルだとうまく動かない場合、HWEカーネルを利用するとうまくいくことがあります。そんな時に役立つ仕組みです。

wiki.ubuntu.com

今回はUbuntu Server 18.04なので 次のコマンドを実行して再起動すると、5.4系のLinux kernelでUbuntu 18.04を起動できます。

$ sudo apt-get install --install-recommends linux-generic-hwe-18.04

通常利用に問題はないのですが、ある時vfio-pciモジュールの利用が必要だったので、 sudo modprobe vfio-pci とかやってとあるアプリケーション(DPDKなんですけど)を実行したらうまくいきませんでした。おかしいな。以前はこれでうまくいったのに。

~$ sudo dpdk-devbind –b vfio-pci 0000:08:11.0
Error: No action specified for devices.Please give a -b or -u option
Run '/sbin/dpdk-devbind --usage' for further information

~$ sudo dpdk-devbind -b vfio-pci 0000:08:11.0
Error: bind failed for 0000:08:11.0 - Cannot bind to driver vfio-pci
Error: unbind failed for 0000:08:11.0 - Cannot open /sys/bus/pci/drivers//unbind

そこで、とりあえずモジュールがどこにあるか確認することにしました。すると、vfio-pciというモジュールはないというメッセージが表示されます。

~$ modinfo vfio-pci
modinfo: ERROR: Module vfio-pci not found.

そんなモジュールはないと。そんなばかな。

Ubuntu 18.04の標準カーネルである4.15系のカーネルを使っていた頃は、vfio-pciモジュールは利用できていました。というわけで、その時は手っ取り早くBionic標準カーネルで起動して暫定対処したものの、原因を調査することにしました。

現在StableのUbuntu 18.04 HWEカーネルの元となっているカーネルはUbuntu 20.04の標準カーネルである5.4系カーネルです。 Ubuntu 20.04で modinfo vfio-pciを実行すると、次のようになります。

カーネルモジュールではなく、ビルトインになっています。

~$ modinfo vfio-pci
name:           vfio_pci
filename:       (builtin)
description:    VFIO PCI - User Level meta-driver
author:         Alex Williamson <alex.williamson@redhat.com>
license:        GPL v2
version:        0.2
parm:           ids:Initial PCI IDs to add to the vfio driver, format is "vendor:device[:subvendor[:subdevice[:class[:class_mask]]]]" and multiple comma separated entries can be specified (string)
parm:           nointxmask:Disable support for PCI 2.3 style INTx masking.  If this resolves problems for specific devices, report lspci -vvvxxx to linux-pci@vger.kernel.org so the device can be fixed automatically via the broken_intx_masking flag. (bool)
parm:           disable_vga:Disable VGA resource access through vfio-pci (bool)
parm:           disable_idle_d3:Disable using the PCI D3 low power state for idle, unused devices (bool)

先日リリースされたばかりのUbuntu 20.10も、同様にビルトインモジュールになっていました。

一方で、Ubuntu 18.04の標準カーネルの場合は次のように出力されます。

$ modinfo vfio-pci
filename:       /lib/modules/4.15.0-122-generic/kernel/drivers/vfio/pci/vfio-pci.ko
description:    VFIO PCI - User Level meta-driver
author:         Alex Williamson <alex.williamson@redhat.com>
license:        GPL v2
version:        0.2
srcversion:     1E92A800B94EAE7B392AD50
depends:        vfio,irqbypass,vfio_virqfd
retpoline:      Y
intree:         Y
name:           vfio_pci
vermagic:       4.15.0-122-generic SMP mod_unload 
signat:         PKCS#7
signer:         
sig_key:        
sig_hashalgo:   md4
parm:           ids:Initial PCI IDs to add to the vfio driver, format is "vendor:device[:subvendor[:subdevice[:class[:class_mask]]]]" and multiple comma separated entries can be specified (string)
parm:           nointxmask:Disable support for PCI 2.3 style INTx masking.  If this resolves problems for specific devices, report lspci -vvvxxx to linux-pci@vger.kernel.org so the device can be fixed automatically via the broken_intx_masking flag. (bool)
parm:           disable_vga:Disable VGA resource access through vfio-pci (bool)
parm:           disable_idle_d3:Disable using the PCI D3 low power state for idle, unused devices (bool)

というわけで、対処がされるかはわからないですが一応報告しておきました。

bugs.launchpad.net

「対処されるかわからない」と書いたのは別に嫌味とかでは全くなくて、すでに新しいUbuntu 20.04 LTSがリリースされていますし、その後のUbuntu 20.10がリリースされたということは20.10のカーネルであるLinux kernel 5.8ベースのHWEカーネルがそのうちリリースされるだろうし、新しいバージョンで動くならそれでいいだろうみたいな楽観的に考えてます。

対処方法

考えられる対処方法は以下があります。ただ、Ubuntu 20.04 LTSを使うのが最も適切のような気がします。 下に行くほど大変だと思います。

  • Ubuntu 20.04 LTSに移行する
  • vfio-pci以外のモジュールの利用を検討する
  • Ubuntu 18.04 LTSの標準カーネルで問題なく動くならそれで使う
  • Ubuntu 18.04 LTS向けHWEカーネルのソースを使って修正してカーネルビルドする
  • Ubuntu 18.04 LTS向けにバニラカーネルを使ってカーネルビルドする

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。