UbuntuにはLTS Enablement Stacksという仕組みがあって、Ubuntuのバージョンを維持しつつ、カーネルを通常バージョンより新しいものを利用できます。 標準のカーネルは4.15ベースです。ハードウェアの都合で標準カーネルだとうまく動かない場合、HWEカーネルを利用するとうまくいくことがあります。そんな時に役立つ仕組みです。
今回は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)
というわけで、対処がされるかはわからないですが一応報告しておきました。
「対処されるかわからない」と書いたのは別に嫌味とかでは全くなくて、すでに新しい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向けにバニラカーネルを使ってカーネルビルドする