あらためて見直すDebian系Linuxでのボンディング設定(UbuntuとProxmoxで検証)

前書き

Debian系Linuxのボンディング設定でハマったのでメモしたい。

ネット上にいろいろ情報は載っているのはわかってる。だけど言わせてくれ。

見かけ上ボンディングはできているが、片側のLANケーブルを抜いて挿し直すと、ネットワークが繋がらなくなるという現象が発生したんだ。
(片側のLANケーブルを抜いた時は大丈夫。だけどLANケーブルを挿し直すとPingが通らなくなるということがあったんだ)

備忘録として書いておこうと思う。
失敗した設定はあえて書かない。というかもう忘れてしまった。

それから話は別だけど、Linuxベースの仮想アプライアンスでProxmox VE(以下Proxmox)というものがあるのだが、Proxmoxでボンディング設定したインターフェースを、その上で動くゲストマシンにアサインする方法も書く。

参考にしたサイトは下記だ。
https://help.ubuntu.com/community/UbuntuBonding

ちなみに、ボンディングの検証を実施したディストリビューションとバージョンは下記のとおりである。

検証ディストリビューション バージョン IPアドレス
Ubuntu 18.04.2 LTS (Bionic Beaver) 192.168.100.201

Debian
(Proxmox VE)

9.6 (stretch)
(5.3)
192.168.100.200




 

ボンディングの設定

まずはボンディング設定の流れを書いておこう。

まず、ボンディング設定に必要なパッケージ「ifenslave」をインストールする。
ちなみに、Proxmox VE 5.3ではすでにこのパッケージはインストールされていた。なのでUbuntuの場合に実施いただければと思う。

マシンがインターネットにつながっているならば、下記コマンドでインストールできる。

# apt-get install ifenslave

 

俺はオフラインサーバの状況を想定し、パッケージをダウンロードして[dpkg]コマンドでインストールした。

パッケージは下記サイトからダウンロードした。
https://packages.ubuntu.com/cosmic/ifenslave

ダウンロードしたパッケージを、「WinSCP」などの転送ツールを使用してUbuntuにアップロードする。

そしてアップロードしたディレクトリで、下記コマンドでインストールする。

# dpkg --install ifenslave_2.9ubuntu1_all.deb

 

ここからはUbuntuでもProxmoxでも行う設定である。
ちなみにこれからコマンド画面が多々出てくるが、すべてUbuntuのものを使用している。

viエディタで「/etc/modules」ファイルを開き、”bonding”を追記する。

# vi /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

bonding

 

モジュールを読み込み、再起動する。

# modprobe bonding
# init 6

 

再起動後、ipコマンドで認識されているインターフェース名を確認する。
下の場合、「enp3s0」と「enp2s0」というインターフェース名で物理NICが認識されている。
初期設定ではDHCPとなっているため、それぞれのインターフェースに異なるIPアドレスが割り振られている。

# 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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:5f:f4:68:ee:d3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.143/24 brd 192.168.100.255 scope global dynamic noprefixroute enp3s0
       valid_lft 604710sec preferred_lft 604710sec
    inet6 2001:268:c0e6:6f0a:dc72:9bdb:40b:3/128 scope global dynamic noprefixroute 
       valid_lft 7111sec preferred_lft 3511sec
    inet6 2001:268:c0e6:6f0a:3d3f:615d:adc0:d2df/64 scope global temporary dynamic 
       valid_lft 7120sec preferred_lft 3520sec
    inet6 2001:268:c0e6:6f0a:7efe:c83f:25f5:24b9/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 7120sec preferred_lft 3520sec
    inet6 fe80::cbba:4a0e:f7f3:ea6f/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:1b:21:63:a8:1d brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.153/24 brd 192.168.100.255 scope global dynamic noprefixroute enp2s0
       valid_lft 604717sec preferred_lft 604717sec
    inet6 2001:268:c0e6:6f0a:dc72:9bdb:40b:2/128 scope global dynamic noprefixroute 
       valid_lft 7120sec preferred_lft 3520sec
    inet6 2001:268:c0e6:6f0a:1111:acda:55bb:b3be/64 scope global temporary dynamic 
       valid_lft 7120sec preferred_lft 3520sec
    inet6 2001:268:c0e6:6f0a:5b4e:794d:3bf7:ec62/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 7120sec preferred_lft 3520sec
    inet6 fe80::8e98:c435:8862:eec6/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

 

「/etc/network/interface」ファイルをviエディタなどで開いて、以下のように編集する。今回のボンディングモードは「active-backup」とする。※基本的に「# LANカード#1」以降の記載は追記するが、特に注意すべき個所を黄色字で書いている。

# vi /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

