CentOS 7 の Teaming + VLAN + Bridge でハマる

CentOS 7 にて

em1 ---+             +--- vlan2 --- br0
       +--- team0 ---+
em2 ---+             +--- vlan3 --- br1

という Teaming で冗長化したインターフェースを VLAN で分割してそれぞれを Bridge にするというネットワーク構成にしようとして、2014年末頃には期待通りにどうさせず、次のようにつぶやいてたら

中井さんが調べて Bugzilla に登録したりしてくださり、まとめページまでつくっていただけたので2016年に再チャレンジしたときにはすんなりできました。ありがとうございます。

ががが、テスト用の環境でセットアップした際には期待通りに動作していたはずなのに実環境に持って行ったらなぜか vlan が片方だけしか Up しないという問題が発生…

$ sudo systemctl status network.service -l
● network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network)
   Active: failed (Result: exit-code) since Thu 2016-04-21 09:31:10
JST; 1min 35s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 11093 ExecStop=/etc/rc.d/init.d/network stop (code=exited,
status=0/SUCCESS)
  Process: 11775 ExecStart=/etc/rc.d/init.d/network start
(code=exited, status=1/FAILURE)

Apr 21 09:31:09 localhost network[11775]: Bringing up interface vlan-vlan2:  Error: Timeout 90 sec expired.
Apr 21 09:31:09 localhost network[11775]: [FAILED]
Apr 21 09:31:09 localhost network[11775]: Bringing up interface vlan-vlan3:  Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/14)
Apr 21 09:31:09 localhost network[11775]: [  OK  ]
Apr 21 09:31:09 localhost network[11775]: Bringing up interface bridge-br0:  [  OK  ]
Apr 21 09:31:10 localhost network[11775]: Bringing up interface bridge-br1:  [  OK  ]
Apr 21 09:31:10 localhost systemd[1]: network.service: control process exited, code=exited status=1
Apr 21 09:31:10 localhost systemd[1]: Failed to start LSB: Bring up/down networking.
Apr 21 09:31:10 localhost systemd[1]: Unit network.service entered failed state.
Apr 21 09:31:10 localhost systemd[1]: network.service failed.

調べたところ L2 switch との相性の問題なのかちょっと待ってから inteface を up させれば良いということが判明したので次のように service を作成して対応しました。

/etc/systemd/system/wait-vlan-ready.service

[Unit]
Description=Wait for VLAN ready state
Before=network.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sleep 20

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable wait-vlan-ready

Before=network.servce としてあるので network サービスを起動させる前に20秒 sleep することになります。