LXCの起動済みのコンテナにmacvtap/macvlan を足す。
既存のコンテナ・インスタンスがあって、そこにmacvtap を追加する。
すでにあるコンテナは、次の通りのsample01を作ってある。これはlxdbr0を経由して外部と接続する。
takuya@ubuntu:~$ lxc start sample01 takuya@ubuntu:~$ lxc list +----------+---------+---------------------+-----------+-----------+ | NAME | STATE | IPV4 | TYPE | SNAPSHOTS | +----------+---------+---------------------+-----------+-----------+ | sample01 | RUNNING | 10.135.9.111 (eth0) | CONTAINER | 0 | +----------+---------+---------------------+-----------+-----------+
ネットワークを追加する
次のコマンドで起動中のコンテナ・インスタンスにネットワーク・インターフェイスを追加する。追加するNICはmacvlan でホスト側のネットワークに直接接続することに。
追加するコマンド。
lxc config device add sample01 mytap0 nic nictype=macvlan parent=eth0
lxc config device add
で、インスタンスを指定しデバイス追加する。追加するのはnic です。
実行するとNIC接続される。
この追加したネットワークをdhcp 有効にして設定を書いておく。
cloud-init ファイルは永続化ファイルじゃないのでOS再起動で変更が消失云々と書かれているのですが、実験なのでとりあえず書く。
/etc/network/interfaces.d/50-cloud-init
# This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-init's # network configuration capabilities, write a file # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: # network: {config: disabled} auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto eth1 iface eth1 inet dhcp
書いたらネットワークを再起動
/etc/init.d/networking restart
DHCPが降ってきた。
root@sample01:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:16:3e:45:89:a7 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.135.9.111/24 brd 10.135.9.255 scope global dynamic eth0 valid_lft 3018sec preferred_lft 3018sec inet6 fd42:d79a:8b11:68a4:216:3eff:fe45:89a7/64 scope global dynamic mngtmpaddr valid_lft 3557sec preferred_lft 3557sec 20: eth1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:16:3e:cc:85:e2 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.11127/24 brd 192.168.11255 scope global dynamic eth1 valid_lft 42621sec preferred_lft 42621sec
ついかしたNICはホスト側でも確認できる
takuya@ubuntu:~$ lxc list +----------+---------+----------------------+-----------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +----------+---------+----------------------+-----------------------------------------------+-----------+-----------+ | sample01 | RUNNING | 192.168.11127 (eth1) | fd42:d79a:8b11:68a4:216:3eff:fe45:89a7 (eth0) | CONTAINER | 0 | | | | 10.135.9.111 (eth0) | | | | +----------+---------+----------------------+-----------------------------------------------+-----------+-----------+
ネットワークを再起動して接続したら、 ホスト側にveth が増えた。
ホスト側で ip a
を叩くと veth が増えていた。
19: veth466e08c2@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000 link/ether 5e:04:fc:b6:ee:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
んんんん。vethかぁ。macvlan の空間に接続するveth なのかなぁ。とりあえずmacvtapではなさそう
仮想マシンに追加された、ホスト側との接続用IPを確認する。ホスト側のネットワークからDHCPでIPをもらってくる
takuya@ubuntu:~$ lxc exec sample01 ip addr show eth1 20: eth1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:16:3e:cc:85:e2 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.11127/24 brd 192.168.11255 scope global dynamic eth1 valid_lft 43014sec preferred_lft 43014sec inet6 fe80::216:3eff:fecc:85e2/64 scope link valid_lft forever preferred_lft forever
このIPアドレスについて、疎通を確認する。
とうぜんだけど、ホスト・ゲスト間で通信はできない。macvlan をホスト側に作っておくと通信できる。
ping 192.168.11127 -I eth0 ping 192.168.11127 -I macvlan1
永続化設定
先程は、とりあえずで /etc/networkに書いたが、macvlan の設定に問題なければ、永続化の設定を書く。または デフォルト・プロファイルに記述する。
cloud-init を使って起動されたコンテナはcloud-init の流儀に従う。debian なら /var/lib/cloud/seed/nocloud-net/network-config 、 ubuntuなら netplanですかね。
/var/lib/cloud/seed/nocloud-net/network-config
version: 1 config: - type: physical name: eth0 subnets: - type: dhcp control: auto name: eth1 subnets: - type: dhcp control: auto
この他の追加方法
今回は、コンテナに直接デバイスmacvlan を追加した。
この他にも、コンテナ作成時のデフォルト設定(プロファイル)にデバイスを追加しておくと、コンテナ作成時に最初から追加された状態で初期化される。という方法を取ることもできる。