CentOS7にmininetを入れたらシャットダウンできなくなった話

Posted on 2015/08/10(Mon) 16:05 in technical

サマリー

CentOS7-1503にmininetを入れます。

systemdの影響でmininetを一度でも起動すると、正常にシャットダウンできなくなるので、簡単なワークアラウンドも併記します。

SDNアプリの開発やOpenDaylightの動作確認など、ちょこちょこ出番があるんだろうなぁ、と思いました(他人事)

手順

  1. openvswitchを入れる
  2. mininetを入れる
  3. 起動する

ここまで。

openvswitchを入れる

どこからでも良いので、RDOを使います。:

$ sudo yum install -y https://repos.fedorapeople.org/repos/openstack/openstack-icehouse/epel-7/rdo-release-icehouse-4.noarch.rpm
$ sudo yum install -y openvswitch
$ sudo systemctl enable openvswitch
$ sudo systemctl start openvswitch
$ systemctl status openvswitch
openvswitch.service - Open vSwitch
   Loaded: loaded (/usr/lib/systemd/system/openvswitch.service; enabled)
   Active: active (exited) since Mon 2015-08-10 01:47:06 JST; 1min 16s ago
 Main PID: 14410 (code=exited, status=0/SUCCESS)
$ sudo ovs-vsctl show
2da623d8-6095-45ac-92f4-4d1f7a043758
    ovs_version: "2.1.3"

通報

mininetのインストーラにはopenvswitchを同時にインストールするオプション(-v)もあるのですが、何となく yum install openvswitch を叩いているだけな気がするので、とりあえず別々に入れます。

mininetを入れる

参考: http://techandtrains.com/2014/09/13/mininet-and-open-vswitch-on-centos-7/

入れます。:

$ sudo yum install -y git net-tools
$ git clone git://github.com/mininet/mininet.git
$ cd mininet
$ sed -i -e "s/Fedora/CentOS/" util/install.sh
$ sed -i -e "s/fedora-release/centos-release/" util/install.sh
$ util/install.sh -nf
$ mn --version
2.2.1

通報

mininetがifconfigでアドレス設定しようとしやがるので、ifconfigのためにnet-toolsも入れています。

これでインストール自体は完了なので、以後は諸問題に対する話です。

mininetを起動する前に

今のところ、systemd環境では、mininet起動後にシャットダウンできなくなる問題がありそうです。

こんな感じです。

$ sudo mn
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1)
*** Configuring hosts
h1 h2
*** Starting controller
c0
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet> ports
s1 lo:0 s1-eth1:1 s1-eth2:2
mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
s1 lo:  s1-eth1:h1-eth0 s1-eth2:h2-eth0
c0
mininet> exit
*** Stopping 1 controllers
c0
*** Stopping 2 links
..
*** Stopping 1 switches
s1
*** Stopping 2 hosts
h1 h2
*** Done
completed in 10.252 seconds
$ sudo systemctl poweroff

ここで、何時まで待ってもシャットダウンされないので、Ctrl+Cで無理矢理抜けて状況を見ます。

$ sudo systemctl --failed
UNIT                          LOAD   ACTIVE SUB    DESCRIPTION
firewalld.service             loaded failed failed firewalld - dynamic firewall daemon
kdump.service                 loaded failed failed Crash recovery kernel arming
lvm2-monitor.service          loaded failed failed Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress
lvm2-pvscan@252:2.service     loaded failed failed LVM2 PV scan on device 252:2
network.service               loaded failed failed LSB: Bring up/down networking
openvswitch-nonetwork.service loaded failed failed Open vSwitch Internal Unit
openvswitch.service           loaded failed failed Open vSwitch
plymouth-poweroff.service     loaded failed failed Show Plymouth Power Off Screen
postfix.service               loaded failed failed Postfix Mail Transport Agent
systemd-random-seed.service   loaded failed failed Load/Save Random Seed
systemd-update-utmp.service   loaded failed failed Update UTMP about System Reboot/Shutdown
systemd-user-sessions.service loaded failed failed Permit User Sessions
tuned.service                 loaded failed failed Dynamic System Tuning Daemon
dev-dm\x2d1.swap              loaded failed failed /dev/dm-1

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

14 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

openvswitch.service 辺りを見ると、

$ sudo systemctl status openvswitch.service
openvswitch.service - Open vSwitch
   Loaded: loaded (/usr/lib/systemd/system/openvswitch.service; enabled)
   Active: failed (Result: exit-code) since Mon 2015-08-10 15:49:43 JST; 59s ago
  Process: 2458 ExecStop=/bin/true (code=exited, status=219/CGROUP)
  Process: 1105 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 1105 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/openvswitch.service

Aug 10 15:48:56 odl.localdomain systemd[1]: Starting Open vSwitch...
Aug 10 15:48:56 odl.localdomain systemd[1]: Started Open vSwitch.
Aug 10 15:49:43 odl.localdomain systemd[1]: Stopping Open vSwitch...
Aug 10 15:49:43 odl.localdomain systemd[1]: openvswitch.service: control process exited, code=exited status=219
Aug 10 15:49:43 odl.localdomain systemd[1]: Stopped Open vSwitch.
Aug 10 15:49:43 odl.localdomain systemd[1]: Unit openvswitch.service entered failed state.
$ sudo journalctl _PID=2458
-- Logs begin at Mon 2015-08-10 15:48:40 JST, end at Mon 2015-08-10 15:51:10 JST. --
Aug 10 15:49:43 odl.localdomain systemd[2458]: Failed at step CGROUP spawning /bin/true: No such file or directory

で、どうも cgroup 辺りで問題がありそうです。

流石にmininet界隈で問題になっていないはずがないだろうと思って探したところ、このIssueが参考になりそうでした。

参考: https://github.com/mininet/mininet/issues/509

結論としては、暫定的な対処ですが、mininet起動前に mount --make-rprivate / を叩いておけば回避できるようです。:

$ sudo mount --make-rprivate /
$ sudo mn

現場からは以上です。