こんにちは.大学院の後期授業も開始され,さらに多数イベントが同時並行で開催されており非常に忙しい日々を過ごしています.最近は将棋の勉強にも精を出しています.弱いですが. 今回はXDPが実行できるVMをVagrantで作ります. 先日GMOペパボさんのeBPFインターンシップ (opens new window)に参加させていただいて以降eBPF関連の技術に興味を持っておりXDPに手を出してみます.

# XDPとは

XDPとはeXpress Data Passの略で高速にパケット処理を行うことのできるLinuxカーネルの機能です(語彙力). 私自身まだ入門もしていないので詳しい説明は別の記事にまかせます.

# XDPに対応したVMを探して

xdp vagrantなどで検索するとgithub.com/iovisor/xdp-vagrant (opens new window)こちらのリポジトリに当たりますがこちらのVMは依存関係が解決できずうまくサンプルを実行できませんでした.さらにgithub.com/xdp-project/xdp-tutorial (opens new window)が見つかりますがこちらもbasic02あたりからつまずきます.そのほかいろいろネットを徘徊してみましたがいいものが見つかりません.

# ないので作る

適切なものが見つからないので作ることにしました.作るといってもベースは先ほどのgithub.com/iovisor/xdp-vagrant (opens new window)を流用させていただきました.使用するboxをgeneric/ubuntu2004に変更しています.

作ったVagrantfileはこちらのgist (opens new window)においてます.

  • Vagrantfile ポイントはlibvirt.nic_model_type = "e1000"です.XDPに対応したNICを選択する必要がありますね.
    ['vagrant-reload'].each do |plugin|
    unless Vagrant.has_plugin?(plugin)
        raise "Vagrant plugin #{plugin} is not installed!"
    end
    end
    Vagrant.configure('2') do |config|
    config.vm.box = "generic/ubuntu2004" # Ubuntu
    config.vm.network "private_network", ip: "192.168.50.4"
    # fix issues with slow dns https://www.virtualbox.org/ticket/13002
    config.vm.provider :libvirt do |libvirt|
        libvirt.connect_via_ssh = false
        libvirt.memory = 1024
        libvirt.cpus = 2
        libvirt.nic_model_type = "e1000"
    end
    config.vm.synced_folder "./", "/home/vagrant/work"
    config.vm.provision :shell, :privileged => true, :path => "setup.sh"
    end
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
  • setup.sh vmの起動時に実行されるスクリプトです.xdpのコードをビルドするためのソフト類を入れています.こちらのファイルはbcc python tutorial (opens new window)を元に作成しています.
    #!/bin/bash
    sudo apt update -y
    sudo apt install -y bison build-essential cmake flex git libedit-dev \
    libllvm7 llvm-7-dev libclang-7-dev python zlib1g-dev libelf-dev \
    python3-distutils clang
    git clone https://github.com/iovisor/bcc.git
    mkdir bcc/build; cd bcc/build
    cmake ..
    make
    sudo make install
    cmake -DPYTHON_CMD=python3 .. # build python3 binding
    pushd src/python/
    make
    sudo make install
    popd
    # install golang
    wget https://golang.org/dl/go1.15.3.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.15.3.linux-amd64.tar.gz
    rm -rf go1.15.3.linux-amd64.tar.gz
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

# 実行

$ vagrant init generic/ubuntu2004
1

した後,

$ vagrant up
1

で起動して

$ vagrant ssh
1

でVMに接続します.

# まとめ

カーネルのバージョンやpythonの依存関係に悩まされましたがこれでやっとXDPに入門することができます. XDP使ってみた系の資料はまだ少ないのでブログ書きたいと思います.