😊

OPX(OpenSwitch)の入ったs6010-onでMTU 9000の永続化をしたい

2024/12/04に公開

MMA Advent Calendar 2024 4日目の記事です

はじめに

s6010-onは全ポートQSFP+です.

40Gbitを扱うならMTU 9000のジャンボフレームで扱いたいところです.

しかし,一時的にならできますが,設定の永続化にはかなりハマりました.

コマンドラインの場合

インターフェースの設定はipコマンドやifconfigコマンドがそのまま使えます.

そのため,MTU 9000の設定も以下のコマンドでできます.

$ sudo ip link set e101-001-0 mtu 9000
$ sudo ip link set e101-032-0 mtu 9000
$ sudo ip link set e101-032-0.10 mtu 9000
$ sudo ip link set br10 mtu 9000

しかし,これではスイッチが再起動したときにすべて消えてしまいます.

そのため,設定の永続化が必要です.

試行錯誤

/etc/network/interfaces に書き込み

OPXはDebianベースで,インターフェースの設定は/etc/network/interfacesに書いておけば設定の永続化ができます.

そのため最初は,このファイルにmtu 9000と書けば行けると思っていました.

/etc/network/interfaces
(前略)

auto e101-001-0
iface e101-001-0 inet manual
    mtu 9000

auto e101-032-0.10
iface e101-032-0.10 inet manual
    vlan-raw-device e101-032-0
    mtu 9000

auto br10
iface br10 inet static
    address 192.168.0.253/24
    bridge_ports e101-001-0 e101-032-0.10
    mtu 9000

ここに書いた後,以下のコマンドで設定は即時に反映できます.

$ sudo systemctl restart networking
$ ip link show
(前略)
7: e101-001-0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq master br10 state UP mode DEFAULT group default qlen 1000
    link/ether f4:8e:38:2b:17:6a brd ff:ff:ff:ff:ff:ff
    alias NAS## 0 1
(中略)
38: e101-032-0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether f4:8e:38:2b:17:d1 brd ff:ff:ff:ff:ff:ff
    alias NAS## 0 125
40: e101-032-0.10@e101-032-0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc noqueue master br10 state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
    link/ether f4:8e:38:2b:17:d1 brd ff:ff:ff:ff:ff:ff
41: br10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether f4:8e:38:2b:17:6a brd ff:ff:ff:ff:ff:ff

しかし,networkingのリスタートではなく,スイッチ自体を再起動してみたら問題が起こりました.

インターフェースのMTUは9000で設定されていますが,他のホストと通信ができなくなってしまったのです.

$ ping 192.168.0.4
PING 192.168.0.4 (192.168.0.4) 56(84) bytes of data.
< シーン >

interfacesにコマンドを書いてみる

コマンドで設定したときは通信できたので,/etc/network/interfacesにコマンドを書いてみることにします.

uppost-upオプションを使えば,インターフェースが立ち上がった直後にコマンドを実行することができます.

/etc/network/interfaces
(前略)

auto e101-001-0
iface e101-001-0 inet manual
    mtu 9000
    up ip link set $IFACE mtu 9000

auto e101-032-0.10
iface e101-032-0.10 inet manual
    vlan-raw-device e101-032-0
    mtu 9000
    up ip link set $IFACE mtu 9000

auto br10
iface br10 inet static
    address 192.168.0.253/24
    bridge_ports e101-001-0 e101-032-0.10
    mtu 9000
    up ip link set $IFACE mtu 9000

しかし,これでも結果は同じです.MTU 9000はちゃんと設定されますが,他のホストにpingが届きません.

これはuppost-upに置き換えても一緒でした.

結論: systemdにコマンドを実行させる

/etc/network/interfacesが使えないことがわかったので,別の方法でコマンドを実行できるようにします.

OPXはDebianベースなので,スイッチ起動時にはsystemdが働きます.

そのため,MTU 9000を設定するサービスをsystemdに登録させて,systemdに設定させます.

/etc/systemd/system/set-mtu-9000.service
[Unit]
Description=Set interfaces mtu 9000
After=network-online.target
Requires=network-online.target

[Service]
Type=oneshot
ExecStart=/opt/mtu9000/set-mtu-9000.sh

[Install]
WantedBy=multi-user.target
/opt/mtu9000/set-mtu-9000.sh
#!/bin/sh
interfaces="e101-001-0 e101-032-0 e101-032-0.10 br10"

for iface in $interfaces; do
    while ! ip link show "$iface" > /dev/null 2>&1; do
        echo "Waiting for interface $iface to appear..."
        sleep 1
    done
    echo "Interface $iface is available."
done

for iface in $interfaces; do
    ip link set "$iface" mtu 9000
    echo "MTU set to 9000 for $iface."
done

echo "All interfaces have been configured with MTU 9000."
$ sudo chmod +x /opt/mtu9000/set-mtu-9000.sh
$ sudo systemctl enable set-mtu-9000.service

network-online.targetのあとに動かすことで,インターフェースが立ち上がった後にMTU 9000を設定するように試みていますが,

実際にはインターフェースが立ち上がる前からnetwork-online.targetが動いてしまいます.
(しかも失敗して終わってそのあと何回もスタートしまくります.)

そのため,シェルスクリプト側でインターフェースが立ち上がったかの確認が必要です.

これで再起動時に,インターフェースがMTU 9000に設定され,他のホストと通信することができました.

$ ip link show
(前略)
7: e101-001-0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq master br80 state UP mode DEFAULT group default qlen 1000
    link/ether f4:8e:38:2b:17:6a brd ff:ff:ff:ff:ff:ff
    alias NAS## 0 1
(中略)
38: e101-032-0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether f4:8e:38:2b:17:d1 brd ff:ff:ff:ff:ff:ff
    alias NAS## 0 125
40: e101-032-0.10@e101-032-0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc noqueue master br10 state LOWERLAYERDOWN mode DEFAULT group default qlen 1000
    link/ether f4:8e:38:2b:17:d1 brd ff:ff:ff:ff:ff:ff
41: br10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether f4:8e:38:2b:17:6a brd ff:ff:ff:ff:ff:ff
$ ping -c 5 -M do -s 8972 192.168.0.4
PING 192.168.0.4 (192.168.0.4) 8972(9000) bytes of data.
8980 bytes from 192.168.0.4: icmp_seq=1 ttl=64 time=0.577 ms
8980 bytes from 192.168.0.4: icmp_seq=2 ttl=64 time=0.704 ms
8980 bytes from 192.168.0.4: icmp_seq=3 ttl=64 time=0.577 ms
8980 bytes from 192.168.0.4: icmp_seq=4 ttl=64 time=0.564 ms
8980 bytes from 192.168.0.4: icmp_seq=5 ttl=64 time=0.566 ms

--- 192.168.0.4 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4103ms
rtt min/avg/max/mdev = 0.564/0.597/0.704/0.059 ms

参考

Discussion