LANの多重化
ArchLinuxのカーネルがバージョンアップしてから、またLANが不安定に…。
ちなみに使用しているNICはasixのAX88179チップのやつ…。
ネットで調べても、不安定に悩んでいる人が少ないみたい…。
で色々調べた結果…以下の2点を実現することにしました。
- NetworkManagerをやめてnetctlに変更
ArchLinux独自ということで、ArchLinuxに最適化されていると信じる…。 - ネットワークを多重化する
速度の向上は特に望んでいないので、ウォームスタンバイにして1つのNICが死んでも別のNICで通信を継続するようにする。
※以下の手順はセキュリティ上VirtualBoxで操作した内容になっています。
目次
bondingの準備
ifenslaveのインストール
bondingに必要な「ifenslave」パッケージを、以下のコマンドでインストールします。
pacman -S ifenslave
netctlはデフォルトでインストールされているので、netctlを使用したbondingを実現できるように設定ファイルを作成します。
bondingの設定
先ずは、bondingするNIC名を以下のコマンドで取得します。
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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:66:20:41 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::3092:89f5:4be1:eb66/64 scope link
valid_lft forever preferred_lft forever
3: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:59:5c:9a brd ff:ff:ff:ff:ff:ff
inet 10.0.4.15/24 brd 10.0.4.255 scope global dynamic noprefixroute enp0s9
valid_lft 80855sec preferred_lft 80855sec
inet6 fe80::3384:eba2:7991:7635/64 scope link noprefixroute
valid_lft forever preferred_lft forever
現時点ではNetworkManagerが起動しているので、2つのNICが生きています。
上記の例では「enp0s3」と「enp0s9」が、それぞれのNIC名になります。
次に手順に従って、サンプルファイルをコピーします。
cp /etc/netctl/examples/bonding /etc/netctl
コピーできたら、環境に合わせて内容を編集します。
nanoなどのエディタで「/etc/netctl/bonding」を開きます。
【修正前】
1 Description="A bonded interface"
2 Interface=bond0
3 Connection=bond
4 BindsToInterfaces=(eth0 eth2)
5 IP=static
6 Address="10.0.0.1/8"
7 #Mode=balance-rr
【修正後】
1 Description='A bonded interface'
2 Interface='bond0'
3 Connection=bond
4 BindsToInterfaces=('enp0s3' 'enp0s9')
5 IP=static
6 Address="10.0.2.15/24"
7 IP6=stateless
8 Mode=active-backup
9 primary=enp0s3
所々、シングルクォーテーションに修正しています。(でないと上手くいかなかったです…)
「BindsToInterfaces」はbondingの対象にするNIC名を指定します。
「Address」は固定IPv4アドレスを指定します。
「IP6=stateless」はIPv6を有効にして、おまかせしています。
「Mode」は動作させるモードを指定します。指定する内容はこちらを参照してください。
「primary」は優先させるNICを指定します。
切り替え
NetworkManegerの無効化とnetctlの有効化
NetworkManegerを無効化して、netctlを有効化します。
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl start netctl
systemctl enable netctl
netctlの設定の切り替え
netctlの動作をbondingに切り替えます
netctl switch-to bonding
念のため再起動
rboot
動作確認
以下のコマンドで動作状況を確認します。
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: enp0s3
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: enp0s3
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:66:20:41
Slave queue ID: 0
Slave Interface: enp0s9
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:59:5c:9a
Slave queue ID: 0
何となくですが…動作モードは「active-backup」でアクティブが「enp0s3」、「enp0s9」は待機しています。
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: enp0s3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UP group default qlen 1000
link/ether aa:3e:a4:2a:af:81 brd ff:ff:ff:ff:ff:ff
inet6 fe80::acd6:4a41:a7e2:54af/64 scope link tentative
valid_lft forever preferred_lft forever
3: enp0s9: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UP group default qlen 1000
link/ether aa:3e:a4:2a:af:81 brd ff:ff:ff:ff:ff:ff
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether aa:3e:a4:2a:af:81 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.16/24 brd 10.0.2.255 scope global noprefixroute bond0
valid_lft forever preferred_lft forever
inet6 fe80::a83e:a4ff:fe2a:af81/64 scope link
valid_lft forever preferred_lft forever
VirtualBoxの都合でdhcp設定にしましたが…。
「bond0」が追加されて、「enp0s3」と「enp0s9」がSLAVEになています。
これだけでは不安なので、以下のコマンドで「enp0s3」を殺してみます。
ip link set enp0s3 down
だめだ…切り替わらない…
参考サイト
netctl - ArchWiki
マスターのnetctl / netctl.profile.5.txt・joukewitteveen / netctl・GitHub
LinuxでのNIC冗長化(bonding)を少し深く考えてみる: sanonosa システム管理コラム集