Ubuntu Weekly Recipe

第539回 LXDのコンテナからSR-IOV対応デバイスを利用する

この記事を読むのに必要な時間:およそ 8 分

コンテナからSR-IOVデバイスを利用する

今度はLXDからSR-IOV対応のネットワークデバイスを利用してみましょう。こちらもIntel 10GbEカードを使用する環境では事前に親Physical Functionをインタフェースアップしておきます※4)⁠

※4
LXD 3.0はVirtual Function設定前に親Physical Functionをインタフェースアップしないため,Intelの10GbEカードを使用する環境では親Physical FunctionがインタフェースダウンしているとVirtual Functionのインタフェースアップ等に失敗してエラーになります。GitHubのLXDリポジトリのmasterブランチとstable-3.0ブランチには,LXD側で事前に親Physical Functionのインタフェースアップを行う修正がマージされており,LXD 3.0.3とLXD 3.6以降ではIntel 10GbEカードの手動インタフェースアップは不要になるはずです。
$ sudo ip link set dev enp4s0f0 up

lxc config device addコマンドでコンテナにnicデバイスを追加します。この際,nictype=sriovを指定することで,Virtual Functionがコンテナにネットワークインタフェースとして追加されます。

$ lxc config device add コンテナ名 設定名 nic nictype=sriov parent=親Physical Function名

各項目の詳しい説明はUbuntu weekly recipeの535回およびLXDのドキュメントを参照してください。

nictype=sriovを指定する場合,parent=に親となるPhysical Functionを指定します。LXDがこのPhysical Functionを調べ,Virtual Functionが未作成であれば作成し,未使用のVirtual Functionをコンテナに割り当てます。LXDがVirtual Functionを作成・設定してくれるため,lxdグループに所属するユーザーアカウントであれば,コンテナを介してSR-IOV対応のネットワークデバイスを利用できます。

parent=にSR-IOV未対応のネットワークインタフェースを指定した場合や,ネットワークインタフェースの最大Virtual Function数※5を超過した場合などは,lxcコマンドがエラーを返します。

※5
最大Virtual Function数は「/sys/class/net/ネットワークインタフェース名/device/sriov_totalvfs」で確認できます。

実際に試してみましょう。この例ではubuntu:18.04イメージからnadeshikoという名前でコンテナを作成,起動しています。

$ lxc launch ubuntu:18.04 nadeshiko
Creating nadeshiko
Starting nadeshiko

$ lxc list -c ns4
+-----------+---------+----------------------+
|   NAME    |  STATE  |         IPV4         |
+-----------+---------+----------------------+
| nadeshiko | RUNNING | 10.150.118.16 (eth0) |
+-----------+---------+----------------------+

コンテナnadeshikoにVirtual Functionをネットワークインタフェースeth1として追加します※6※7)⁠

※6
Virtual Function未作成の状態でnictype=sriovのデバイスを追加する際,⁠Error: open /sys/class/net/ネットワークインタフェース名/device/virtfn1/net: no such file or directory」というエラーが発生する場合があります。Virtual Function作成と/sys以下のシンボリックリンク作成のタイムラグによるもののようです。この場合,もう一度lxc config device addコマンドを実行すると成功します。
※7
コンテナにVirtual Functionが割り当てられた時点で,そのVirtual Functionはホスト上から見えなくなります。
$ lxc config device add nadeshiko eth1 nic nictype=sriov parent=enp4s0f0
Device eth1 added to nadeshiko

コンテナnadeshiko内でipコマンドを実行して確認してみましょう※8)⁠ここではホスト上からlxc execコマンド経由で実行しています。

※8
Virtual Functionがコンテナに追加される際に,LXDがVirtual FunctionのMACアドレスを再設定します。このMACアドレスは,nictype=macvlanの場合と同様に「00:16:3e」で始まるランダムなアドレスとなります。
$ lxc exec nadeshiko ip address show eth1
12: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:16:3e:b5:3e:cb brd ff:ff:ff:ff:ff:ff

コンテナnadeshikoeth1にIPアドレス172.16.1.12/24を設定し,インタフェースアップします。

$ lxc exec nadeshiko ip address add 172.16.1.12/24 dev eth1
$ lxc exec nadeshiko ip link set dev eth1 up
$ lxc exec nadeshiko ip address show eth1
12: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:b5:3e:cb brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.12/24 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:feb5:3ecb/64 scope link 
       valid_lft forever preferred_lft forever

lxc listコマンドでもnadeshikoeth1にIPアドレスが振られていることが確認できます。

$ lxc list -c ns4
+-----------+---------+----------------------+
|   NAME    |  STATE  |         IPV4         |
+-----------+---------+----------------------+
| nadeshiko | RUNNING | 172.16.1.12 (eth1)   |
|           |         | 10.150.118.16 (eth0) |
+-----------+---------+----------------------+

対向のIPアドレス172.16.1.11のマシンと通信してみましょう。

$ lxc exec nadeshiko -- ping -c 4 172.16.1.11
PING 172.16.1.11 (172.16.1.11) 56(84) bytes of data.
64 bytes from 172.16.1.11: icmp_seq=1 ttl=64 time=0.222 ms
64 bytes from 172.16.1.11: icmp_seq=2 ttl=64 time=0.126 ms
64 bytes from 172.16.1.11: icmp_seq=3 ttl=64 time=0.127 ms
64 bytes from 172.16.1.11: icmp_seq=4 ttl=64 time=0.180 ms

--- 172.16.1.11 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3053ms
rtt min/avg/max/mdev = 0.126/0.163/0.222/0.043 ms

コンテナnadeshikoと対向のマシンにネットワークスループット計測用ソフトウェアのiperf3をインストールし,転送スピードを計測してみます。

$ lxc exec nadeshiko -- iperf3 -c 172.16.1.11 -i 0
Connecting to host 172.16.1.11, port 5201
[  5] local 172.16.1.12 port 51452 connected to 172.16.1.11 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  5]   0.00-10.00  sec  11.0 GBytes  9.42 Gbits/sec   11    925 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  5]   0.00-10.00  sec  11.0 GBytes  9.42 Gbits/sec   11             sender
[  5]   0.00-10.00  sec  11.0 GBytes  9.41 Gbits/sec                  receiver

iperf Done.

Bandwidthの値をみると9.42 Gbit/secの転送スピードが出ていることがわかります。

著者プロフィール

大田晃彦(おおたあきひこ)

Ubuntuでアニメを録画したり積んだりしながら暮らしています。全体的に浅いです。

コメント

コメントの記入