CentOS7 ovs(Open vSwitch)のネットワーク設定方法
CentOS7によるovs(Open vSwitch)のネットワーク設定(Bridge、Bonding、VLAN)の方法について記載しました。
KVMとLXC/LXDにおいてLinuxBridgeで実現可能だったことを、ovsでも同様に実現可能にした内容となっています。
このため、LinuxBridgeからovsへの移行設計が可能になると考えています。*1
過去記事では、nmcliコマンドによるLinuxBridgeについて記載しましたが、LinuxBridgeからovsへ変更した際、どこが変わったのか?のポイントも記載したいと考えています。
1.構成
1-1.環境
筐体 : ProLiant DL360p Gen8 System ROM : P71 01/22/2018 NIC : Intel X520-SR2 OS : CentOS7.6(1810) Kernel : 3.10.0-957.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools ovs : 2.10.1
今回は物理スイッチとLACPで接続するために上記の筐体を使用しましたが、LACP以外のところはVMWareWorkstation12上でも動作しますので、本記事に記載した内容は特に環境依存的なことはないと考えています。
1-2.全体構成
構成図上に(1)~(13)までの番号を割り振りました。
スイッチ側の設定は以下となります。
interface Port-channel1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 11,300-302 switchport mode trunk spanning-tree portfast trunk ! interface TenGigabitEthernet0/1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 11,300-302 switchport mode trunk spanning-tree portfast trunk channel-group 1 mode active ! interface TenGigabitEthernet0/2 switchport trunk encapsulation dot1q switchport trunk allowed vlan 11,300-302 switchport mode trunk spanning-tree portfast trunk channel-group 1 mode active ! interface Vlan300 ip address 192.168.30.254 255.255.255.0 ! interface Vlan301 ip address 192.168.31.254 255.255.255.0 ! interface Vlan302 ip address 192.168.32.254 255.255.255.0
1-3.全体の流れ ~概要~
1-4.全体の流れ ~コマンドのみ~
以下のコマンドを投入していきます。
やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。
1.Bridge作成 (1) ovs-vsctl add-br ovsbr0 2.Bonding (2) ovs-vsctl add-bond ovsbr0 bond0 ens1f0 ens1f1 1&2の永続化設定 vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0 DEVICE=ovsbr0 DEVICETYPE=ovs TYPE=OVSBridge BOOTPROTO=static NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no vi /etc/sysconfig/network-scripts/ifcfg-ens1f0 DEVICE=ens1f0 NETBOOT=yes IPV6INIT=no BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no vi /etc/sysconfig/network-scripts/ifcfg-ens1f1 DEVICE=ens1f1 NETBOOT=yes IPV6INIT=no BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no [LACPの場合] vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 BOOTPROTO=none NM_CONTROLLED=no BOND_IFACES="ens1f0 ens1f1" OVS_OPTIONS="bond_mode=balance-tcp lacp=active other_config:lacp-time=fast vlan_mode=trunk trunks=11,300-302" HOTPLUG=no [固定LAGの場合] vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 BOOTPROTO=none NM_CONTROLLED=no BOND_IFACES="ens1f0 ens1f1" OVS_OPTIONS="bond_mode=balance-slb lacp=off vlan_mode=trunk trunks=11,300-302" HOTPLUG=no 3.VLAN(PortGroupの定義) (3) vi /tmp/ovsnw.xml <network> <name>ovsnw</name> <forward mode='bridge'/> <bridge name='ovsbr0'/> <virtualport type='openvswitch'/> <portgroup name='untag' default='yes'> </portgroup> <portgroup name='vlan11'> <vlan> <tag id='11'/> </vlan> </portgroup> <portgroup name='vlan300'> <vlan> <tag id='300'/> </vlan> </portgroup> <portgroup name='vlan301'> <vlan> <tag id='301'/> </vlan> </portgroup> <portgroup name='vlan302'> <vlan> <tag id='302'/> </vlan> </portgroup> </network> 4.access port (4) Virt-Manager画面上でvlan300を選択 or virsh edit Guest1 <interface type='network'> <mac address='52:54:00:d4:25:2e'/> <source network='ovsnw' portgroup='vlan300'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface> 5.trunk port (5) Virt-Manager画面上でuntagを選択 or virsh edit Guest2 <interface type='network'> <mac address='52:54:00:d4:35:3e'/> <source network='ovsnw' portgroup='untag'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface> 6.Guest側Tagging例1 (6) nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method manual ipv4.addresses 192.168.31.162/24 nmcli connection modify br301 ipv6.method ignore nmcli connection up br301 nmcli con show (7) nmcli connection add type vlan autoconnect yes con-name eth0.301 ifname eth0.301 dev eth0 id 301 nmcli con show (8) nmcli connection modify eth0.301 connection.master br301 connection.slave-type bridge nmcli connection up eth0.301 nmcli con show 7.Guest側Tagging例2 (9) nmcli connection add type bridge autoconnect yes con-name br302 ifname br302 nmcli connection modify br302 bridge.stp no nmcli connection modify br302 ipv4.method manual ipv4.addresses 192.168.32.162/24 nmcli connection modify br302 ipv6.method ignore nmcli connection up br302 nmcli con show (10) nmcli connection add type vlan autoconnect yes con-name eth0.302 ifname eth0.302 dev eth0 id 302 nmcli con show (11) nmcli connection modify eth0.302 connection.master br302 connection.slave-type bridge nmcli connection up eth0.302 nmcli con show 8.fake bridge(VLAN Interface)の作成 (12) vi /etc/sysconfig/network-scripts/ifcfg-vlan302 DEVICE=vlan302 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSIntPort BOOTPROTO=static OVS_BRIDGE=ovsbr0 OVS_OPTIONS="vlan_mode=access tag=302 fake_bridge=true" OVS_EXTRA="set Interface $DEVICE external-ids:iface-id=$(hostname -s)-$DEVICE-vif" HOTPLUG=no 9.LXCコンテナとfake bridgeのアタッチ (13) lxc network attach vlan302 lxc762 eth1
2.Bridge作成
まずはBridgeを作成します。
(1)Bridgeの作成
出力結果 [root@c761 ~]# ovs-vsctl add-br ovsbr0 [root@c761 ~]# ovs-vsctl show b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2 Bridge "ovsbr0" Port "ovsbr0" Interface "ovsbr0" type: internal ovs_version: "2.10.1"
3.Bonding
Bondを作成し、物理インターフェースをBondにアタッチします。
(2)Bond作成+物理アタッチ
出力結果 [root@c761 ~]# ovs-vsctl add-bond ovsbr0 bond0 ens1f0 ens1f1 [root@c761 ~]# ovs-vsctl show b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2 Bridge "ovsbr0" Port "ovsbr0" Interface "ovsbr0" type: internal Port "bond0" Interface "ens1f1" Interface "ens1f0" ovs_version: "2.10.1"
過去記事の図と比較してもらえればわかると思いますが、過去記事の(3)~(5)を行った状態となります。
また、LinuxBridgeの場合、BridgeとBondが分離しているのに対して、ovsでは、Bridge "ovsbr0"の中にBondが入っています。
具体的には、Port "ovsbr0"とPort "bond0"がBridge "ovsbr0"の中に定義されており、さらに、Port "bond0"のインターフェースとして、物理のens1f0やens1f1が定義されています。
これは仮想スイッチovsbr0のアップリンクポート(物理サーバの外部へ抜けるトラフィックが通るポート)がBondとして定義されている状態と言えます。
仮にESXiのvSwitchで例えるなら、こんな↓状態です。
4.永続化設定
コマンドを打っただけだと、ホストOSをRebootすると消えてしまうので永続化設定を行います。
vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0 DEVICE=ovsbr0 DEVICETYPE=ovs TYPE=OVSBridge BOOTPROTO=static NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no vi /etc/sysconfig/network-scripts/ifcfg-ens1f0 DEVICE=ens1f0 NETBOOT=yes IPV6INIT=no BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no vi /etc/sysconfig/network-scripts/ifcfg-ens1f1 DEVICE=ens1f1 NETBOOT=yes IPV6INIT=no BOOTPROTO=none NM_CONTROLLED=no ONBOOT=yes HOTPLUG=no [LACPの場合] vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 BOOTPROTO=none NM_CONTROLLED=no BOND_IFACES="ens1f0 ens1f1" OVS_OPTIONS="bond_mode=balance-tcp lacp=active other_config:lacp-time=fast vlan_mode=trunk trunks=11,300-302" HOTPLUG=no [固定LAGの場合] vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSBond OVS_BRIDGE=ovsbr0 BOOTPROTO=none NM_CONTROLLED=no BOND_IFACES="ens1f0 ens1f1" OVS_OPTIONS="bond_mode=balance-slb lacp=off vlan_mode=trunk trunks=11,300-302" HOTPLUG=no 設定後はnetworkサービスをリスタート systemctl restart network
いくつか、ポイントを記載します。
・対向の物理スイッチに合わせて、LACP or 固定LAGのどちらかの設定を行ってください。なお、ここではLACPとします。
・ovsのDefaultでは、vlan_mode=trunkにてFullTrunk状態となっているため、明示的にTrunkするVLANを絞りたい場合に、trunks=11,300-302が必要となります。*2
・NM_CONTROLLED=noにより、該当するインターフェースがNetworkManagerの管理下から外れるため必須設定と考えてください。
・nmcliコマンドでBondを作成した際も、上記パス*3に似たようなファイルが生成されていますが、ovs特有のオプションを指定できる点が異なります。
・networkサービスのリスタートを行っても正常に動作しない場合、少々ダサいですがホストOSごと再起動してみてください。
5.VLAN(PortGroupの定義)
(3)libvirtに対してovsのネットワーク定義
仮想マシン側でNICを追加する際、ovsを選択できるようにするため、libvirt上でネットワークの定義を行います。
その際、仮想マシンとovsをaccessポートで接続するのか?trunkポートで接続するのか?を設定できるようにするため、PortGroupの定義も併せて行います。
ESXiのvSwitchで例えるなら、下図の左側にある「仮想マシンのポートグループ」の設定を行っていくイメージです。
(3) vi /tmp/ovsnw.xml <network> <name>ovsnw</name> <forward mode='bridge'/> <bridge name='ovsbr0'/> <virtualport type='openvswitch'/> <portgroup name='untag' default='yes'> </portgroup> <portgroup name='vlan11'> <vlan> <tag id='11'/> </vlan> </portgroup> <portgroup name='vlan300'> <vlan> <tag id='300'/> </vlan> </portgroup> <portgroup name='vlan301'> <vlan> <tag id='301'/> </vlan> </portgroup> <portgroup name='vlan302'> <vlan> <tag id='302'/> </vlan> </portgroup> </network>
いくつか、ポイントを記載します。
A.「portgroup name='vlan11'」や「portgroup name='vlan300'」は、仮想マシンをovsにaccess portとして接続させたい場合の設定となります。
B.「portgroup name='untag' default='yes'」は、仮想マシンをovsにtrunk portとして接続させたい場合の設定となります。
A.は、主に仮想サーバなど自身でVLAN IDを付けずにトラフィックを流してくる仮想マシン用として使用できます。
B.は、主に仮想ルータ(CSR1000v・vMX・A10 vThunderなど)や仮想スイッチ(CumulusVXやNexus9000v)など、自身でVLAN IDを付けてトラフィックを流してくる仮想マシン用として使用できます。
ちなみに、B.においては、4.永続化設定で記載したように、DefaultでFullTrunk状態です。このため、許可するVLANを絞ることも可能なようですが、ここでは割愛します。*4
上記ファイルの作成が完了したら、virshコマンドで定義していきます。
virsh net-list virsh net-define /tmp/ovsnw.xml virsh net-start ovsnw virsh net-autostart ovsnw virsh net-list
現在のネットワーク定義を参照
ovsnw.xmlのネットワークを定義
ovsnwのスタート
ovsnwの自動起動設定
現在のネットワーク定義を参照
以下が各コマンドの出力結果となります。
出力結果 [root@c761 ~]# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes [root@c761 ~]# virsh net-define /tmp/ovsnw.xml Network ovsnw defined from /tmp/ovsnw.xml [root@c761 ~]# virsh net-start ovsnw Network ovsnw started [root@c761 ~]# virsh net-autostart ovsnw Network ovsnw marked as autostarted [root@c761 ~]# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes ovsnw active yes yes
上記の設定が完了すると、Virt-Manager上の画面からovsやPortGroupが選択できるようになります。
6.access port
(4)仮想マシンをovsにaccess portで接続
Virt-Manager画面上で設定する場合は、以下の通り。
AddHardwareをクリック
Networkを選択
NetworkSource:Virtual Network’ovsnw’を選択
Portgroup:vlan300を選択
virshコマンドで設定する場合は、以下の通り。
virsh edit Guest1 <interface type='network'> <mac address='52:54:00:d4:25:2e'/> <source network='ovsnw' portgroup='vlan300'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface>
7.trunk port
(5)仮想マシンをovsにtrunk portで接続
Virt-Manager画面上で設定する場合は、以下の通り。
AddHardwareをクリック
Networkを選択
NetworkSource:Virtual Network’ovsnw’を選択
Portgroup:untagを選択
virshコマンドで設定する場合は、以下の通り。
virsh edit Guest2 <interface type='network'> <mac address='52:54:00:d4:25:2e'/> <source network='ovsnw' portgroup='untag'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </interface>
8.Guest側Tagging例1と2
Guest2起動後、Guest2のbash上でnmcliコマンドにより、VLANインターフェースを作成します。
nmcliコマンドの詳細については、過去記事を参照ください。
(6) nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method manual ipv4.addresses 192.168.31.162/24 nmcli connection modify br301 ipv6.method ignore nmcli connection up br301 nmcli con show (7) nmcli connection add type vlan autoconnect yes con-name eth0.301 ifname eth0.301 dev eth0 id 301 nmcli con show (8) nmcli connection modify eth0.301 connection.master br301 connection.slave-type bridge nmcli connection up eth0.301 nmcli con show (9) nmcli connection add type bridge autoconnect yes con-name br302 ifname br302 nmcli connection modify br302 bridge.stp no nmcli connection modify br302 ipv4.method manual ipv4.addresses 192.168.32.162/24 nmcli connection modify br302 ipv6.method ignore nmcli connection up br302 nmcli con show (10) nmcli connection add type vlan autoconnect yes con-name eth0.302 ifname eth0.302 dev eth0 id 302 nmcli con show (11) nmcli connection modify eth0.302 connection.master br302 connection.slave-type bridge nmcli connection up eth0.302 nmcli con show
7.trunk portの設定により、(5)のeth0とvnet1間はFullTrunkで接続されていると考えてください。
これにより、例えば、SrcIP:192.168.31.162-DstIP:192.168.31.254でPingを打つと、以下のような流れで処理されます。
1. (7)でVLAN ID301がTaggingされる。
2. (5)はFullTrunk状態なので、VLANタグは剥がされずに、そのままスイッチング処理*5される。
3. (2)では11,300-302がAllowedされているので、VLANタグは剥がされずに、そのままスイッチング処理される。
4.物理スイッチ側でVLANタグが剥がされ、以下のVLAN InterfaceがPingに応答する。
interface Vlan301 ip address 192.168.31.254 255.255.255.0
9.fake bridge(VLAN Interface)の作成
fake bridge(VLAN Interface)の作成と同時に永続化設定も実施します。
vi /etc/sysconfig/network-scripts/ifcfg-vlan302 DEVICE=vlan302 ONBOOT=yes DEVICETYPE=ovs TYPE=OVSIntPort BOOTPROTO=static OVS_BRIDGE=ovsbr0 OVS_OPTIONS="vlan_mode=access tag=302 fake_bridge=true" OVS_EXTRA="set Interface $DEVICE external-ids:iface-id=$(hostname -s)-$DEVICE-vif" HOTPLUG=no 設定後はnetworkサービスをリスタート systemctl restart network
fake_bridge=trueを指定しないと、単なるVLAN Interfaceとなってしまうため、次工程(10.LXCコンテナとfake bridgeのアタッチ)に進むと、必ず躓くポイントになります。理由は、LXCに対してVLAN Interface 302をBridgeとして認識させる必要があるためです。
10.LXCコンテナとfake bridgeのアタッチ
fake bridge (VLAN Interface 302)にコンテナlxc762のeth1をアタッチします。
lxc network attach vlan302 lxc762 eth1
アタッチ後、仮想マシンやLXCコンテナを起動すると、ovs上では以下のように構成されていることが確認できます。
[root@c761 ~]# ovs-vsctl show b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2 Bridge "ovsbr0" Port "ovsbr0" Interface "ovsbr0" type: internal Port "bond0" trunks: [11, 300, 301, 302, 303, 304] Interface "ens1f1" Interface "ens1f0" Port "vnet0" tag: 300 Interface "vnet0" Port "vnet1" Interface "vnet1" Port "vlan302" tag: 302 Interface "vlan302" type: internal Port "vethCPI2P0" tag: 302 Interface "vethCPI2P0" ovs_version: "2.10.1"
Port "bond0":アップリンクポートの設定(trunk allowed vlan 11,300-304の状態)
Port "vnet0":access vlan 300のポート設定
Port "vnet1":trunkポートの設定(FullTrunk状態)
Port "vlan302":fake bridgeの設定
Port "vethCPI2P0":fake bridgeに接続されたlxc762のポート設定
11.補足1:fake_bridgeについて
fake_bridge=trueを指定しなかった場合、上記コマンドにて「lxc network attach 」まで打った後、Tabキーで補完してみてください。すると、物理インターフェースもしくはBridgeインターフェースしか表示されません。
fake_bridge=trueを指定しなかった場合の出力例 [root@c761 ~]# lxc network attach eno1 eno3 enp4s16 enp4s16f2 ens1f0 ens2 ovsbr0 eno2 eno4 enp4s16f1 enp4s16f3 ens1f1 lxdbr0 virbr0
すると、lxcコンテナをovsにアタッチするためには、ovsbr0を選択するしかない状態となってしまいます。
このため、LXCに対して、VLAN Interface 302がBridgeであるということを明示的に認識させる必要があるため、fake_bridge=trueオプションを指定しています。
ちなみに、上記のlxcコマンドでovsbr0を選択した場合、(5)に接続した状態となります。
前述した通り、(5)はFullTrunk状態なので、物理スイッチへトラフィックを流すためには、LXCコンテナ側でVLAN IDを付与する必要があります。
軽量さがメリットであるLXCコンテナで、VLAN IDを付ける設定を実施することは、そもそも使い方が間違っている気がしました。*6
このため、
- KVM:(4)の通り、PortGroupで所属するVLANを決定する。もしくは、(5)の通り、untagにして仮想マシン側でVLAN IDを付与する。
- LXC/LXD:(12)(13)に記載の通り、fake bridgeで所属するVLANを決定する。
という使い方が適しているのではないかと考えています。
12.補足2:ovs上での見え方
Guest1と2を起動すると、ovs上では以下のように見えます。
[root@c761 ~]# ovs-vsctl show b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2 Bridge "ovsbr0" Port "ovsbr0" Interface "ovsbr0" type: internal Port "vnet0" tag: 300 Interface "vnet0" Port "vnet1" Interface "vnet1" Port "bond0" trunks: [11, 300, 301, 302] Interface "ens1f1" Interface "ens1f0" ovs_version: "2.10.1"
また、今回LCAPを使用しましたが、LCAPの状態を確認する場合は、以下のコマンドで可能です。
ovs-appctl bond/show bond0 ovs-vsctl list port bond0 出力例 [root@c761 ~]# ovs-appctl bond/show bond0 ---- bond0 ---- bond_mode: balance-tcp bond may use recirculation: yes, Recirc-ID : 2 bond-hash-basis: 0 updelay: 0 ms downdelay: 0 ms next rebalance: 2115 ms lacp_status: negotiated lacp_fallback_ab: false active slave mac: 90:e2:ba:0b:37:b9(ens1f1) slave ens1f0: enabled may_enable: true slave ens1f1: enabled active slave may_enable: true [root@c761 ~]# ovs-vsctl list port bond0 _uuid : 85d6d0bb-1b9d-44b0-964c-b83d60451aab bond_active_slave : "90:e2:ba:0b:37:b9" bond_downdelay : 0 bond_fake_iface : false bond_mode : balance-tcp bond_updelay : 0 cvlans : external_ids : {} fake_bridge : false interfaces : [a102fd00-be8d-402b-b9f3-1ae3cf3aeb64, cffbeb94-2ab5-453e-832c-ac63c86e5d8a] lacp : active mac : name : "bond0" other_config : {lacp-time=fast} protected : false qos : rstp_statistics : {} rstp_status : {} statistics : {} status : {} tag : trunks : [11, 300, 301, 302] vlan_mode : trunk
以上です。
13.最後に
以下のサイトを参考にさせて頂きました。
Open vSwitch
Using VLANs with OVS and libvirt - Scott's Weblog - The weblog of an IT pro focusing on cloud computing, Kubernetes, Linux, containers, and networking
Tag Vlan on Veth to Openvswitch bridge · Issue #3414 · lxc/lxd · GitHub
ovsは、最初は取っ付き難かったのですが、触ってみると意外と楽しかったです。
また、LinuxBridgeと異なる点として、Port(Interface)やBond、VLANの概念がBridgeの中に集約されている(ように見える)ので、よりスイッチっぽいかな?と。
ovsはVxLANのVTEPを作ったり、OpenFlowが使えたりと色々遊べるのですが、まずはLinuxBridgeからの移行で最低限必要な機能は網羅できたかなと思います。
次のステップとして、DPDKを実装したいと考えています。
*1:手前味噌ですが、私はovsに一本化しようと思いました。
*2:ネットワークエンジニアという職業柄、意図しないループが怖いため、TrunkするVLANはなるべく絞りたい派です。
*3:/etc/sysconfig/network-scripts/配下のパス
*4:ovsnw.xml上に、tag id='11,300-302'などと記載すれば、できそうな気がしていますが、libvirt側の話題になるため、また別の機会に確認したいと思います。
*5:宛先MACアドレスとMACアドレステーブルを照合し、受信したEtherフレームを然るべきポートへ転送する動作のこと
*6:もちろん、ケースバイケースで充分な議論をする余地はあるかと思います。
CentOS7 ovs(Open vSwitch)のビルドとインストール方法
CentOS7によるovs(Open vSwitch)のビルドとインストール方法について記載しました。
CentOS7でyumを使用すると、openvswitch.x86_64 0:2.0.0-7.el7がインストールされますが、今後DPDK版ovsを作りたいと考えているため、その練習も兼ねて、最新版2.10系のビルドから行います。
1.構成
1-1.環境
筐体 : ProLiant DL360p Gen8 System ROM : P71 01/22/2018 NIC : Intel X520-SR2 OS : CentOS7.6(1810) Kernel : 3.10.0-957.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools ovs : 2.10.1
1-2.全体の流れ
事前準備
rpmビルド
インストール
起動確認
2.事前準備
3.rpmビルド
3-1.ビルド環境準備
ビルド環境の準備をします。
mkdir -p ~/rpmbuild/SOURCES cd rpmbuild/SOURCES/ wget https://www.openvswitch.org/releases/openvswitch-2.10.1.tar.gz tar zxvf openvswitch-2.10.1.tar.gz sed -e 's/@VERSION@/0.0.1/' openvswitch-2.10.1/rhel/openvswitch-fedora.spec.in > ovs.spec
ソース格納ディレクトリの作成
ディレクトリ移動
ソースのダウンロード
ソースのtarファイルを解凍
specファイル生成
3-2.ビルド
ソースからrpmファイルを生成します。
sudo yum-builddep -y ovs.spec cd openvswitch-2.10.1 ./boot.sh ./configure make rpm-fedora RPMBUILD_OPT="--without check"
依存パッケージのインストール
ovsのソース格納ディレクトリへ移動
boot.sh実行
configure実行
rpmビルド*1
多少時間は掛かりますが、最後の方は以下のような出力がでれば正常にビルドが完了しています。
Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/SRPMS/openvswitch-2.10.1-1.el7.src.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/x86_64/openvswitch-2.10.1-1.el7.x86_64.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/noarch/openvswitch-selinux-policy-2.10.1-1.el7.noarch.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/noarch/python-openvswitch-2.10.1-1.el7.noarch.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/noarch/openvswitch-test-2.10.1-1.el7.noarch.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/x86_64/openvswitch-devel-2.10.1-1.el7.x86_64.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/x86_64/openvswitch-ovn-central-2.10.1-1.el7.x86_64.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/x86_64/openvswitch-ovn-host-2.10.1-1.el7.x86_64.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/x86_64/openvswitch-ovn-vtep-2.10.1-1.el7.x86_64.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/x86_64/openvswitch-ovn-common-2.10.1-1.el7.x86_64.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/x86_64/openvswitch-ovn-docker-2.10.1-1.el7.x86_64.rpm Wrote: /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/RPMS/x86_64/openvswitch-debuginfo-2.10.1-1.el7.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.JbhK5R + umask 022 + cd /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/BUILD + cd openvswitch-2.10.1 + rm -rf /home/ovs/rpmbuild/SOURCES/openvswitch-2.10.1/rpm/rpmbuild/BUILDROOT/openvswitch-2.10.1-1.el7.x86_64 + exit 0
5.起動確認
rpmインストール後はrootに戻ります。
exit systemctl start openvswitch systemctl enable openvswitch systemctl status openvswitch ovs-vsctl -V
ユーザovsからrootへ変更
ovsサービスの起動
ovsサービスの自動起動設定
ovsサービスの動作確認
ovsのversion確認
以下、出力例
# systemctl start openvswitch # systemctl enable openvswitch Created symlink from /etc/systemd/system/multi-user.target.wants/openvswitch.service to /usr/lib/systemd/system/openvswitch.service. # systemctl status openvswitch ● openvswitch.service - Open vSwitch Loaded: loaded (/usr/lib/systemd/system/openvswitch.service; enabled; vendor preset: disabled) Active: active (exited) since Mon 2018-12-24 10:21:25 JST; 11s ago Main PID: 27852 (code=exited, status=0/SUCCESS) Dec 24 10:21:25 c76x64ovs3.md.jp systemd[1]: Starting Open vSwitch... Dec 24 10:21:25 c76x64ovs3.md.jp systemd[1]: Started Open vSwitch. # ovs-vsctl -V ovs-vsctl (Open vSwitch) 2.10.1 DB Schema 7.16.1
上記まで完了したら、あとはovs-vsctl add-br ovsbr0などでBridgeを作成していきます。
ovsの設定方法は次回記載します。
以上です。
6.最後に
先にも記載しましたが、ovs-dpdkをやることが目的なこともあり、rpmのビルドから実施しました。
以下のサイトに詳しい説明が記載されていますが、
software.intel.com
今回インストールしたのは、下図の左上(ovsのみ)です。
左下(dpdk)については、過去記事のpktgenやspdk+NVMe-oFで、既に実績があるため、DPDKはサクッと導入できるかな?と考えています。
Linux nmcliコマンドによるKVM&LXC/LXD with SR-IOVのInterface設定
LinuxのnmcliコマンドによるBonding、VLAN、Bridge Interfaceの設定方法に加えて、SR-IOVを使用した場合について記載しました。
SR-IOVの使用方法として、KVMとLXC/LXDのそれぞれについてもまとめました。
また、SR-IOVを使用する場合の注意点についても記載しました。
さらに、内部ネットワーク的な疎通可否についても記載しました。
1.構成
1-1.環境
筐体 : ProLiant DL360p Gen8 System ROM : P71 01/22/2018 NIC : Intel X520-SR2 OS : CentOS7.5(1804) Kernel : 4.19.0-1.el7.elrepo.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools
1-2.全体構成
構成図上に(1)~(21)までの番号を割り振りました。
(1)~(10)については過去記事を参照してください。
metonymical.hatenablog.com
(11)~(21)については主にVLANやIPの設定となります。
各VLANとIPは以下の通りです。
(11)(13)(16)(19)
Untag:192.168.30.22x/24
(12)(14)(18)(21)
VLAN301:192.168.31.22x/24
(15)
Untag:192.168.31.222/24*1
SR-IOVを使用する場合、仮想マシンやコンテナを起動する前にVFを予めアタッチした後*2、起動させます。
アタッチ方法については、nmcliコマンドではできないため、適時解説します。
各仮想マシンやコンテナは以下の通りです。
c750~c753:KVM上の仮想マシン
lxc754:LXC/LXD上のコンテナ
スイッチ側の設定は以下となります。
interface GigabitEthernet0/1 switchport trunk encapsulation dot1q switchport trunk native vlan 300 switchport trunk allowed vlan 300,301 switchport mode trunk spanning-tree portfast trunk ! interface Port-channel1 switchport trunk encapsulation dot1q switchport trunk native vlan 300 switchport trunk allowed vlan 300,301 switchport mode trunk spanning-tree portfast trunk ! interface TenGigabitEthernet0/1 switchport trunk encapsulation dot1q switchport trunk native vlan 300 switchport trunk allowed vlan 300,301 switchport mode trunk spanning-tree portfast trunk channel-group 1 mode on ! interface TenGigabitEthernet0/2 switchport trunk encapsulation dot1q switchport trunk native vlan 300 switchport trunk allowed vlan 300,301 switchport mode trunk spanning-tree portfast trunk channel-group 1 mode on ! interface Vlan300 ip address 192.168.30.1 255.255.255.0 ! interface Vlan301 ip address 192.168.31.1 255.255.255.0
1-3.全体の流れ ~概要~
1-4.全体の流れ ~コマンドのみ~
以下のコマンドを投入していきます。
やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。
1.物理+Bridge (1) nmcli connection add type bridge autoconnect yes con-name br1 ifname br1 nmcli connection modify br1 bridge.stp no nmcli connection modify br1 ipv4.method disabled ipv6.method ignore nmcli connection up br1 nmcli con show brctl show (2) nmcli connection add type bridge-slave ifname eno3 master br1 nmcli con show brctl show (3) nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor nmcli connection mod bond0 ipv4.method disabled ipv6.method ignore nmcli con show (4) nmcli connection add type bond-slave autoconnect yes ifname ens1f0 master bond0 nmcli con show (5) nmcli connection add type bond-slave autoconnect yes ifname ens1f1 master bond0 nmcli con show (6) nmcli connection add type bridge autoconnect yes con-name br0 ifname br0 nmcli connection modify br0 bridge.stp no nmcli connection modify br0 ipv4.method disabled ipv6.method ignore nmcli connection up br0 nmcli con show brctl show (7) nmcli connection modify bond0 connection.master br0 connection.slave-type bridge nmcli con show brctl show (8) nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method disabled ipv6.method ignore nmcli connection up br301 nmcli con show brctl show (9) nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301 nmcli con show brctl show (10) nmcli connection modify bond0.301 connection.master br301 connection.slave-type bridge nmcli connection up bond0.301 nmcli con show brctl show c750 (11) nmcli connection add type ethernet autoconnect yes con-name eth1 ifname eth1 nmcli connection mod eth1 ipv4.method manual ipv4.address 192.168.30.220/24 nmcli connection mod eth1 ipv6.method ignore nmcli con up eth1 nmcli con show (12) nmcli connection add type vlan autoconnect yes con-name eth1.301 ifname eth1.301 dev eth1 id 301 nmcli connection mod eth1.301 ipv4.method manual ipv4.address 192.168.31.220/24 nmcli connection mod eth1.301 ipv6.method ignore nmcli con up eth1.301 nmcli con show c751 (13) nmcli connection add type ethernet autoconnect yes con-name eth1 ifname eth1 nmcli connection mod eth1 ipv4.method manual ipv4.address 192.168.30.221/24 nmcli connection mod eth1 ipv6.method ignore nmcli con up eth1 nmcli con show (14) nmcli connection add type vlan autoconnect yes con-name eth1.301 ifname eth1.301 dev eth1 id 301 nmcli connection mod eth1.301 ipv4.method manual ipv4.address 192.168.31.221/24 nmcli connection mod eth1.301 ipv6.method ignore nmcli con up eth1.301 nmcli con show c752 (15) nmcli connection add type ethernet autoconnect yes con-name eth1 ifname eth1 nmcli connection mod eth1 ipv4.method manual ipv4.address 192.168.31.222/24 nmcli connection mod eth1 ipv6.method ignore nmcli con up eth1 nmcli con show c753 Virt-Manager画面上でPCI デバイスを選択 or virsh edit c753 <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x04' slot='0x10' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x04' slot='0x10' function='0x1'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </hostdev> (16) nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor nmcli connection mod bond0 ipv4.method manual ipv4.address 192.168.30.223/24 nmcli connection mod bond0 ipv6.method ignore nmcli con show (17) nmcli connection add type bond-slave autoconnect yes ifname ens4 master bond0 nmcli connection add type bond-slave autoconnect yes ifname ens5 master bond0 nmcli con show (18) nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301 nmcli connection mod bond0.301 ipv4.method manual ipv4.address 192.168.31.223/24 nmcli connection mod bond0.301 ipv6.method ignore nmcli con up bond0 nmcli con up bond0.301 nmcli con show ip add show lxc754 lxc config device add lxc754 eth1 nic nictype=sriov parent=ens1f0 lxc config device add lxc754 eth2 nic nictype=sriov parent=ens1f1 (19) nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor nmcli connection mod bond0 ipv4.method manual ipv4.address 192.168.30.224/24 nmcli connection mod bond0 ipv6.method ignore nmcli con show (20) nmcli connection add type bond-slave autoconnect yes ifname eth1 master bond0 nmcli connection add type bond-slave autoconnect yes ifname eth2 master bond0 nmcli con show (21) nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301 nmcli connection mod bond0.301 ipv4.method manual ipv4.address 192.168.31.224/24 nmcli connection mod bond0.301 ipv6.method ignore nmcli con up bond0 nmcli con up bond0.301 nmcli con show ip add show
(1)~(10)の詳細は省略し、以下は(11)から解説します。
また、全ての出力結果を表示させると不要な設定も記載することになるため、一部省略します。
2.c750のEthernet&VLAN+IP
物理とVLANインターフェースを作成しIPをアサインします。
(11)物理インターフェースeth1とIPの設定
(12)VLANインターフェースeth1.301とIPの設定
出力結果 [root@c750 ~]# nmcli con show NAME UUID TYPE DEVICE eth0 2c180c0c-76b3-4f05-b04e-546812f51811 ethernet eth0 eth1 5e55d7f8-1db1-48d0-a954-46c996ad5533 ethernet eth1 eth1.301 e39150fd-d1ab-42e9-8a23-d48733229b38 vlan eth1.301 virbr0 5ee27a89-6153-4e47-9a68-dbbd1caf1e04 bridge virbr0 [root@c750 ~]# ip add show 3: eth1:mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:4d:da:7b brd ff:ff:ff:ff:ff:ff inet 192.168.30.220/24 brd 192.168.30.255 scope global noprefixroute eth1 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe4d:da7b/64 scope link valid_lft forever preferred_lft forever 8: eth1.301@eth1: mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:4d:da:7b brd ff:ff:ff:ff:ff:ff inet 192.168.31.220/24 brd 192.168.31.255 scope global noprefixroute eth1.301 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe4d:da7b/64 scope link tentative valid_lft forever preferred_lft forever
3.c751のEthernet&VLAN+IP
物理とVLANインターフェースを作成しIPをアサインします。
(13)物理インターフェースeth1とIPの設定
(14)VLANインターフェースeth1.301とIPの設定
出力結果 c750とほぼ同一のため省略 異なる点は、IPアドレスの第4オクテットが221となります。
4.c752のEthernet+IP
物理インターフェースを作成しIPをアサインします。
(15)物理インターフェースeth1とIPの設定
出力結果 c750とほぼ同一のため省略 異なる点は、IPアドレスの第4オクテットが222となります。
5.c753のBonding&VLAN+IP
仮想マシン起動前にVFをアタッチします。
ホストOSのVirt-Manager上でAdd Hardwareを実施し以下の画面のようにアタッチしてください。
上記画面の場合、VFのBus:Device(Slot).function番号が0000:04:10:0となっていますが、以下のようにPFとVFのBus:Device(Slot).function番号は対応しています。
ens1f0=04:10:0, 04:10:2
ens1f1=04:10:1, 04:10:3
または、ホストOS上のvirshでアタッチする場合は、以下のように設定してください。
address domain=の行がVFのBus:Device(Slot).function番号に対応しています。
# virsh edit c753 <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x04' slot='0x10' function='0x0'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </hostdev> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x04' slot='0x10' function='0x1'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </hostdev>
上記設定が完了した後、仮想マシンを起動して以下の設定を仮想マシン上で行ってください。
BondingインターフェースとVLANインターフェースを作成します。
(16)Bondingインターフェースbond0とIPの設定
(17)ens4とens5をBond0にアサイン
(18)VLANインターフェースbond0.301とIPの設定
出力結果 [root@c753 ~]# nmcli con show NAME UUID TYPE DEVICE bond-slave-ens4 461a812f-bb8f-4046-84bb-e1e9df598a76 ethernet ens4 bond-slave-ens5 62bd54a3-bb07-4c0a-8ca4-ed7d3ea236b7 ethernet ens5 bond0 9962c767-59ff-41bf-b8ed-097061f6016c bond bond0 bond0.301 44296f6c-a9b3-4435-be5e-541a0fd5e4b9 vlan bond0.301 eth0 2c180c0c-76b3-4f05-b04e-546812f51811 ethernet eth0 virbr0 42ae0bd5-a46a-4e7c-8038-8711ae2aab4d bridge virbr0 [root@c753 ~]# ip add show 2: ens4: <\BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000 link/ether 16:27:f0:0c:e1:4b brd ff:ff:ff:ff:ff:ff 3: ens5: <\BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000 link/ether 16:27:f0:0c:e1:4b brd ff:ff:ff:ff:ff:ff 9: bond0:mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 16:27:f0:0c:e1:4b brd ff:ff:ff:ff:ff:ff inet 192.168.30.223/24 brd 192.168.30.255 scope global noprefixroute bond0 valid_lft forever preferred_lft forever 10: bond0.301@bond0: mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 16:27:f0:0c:e1:4b brd ff:ff:ff:ff:ff:ff inet 192.168.31.223/24 brd 192.168.31.255 scope global noprefixroute bond0.301 valid_lft forever preferred_lft forever [root@c753 ~]#
6.lxc754のBonding&VLAN+IP
コンテナ起動前にVFを仮想マシンにアタッチします。
ホストOS上で以下のように設定してください。*3
# lxc config device add lxc754 eth1 nic nictype=sriov parent=ens1f0 Device eth1 added to lxc754 # lxc config device add lxc754 eth2 nic nictype=sriov parent=ens1f1 Device eth2 added to lxc754
上記設定が完了した後、コンテナを起動して以下の設定をコンテナ上で行ってください。
また、コンテナ上で事前にyum -y install NetworkManagerを実施しておいてください。
BondingとVLANインターフェースを作成します。
(19)Bondingインターフェースbond0とIPの設定
(20)eth1とeth2をBond0にアサイン
(21)VLANインターフェースbond0.301とIPの設定
出力結果 c753とほぼ同一のため省略 異なる点は、IPアドレスの第4オクテットが224となります。
8.補足1:SR-IOVを使用する場合の注意点
以下3つの注意点があります。
先に結論だけ書きますと、以下の通りとしてください。
8-1.VFのMACアドレスについて
VFのMACアドレスは固定設定とせずに、オール0(ゼロ)のままの状態にしておいてください。
通常、VFのMACアドレスを明示的に固定設定とする場合、/etc/rc.localに以下のように記載しますが、全てコメントアウトしてください。
# vi /etc/rc.local
echo 2 > /sys/class/net/ens1f0/device/sriov_numvfs
echo 2 > /sys/class/net/ens1f1/device/sriov_numvfs
sleep 1
#ip link set ens1f0 vf 0 mac 00:11:22:33:44:55
#ip link set ens1f0 vf 1 mac 00:11:22:33:44:56
#ip link set ens1f1 vf 0 mac 00:11:22:33:44:57
#ip link set ens1f1 vf 1 mac 00:11:22:33:44:58
sleep 1
ip link set ens1f0 vf 0 spoofchk off
ip link set ens1f0 vf 1 spoofchk off
ip link set ens1f1 vf 0 spoofchk off
ip link set ens1f1 vf 1 spoofchk off
exit 0
8-2.BlackListについて
BlackListを使用した場合、LXC/LXDでVFをコンテナにアタッチしようする際、エラーで弾かれます。
このため、BlackListからixgbevfはコメントアウト、または削除してください。*5
# vi /lib/modprobe.d/dist-blacklist.conf # # Listing a module here prevents the hotplug scripts from loading it. # Usually that'd be so that some other driver will bind it instead, # no matter which driver happens to get probed first. Sometimes user # mode tools can also control driver binding. # # Syntax: see modprobe.conf(5). # # watchdog drivers blacklist i8xx_tco # framebuffer drivers blacklist aty128fb blacklist atyfb blacklist radeonfb blacklist i810fb blacklist cirrusfb blacklist intelfb blacklist kyrofb blacklist i2c-matroxfb blacklist hgafb blacklist nvidiafb blacklist rivafb blacklist savagefb blacklist sstfb blacklist neofb blacklist tridentfb blacklist tdfxfb blacklist virgefb blacklist vga16fb blacklist viafb # ISDN - see bugs 154799, 159068 blacklist hisax blacklist hisax_fcpcipnp # sound drivers blacklist snd-pcsp # I/O dynamic configuration support for s390x (bz #563228) blacklist chsc_sch # crypto algorithms blacklist sha1-mb # ixgbevf driver #blacklist ixgbevf
9.補足2:内部ネットワーク的な疎通可否
全体構成図を見ながら、以下のマトリックスを見てください。
VLAN300:192.168.30.0/24
VLAN301:192.168.31.0/24
今回は(11)~(21)にIPアドレスをアサインしました。
そこからPing疎通できた箇所にはRTTを記載しました。*6
Ping疎通できなかった箇所はNGと記載しています。
上記の表より、疎通NGだった箇所*7について記載したいと思います。
9-1.VLAN300:192.168.30.0/24の表について
以下2つのフローが疎通NGでした。
- Src:(13), Dst:(16)
- Src:(13), Dst:(19)
PF(ens1f0)⇔VF間におけるEtherフレームの受け渡しがうまくいっていないようでした。
ens1f0でPcapした結果、(13)→(16)、(13)→(19)のarpは確認できたものの、戻りのarp replayが見えず。
一方、c753のens4&5でPcapした結果、(13)→(16)へのarp受信後、(16)→(13)へのarp replayを返送していました。
このため、ens1f0での戻りのarp replayが見えない点が怪しいものの解決に至らず。。。
9-2.VLAN301:192.168.31.0/24の表について
以下2つのフローが疎通NGでしたが、疎通不可な理由は9-1に記載した事象と同一です。
- Src:(15), Dst:(18)
- Src:(15), Dst:(21)
以下の通信が全滅でした。
- Src:(14), Dst:ALL
原因は、戻りのEtherフレームにVLAN301のタグが付いていることにより、(3)から(9)へ転送されてしまうためです。
実際、(9)や(15)でPcapしたところ、(14)宛てのVLANタグ付きフレームが受信できました。
9-3.RTTから見えてくるもの
宛先がSWになっているRTTを見てください。概ね1~2ms程度です。
また、自分自身にPingを打った場合のRTTは、おおむね100μs(0.100ms)以下となっています。
それ以外のRTTは概ね900~200μs(0.9~0.2ms)程度です。
Bridgeを使用したインターフェースのRTTと比較して、SR-IOVを使用したインターフェースのRTTは全体的に短時間(500μs程度)となっています。
加えて、SR-IOVを使用した者同士のRTTはさらに短時間(200~300μs程度)となっています。
10.補足3:KVMによるVF自動アサイン設定
「6.lxc754のBonding&VLAN+IP」に記載したアタッチ方法の場合、VFを自動的にアサインしてくれますが、今回紹介したKVMでの方法は手動設定を行いました。
理由は、KVMによるVF自動アサインを行った結果、(16)(17)を作成した際にens5がLinkUpしなかったためです。
但し、仮想マシン上でBondingしない場合は有用な設定方法だと思いますので、補足として記載しておきます。
10-1.定義ファイルの作成
以下のようにxmlの定義ファイルを作成し、virshコマンドで定義ファイルを読み込ませます。
# cat > sriov_ens1f0.xml << EOF <network> <name>sriov_ens1f0 <forward mode='hostdev' managed='yes'> <pf dev='ens1f0'/> </forward> </network> EOF # virsh net-define sriov_ens1f0.xml
10-2.Virt-Manager上での設定
以下の画面にて、Edit→Connection Detailsを選択
以下の画面にて、Autostartにチェックを入れApplyをクリック。
左下の再生ボタン*8をクリック。
以下の画面にて、AddHardwareより、「Virtual Network 'sriov_ens1f0' : Hostdev network」を選択することができるようになります。
これにより、ens1f0から自動的にVFがアサインされるようになります。
1つのPF上でVFを8個や16個など作成した場合には管理が煩雑となるため、どのVFを使用しているかを意識せずに設定することが可能となります。
以上です。
10.最後に
LinuxBridge*9とSR-IOVを駆使したネットワーク構成としては、概ね網羅できたと思います。
次のステップとしては、Open vSwitchによる分散仮想スイッチ*10の構成になると考えています。
さらに、パフォーマンス面ではDPDKを使用する*11ことに加え、足回りを全てSR-IOVにすることにより、ようやく最下層における基礎/基盤の部分が構成できるようになります。
その上で、あるホストから別のホストへトラフィック*12を転送する際に、MPLSやVxLANでトラフィックを識別し、対向スイッチ上では、MP-BGPやEVPNを使用することにより、Overlayネットワークが構成できるようになります。
SDN/NFVという言葉だけがあちこちに溢れていますが、最下層の仕組みを理解せずに上物だけをやってしまうのは、とても怖い気がしています。
*1:¥(9)にてVLAN301を付与しているためUntagとなります。
*2:厳密には、KVMとLXC/LXDでVFのアタッチ方法が異なります。詳しくは補足に記載します。
*3:補足で解説しますが、LXC/LXDの場合、PF=ens1f0やens1f1を指定するだけで、自動的に空いているVFをアタッチしてくれます。
*4:見かけ上の設定では上手くいったように見えますが、IP疎通性が無くなる場合があります。また、BondingインターフェースのSlaveのうちの一つがLinkUpしてくれないといった状態になります。
*5:つまり、ホストOS上でixgbevfがmodprobeされる状態にしておいてください。
*6:送信元:スイッチに関しては、min/avg/maxRTTの表記となっています。
*7:一部考察も含みます
*8:+ボタンの右隣になる横三角のボタン
*9:仮想スイッチのことです
*10:VMWareでいうところのvDistributionSwitch
*11:所謂、OvS-DPDKのことです
LXC/LXDコンテナ上にEPC環境構築
LXC/LXDコンテナ上にEPC環境を構築しました。
利用するEPCはNextEPCとなります。
NextEPCに含まれるサービスは以下の通りです。
mme
hss
sgw
pgw
pcrf
webui
また、以下2つの内容が理解できていることを前提に記載しますので、LXC/LXD環境などは既に構築済みの状態からスタートします。
CentOS7でLXC/LXDのコンテナ環境構築 - Metonymical Deflection
LXC/LXDコンテナのネットワーク設定方法 - Metonymical Deflection
1.環境
1-1.VMWare
筐体 : 自作PC CPU : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz VMWare : VMware(R) Workstation 12 Pro 12.5.9 build-7535481 OS : CentOS7.5(1804) Kernel : 3.10.0-862.el7.x86_64 Installed Environment Groups : Minimal Install
1-2.全体構成
今回用意するlxcコンテナはUbuntu18.04となります。
公式サイトを読む限りCentOS7のコンテナでもいけそうなのですが、ビルドが必要っぽいので。
ロードマップには、いずれRPMも公開される旨、記載されていました。
1-3.全体の流れ
lxcコンテナ準備
NextEPCインストール
NextEPCのWebUIにアクセス
2.lxcコンテナ準備準備
2-1.Ubuntu18.04のコンテナ作成
今回はimages:からではなく、ubuntu:からコンテナイメージを引っ張ってきます。
lxc image list ubuntu: | grep 18.04 lxc launch ubuntu:18.04/amd64 lxc8041 出力例 [root@c757 ~]# lxc image list ubuntu: | grep 18.04 | b (9 more) | 7a4f7e85f1fa | yes | ubuntu 18.04 LTS amd64 (release) (20181024) | x86_64 | 174.40MB | Oct 24, 2018 at 12:00am (UTC) | | b/arm64 (4 more) | 50fed56edee1 | yes | ubuntu 18.04 LTS arm64 (release) (20181024) | aarch64 | 158.29MB | Oct 24, 2018 at 12:00am (UTC) | | b/armhf (4 more) | bf45f28d0dca | yes | ubuntu 18.04 LTS armhf (release) (20181024) | armv7l | 157.74MB | Oct 24, 2018 at 12:00am (UTC) | | b/i386 (4 more) | 3867042a618e | yes | ubuntu 18.04 LTS i386 (release) (20181024) | i686 | 176.20MB | Oct 24, 2018 at 12:00am (UTC) | | b/ppc64el (4 more) | 852f241c93e1 | yes | ubuntu 18.04 LTS ppc64el (release) (20181024) | ppc64le | 182.86MB | Oct 24, 2018 at 12:00am (UTC) | | b/s390x (4 more) | a987004cb9f9 | yes | ubuntu 18.04 LTS s390x (release) (20181024) | s390x | 166.14MB | Oct 24, 2018 at 12:00am (UTC) | ~一部省略~ [root@c757 ~]# lxc launch ubuntu:18.04/amd64 lxc8041 Creating lxc8041 Starting lxc8041 [root@c757 ~]# lxc list +-----------+---------+---------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+---------------------+------+------------+-----------+ | lxc8041 | RUNNING | 10.150.81.57 (eth0) | | PERSISTENT | | +-----------+---------+---------------------+------+------------+-----------+
2-2.コンテナのネットワーク設定
lxc8041のeth1をlxdbr30にアタッチします。
lxc network list lxc network attach lxdbr30 lxc8041 eth1 lxc network list 出力例 [root@c757 ~]# lxc network list +---------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +---------+----------+---------+-------------+---------+ | ens33 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens34 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 2 | +---------+----------+---------+-------------+---------+ | lxdbr30 | bridge | YES | | 0 | +---------+----------+---------+-------------+---------+ [root@c757 ~]# lxc network attach lxdbr30 lxc8041 eth1 [root@c757 ~]# lxc network list +---------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +---------+----------+---------+-------------+---------+ | ens33 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens34 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 2 | +---------+----------+---------+-------------+---------+ | lxdbr30 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+
2-3.ubuntuのネットワーク設定
lxc8041のeth1に固定IPを設定します。
IPアドレスは各自の環境に合わせてください。
[root@c757 ~]# lxc exec lxc8041 vi /etc/netplan/50-cloud-init.yaml # This file is generated from information provided by # the datasource. Changes to it will not persist across an instance. # 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} network: version: 2 ethernets: eth0: dhcp4: true eth1: dhcp4: false addresses: [192.168.30.50/24] dhcp6: false
設定反映後にIPアドレスが設定されているかを確認し一旦再起動します。
lxc exec lxc8041 netplan apply lxc list lxc exec lxc8041 reboot 出力例 [root@c757 ~]# lxc exec lxc8041 netplan apply [root@c757 ~]# lxc list +-----------+---------+----------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+----------------------+------+------------+-----------+ | lxc8041 | RUNNING | 192.168.30.50 (eth1) | | PERSISTENT | | | | | 10.150.81.57 (eth0) | | | | +-----------+---------+----------------------+------+------------+-----------+ [root@c757 ~]# lxc exec lxc8041 reboot
3.NextEPCインストール
3-1.NextEPCのインストール
lxc exec lxc8041 bash apt-get update add-apt-repository ppa:acetcom/nextepc apt-get -y install nextepc
ホストOS上からコンテナのbashへ移動
aptアップデート
リポジトリ登録
NextEPCのインストール
注意事項
リポジトリ登録時に以下のようにEnterキーを押すよう促してくるので、そのままEnterキーを押下してください。
root@lxc8041:~# add-apt-repository ppa:acetcom/nextepc NextEPC is a C-language Open Source implementation of the 3GPP Evolved ?Packet Core, i.e. the core network of an LTE network.(http://nextepc.org) More info: https://launchpad.net/~acetcom/+archive/ubuntu/nextepc Press [ENTER] to continue or Ctrl-c to cancel adding it.
3-2.NextEPCのWebUIインストール
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - apt-get -y install nodejs curl -sL http://nextepc.org/static/webui/install | sudo -E bash -
NodeSource Node.js 8.x のスクリプトインストール
nodejsインストール
NextEPCのWebUIインストール
3-3.サービスの有効化
systemctl enable nextepc-mmed systemctl enable nextepc-sgwd systemctl enable nextepc-pgwd systemctl enable nextepc-hssd systemctl enable nextepc-pcrfd systemctl enable nextepc-webui reboot
各種サービスの有効化
一旦再起動
3-4.サービスの起動確認
再起動後、サービスが起動するまで3分程度待ってください。
再起動直後のステータス
[root@c757 ~]# lxc list +-----------+---------+----------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+----------------------+------+------------+-----------+ | lxc8041 | RUNNING | 192.168.30.50 (eth1) | | PERSISTENT | | | | | 10.150.81.57 (eth0) | | | | +-----------+---------+----------------------+------+------------+-----------+
再起動3分後のステータス
pgwtunインターフェースが表示されていればOKです。
[root@c757 ~]# lxc list +-----------+---------+----------------------+------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+----------------------+------------------+------------+-----------+ | lxc8041 | RUNNING | 45.45.0.1 (pgwtun) | cafe::1 (pgwtun) | PERSISTENT | | | | | 192.168.30.50 (eth1) | | | | | | | 10.150.81.57 (eth0) | | | | +-----------+---------+----------------------+------------------+------------+-----------+
4.NextEPCのWebUIにアクセス
4-2.Subscriber情報の登録
IMSIの登録
APNの登録
以上です。
6.最後に
以下のサイトを参考にさせて頂きました。
Home - LXDドキュメント翻訳プロジェクトNextEPC | Guides | Installation
Raspberry Pi 3上にLTEコア網(Evolved Packet Core:EPC)機能を構築してみた(Raspberry Pi 3+ubuntu16.04 LTS+NextEPC)
メインは公式サイトですが、@m0ch1m0ch1さんの記事が大変良くまとめられています。
ラズパイ上で動くならコンテナ上でも動くかな?と思ってやってみましたが、何とか動くところまでは確認できました。
基地局側の環境を用意するのは、USRPなどが必要となってくるようで、少々敷居が高いのですが、タイミングをみて検証したいなと思っています。
あとはキャリアのSGWと接続テストとかやってみて上手くいきそうであれば、IoT用途に特化したPGWとしては有効活用できそうな気がしています。
また、OAI(Open Air Interface)などにも興味が湧いてきたので、折をみて検証したいなと考えています。
Home · Wiki · oai / openairinterface5G · GitLab
LXC/LXDコンテナのネットワーク設定方法
前々回の続きとなります。
前々回:CentOS7でLXC/LXDのコンテナ環境構築 - Metonymical Deflection
また、前回の内容が理解できていることを前提として記載します。
前回:Linux nmcliコマンドによるBonding VLAN Bridge Interface設定 - Metonymical Deflection
LXC/LXDコンテナは「LightweightなKVM」というイメージで使用しています。
このため、コンテナのトラフィックをBridgeで外部ネットワークに流して使用する場合の設定方法を記載したいと思います。
1.環境
1-1.VMWare
筐体 : 自作PC CPU : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz VMWare : VMware(R) Workstation 12 Pro 12.5.9 build-7535481 OS : CentOS7.5(1804) Kernel : 3.10.0-862.el7.x86_64 Installed Environment Groups : Minimal Install
WinおよびVMWare環境は以下の画像で確認してもらった方が良いかもしれません。
Win環境
VMWare環境
前々回の記事に加えてNICを追加していますが、実際に使用するのはトータル3つです。
具体的には以下の通りです。
仮想ネットワークエディタ
ネットワーク接続
Intel I219のプロパティ
WindowsによるVLAN Interface設定方法は過去記事を参照ください。
metonymical.hatenablog.com
なお、ベアメタル環境でも同様に設定可能です。
1-2.全体構成
上図のうちlxdbr0はLXD init時にDefaultで作成されています。
また、Default Profileの設定よりコンテナ作成時にlxdbr0が使用されるように構成されています。
但し、lxdbr0はNATして外部ネットワークに接続されています。私の用途としては、コンテナ上でyumなどを行いたい場合のInternet接続用マネジメントインターフェースとして使用しています。
しかし、KVMライクにLXC/LXDコンテナを使用したいので、今回行う設定は(1)~(2)となります。
具体的には新規でBridge lxdbr30を作成し、コンテナlxc751を収容します。
(1)はnmcliコマンドでも設定可能ですが、ここではlxc networkコマンドを使用して設定を行っていきます。
なお、前々回の続きという想定なので、lxc751というコンテナは既に作成済みという認識で進めます。
1-3.全体の流れ ~コマンドのみ~
以下のコマンドを投入していきます。
やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。
1.DHCPによるIP固定設定の場合 (1) lxc network create lxdbr30 \ bridge.external_interfaces=ens34 \ ipv4.address=192.168.30.16/24 \ ipv6.address=none (2) lxc network attach lxdbr30 lxc751 eth1 lxc config device set lxc751 eth1 ipv4.address 192.168.30.48 lxc start lxc751 lxc exec lxc751 dhclient eth1 lxc list lxc exec lxc751 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 lxc exec lxc751 vi /etc/sysconfig/network-scripts/ifcfg-eth1 :s/eth0/eth1/g :wq lxc exec lxc751 cat /etc/sysconfig/network-scripts/ifcfg-eth1 lxc restart lxc751 lxc list 2.手動によるIP固定設定の場合 (1) lxc network create lxdbr30 \ bridge.external_interfaces=ens34 \ ipv4.address=none \ ipv6.address=none (2) lxc network attach lxdbr30 lxc751 eth1 lxc start lxc751 lxc exec lxc751 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 lxc exec lxc751 vi /etc/sysconfig/network-scripts/ifcfg-eth1 :s/eth0/eth1/g :s/dhcp/none/g IPADDR=192.168.30.48 #追記 PREFIX=24 #追記 :wq lxc exec lxc751 cat /etc/sysconfig/network-scripts/ifcfg-eth1 lxc restart lxc751 lxc list
2.DHCPによるIP固定設定の場合
物理インターフェースとBridgeインターフェースを1対1でアサインします。
nmcliよりもコマンド数は少ないです
(1)Bridgeインターフェースlxdbr30の作成+ens34をlxdbr30にアタッチ*1
(2)lxdbr30にコンテナlxc751のeth1をアタッチ+IP設定
(1)Bridgeインターフェースlxdbr30の作成+ens34をlxdbr30にアタッチ
投入コマンド lxc network create lxdbr30 \ bridge.external_interfaces=ens34 \ ipv4.address=192.168.30.16/24 \ ipv6.address=none 出力例 [root@c756 ~]# lxc network create lxdbr30 \ > bridge.external_interfaces=ens34 \ > ipv4.address=192.168.30.16/24 \ > ipv6.address=none Network lxdbr30 created [root@c756 ~]# lxc network list +---------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +---------+----------+---------+-------------+---------+ | ens33 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens34 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens37 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens38 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens39 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens40 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ | lxdbr30 | bridge | YES | | 0 | +---------+----------+---------+-------------+---------+ [root@c756 ~]# lxc network show lxdbr30 config: bridge.external_interfaces: ens34 ipv4.address: 192.168.30.16/24 ipv6.address: none description: "" name: lxdbr30 type: bridge used_by: [] managed: true status: Created locations: - none
lxdbr30が作成され、物理インターフェースens34にもアタッチされました。
また、コンテナに対してDHCPでIPアドレス割り当てを行うため、lxdbr30自身にもIPアドレスを設定しています。
(2)lxdbr30にコンテナlxc751のeth1をアタッチ+IP設定
投入コマンドその1 lxc network attach lxdbr30 lxc751 eth1 lxc config device set lxc751 eth1 ipv4.address 192.168.30.48 lxc start lxc751 lxc exec lxc751 dhclient eth1 出力例 [root@c756 ~]# lxc network attach lxdbr30 lxc751 eth1 [root@c756 ~]# lxc config device set lxc751 eth1 ipv4.address 192.168.30.48 [root@c756 ~]# lxc start lxc751 [root@c756 ~]# lxc exec lxc751 dhclient eth1 [root@c756 ~]# lxc list +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | lx75mas | STOPPED | | | PERSISTENT | | +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | lxc751 | RUNNING | 192.168.30.48 (eth1) | fd42:d3a:78c6:6d8c:216:3eff:fe8f:a6c3 (eth0) | PERSISTENT | | | | | 10.106.42.75 (eth0) | | | | +---------+---------+----------------------+----------------------------------------------+------------+-----------+
lxdbr30にコンテナlxc751のeth1をアタッチし、コンテナのIP設定を行っています。
その後コンテナを起動し、lxc751のeth1上でdhclientコマンドを実行しています。
「コンテナのIP設定」と記載しましたが厳密には異なります。
これは、LXDの管理下におかれているlxdbr30に対して、DHCP固定IP 設定を行っています。
なお、上記コマンドの場合、恒久設定ではないためコンテナ上で設定ファイルを作成します。
投入コマンドその2 lxc exec lxc751 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 lxc exec lxc751 vi /etc/sysconfig/network-scripts/ifcfg-eth1 :s/eth0/eth1/g :wq lxc exec lxc751 cat /etc/sysconfig/network-scripts/ifcfg-eth1 lxc restart lxc751 出力例 [root@c756 ~]# lxc exec lxc751 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 [root@c756 ~]# lxc exec lxc751 vi /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes HOSTNAME=LXC_NAME NM_CONTROLLED=no TYPE=Ethernet MTU= DHCP_HOSTNAME=`hostname` #コンテナのviが起動されるため、sed(:s/eth0/eth1/g)して保存(:wq)します。 [root@c756 ~]# lxc exec lxc751 cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 BOOTPROTO=dhcp ONBOOT=yes HOSTNAME=LXC_NAME NM_CONTROLLED=no TYPE=Ethernet MTU= DHCP_HOSTNAME=`hostname` [root@c756 ~]# lxc restart lxc751 [root@c756 ~]# lxc list +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | lx75mas | STOPPED | | | PERSISTENT | | +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | lxc751 | RUNNING | 192.168.30.48 (eth1) | fd42:d3a:78c6:6d8c:216:3eff:fe8f:a6c3 (eth0) | PERSISTENT | | | | | 10.106.42.75 (eth0) | | | | +---------+---------+----------------------+----------------------------------------------+------------+-----------+
「lxc exec lxc751」によりコンテナ上でコマンドを実行できます。
ifcfg-eth0 をコピーして、DEVICE=eth1に書き換え、コンテナを再起動しています。
しばらくして、lxc listによりeth1のアドレスが取得できていればOKです。
3.手動によるIP固定設定の場合
やっていることは前項と同様です。
では、何が異なるか?と言いますと、lxdbr30にIPアドレスを設定したくない場合を想定しています。
具体的には、以下のような構成の場合です。
コンテナlxc751からLBまで、LBからコンテナlxc752までをそれぞれ同一VLANとしたい場合、Bridgeインターフェース上でIPアドレスを設定してしまうと、ホストOS上のRoutingテーブルにlxdbr30とlxdbr31がconnectedで載ってきてしまうため、LBまで到達せずに内部で折り返してしまいます。
一方でnet.ipv4.ip_forwardを無効にしてしまうと、今度はlxdbr0で稼働しているNAT+Routingが動作しなくなるため、lxdbr30にIPアドレスを設定せずに構成する方法を記載します。
(1)Bridgeインターフェースlxdbr30の作成+ens34をlxdbr30にアタッチ
投入コマンド lxc network create lxdbr30 \ bridge.external_interfaces=ens34 \ ipv4.address=none \ ipv6.address=none 出力例 [root@c756 ~]# lxc network create lxdbr30 \ > bridge.external_interfaces=ens34 \ > ipv4.address=none \ > ipv6.address=none Network lxdbr30 created [root@c756 ~]# lxc network list +---------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +---------+----------+---------+-------------+---------+ | ens33 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens34 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens37 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens38 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens39 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens40 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ | lxdbr30 | bridge | YES | | 0 | +---------+----------+---------+-------------+---------+ [root@c756 ~]# lxc network show lxdbr30 config: bridge.external_interfaces: ens34 ipv4.address: none ipv6.address: none description: "" name: lxdbr30 type: bridge used_by: [] managed: true status: Created locations: - none
lxdbr30が作成され、物理インターフェースens34にもアタッチされました。
但し、lxdbr30自身にはIPアドレスが設定されていません。
(2)lxdbr30にコンテナlxc751のeth1をアタッチ+IP設定
投入コマンドその1 lxc network attach lxdbr30 lxc751 eth1 lxc start lxc751 出力例 [root@c756 ~]# lxc network attach lxdbr30 lxc751 eth1 [root@c756 ~]# lxc start lxc751 [root@c756 ~]# lxc list +---------+---------+---------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------+---------+---------------------+----------------------------------------------+------------+-----------+ | lx75mas | STOPPED | | | PERSISTENT | | +---------+---------+---------------------+----------------------------------------------+------------+-----------+ | lxc751 | RUNNING | 10.106.42.75 (eth0) | fd42:d3a:78c6:6d8c:216:3eff:fe8f:a6c3 (eth0) | PERSISTENT | | +---------+---------+---------------------+----------------------------------------------+------------+-----------+
lxdbr30にコンテナlxc751のeth1をアタッチしましたが、コンテナのIPは設定されていません。
投入コマンドその2 lxc exec lxc751 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 lxc exec lxc751 vi /etc/sysconfig/network-scripts/ifcfg-eth1 :s/eth0/eth1/g :s/dhcp/none/g IPADDR=192.168.30.48 #追記 PREFIX=24 #追記 :wq lxc exec lxc751 cat /etc/sysconfig/network-scripts/ifcfg-eth1 lxc restart lxc751 出力例 [root@c756 ~]# lxc exec lxc751 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 [root@c756 ~]# lxc exec lxc751 vi /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes HOSTNAME=LXC_NAME NM_CONTROLLED=no TYPE=Ethernet MTU= DHCP_HOSTNAME=`hostname` #コンテナのviが起動されるため、sedで置換してIPとPrefixを追記して保存します。 [root@c756 ~]# lxc exec lxc751 cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 BOOTPROTO=none IPADDR=192.168.30.48 PREFIX=24 ONBOOT=yes HOSTNAME=LXC_NAME NM_CONTROLLED=no TYPE=Ethernet MTU= DHCP_HOSTNAME=`hostname` [root@c756 ~]# lxc restart lxc751 [root@c756 ~]# lxc list +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | lx75mas | STOPPED | | | PERSISTENT | | +---------+---------+----------------------+----------------------------------------------+------------+-----------+ | lxc751 | RUNNING | 192.168.30.48 (eth1) | fd42:d3a:78c6:6d8c:216:3eff:fe8f:a6c3 (eth0) | PERSISTENT | | | | | 10.106.42.75 (eth0) | | | | +---------+---------+----------------------+----------------------------------------------+------------+-----------+
ifcfg-eth0 をコピーして、DEVICE=eth1に書き換え、コンテナを再起動しています。
しばらくして、lxc listによりeth1のアドレスが表示されていればOKです。
4.補足1:nmcliコマンドでBridgeを作成した場合
nmcliコマンドでBridgeインターフェースを作成しても、lxc上で利用可能です。
しかし、nmcliコマンドで作成した場合、lxdの管理下から外れるため、以下のようにMANAGED=NOとなります。
[root@c756 ~]# lxc network list +---------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +---------+----------+---------+-------------+---------+ | ens33 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens34 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens37 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens38 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens39 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | ens40 | physical | NO | | 0 | +---------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ | lxdbr30 | bridge | NO | | 0 | +---------+----------+---------+-------------+---------+
nmcliでBridgeを作成した場合、LXDクラスタを組んだときなどに困りそうな予感はしていますが、もう少し検証してみようと思います。
なお、LXC/LXDのネットワーク周りの設定は以下の公式サイトに詳細が記載されています。
https://lxd-ja.readthedocs.io/ja/latest/networks/
5.補足2:PortForwarding設定
コンテナ内のサービスを外部に公開したい場合、今回解説したBridgeの他に、Defaultで作成されるlxdbr0上でPortForwardingを行う方法があります。
lxc config device add lxc751 httpd proxy listen=tcp:0.0.0.0:80 connect=tcp:localhost:80
lxc751:コンテナ名
httpd:任意の名前
listen=tcp:0.0.0.0:80:ホスト側の待受けポート*2
connect=tcp:localhost:80:コンテナ側(lxc751)の待受けポート
以上です。
6.最後に
以下のサイトを参考にさせて頂きました。
Home - LXDドキュメント翻訳プロジェクト
第535回 LXD 3.0のネットワーク設定:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
LXC/LXDはコンテナ起動後、ちょいちょいいじりたい時に便利だなと思っています。
なので「LightweightなKVM」とか「KVMライク」といった使い方が、私にはマッチしています。
ちなみに、SR-IOVやCloud-initにも対応しているため、そちらの検証もやってみたいなと思います。
Linux nmcliコマンドによるBonding VLAN Bridge Interface設定
LinuxのnmcliコマンドによるBonding、VLAN、Bridge Interfaceの設定方法をまとめました。
KVMやLXCなどで仮想マシンやコンテナを構築する前段階として、ホストOS内で構成されるNWをきちんと理解し、自分のイメージした通りに構築できるようにすることが目的です。
1.構成
1-1.全体構成
構成図上に(1)~(10)までの番号を割り振りました。
この項番ごとにnmcliコマンドを投入した後の確認方法までを解説していきたいと思います。
また、補足としてbrctlコマンドについての解説も行いたいと思います。
Linuxで「Bridge」や「Bridgeインターフェース」と言った場合、それは「仮想スイッチ」*1を意味します。
しかし、本当にスイッチであるなら
といったことが確認できるハズです。
このため、この辺りの確認方法も併せて解説します。
1-2.全体の流れ ~概要~
- 物理+Bridge:(1)(2)
- 物理+Bonding:(3)(4)(5)
- Bonding+Bridge:(6)(7)
- Bonding+VLAN+Bridge:(8)(9)(10)
1-3.全体の流れ ~コマンドのみ~
以下のコマンドを投入していきます。
やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。
1.物理+Bridge (1) nmcli connection add type bridge autoconnect yes con-name br1 ifname br1 nmcli connection modify br1 bridge.stp no nmcli connection modify br1 ipv4.method disabled ipv6.method ignore nmcli connection up br1 nmcli con show brctl show (2) nmcli connection add type bridge-slave ifname ens36 master br1 nmcli con show brctl show 2.物理+Bonding (3) nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor nmcli connection mod bond0 ipv4.method disabled ipv6.method ignore nmcli con show (4) nmcli connection add type bond-slave autoconnect yes ifname ens37 master bond0 nmcli con show (5) nmcli connection add type bond-slave autoconnect yes ifname ens38 master bond0 nmcli con show 3.Bonding+Bridge (6) nmcli connection add type bridge autoconnect yes con-name br0 ifname br0 nmcli connection modify br0 bridge.stp no nmcli connection modify br0 ipv4.method disabled ipv6.method ignore nmcli connection up br0 nmcli con show brctl show (7) nmcli connection modify bond0 connection.master br0 connection.slave-type bridge nmcli con show brctl show 4.Bonding+VLAN+Bridge (8) nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method disabled ipv6.method ignore nmcli connection up br301 nmcli con show brctl show (9) nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301 nmcli con show brctl show (10) nmcli connection modify bond0.301 connection.master br301 connection.slave-type bridge nmcli connection up bond0.301 nmcli con show brctl show
2.物理+Bridge
物理インターフェースとBridgeインターフェースを1対1でアサインします。
(1)Bridgeインターフェースbr1の作成
(2)ens36をbr1にアサイン
(1)Bridgeインターフェースbr1の作成
投入コマンド nmcli connection add type bridge autoconnect yes con-name br1 ifname br1 nmcli connection modify br1 bridge.stp no nmcli connection modify br1 ipv4.method disabled ipv6.method ignore nmcli connection up br1 nmcli con show brctl show 出力例 [root@c752 ~]# nmcli connection add type bridge autoconnect yes con-name br1 ifname br1 Connection 'br1' (431ecf74-7476-4009-b13c-d6bb9b286697) successfully added. [root@c752 ~]# nmcli connection modify br1 bridge.stp no [root@c752 ~]# nmcli connection modify br1 ipv4.method disabled ipv6.method ignore [root@c752 ~]# nmcli connection up br1 Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13) [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 23ade1e4-3822-4bc9-83fd-3504ad9b5efe bridge virbr0 [root@c752 ~]# brctl show bridge name bridge id STP enabled interfaces br1 8000.000000000000 no virbr0 8000.525400701951 yes virbr0-nic [root@c752 ~]#
br1は作成されましたが、物理インターフェースがbr1にアサインされていない状態です。
この状態だと、仮想マシンのトラフィックを外部のスイッチへ流すことができません。
(2)ens36をbr1にアサイン
投入コマンド nmcli connection add type bridge-slave ifname ens36 master br1 nmcli con show brctl show 出力例 [root@c752 ~]# nmcli connection add type bridge-slave ifname ens36 master br1 Connection 'bridge-slave-ens36' (211c573e-7133-40c3-bba9-c3c19e751417) successfully added. [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 23ade1e4-3822-4bc9-83fd-3504ad9b5efe bridge virbr0 [root@c752 ~]# brctl show bridge name bridge id STP enabled interfaces br1 8000.000c299755f7 no ens36 virbr0 8000.525400701951 yes virbr0-nic [root@c752 ~]#
nmcli con showの出力にはbridge-slave-ens36が追加され、brctl showの出力にてbr1にens36がアサインされたことが確認できます。*2
3.物理+Bonding
Bondingインターフェースに2つの物理インターフェースをアサインします。
(3)Bondingインターフェースbond0の作成
(4)ens37をBond0にアサイン
(5)ens38をBond0にアサイン
(3)Bondingインターフェースbond0の作成
投入コマンド nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor nmcli connection mod bond0 ipv4.method disabled ipv6.method ignore nmcli con show 出力例 [root@c752 ~]# nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor Connection 'bond0' (25a6c049-251e-464a-87fc-6f25112c712e) successfully added. [root@c752 ~]# nmcli connection mod bond0 ipv4.method disabled ipv6.method ignore [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 23ade1e4-3822-4bc9-83fd-3504ad9b5efe bridge virbr0 [root@c752 ~]#
bond0は作成されましたが、物理インターフェースがbond0にアサインされていない状態です。
この状態だと、仮想マシンのトラフィックを外部のスイッチへ流すことができません。
(4)ens37をBond0にアサイン
投入コマンド nmcli connection add type bond-slave autoconnect yes ifname ens37 master bond0 nmcli con show 出力例 [root@c752 ~]# nmcli connection add type bond-slave autoconnect yes ifname ens37 master bond0 nmcli con show Connection 'bond-slave-ens37' (7ca51b00-89fe-4e30-98d0-6588a747b5f1) successfully added. [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE bond-slave-ens37 7ca51b00-89fe-4e30-98d0-6588a747b5f1 ethernet ens37 bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 23ade1e4-3822-4bc9-83fd-3504ad9b5efe bridge virbr0 [root@c752 ~]#
nmcli con showの出力にてbond-slave-ens37がアサインされたことが確認できます。
(5)ens38をBond0にアサイン
投入コマンド nmcli connection add type bond-slave autoconnect yes ifname ens38 master bond0 nmcli con show 出力例 [root@c752 ~]# nmcli connection add type bond-slave autoconnect yes ifname ens38 master bond0 nmcli con show Connection 'bond-slave-ens38' (dc260d63-0dae-4d63-ba90-66fbb57a4735) successfully added. [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE bond-slave-ens37 7ca51b00-89fe-4e30-98d0-6588a747b5f1 ethernet ens37 bond-slave-ens38 dc260d63-0dae-4d63-ba90-66fbb57a4735 ethernet ens38 bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 23ade1e4-3822-4bc9-83fd-3504ad9b5efe bridge virbr0 [root@c752 ~]#
nmcli con showの出力にてbond-slave-ens38がアサインされたことが確認できます。
4.Bonding+Bridge
BondingインターフェースにBridgeインターフェースをアサインします。
(6)Bridgeインターフェースbr0の作成
(7)Bond0をbr0にアサイン
(6)Bridgeインターフェースbr0の作成
投入コマンド nmcli connection add type bridge autoconnect yes con-name br0 ifname br0 nmcli connection modify br0 bridge.stp no nmcli connection modify br0 ipv4.method disabled ipv6.method ignore nmcli connection up br0 nmcli con show brctl show 出力例 [root@c752 ~]# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0 Connection 'br0' (7531e688-83cd-4b97-b596-3b3b55ea2cbf) successfully added. [root@c752 ~]# nmcli connection modify br0 bridge.stp no [root@c752 ~]# nmcli connection modify br0 ipv4.method disabled ipv6.method ignore [root@c752 ~]# nmcli connection up br0 Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/19) [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE bond-slave-ens37 7ca51b00-89fe-4e30-98d0-6588a747b5f1 ethernet ens37 bond-slave-ens38 dc260d63-0dae-4d63-ba90-66fbb57a4735 ethernet ens38 bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 br0 7531e688-83cd-4b97-b596-3b3b55ea2cbf bridge br0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 23ade1e4-3822-4bc9-83fd-3504ad9b5efe bridge virbr0 [root@c752 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no br1 8000.000c299755f7 no ens36 virbr0 8000.525400701951 yes virbr0-nic [root@c752 ~]#
br0は作成されましたが、bond0がbr0にアサインされていない状態です。
この状態だと、仮想マシンのトラフィックを外部のスイッチへ流すことができません。
(7)Bond0をbr0にアサイン
投入コマンド nmcli connection modify bond0 connection.master br0 connection.slave-type bridge nmcli con show brctl show 出力例 [root@c752 ~]# nmcli connection modify bond0 connection.master br0 connection.slave-type bridge [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE bond-slave-ens37 7ca51b00-89fe-4e30-98d0-6588a747b5f1 ethernet ens37 bond-slave-ens38 dc260d63-0dae-4d63-ba90-66fbb57a4735 ethernet ens38 bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 br0 7531e688-83cd-4b97-b596-3b3b55ea2cbf bridge br0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 23ade1e4-3822-4bc9-83fd-3504ad9b5efe bridge virbr0 [root@c752 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no br1 8000.000c299755f7 no ens36 virbr0 8000.525400701951 yes virbr0-nic [root@c752 ~]#
nmcli con showの出力に変化はありません。
また、環境により、brctl showの出力にbond0が表示されない場合があります。
このような場合は、ホストOSを一旦rebootしてください。*3
reboot後の出力
[root@c752 ~]# nmcli con show brctl show NAME UUID TYPE DEVICE bond-slave-ens37 7ca51b00-89fe-4e30-98d0-6588a747b5f1 ethernet ens37 bond-slave-ens38 dc260d63-0dae-4d63-ba90-66fbb57a4735 ethernet ens38 bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 br0 7531e688-83cd-4b97-b596-3b3b55ea2cbf bridge br0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 0208dbe6-9eb8-4370-bd8b-227165f695db bridge virbr0 [root@c752 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29975501 no bond0 br1 8000.000c299755f7 no ens36 virbr0 8000.525400701951 yes virbr0-nic [root@c752 ~]#
brctl showの出力にbond0が表示されました。
5.Bonding+VLAN+Bridge
BondingインターフェースにVLAN+Bridgeインターフェースをアサインします。
Bondingは物理が冗長化されており、複数のBridgeをアサインさせることが可能です。
その場合は、VLAN+Bridgeをセットで追加していく構成となります。
(8)Bridgeインターフェースbr301の作成
(9)VLANインターフェースbond0.301の作成+bond0.301をbond0にアサイン
(10)bond0.301をbr301にアサイン
(8)Bridgeインターフェースbr301の作成
投入コマンド nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method disabled ipv6.method ignore nmcli connection up br301 nmcli con show brctl show 出力例 [root@c752 ~]# nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 Connection 'br301' (040c6db1-4e47-4aaa-beec-014bc14f82a6) successfully added. [root@c752 ~]# nmcli connection modify br301 bridge.stp no [root@c752 ~]# nmcli connection modify br301 ipv4.method disabled ipv6.method ignore [root@c752 ~]# nmcli connection up br301 Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/11) [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE bond-slave-ens37 7ca51b00-89fe-4e30-98d0-6588a747b5f1 ethernet ens37 bond-slave-ens38 dc260d63-0dae-4d63-ba90-66fbb57a4735 ethernet ens38 bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 br0 7531e688-83cd-4b97-b596-3b3b55ea2cbf bridge br0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 br301 040c6db1-4e47-4aaa-beec-014bc14f82a6 bridge br301 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 0208dbe6-9eb8-4370-bd8b-227165f695db bridge virbr0 [root@c752 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29975501 no bond0 br1 8000.000c299755f7 no ens36 br301 8000.000000000000 no virbr0 8000.525400701951 yes virbr0-nic [root@c752 ~]#
br0やbr1と同様です。
br301は作成されましたが、アップリンクとなるbond0.301がアサインされていない状態です。
この状態だと、仮想マシンのトラフィックを外部のスイッチへ流すことができません。
(9)VLANインターフェースbond0.301の作成+bond0.301をbond0にアサイン
投入コマンド nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301 nmcli con show brctl show 出力例 [root@c752 ~]# nmcli connection add type vlan autoconnect yes con-name bond0.301 ifname bond0.301 dev bond0 id 301 Connection 'bond0.301' (749d10a2-4900-42b5-964a-2ea146a2e7a6) successfully added. [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE bond-slave-ens37 7ca51b00-89fe-4e30-98d0-6588a747b5f1 ethernet ens37 bond-slave-ens38 dc260d63-0dae-4d63-ba90-66fbb57a4735 ethernet ens38 bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 br0 7531e688-83cd-4b97-b596-3b3b55ea2cbf bridge br0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 br301 040c6db1-4e47-4aaa-beec-014bc14f82a6 bridge br301 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 0208dbe6-9eb8-4370-bd8b-227165f695db bridge virbr0 bond0.301 749d10a2-4900-42b5-964a-2ea146a2e7a6 vlan -- [root@c752 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29975501 no bond0 br1 8000.000c299755f7 no ens36 br301 8000.000000000000 no virbr0 8000.525400701951 yes virbr0-nic [root@c752 ~]#
nmcli con showの出力にてbond0.301が追加されたことが確認できます。
しかし、現段階ではbond0.301をUpさせていないため、DEVICEが「ーー」となっています。
また、「dev bond0」を指定することにより、bond0.301をbond0にアサインしています。
さらに、「id 301」を指定することにより、VLAN番号を指定しています。*4
(10)bond0.301をbr301にアサイン
投入コマンド nmcli connection modify bond0.301 connection.master br301 connection.slave-type bridge nmcli connection up bond0.301 nmcli con show brctl show 出力例 [root@c752 ~]# nmcli connection modify bond0.301 connection.master br301 connection.slave-type bridge [root@c752 ~]# nmcli connection up bond0.301 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13) [root@c752 ~]# nmcli con show NAME UUID TYPE DEVICE bond-slave-ens37 7ca51b00-89fe-4e30-98d0-6588a747b5f1 ethernet ens37 bond-slave-ens38 dc260d63-0dae-4d63-ba90-66fbb57a4735 ethernet ens38 bond0 25a6c049-251e-464a-87fc-6f25112c712e bond bond0 bond0.301 749d10a2-4900-42b5-964a-2ea146a2e7a6 vlan bond0.301 br0 7531e688-83cd-4b97-b596-3b3b55ea2cbf bridge br0 br1 431ecf74-7476-4009-b13c-d6bb9b286697 bridge br1 br301 040c6db1-4e47-4aaa-beec-014bc14f82a6 bridge br301 bridge-slave-ens36 211c573e-7133-40c3-bba9-c3c19e751417 ethernet ens36 ens33 004afe6f-a987-4467-a6e7-8d5d04ec3a33 ethernet ens33 virbr0 0208dbe6-9eb8-4370-bd8b-227165f695db bridge virbr0 [root@c752 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29975501 no bond0 br1 8000.000c299755f7 no ens36 br301 8000.000c29975501 no bond0.301 virbr0 8000.525400701951 yes virbr0-nic [root@c752 ~]#
nmcli con showの出力のDEVICEにbond0.301が表示され、brctl showの出力にはbond0.301が表示されました。
6.補足1:brctlコマンドについて
先にも書きましたが、「Bridge」や「Bridgeインターフェース」は、仮想スイッチです。
このため、構成図上にもPort1やPort2と記載していますが、これらの確認方法を解説します。
結論から先に書くと、以下2つのオプションコマンドにより確認可能です。
brctl showstp br0 brctl showmacs br0
まずは構成図に記載した状態&Guest1~3を全て起動した状態にて、brctl showで確認してみます。
[root@c752 vm]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29975501 no bond0 vnet1 vnet2 br1 8000.000c299755f7 no ens36 vnet0 br301 8000.000c29975501 no bond0.301 vnet3 virbr0 8000.525400701951 yes virbr0-nic
ここではbr0にフォーカスします。
b0には、bond0,vnet1,vnet2の3つのインターフェースがアサインされています。
bond0は先に記載した通り、nmcliコマンドでb0にアサインしました。
vnet1やvnet2は、仮想マシンを起動させた際、起動順に動的にアサインされます。
では、これら3つのインターフェースがbr0の何番ポート*5に接続されているのでしょうか?
[root@c752 vm]# brctl showstp br0 br0 bridge id 8000.000c29975501 designated root 8000.000c29975501 root port 0 path cost 0 max age 20.00 bridge max age 20.00 hello time 2.00 bridge hello time 2.00 forward delay 15.00 bridge forward delay 15.00 ageing time 300.00 hello timer 0.00 tcn timer 0.00 topology change timer 0.00 gc timer 151.70 flags bond0 (1) port id 8001 state forwarding designated root 8000.000c29975501 path cost 100 designated bridge 8000.000c29975501 message age timer 0.00 designated port 8001 forward delay timer 0.00 designated cost 0 hold timer 0.00 flags vnet1 (2) port id 8002 state forwarding designated root 8000.000c29975501 path cost 100 designated bridge 8000.000c29975501 message age timer 0.00 designated port 8002 forward delay timer 0.00 designated cost 0 hold timer 0.00 flags vnet2 (3) port id 8003 state forwarding designated root 8000.000c29975501 path cost 100 designated bridge 8000.000c29975501 message age timer 0.00 designated port 8003 forward delay timer 0.00 designated cost 0 hold timer 0.00 flags
上記コマンドにより、
Port1=bond0
Port2=vnet1
Port3=vnet2
であることが確認できました。
次に各PortのMACアドレスとarpにより学習したMACアドレスはどのように判別すればよいでしょうか?
[root@c752 vm]# brctl showmacs br0 port no mac addr is local? ageing timer 1 00:50:56:c0:00:01 no 6.96 1 00:0c:29:97:55:01 yes 0.00 1 00:0c:29:97:55:01 yes 0.00 2 52:54:00:5d:46:f7 no 158.94 2 fe:54:00:5d:46:f7 yes 0.00 2 fe:54:00:5d:46:f7 yes 0.00 3 52:54:00:1f:56:30 no 142.25 3 fe:54:00:1f:56:30 yes 0.00 3 fe:54:00:1f:56:30 yes 0.00
上記コマンドより、まず前提として
「port no」 :brctl showstp br0により確認したポート番号 「is local?=yes」:br0内ポートのMACアドレス*6 「is local?=no」 :arpにより学習したMACアドレス*7
となります。
次に
「is local?=yes」のMACアドレスは
port no mac addr 1 00:0c:29:97:55:01 bond0のMACアドレス 2 fe:54:00:5d:46:f7 vnet1のMACアドレス 3 fe:54:00:1f:56:30 vnet2のMACアドレス
となります。
最後に
「is local?=no」のMACアドレスは
port no mac addr 1 00:50:56:c0:00:01 スイッチのPo1のMACアドレス 2 52:54:00:5d:46:f7 Guest2のeth0のMACアドレス 3 52:54:00:1f:56:30 Guest3のeth0のMACアドレス
となります。
7.補足2:スイッチ側のサンプルConfig
Ciscoになってしまいますが、物理スイッチ側のサンプルConfigを乗せておきます。
ens36対向ポート(G0/0)の場合:その1
interface GigabitEthernet0/0 switchport access vlan 100 switchport mode access
最もオーソドックなパターンです。
ens36対向ポート(G0/0)の場合:その2
interface GigabitEthernet0/0 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100,110 switchport mode trunk
Guest側でVLAN Tagを付ける場合です。
Guest側にCSR1000vとかNexus9000vなどを構築した場合、仮想ルータやスイッチ側でVLAN Tagを付けられるため、対向ポートではTrunkにします。
ちなみに、br0上ではスイッチングハブなどのようにTagを剥がされる心配はありません。
bond0対向ポート(Po1&G0/1&G0/2)の場合
interface Port-channel1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100,110,301 switchport mode trunk spanning-tree portfast trunk ! interface GigabitEthernet0/1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100,110,301 switchport mode trunk channel-group 1 mode on ! interface GigabitEthernet0/2 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100,110,301 switchport mode trunk channel-group 1 mode on
図に記載した構成の場合、(9)でVLANインターフェースを作成しているため、301のTrunkは必須となります。
一方、br0は特にVLANインターフェースを経由していないため、VLAN Tagを付けるか否かは、GuestOS側に依存します。
GuestOS側でVLAN Tagを付けない場合は、 switchport trunk native vlan 100などとしてください。
あと、脱線してしまいますが、bonding modeについて少し触れておきます。
Static LAGの場合
nmcli connection add type bond con-name bond0 ifname bond0 mode balance-xor の場合 interface GigabitEthernet0/1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100,110,301 switchport mode trunk channel-group 1 mode on ! interface GigabitEthernet0/2 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100,110,301 switchport mode trunk channel-group 1 mode on
LACPの場合
nmcli connection add type bond con-name bond0 ifname bond0 mode 802.3ad の場合 interface GigabitEthernet0/1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100,110,301 switchport mode trunk channel-group 1 mode active ! interface GigabitEthernet0/2 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100,110,301 switchport mode trunk channel-group 1 mode active
8.補足3:GuestOS側のネットワーク設定
GuestOS側で今回作成したBridgeをアサインする場合、いくつか方法はありますが、Virt-Manager上では以下のように指定します。
以上です。
9.最後に
この手の内容を記載したサイトは他にもたくさんあります。
しかし、どのコマンドを打ったときに、どの部分が作られているのかを順を追って解説したサイトは少ないように感じたので、私なりにまとめてみました。
また、過去記事ではCentOS6系の内容を記載しましたが、nmcliコマンドではなかったため新規記事として作成しました。
前回(2018/10/21に)記載したLXC/LXDのコンテナ環境構築において、ネットワーク周りの内容を記載するにあたり、前提となる知識が必要だったため、今回はLinuxのネットワーク周りについて、少し深堀りした内容にしました。
あと、SR-IOVを動かした際の構成については、次のステップとして検証したいなと思っています。
また「brctlコマンドについて」は今回の内容から少し脱線している認識があります。しかしながら、「brctlコマンドについて」の内容を理解していないと、トラブルシュートが難しくなると考えています。
何かのトラブルが発生した際、例えば、br0上のどのポートからどのMACアドレスが見えているのか?とか、br0上のどのポートをPcapすればよいのか?といったが瞬時に把握できないと、相当しんどいと思うので。
*1:ESXiでは、vSwitchと呼ばれています
*2:私としては、bridge-slaveというよりも、外部スイッチへのアップリンクポートという風に捉えています。
*3:nmcli con reloadやsystemctl reload NetworkManagerを行ってもbond0が表示されないため、rebootした方が手っ取り早いです。ちなみに、この段階でrebootするのではなく、(10)まで設定した後、最後にrebootしても問題ありません。
*4:VLAN番号を指定というよりも、私としては、bond0.301を通過するEtherフレームにVLAN301のTagを付与しているという風に捉えています。
*5:老婆心ながら、ここでいう「ポート」とは、スイッチポートの番号(G1/0/1とか)のことです。L4(TCPやUDP)のポート番号ではありません。
*6:yesのMACアドレスが2つづつ表示されてる理由は私自身もあまりよくわかっていません。すいません。。。
*7:つまり、br0の各ポートの先に存在するMACアドレスとなります。このため、ageing timerが稼働しています。
CentOS7でLXC/LXDのコンテナ環境構築
CentOS7上でLXC/LXDのコンテナ環境を構築しました。
LXC/LXDはUbuntuメインですが、CentOSにおいてもsnapを使用することにより遜色なく使えたため、記事として残しておきます。
Windows版VMWareWorkstation12上でCentOS7.5を稼働させて構築しましたが、同様の手順でベアメタルサーバ上にも構築できます。
1.環境
1-1.VMWare
筐体 : 自作PC CPU : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz VMWare : VMware(R) Workstation 12 Pro 12.5.9 build-7535481 OS : CentOS7.5(1804) Kernel : 3.10.0-862.el7.x86_64 Installed Environment Groups : Minimal Install
WinおよびVMWare環境は以下の画像で確認してもらった方が良いかもしれません。
Win環境
VMWare環境
50GBのOS用とは別に100GBのHDDを追加しています。
これを母体(KVMで言うホストOS)として、LXC/LXD環境を構築していきます。
1-3.全体の流れ
事前準備
Kernelのアップグレード
snapd&LXDのインストール
コンテナのインストール
2.事前準備
3.Kernelのアップグレード
Linux Containers
上記公式サイトのRequirementを読む限り、Kernel3.13以降でないとダメなようです。実際、CentOS7のKernel3.10系のままで進めると、LXDのインストール時に確実に止まってしまいます。このため、少々しんどいですが、Kernelのアップグレードを実施します。
3-1.リポジトリの登録
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
GPG-KeyとELRepoの登録を実施。
# yum list installed | grep kernel kernel.x86_64 3.10.0-862.el7 @anaconda kernel-tools.x86_64 3.10.0-862.el7 @anaconda kernel-tools-libs.x86_64 3.10.0-862.el7 @anaconda
現在インストールされているKernelのバージョンを確認
3-2.Kernelのアップグレード
yum --enablerepo=elrepo-kernel install kernel-ml
最新Kernelのインストール*1
# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg 0 : CentOS Linux (4.18.12-1.el7.elrepo.x86_64) 7 (Core) 1 : CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core) 2 : CentOS Linux (0-rescue-626b869879714a9cbe128e5b6f85dd89) 7 (Core) # grub2-set-default 0 # grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-4.18.12-1.el7.elrepo.x86_64 Found initrd image: /boot/initramfs-4.18.12-1.el7.elrepo.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-862.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-862.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-626b869879714a9cbe128e5b6f85dd89 Found initrd image: /boot/initramfs-0-rescue-626b869879714a9cbe128e5b6f85dd89.img done # reboot
menuentryを確認
初期起動Kernelに4.18.12-1.el7.elrepo.x86_64を選択
grub.cfgへの反映
再起動*2
4.snapd&LXDのインストール
4-1.snapdのインストール
yum -y install epel-release && yum -y install yum-plugin-copr yum -y copr enable ngompa/snapcore-el7 && yum -y install snapd systemctl enable --now snapd.socket
epelとyum-plugin-coprのインストール
coprの有効化とsnapdのインストール
snapdサービスの自動起動設定
4-2.grubbyの設定
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)" grubby --args="namespace.unpriv_enable=1" --update-kernel="$(grubby --default-kernel)" sh -c 'echo "user.max_user_namespaces=3883" > /etc/sysctl.d/99-userns.conf' reboot
詳細は省きますが、上記はいずれもnamespaceに関連したカーネルに渡す引数を設定しています。
4-3.LXDのインストール
snap search lxd
# snap search lxd
Name Version Developer Notes Summary
lxd-demo-server 0+git.f3532e3 stgraber - Online software demo sessions using LXD
lxd 3.6 canonical - System container manager and API
satellite 0.1.2 alanzanattadev - Advanced scalable Open source intelligence platform
上記コマンドにより、snap上でlxdが参照できています。
ln -s /var/lib/snapd/snap /snap snap install lxd # snap install lxd Ensure prerequisites for "lxd" are available Ensure prerequisites for "lxd" are available ~省略~ Download snap "core" (5662) from channel "stable" Download snap "core" (5662) from channel "stable" 3% 23.2MB/s 3.87s ~省略~ Download snap "core" (5662) from channel "stable" 100% 11.2MB/s 0.0ns Download snap "lxd" (9239) from channel "stable" Download snap "lxd" (9239) from channel "stable" 2% 15.0MB/s 4.57s ~省略~ Download snap "lxd" (9239) from channel "stable" 100% 10.4MB/s 0.0ns
snapのシンボリックリンクを張る
lxdのインストール
lxdをインストールすると上記画面のように出力されます。最初はsnapdの”core”がインストールされた後、lxdのインストールが開始されます。
また、たびたび以下のエラーが出力され、lxdサービススタートに失敗してインストールが中断する場合があります。
snap install lxd # snap install lxd 2018-10-20T23:31:34+09:00 INFO Waiting for restart... error: cannot perform the following tasks: - Copy snap "lxd" data (remove /var/snap/lxd/common/ns/shmounts: device or resource busy) - Start snap "lxd" (9239) services ([start snap.lxd.daemon.unix.socket] failed with exit status 1: Job for snap.lxd.daemon.unix.socket failed. See "systemctl status snap.lxd.daemon.unix.socket" and "journalctl -xe" for details.)
その際は、気にせず以下のコマンドを2~3回、少し時間をおきながら繰り返してみてください。
snap install lxd
以下のコマンドによりlxdがインストールされていればOKです。
snap list # snap list Name Version Rev Developer Notes core 16-2.35.4 5662 canonical core lxd 3.6 9239 canonical -
5.コンテナのインストール
5-1.コンテナ格納用ストレージの準備
追加の100GBストレージをfdiskしておきます。
これにより、/dev/sdb1が作成されます。このパーティションはlxd初期設定時に設定します。
fdisk /dev/sdb n t w
5-2.lxd初期設定
以下のコマンドにより、初期設定が開始されます。
lxd init # lxd init Would you like to use LXD clustering? (yes/no) [default=no]: Do you want to configure a new storage pool? (yes/no) [default=yes]: Name of the new storage pool [default=default]: Name of the storage backend to use (btrfs, ceph, dir, lvm) [default=btrfs]: Create a new BTRFS pool? (yes/no) [default=yes]: Would you like to use an existing block device? (yes/no) [default=no]: yes Path to the existing block device: /dev/sdb1 Would you like to connect to a MAAS server? (yes/no) [default=no]: Would you like to create a new local network bridge? (yes/no) [default=yes]: What should the new bridge be called? [default=lxdbr0]: What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: Would you like LXD to be available over the network? (yes/no) [default=no]: Would you like stale cached images to be updated automatically? (yes/no) [default=yes] Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
基本的にはEnterで進めてOKですが、前項で作成したパーティションをコンテナ格納用ストレージとして使用する場合は、上記赤文字のように指定してください。
5-3.コンテナイメージファイルの確認
lxc image list images: # lxc image list images: If this is your first time running LXD on this machine, you should also run: lxd init To start your first container, try: lxc launch ubuntu:18.04 +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+ | alpine/3.4 (3 more) | cc8b58012122 | yes | Alpine 3.4 amd64 (20180627_17:50) | x86_64 | 2.04MB | Jun 27, 2018 at 12:00am (UTC) | +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+ | alpine/3.4/armhf (1 more) | 7813a1299900 | yes | Alpine 3.4 armhf (20180627_17:50) | armv7l | 1.63MB | Jun 27, 2018 at 12:00am (UTC) | +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+ | alpine/3.4/i386 (1 more) | 612c3ece0803 | yes | Alpine 3.4 i386 (20180627_17:50) | i686 | 1.88MB | Jun 27, 2018 at 12:00am (UTC) | +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+ | alpine/3.5 (3 more) | 0381c3c01c04 | yes | Alpine 3.5 amd64 (20181004_13:00) | x86_64 | 3.05MB | Oct 4, 2018 at 12:00am (UTC) | +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+ | alpine/3.5/arm64 (1 more) | ec3eb4f0dd1e | yes | Alpine 3.5 arm64 (20181004_13:28) | aarch64 | 2.96MB | Oct 4, 2018 at 12:00am (UTC) | +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+ ~省略~ +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+ | | ff280c2bb726 | yes | Ubuntu-Core 16 i386 (20180925_19:01) | i686 | 211.07MB | Sep 25, 2018 at 12:00am (UTC) | +-------------------------------+--------------+--------+------------------------------------------+---------+----------+-------------------------------+
上記コマンドにより、Linux Containersにアップロードされているコンテナイメージを参照することができます。
膨大な数がありますので、ここではgrepしてcentosに絞って参照してみます。
lxc image list images: | grep -i centos # lxc image list images: | grep -i centos | centos/6 (3 more) | fa9b42139279 | yes | Centos 6 amd64 (20181004_02:16) | x86_64 | 75.55MB | Oct 4, 2018 at 12:00am (UTC) | | centos/6/i386 (1 more) | fbcfebb4cd8e | yes | Centos 6 i386 (20181004_02:16) | i686 | 75.79MB | Oct 4, 2018 at 12:00am (UTC) | | centos/7 (3 more) | 15089a354969 | yes | Centos 7 amd64 (20181004_02:16) | x86_64 | 83.47MB | Oct 4, 2018 at 12:00am (UTC) | | | 029f614a0679 | yes | Centos 7 amd64 (20181002_02:16) | x86_64 | 83.47MB | Oct 2, 2018 at 12:00am (UTC) | | | 19dcb4a810a0 | yes | Centos 7 amd64 (20181003_02:16) | x86_64 | 83.47MB | Oct 3, 2018 at 12:00am (UTC) | | | 99deb61e666e | yes | Centos 6 i386 (20181003_02:16) | i686 | 75.79MB | Oct 3, 2018 at 12:00am (UTC) | | | d4afdb0e3995 | yes | Centos 6 amd64 (20181003_02:16) | x86_64 | 75.55MB | Oct 3, 2018 at 12:00am (UTC) | | | f47e537c7032 | yes | Centos 6 amd64 (20181002_02:16) | x86_64 | 75.55MB | Oct 2, 2018 at 12:00am (UTC) | | | fc3ce1c88403 | yes | Centos 6 i386 (20181002_02:16) | i686 | 75.79MB | Oct 2, 2018 at 12:00am (UTC) |
5-4.コンテナのインストール
lxc launch images:centos/7/amd64 lxc751 # lxc launch images:centos/7/amd64 lxc751 Creating lxc751 Retrieving image: metadata: 100% (3.20GB/s) Retrieving image: rootfs: 1% (490.01kB/s) Retrieving image: rootfs: 2% (687.27kB/s) ~省略~ Retrieving image: rootfs: 100% (3.14MB/s) Starting lxc751
上記コマンドによりcentos7のコンテナインストールが完了します。
公開サーバの「images:centos/7/amd64」からイメージをDLします。
初回はDLするのに2~3分程度かかりますが、2回目以降はローカルに保存されたコンテナイメージから展開されるため早いです。
また上記の例ではコンテナに「lxc751」という名前付与しています。
起動したコンテナは以下のように確認できます。
lxc list # lxc list +--------+---------+-----------------------+--------------------------------------------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +--------+---------+-----------------------+--------------------------------------------+------------+-----------+ | lxc751 | RUNNING | 10.164.132.246 (eth0) | fd42:45:88ee:25a6:216:3eff:fe60:6a5 (eth0) | PERSISTENT | | +--------+---------+-----------------------+--------------------------------------------+------------+-----------+
5-5.コンテナのbashへ移動
lxc exec lxc751 bash # lxc exec lxc751 bash [root@lxc751 ~]# [root@lxc751 ~]# ip add show 1: lo: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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 5: eth0@if6: mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:16:3e:60:06:a5 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.164.132.246/24 brd 10.164.132.255 scope global dynamic eth0 valid_lft 3269sec preferred_lft 3269sec inet6 fd42:45:88ee:25a6:216:3eff:fe60:6a5/64 scope global mngtmpaddr dynamic valid_lft 3328sec preferred_lft 3328sec inet6 fe80::216:3eff:fe60:6a5/64 scope link valid_lft forever preferred_lft forever
上記コマンドにより、ホストOS上からコンテナのbashへ移動できます。
IPアドレスが先に参照したlxc listで起動中のコンテナと同様であることが確認できます。
以上です。
6.最後に
以下のサイトを参考にさせて頂きました。
Home - LXDドキュメント翻訳プロジェクト
How to Set Up and Use LXD on CentOS Linux 7.x Server - nixCraft
LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術:連載|gihyo.jp … 技術評論社
gihyo.jpの記事は大変よくまとまっており、LXC/LXDのアーキテクチャもさることながら、コンテナ技術そのものやNamespace機能に関する理解が深まりますので、ぜひご一読ください。
先にも書きましたが、LXC/LXDはcanonicalが推し進めていることもありUbuntuがメインとなります。ただ、CentOS7に触れる記事がとても少なかったので、残しておきたいなと思いました。
今回はLXC/LXDのインストールとコンテナのインストールまででしたが、次回はコンテナのネットワーク周りについて書きたいと思います。私は本職がNWエンジニアなので、ここが一番の肝になってくるため、Linuxのネットワーク周りについても触れたいと思っています。
lxc networkコマンドで作成したブリッジの場合、私の使い方にはあまりマッチしなかったため、nmcliコマンドでブリッジを作成した場合についても併せて書きたいと思います。