# LANカード#1
auto enp3s0
iface enp3s0 inet manual
        bond-master bond0

# LANカード#2
auto enp2s0
iface enp2s0 inet manual
        bond-master bond0

# ボンディング設定
auto bond0
iface bond0 inet static
        address 192.168.100.201
        netmask 255.255.255.0
        gateway 192.168.100.1
        bond-mode active-backup
        bond-miimon 100
        bond-slaves none

 

そしたらネットワークをリスタートする。[ok]という表示が出れば問題ない。

# /etc/init.d/networking restart
[ ok ] Restarting networking (via systemctl): networking.service.

 

[ifconfig]コマンドを実行してみると、[bond0]インターフェースにIPアドレスが振られていることがわかる。
注目したいのは、ボンディングを組んでいる[enp2s0]と[enp3s0]のMACアドレスが同じになっていることだ。

# ifconfig
bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500
        inet 192.168.100.201  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 2001:268:c0e6:6f0a:21b:21ff:fe63:a81d  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::21b:21ff:fe63:a81d  prefixlen 64  scopeid 0x20<link>
        inet6 2001:268:c0e6:6f0a:a849:89a2:7fbd:c783  prefixlen 64  scopeid 0x0<global>
        ether 00:1b:21:63:a8:1d  txqueuelen 1000  (イーサネット)
        RX packets 3054  bytes 1105402 (1.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2584  bytes 234850 (234.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:1b:21:63:a8:1d  txqueuelen 1000  (イーサネット)
        RX packets 68  bytes 5078 (5.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xf7ec0000-f7ee0000

enp3s0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        inet 192.168.100.153  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::e37e:519d:41d7:d1dd  prefixlen 64  scopeid 0x20<link>
        ether 00:1b:21:63:a8:1d  txqueuelen 1000  (イーサネット)
        RX packets 2986  bytes 1100324 (1.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2584  bytes 234850 (234.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (ローカルループバック)
        RX packets 214  bytes 17746 (17.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 214  bytes 17746 (17.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

ボンディングのステータスを確認するためには、「/proc/net/bonding/bond0」ファイルを確認する。
※ファイル名が[bond0]なのは、ここでのボンディングインターフェース名が[bond0]のためだ。

2つのインターフェースがup状態となっていることがわかる。

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: enp3s0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: enp2s0
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:1b:21:63:a8:1d
Slave queue ID: 0

Slave Interface: enp3s0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: bc:5f:f4:68:ee:d3
Slave queue ID: 0

 

ここで、[enp2s0]インターフェースのLANケーブルを抜いてみる。「/proc/net/bonding/bond0」ファイルを確認すると、enp2s0がdown状態になったことがわかる。

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: enp3s0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: enp2s0
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 2
Permanent HW addr: 00:1b:21:63:a8:1d
Slave queue ID: 0

Slave Interface: enp3s0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: bc:5f:f4:68:ee:d3
Slave queue ID: 0

 

ログ(/var/log/syslog)でも、enp2s0がdownしたと記録されている。
※余談だが、Debian(Proxmox)のログファイルは「/var/log/messages」であった。

# tail /var/log/syslog
Mar 10 20:34:06 atsushi-desktop colord-sane: io/hpmud/pp.c 627: unable to read device-id ret=-1
Mar 10 20:38:58 atsushi-desktop gnome-session[1695]: gnome-session-binary[1695]: WARNING: Could not get session path for session. Check that logind is properly installed and pam_systemd is getting used at login.
Mar 10 20:38:58 atsushi-desktop gnome-session-binary[1695]: WARNING: Could not get session path for session. Check that logind is properly installed and pam_systemd is getting used at login.
Mar 10 20:39:09 atsushi-desktop rtkit-daemon[1848]: Supervising 2 threads of 1 processes of 1 users.
Mar 10 20:39:09 atsushi-desktop rtkit-daemon[1848]: Successfully made thread 2472 of process 1846 (n/a) owned by '1000' RT at priority 5.
Mar 10 20:39:09 atsushi-desktop rtkit-daemon[1848]: Supervising 3 threads of 1 processes of 1 users.
Mar 10 20:39:09 atsushi-desktop unity-settings-[1679]: failed to turn the kbd backlight off: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: パス /org/freedesktop/UPower/KbdBacklight のオブジェクト上にインターフェース 'org.freedesktop.UPower.KbdBacklight' がありません
Mar 10 20:39:09 atsushi-desktop unity-settings-[1679]: Unable to get default sink
Mar 10 20:39:25 atsushi-desktop kernel: [ 1654.980058] e1000e: enp2s0 NIC Link is Down
Mar 10 20:39:25 atsushi-desktop kernel: [ 1655.079956] bond0: link status definitely down for interface enp2s0, disabling it

 

ここで、[enp2s0]のLANケーブルを挿し直してみる。

まずログを確認すると、[enp2s0]がup状態になったことがわかる。

# tail /var/log/syslog
Mar 10 20:39:25 atsushi-desktop kernel: [ 1654.980058] e1000e: enp2s0 NIC Link is Down
Mar 10 20:39:25 atsushi-desktop kernel: [ 1655.079956] bond0: link status definitely down for interface enp2s0, disabling it
Mar 10 20:40:56 atsushi-desktop NetworkManager[978]: <info>  [1552218056.6871] device (enp2s0): carrier: link connected
Mar 10 20:40:56 atsushi-desktop kernel: [ 1746.148510] e1000e: enp2s0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
Mar 10 20:40:56 atsushi-desktop kernel: [ 1746.148628] e1000e 0000:02:00.0 enp2s0: 10/100 speed: disabling TSO
Mar 10 20:40:56 atsushi-desktop kernel: [ 1746.180447] bond0: link status definitely up for interface enp2s0, 100 Mbps full duplex

 

ボンディングステータスを確認しても、[enp2s0]がup状態になっていることがわかる。

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: enp3s0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: enp2s0
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 2
Permanent HW addr: 00:1b:21:63:a8:1d
Slave queue ID: 0

Slave Interface: enp3s0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: bc:5f:f4:68:ee:d3
Slave queue ID: 0

 

ちなみにこの後、[enp3s0]の抜き差しもやってみたが、問題なかった。




 

Proxmox上の仮想マシンにボンディングした仮想NICを割り当てる

ここからはProxmoxの話だ。Ubuntuは関係なくなるのであしからず。
Proxmox(仮想アプライアンス)上の仮想マシンに、ボンディング設定したインターフェースを割り当てる方法を書く。

方法は簡単だ。ブリッジアダプタを作成し、そのブリッジアダプタにボンディングインターフェースを割り当てるだけだ。

「/etc/network/interfaces」ファイルを以下のように編集する。具体的には、[bond0]はmanualとしてIPアドレスを外し、ブリッジアダプタにIPアドレスを割り振る。

# vi /etc/network/interfaces


auto lo
iface lo inet loopback

# LANカード#1
auto enp2s0
iface enp2s0 inet manual
        bond-master bond0

# LANカード#2
auto enp3s0
iface enp3s0 inet manual
        bond-master bond0

# ボンディング設定
auto bond0
iface bond0 inet manual
        bond-mode active-backup
        bond-miimon 100
        bond-slaves none

# ブリッジ設定
auto vmbr0
iface vmbr0 inet static
        address 192.168.100.200
        netmask 255.255.255.0
        gateway 192.168.100.1
        bridge_ports bond0
        bridge_stp off
        bridge_fd 0

 

そしたらマシンを再起動する。(ネットワークの再起動だけでは無理だった)

# init 6

 

[ifconfig]コマンドを実行すると、以下のような感じだ。ブリッジアダプタ(vmbr0)にIPアドレスが割り振られていることがわかる

# ifconfig
bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500
        ether 00:1b:21:63:a8:1d  txqueuelen 1000  (Ethernet)
        RX packets 262  bytes 21571 (21.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 154  bytes 14459 (14.1 KiB)
        TX errors 0  dropped 3 overruns 0  carrier 0  collisions 0

enp2s0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:1b:21:63:a8:1d  txqueuelen 1000  (Ethernet)
        RX packets 124  bytes 11090 (10.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 67  bytes 5972 (5.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xf7ec0000-f7ee0000

enp3s0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 00:1b:21:63:a8:1d  txqueuelen 1000  (Ethernet)
        RX packets 138  bytes 10481 (10.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 87  bytes 8487 (8.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vmbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.200  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 2001:268:c0e5:f03f:21b:21ff:fe63:a81d  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::21b:21ff:fe63:a81d  prefixlen 64  scopeid 0x20<link>
        ether 00:1b:21:63:a8:1d  txqueuelen 1000  (Ethernet)
        RX packets 167  bytes 13037 (12.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 158  bytes 14373 (14.0 KiB)

 

このブリッジアダプタを仮想マシンにアタッチすればよい。
つまり言いたいことは、ボンディングアダプタをそのまま仮想マシンにアタッチすることはできないということ。ボンディングアダプタをブリッジアダプタにアサインして、そのブリッジアダプタを仮想マシンにアタッチするという流れだ。
ワンクッション置くということだね。

 

後書き

読んでいただきありがとうございました。

メインはDebian系ディストリビューションでのボンディング設定についてでしたが、ボンディングアダプタを仮想マシンにアサインできないということにも俺は少しつまずいた。

少しでもお役に立てたならば幸いです。