読者です 読者をやめる 読者になる 読者になる

仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Ubuntu Xenial (16.04) でOpen vSwitch+DPDKな環境を作る(後編)

tech.virtualtech.jp

Ubuntu XenialでOpen vSwitch+DPDKな環境を作る(前編) の環境ができたら、次にOpen vSwitch+DPDKをLinux KVM仮想マシンで使ってみます。

以降の手順は次のページで解説されています。今回はこれをベースに手順を記述します。

insights.ubuntu.com

Linux KVMのインストール

Linux KVM環境を構築し、VMを起動して通信できることを確認します。 UbuntuにはVMの作成とコンフィグレーション、OSのデプロイなどの処理を便利にしてくれるuvtoolというツールが用意されていますので、ここではこのコンポーネントを利用します。

uvtoolをインストールすると一緒にLinux KVM関連もインストールされますので、インストール後はvirshコマンドでKVMを叩けます。

kvmhost# apt -y install uvtool
kvmhost# virsh list --all
 Id    Name                           State
----------------------------------------------------

テンプレートイメージのダウンロード

Cloud images and uvtoolに使い方が書かれているのでそれを参考に、Ubuntu 16.04のイメージをダウンロードします。少々時間がかかりますが、インストールするよりずっと速いので待ちます。

kvmhost# uvt-simplestreams-libvirt sync \
    --source http://cloud-images.ubuntu.com/daily \
    release=xenial arch=amd64

VMコンフィグテンプレートのダウンロード

すぐDPDKを試したい人のためにVMコンフィグ用のテンプレートを用意してくれているのでこれを使います。 二つのファイルの違いはvhost-userが1か2かの違いだけです。

http://paste.ubuntu.com/16062769/plain/ の内容を guest-dpdk-vhost-user-singleq-1.xml に書き込み
http://paste.ubuntu.com/16062773/plain/ の内容を guest-dpdk-vhost-user-singleq-2.xml に書き込み

なお、上記のページを見るにはUbuntu Oneアカウントにログインする必要があります。

仮想マシンの起動

次のコマンドを実行して仮想マシンの作成、OSイメージの流し込みを行います。仮想マシンの設定には先の手順で作成したファイルを利用します。

kvmhost# uvt-kvm create --memory 2048 --template guest-dpdk-vhost-user-singleq-1.xml --password=ubuntu guest-dpdk-vhost-user-1 release=xenial arch=amd64 label=daily

kvmhost# uvt-kvm create --memory 2048 --template guest-dpdk-vhost-user-singleq-2.xml --password=ubuntu guest-dpdk-vhost-user-2 release=xenial arch=amd64 label=daily

作成したVMはuvt-kvmコマンドでVMを作成した時にパスワードを設定したので、ubuntu/ubuntuでログインできます。 指定しなかった場合は公開鍵認証を使いますので、必要な場合は事前にキーペアを作っておきます。

「unable to map backing store for hugepages: Cannot allocate memory」とかエラーが出た場合は、Hugepagesを増やしましょう。

ex.

# sysctl -w vm.nr_hugepages=8192

uvt-kvmコマンドを使った方法だと仮想マシンマネージャーでアクセスできるので、 仮想マシンマネージャーにリモートホストを登録して操作することができます。

f:id:virtualtech:20161209141151p:plain:w400

IPアドレスの設定

GUIによるアクセス環境が用意できれば仮想マシンマネージャーで仮想マシンにアクセスしてipコマンドなどでIPアドレスを設定してください。最初の状態ではNAT接続のNICしかIPアドレスが設定されていません。

GUI環境が用意できなければvirshコマンドを使ってそれぞれのVMにログインして設定します。

kvmhost# virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     guest-dpdk-vhost-user-1        running
 2     guest-dpdk-vhost-user-2        running

kvmhost# virsh console 1
Connected to domain guest-dpdk-vhost-user-1
Escape character is ^]   ←Enterを押す。うまく接続できない場合はlibvirt-binを再起動してから

