今天在工作中,遇到了一個升級ovs 的過程中啓動失敗的情況。因爲定位了將近半天,爲此在這裏做下記錄。
問題現象如下, ovs啓動一直失敗,log提示找不到ovsdb-server.pid。
148 16:08:11 host1:~/yazhou/src/openvswitch-2.11.1 # ovs-ctl --no-ovs-vswitchd start
ovsdb-server is already running. Enabling remote OVSDB managers 2019-09-28T08:08:24Z|00001|daemon_unix|WARN|/var/run/openvswitch/ovsdb-server.pid: open: No such file or directory
ovs-appctl: cannot read pidfile "/var/run/openvswitch/ovsdb-server.pid" (No such file or directory)
[FAILED]
在這裏直接說明原因和修改方法。
問題原因:
我的openvswitch的版本是2.11.1,卸載原先的ovs,沒有刪除乾淨。導致殘留,路徑不匹配導致。
修改方法:
cp ./openvswitch-2.11.1/utilities/ovs-appctl /usr/bin/ovs-appctl
cp ./openvswitch-2.11.1/vswitchd/ovs-vswitchd ./usr/sbin/ovs-vswitchd
cp ./openvswitch-2.11.1/vswitchd/ovs-vswitchd ./usr/local/sbin/ovs-vswitchd
一般修改了這幾個文件就可以, 如果還有錯誤,檢查是否還有不一致的地方。我在修改這些文件之前,做了一次尋找root目錄下,所有的以openvswitch命名的文件夾刪除的動作,重啓系統後,重新編譯安裝ovs的步驟。
請留步,下面是我的定位過程,不感興趣的可以略過,避免浪費時間。
硬件環境
os | centos7.6 |
cpu | E5-2620 |
dpdk | 18.11 |
openvswitch | 2.11.1 |
qemu | 3.09 |
nic | intel 82599ES |
問題背景
我在做openvswitch升級的動作,希望支持dpdk的vhostuser模式。因爲服務器之前有了ovs, 所以我這邊只是做了一下stop,便開始編譯,安裝。之後便出現如上的情況。
定位步驟
-
在編譯dpdk的時候,內核版本出現了升級的情況,於是我第一步做的便
是update,重新編譯dpdk,然後在重新安裝ovs,其結果依然如此。 -
我關注在log的本身, 查看了/var/run/openvswitch/目錄下確實沒有這個
文件,但是真的沒有創建出來嗎? 我在根目錄下找了一下,找到了它。它被放在/user/local/var/run/openvswitch。如下:
0 16:04:43 host1:/ # find -name ovsdb-server.pid
find: ‘./proc/51712’: No such file or directory
./usr/local/var/run/openvswitch/ovsdb-server.pid
- 於是我猜想可能是隨着ovs版本的更新,安裝目錄發生了變化,而系統中仍存在以前的殘留文件,導致socket創建的時候,兩邊出現了不統一的情況。根據這個猜想,我關注到的第一個文件便是ovs-appctl文件(爲什麼是它, 因爲他在出錯日誌上寫着呢,它報告的錯誤)。
0 16:09:02 host1:~/yazhou/src/openvswitch-2.11.1 # md5sum /root/yazhou/src/openvswitch-2.11.1/utilities/ovs-appctl /usr/bin/ovs-appctl /usr/local/bin/ovs-appctl
a0289f65b7a674cc562fd4e87adda8e1 /root/yazhou/src/openvswitch-2.11.1/utilities/ovs-appctl
e6091e80cf2160f3d642d4fd21ab9f1e /usr/bin/ovs-appctl
a0289f65b7a674cc562fd4e87adda8e1 /usr/local/bin/ovs-appctl
- 顯然/usr/bin/ovs-appctl並不是我編譯出來的文件,很可能是它導致的問題。替換掉,錯誤便沒有了。
0 16:09:38 host1:~/yazhou/src/openvswitch-2.11.1 # cp /root/yazhou/src/openvswitch-2.11.1/utilities/ovs-appctl /usr/bin/ovs-appctl
cp: overwrite ‘/usr/bin/ovs-appctl’? y
0 16:09:48 host1:~/yazhou/src/openvswitch-2.11.1 # ovs-ctl --no-ovs-vswitchd start
ovsdb-server is already running. Enabling remote OVSDB managers [ OK ]
後面還遇到其他的問題,都是一些殘留文件導致的,可以通過MD5
比較。
0 16:03:21 host1:~/yazhou/src/openvswitch-2.11.1 # ovsdb-tool create /usr/local/etc/openvswitch/conf.db /usr/local/share/openvswitch/vswitch.ovsschema
0 16:03:33 host1:~/yazhou/src/openvswitch-2.11.1 # ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
0 16:03:40 host1:~/yazhou/src/openvswitch-2.11.1 # ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
0 16:03:49 host1:~/yazhou/src/openvswitch-2.11.1 # ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x3f
0 16:04:14 host1:~/yazhou/src/openvswitch-2.11.1 # ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-hugepage-dir=/dev/hugepages
0 16:04:14 host1:~/yazhou/src/openvswitch-2.11.1 # ovs-vsctl --no-wait set Open_vSwitch . other_config:vhost-sock-dir=/tmp
0 16:04:14 host1:~/yazhou/src/openvswitch-2.11.1 # ovs-ctl --no-ovsdb-server start Inserting openvswitch module [ OK ]