🫠

WSL2でXDPのxdp_drop_count.pyを動かすまで

2023/02/12に公開

はじめに

前回の記事ではWSL2にeBPF開発環境を構築してhello_worldを動作させました。
今回はeBPFのXDPをWSL2上で動作させるための環境構築をしていきます。

0. XDP対応状況の確認

WSLで使用しているネットワークドライバがXDPに対応しているか確認します

$ ethtool -i eth0 | grep driver
driver: hv_netvsc

上記からeth0がhv_netvscを使用しているのがわかったので、対応状況をマニュアルで確認します。

Microsoft hv_netvsc driver 5.6 351e1581395f

との記載があり、hv_netvscはkernelバージョン5.6以上であれば対応していることが確認できました。

1. カーネルの更新

前回の記事でカーネルのビルドまで済ませていたので、ビルドしたカーネルイメージを使ってWSL2を起動します。

$ cd WSL2-Linux-Kernel
$ cp vmlinux /mnc/c/Users/${ユーザ名}/AppData/Local/Temp
$ vi /mnc/c/Users/${ユーザ名}/.wslconfig
# 以下の内容を記述
[wsl2]
kernel=C:\\Users\\<username>\\AppData\\Local\\Temp\\vmlinux

次にWindows側のコマンドプロンプトから以下を実行しWSLを再起動します

$ wsl.exe --shutdown

再起動が完了したら再度WSLにログインして、カーネルが更新されていることを確認します
以下のようにXDPが有効になっていたら成功です
(2023/02/19 BTFの検索条件を追記しました)

$ zcat /proc/config.gz | grep -e BTF -e XDP
CONFIG_XDP_SOCKETS=y
CONFIG_XDP_SOCKETS_DIAG=y
CONFIG_DEBUG_INFO_BTF=y

2. bccの更新

前回はaptを使ってbccをインストールしましたが、aptを使ってインストールした場合、自分の環境では0.12.0-2がインストールされていました。
bccのリリース情報を見ていくと、自分のカーネルバージョンの5.15は、bccのv0.23.0まで対応しているようです。
ということで前回せっかくインストールしたbccですが、一旦削除してbccをビルドしてインストールしていくことにします。
基本的にここの手順に従ってインストールをしていきます。

# For Focal (20.04.1 LTS)
$ sudo apt install -y bison build-essential cmake flex git libedit-dev \
  libllvm12 llvm-12-dev libclang-12-dev python zlib1g-dev libelf-dev libfl-dev python3-distutils
$ git clone https://github.com/iovisor/bcc
$ cd bcc
$ git checkout -b v0.23.0 refs/tags/v0.23.0
$ mkdir build
$ cd build
$ cmake ..
$ make -j8
$ cd ..
$ pushd src/python/
$ make
$ sudo make install # 自分の環境ではここでエラーになったので以下実行しました
$ cd bcc-python3
$ python3 setup.py install
$ popd

3. 動作確認

bccリポジトリのexamples/networking/xdp以下にxdpのサンプルコードがあるので実行していきます。

$ cd bcc/examples/networking/xdp
$ sudo python3 xdp_drop_count.py eth0
Printing drops per IP protocol-number, hit CTRL+C to stop
17: 1 pkt/s

4. まとめ

前回に続き環境構築を実施していきました。
これでXDPを使ってネットワークまわりを、いじっていけそうです。
次回はいよいよXDPを使ったプログラミングをしていきたいと思います。

5. 参考文献

https://qiita.com/matarillo/items/bcae7e61ada3d1a7f9a4

Discussion