Ubuntu 16.04.1 LTS guest-dpdk-vhost-user-1 ttyS0

guest-dpdk-vhost-user-1 login: ubuntu ←ubuntuユーザーでログイン
Password: (ubuntuと入力)

guest...-1$ sudo ip a add 192.168.1.101/24 dev ens4 && sudo ifconfig ens4 up
guest...-2$ sudo ip a add 192.168.1.102/24 dev ens4 && sudo ifconfig ens4 up

コンソール接続を終了するにはログイン画面で「 CTRL+] 」を押します。

guest...-1$ exit

Ubuntu 16.04.1 LTS guest-dpdk-vhost-user-1 ttyS0

guest-dpdk-vhost-user-1 login:  ←「 CTRL+] 」を押す。

以上で仮想マシンでDPDKデバイスを割り当ててOpen vSwitch+DPDKの仮想ネットワークと接続できるようになりました。

Hello Worldアプリケーションがビルドできない?

5. Hello World Sample Application — Data Plane Development Kit 16.04.0 documentation

に従ってビルドしようとすると、次のようなエラーが出力されます。

# export RTE_SDK=/usr/share/dpdk/
# cd /usr/share/dpdk/examples/helloworld
# make
/usr/share/dpdk//mk/internal/rte.extvars.mk:57: *** Cannot find .config in /usr/share/dpdk//x86_64-native-linuxapp-gcc.  Stop.

それはどうもUbuntuのCloud Airchiveパッケージのバグの可能性があるようです。バグ報告されていない場合はしないといけませんね。どうしても動かしたい場合はDPDKだけビルドした方がいいのかもしれません。

以下の手順で対応可能でした。.configファイルは/usr/share/dpdk/にconfigファイルとして存在していました。また、公式ガイドではexport RTE_TARGET=x86_64-native-linuxapp-gccとなっていますが、Ubuntuパッケージ版はここがx86_64-default-linuxapp-gccになっています。 読み替えて次のように実行します。なお先の手順でDPDKをOpenvSwitchで使っている場合は動作させることができずエラーになりますので、一旦service openvswitch-switch stopが必要です。

# vi /etc/apt/sources.list.d/cloudarchive-newton.list
…
deb-src http://ubuntu-cloud.archive.canonical.com/ubuntu xenial-updates/newton main

# apt update && apt-get build-dep dpdk
# source /usr/share/dpdk/dpdk-sdk-env.sh
# cd ${RTE_SDK}/examples/helloworld
# make
  CC main.o
  LD helloworld
  INSTALL-APP helloworld
  INSTALL-MAP helloworld.map

実行する前にopenvswitch-switchサービスを停止します。

# service openvswitch-switch stop

念のため、こうして置いたほうがいいかもしれません。元に戻すには前編を参考にadd-portしてください。

# ovs-vsctl del-port ovsbr0 dpdk0
# service openvswitch-switch stop

実行してみます。

# ./build/helloworld -c f -n 4
EAL: Detected 16 lcore(s)
EAL: Probing VFIO support...
PMD: bnxt_rte_pmd_init() called for (null)
EAL: PCI device 0000:07:00.0 on NUMA socket -1
EAL:   probe driver: 8086:10d6 rte_igb_pmd
EAL: PCI device 0000:07:00.1 on NUMA socket -1
EAL:   probe driver: 8086:10d6 rte_igb_pmd
EAL: PCI device 0000:08:00.0 on NUMA socket -1
EAL:   probe driver: 8086:10d6 rte_igb_pmd
EAL: PCI device 0000:08:00.1 on NUMA socket -1
EAL:   probe driver: 8086:10d6 rte_igb_pmd
hello from core 1
hello from core 2
hello from core 3
hello from core 0

実行したサンプルプログラムはすぐ終了してしまうので端末を複数開き、一方でtopコマンドを実行し、一方でhelloworldを実行してください。