kobar9568のブログ

技術的なメモやその他諸々

自分用と家族用のファイルサーバーを統合した

我が家ではストレージとして、 自分用にはアプライアンスNAS(Synology DiskStation DS218play)を、 家族用にはヤフオクで落札したスリムタワーPCにUbuntu Server 18.04を入れてSambaを動かしていた。

物理的にサーバーを分けていたのは同時アクセス時の帯域を確保したかったからだが、とても無駄だなぁ…と思っていた。 そこで、今回は両方を1台のサーバーに収めて、リンクアグリゲーションを利用して家族と自分が同時にアクセスしてもギガビットの帯域をそれぞれ使えるようにした。

今までの構成

f:id:kobar9568:20190416151311p:plain

だいたいこんな感じになっていた。

ルーターのスイッチポートに直接自分のパソコンとNASを接続し、サーバー類とAPも同じ段に設置することで家族が家族用のストレージへ、自分が自分用のストレージに同時にアクセスしても帯域が確保できるようにしていた。

新しい構成

f:id:kobar9568:20190416152742p:plain

ルーターのスイッチポートに接続していたデバイスと、サーバー置き場にあるスイッチングハブに接続していたデバイスを1台のスイッチに収容して、サーバーとスイッチ間のリンクを負荷分散させる

購入品

サーバー

  • 普通のパソコン
  • Ubuntu Server 18.04.2 LTS
    • 今回はnetplanからbondingの設定をする
  • オンボードNICとUSB NICでリンクアグリゲーションする

サーバー側 bondingの設定

2019/04/30 06:40 内容を編集

  • Ubuntu 17.10から設定がnetplanになったので、こちらで設定する。

USB NICを挿してNIC名の確認

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
(略)
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether d8:cb:8a:c3:4c:0d brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.237/24 brd 10.0.0.255 scope global enp2s0
       valid_lft forever preferred_lft forever
(略)
3: enxbc5c4ce124f3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether bc:5c:4c:e1:24:f3 brd ff:ff:ff:ff:ff:ff

netplan 設定ファイルの編集

$ sudo cp -p /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.org
  • 設定ファイルのバックアップ
$ sudo vi /etc/netplan50-cloud-init.yaml
  • netplan設定ファイルの編集
# 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:
    ethernets:
        enp2s0:
            match:
                macaddress: d8:cb:8a:c3:4c:0d
            set-name: eth1
        enxbc5c4ce124f3:
            match:
                macaddress: bc:5c:4c:e1:24:f3
            set-name: eth2
        eth1:
            addresses: []
        eth2:
            addresses: []
    bonds:
        bond0:
            addresses: [10.0.0.237/24]
            gateway4: 10.0.0.254
            nameservers:
                addresses: [10.0.0.254]
            interfaces:
            - eth1
            - eth2
            parameters:
                mode: balance-xor
                mii-monitor-interval: 1
    version: 2
  • USB NIC(enx…)は再起動の拍子にNIC名がenp…に変わってしまうことがあるので、set-nameeth2に設定している。
  • せっかくなのでオンボードNIC(enp2s0)に対しても名前の設定を行い、eth1eth2にしておく
  • set-nameした結果のインタフェースをeth1eth2として定義しておく。ここを省略すると、束ねる時にインタフェースが定義されていないと言われエラーになってしまう
  • bond0で、eth1eth2を束ね、束ねたこのインタフェースに対してIP等の設定を行う
  • 対向スイッチはスタティックの設定になっているので、bondingのモードはbalance-xor
  • mii-monitor-intervalNICの故障検知の間隔を設定するらしい。(要調査)
dhcp4: false
dhcp6: false
  • DHCPはデフォルトでオフになっているので、これは必要ナシ。(あってもOK)

設定の適用

$ sudo reboot
  • sudo netplan applyだと、USB NICに対してeth2の設定のみがされ、オンボード NICには設定されない。
    • この状態で再起動すると、USB NICは(enp…)の名前になってしまうので、NG。

状態の確認

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

Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 1
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: bc:5c:4c:e1:24:f3
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: d8:cb:8a:c3:4c:0d
Slave queue ID: 0
  • 3行目 Bonding Modeの記述より、ロードバランシングが設定されている。
  • ちゃんとSlave Interfaceに2つ表示されている。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
(略)
2: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UP group default qlen 1000
    link/ether c6:ed:90:c2:76:a7 brd ff:ff:ff:ff:ff:ff
3: eth2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bond0 state UP group default qlen 1000
    link/ether c6:ed:90:c2:76:a7 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 c6:ed:90:c2:76:a7 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.237/24 brd 10.0.0.255 scope global bond0
       valid_lft forever preferred_lft forever
(略)
  • 2つのインタフェースがどちらもmaster bond0 state UPとなっている

スイッチ側 LAGの設定

  • TP-LinkはリンクアグリゲーションをLAGと呼んでいるらしい。
  • WebUIで簡単に設定できる。

f:id:kobar9568:20190416163740p:plain

  • 左側のメニューでSwitchingを選択し、その下にあるLAGを選択

f:id:kobar9568:20190416163727p:plain

  • LAG 1にPort1とPort2を割り当ててApply

確認

  • 2台のPCが同時にサーバーから約4GBのCentOSのisoをコピーする
  • HDDのI/Oがボトルネックにならないように、ファイルは家族用のHDDと自分用のHDDにそれぞれ設置

f:id:kobar9568:20190416164713p:plain

  • My PCがコピーを始めると、Port1のランプが点滅してアクセスしている。Port2は点滅していない。
  • Test PCがコピーを始めると、Port2も点滅する。
  • どちらも110MB/sくらいのコピー速度が出ているので、無事負荷分散出来ている。

感想

  • netplanからのbondingの設定が思ったより簡単だった。
  • USB NICを使ったので、単純にenxから始まるUSB NICbond0で束ねても、OSを再起動した拍子にenpから始まるNIC名(enp0s20f0u4)に変わってしまい、bondingが外れてしまうという現象があった。
    • 変わった後のenpから始まるNIC名を使ってもう一度設定を行うと取り敢えず動作したが、また再起動の拍子にenxから始まるNIC名に戻ってbond0から外れる等、不安定だったので、NIC名を変更した。
    • systemdでの命名ルールによると、最初の2文字がインタフェースの種類(今回はEtherneten)で、3文字目はNICの装着場所を表すらしい。xの場合は、後ろにMACアドレスが続く。pの場合はPCIのバスの場所らしい。
    • 何故bondingした上で再起動をするとPCIバスのNICとして認識されるのかはよく分からなかった。
  • NASからRAIDケースへのデータ移行は適当に済ませた。玄人志向のGW3.5AX2-SU3/REV2.0へお引越し。このケース、安かろう…なレビューが多いが、なんだかんだでハードウェアRAIDは安心。
  • 余ったDS218playは友人に買い取ってもらうことになった。