《OpenvSwitch玄机解读》|【2】OvS编译安装、自启动服务与卸载

原创 Linux二进制 2023-12-07 08:30

一、前言

首先验证内核版本uname -r与你下载的OvS版本是否匹配(必须),目前 OvS-3.2.1 最高只支持内核5.8

版本适配关系表

Linux内核与OvS版本匹配关系、OvS版本与DPDK版本匹配关系:

https://docs.openvswitch.org/en/latest/faq/releases/ 

OvS版本路径列表

Open vSwitch版本下载路径:

http://www.openvswitch.org/download/ 

以 OvS-2.16.0 为例,编译过程如下:

二、准备工作

安装依赖包:

yum install wget git gcc autoconf automake libtool make pkg-config uuid kernel-devel-$(uname -r) -y

三、获取代码

1)wget 下载

[root@localhost ~]# wget https://www.openvswitch.org/releases/openvswitch-2.16.0.tar.gz 
[root@localhost ~]# tar zxvf openvswitch-2.16.0.tar.gz
[root@localhost ~]# cd openvswitch-2.16.0/
[root@localhost openvswitch-2.16.0]# ls
acinclude.m4 AUTHORS.rst config.h.in CONTRIBUTING.rst debian ipsec m4 Makefile.in ofproto poc rhel third-party Vagrantfile vtep
aclocal.m4 boot.sh configure datapath Documentation lib MAINTAINERS.rst NEWS ovsdb python selinux tutorial Vagrantfile-FreeBSD windows
appveyor.yml build-aux configure.ac datapath-windows include LICENSE Makefile.am NOTICE package.m4 README.rst tests utilities vswitchd xenserver

2)git 下载

[root@localhost ~]# git clone https://github.com/openvswitch/ovs.git 
[root@localhost tmp]# cd ovs
// git tag 或 git branch -a 查看所有分支,切换为稳定分支
[root@localhost ovs]# git branch
* master
[root@localhost ovs]# git tag
v0.90.0
...
v2.15.8
v2.16.0
v2.16.1
...
[root@localhost ovs]# git checkout v2.16.0
[root@localhost ovs]# ls
acinclude.m4 boot.sh CONTRIBUTING.rst Documentation lib MAINTAINERS.rst NOTICE poc rhel third-party Vagrantfile vtep
appveyor.yml build-aux datapath-windows include LICENSE Makefile.am ofproto python selinux tutorial Vagrantfile-FreeBSD windows
AUTHORS.rst configure.ac debian ipsec m4 NEWS ovsdb README.rst tests utilities vswitchd

四、编译安装

# 当使用源代码时,需要自己创建configure脚本
[root@localhost openvswitch-2.16.0]# ./boot.sh

# 配置并开启内核模块编译,如无需编译openvswitch.ko等内核模块,则直接执行./configure即可
[root@localhost openvswitch-2.16.0]# ./configure --with-linux=/lib/modules/`uname -r`/build

# 编译安装OvS用户空间组件
[root@localhost openvswitch-2.16.0]# make && make install

# 安装内核模块,执行该步骤后,会使编译生成的openvswitch.ko等内核模块拷贝到/lib/modules/$(uname -r)/extra/目录下
[root@localhost openvswitch-2.16.0]# make modules_install

注意:如何不带配置选项--with-linux=/lib/modules/$(uname -r)/build ,则表示使用当前系统内核附带的openvswitch.ko模块。如果带有该配置选项,则表示在更新的Open vSwitch版本基础上,基于当前的Linux内核,构建新的openvswitch.ko 模块版本。

make modules_install会使编译生成的openvswitch.ko等内核模块安装到系统默认的/lib/modules/$(uname -r)/extra/目录下,当使用modprobe openvswitch时,则会直接加载该目录下的openvswitch.ko模块。

拓展

  • Linux系统中,模块默认安装在/lib/modules/$(KERNELRELEASE)/kernel/

  • 外部模块默认安装在/lib/modules/$(KERNELRELEASE)/extra/

  • 改变默认安装目录的前置路径,编译时设置INSTALL_MOD_PATH即可,如下:

    make INSTALL_MOD_PATH=/myown modules_install 把默认安装路径/lib/modules/$(KERNELRELEASE)/kernel/更改为   /myown/lib/modules/$(KERNELRELEASE)/kernel/ ;该属性对编译kernel结构内或结构外模块,都可以使用。

可以使用以下命令来查看 OvS 用户空间的组件,即可执行程序安装的位置:

[root@localhost ~]# whereis openvswitch
openvswitch: /etc/openvswitch /usr/local/etc/openvswitch /usr/include/openvswitch /usr/share/openvswitch

一般而言,OvS 可执行文件位于 /usr/local/sbin 目录下,数据库文件位于 /usr/local/etc/openvswitch 目录下。

openvswitch 有几个脚本放在 /usr/local/share/openvswitch/scripts 下,为了方便使用,可以设置 PATH 路径。由于运行需要 root 权限,可以切换到 root,再设置 PATH

echo 'export PATH=$PATH:/usr/local/share/openvswitch/scripts' | tee -a /root/.bashrc

进行上面设置后,则可无需带文件路径,直接使用位于/usr/local/share/openvswitch/scripts/目录下的ovs-ctl等可执行程序。

五、载入内核openvswitch模块

# 查看系统自带openvswitch.ko模块信息,未执行上述make modules_install命令前
[root@localhost openvswitch-2.16.0]# modinfo openvswitch
filename: /lib/modules/4.18.0-394.el8.x86_64/kernel/net/openvswitch/openvswitch.ko.xz
alias: net-pf-16-proto-16-family-ovs_ct_limit
alias: net-pf-16-proto-16-family-ovs_meter
alias: net-pf-16-proto-16-family-ovs_packet
alias: net-pf-16-proto-16-family-ovs_flow
alias: net-pf-16-proto-16-family-ovs_vport
alias: net-pf-16-proto-16-family-ovs_datapath
license: GPL
description: Open vSwitch switching datapath
rhelversion: 8.7
srcversion: F3F697B9C54245CFAFFDBC6
depends: nf_conntrack,nf_nat,nf_conncount,libcrc32c,nf_defrag_ipv6
intree: Y
name: openvswitch
vermagic: 4.18.0-394.el8.x86_64 SMP mod_unload modversions
sig_id: PKCS#7
signer: CentOS kernel signing key
sig_key: 63:93:7D:30:8C:56:B6:89:97:5E:B1:FE:1B:5B:91:73:BC:D2:CA:D2
...

# 查看自己编译的 openvswitch.ko 依赖的模块
[root@localhost openvswitch-2.16.0]# modinfo ./datapath/linux/openvswitch.ko
filename: /tmp/openvswitch-2.16.0/./datapath/linux/openvswitch.ko
alias: net-pf-16-proto-16-family-ovs_ct_limit
alias: net-pf-16-proto-16-family-ovs_meter
alias: net-pf-16-proto-16-family-ovs_packet
alias: net-pf-16-proto-16-family-ovs_flow
alias: net-pf-16-proto-16-family-ovs_vport
alias: net-pf-16-proto-16-family-ovs_datapath
version: 2.16.0
license: GPL
description: Open vSwitch switching datapath
rhelversion: 8.7
srcversion: 79E4AE8CCF8AE3FCD9DB165
depends: nf_conntrack,nf_nat,udp_tunnel,libcrc32c,nf_defrag_ipv6
name: openvswitch
vermagic: 4.18.0-394.el8.x86_64 SMP mod_unload modversions

# 查看depends:行,发现 openvswitch.ko 依赖于多个模块,但其中 udp_tunnel 和 libcrc32c 模块还未加载,于是先载入 udp_tunnel 和 libcrc32c
# 不同机器可能有所区别,根据实际依赖进行加载
[root@localhost openvswitch-2.16.0]# modprobe udp_tunnel
[root@localhost openvswitch-2.16.0]# modprobe libcrc32c

# 载入 openvswitch 模块
[root@localhost openvswitch-2.16.0]# modprobe openvswitch

=======================================================================================
# 也可使用如下方式加载openvswitch.ko模块,自己编译的openvswitch.ko模块位于datapath/linux/目录下
[root@localhost openvswitch-2.16.0]# insmod ./datapath/linux/openvswitch.ko
=======================================================================================

# 执行上述make modules_install命令后,查看模块载入情况,可以发现filename行的文件路径和之前有所不同
[root@localhost ~]# modinfo openvswitch
filename: /lib/modules/4.18.0-394.el8.x86_64/extra/openvswitch.ko
alias: net-pf-16-proto-16-family-ovs_ct_limit
alias: net-pf-16-proto-16-family-ovs_meter
alias: net-pf-16-proto-16-family-ovs_packet
alias: net-pf-16-proto-16-family-ovs_flow
alias: net-pf-16-proto-16-family-ovs_vport
alias: net-pf-16-proto-16-family-ovs_datapath
version: 2.16.0
license: GPL
description: Open vSwitch switching datapath
rhelversion: 8.7
srcversion: 79E4AE8CCF8AE3FCD9DB165
depends: nf_conntrack,nf_nat,udp_tunnel,libcrc32c,nf_defrag_ipv6
name: openvswitch
vermagic: 4.18.0-394.el8.x86_64 SMP mod_unload modversions
sig_id: PKCS#7
signer: localhost
sig_key: 2E:DC:FD:33:39:74:46:20:22:5A:63:C7:1F:0C:90:CD:90:25:50:01
sig_hashalgo: sha256
...

[root@localhost openvswitch-2.16.0]# lsmod | grep openvswitch
openvswitch 184320 0
nf_conncount 16384 1 openvswitch
nf_nat 45056 3 ipt_MASQUERADE,openvswitch,nft_chain_nat
nf_conntrack 172032 5 xt_conntrack,nf_nat,ipt_MASQUERADE,openvswitch,nf_conncount
nf_defrag_ipv6 20480 2 nf_conntrack,openvswitch
libcrc32c 16384 5 nf_conntrack,nf_nat,openvswitch,nf_tables,xfs

拓展

  • modinfo openvswitch:可查看openvswitch依赖的模块。

  • modprobe -D openvswitch:可查看加载的是Linux自带的openvswitch.ko模块还是自己编译的openvswitch.ko模块。

  • /sbin/lsmod | grep openvswitch:查看安装是否成功。

# 根据下面openvswitch.ko模块位于extra路径下,可知加载的是自己编译的模块
[root@localhost ~]# modprobe -D openvswitch
insmod /lib/modules/4.18.0-394.el8.x86_64/kernel/arch/x86/crypto/crc32c-intel.ko.xz
insmod /lib/modules/4.18.0-394.el8.x86_64/kernel/lib/libcrc32c.ko.xz
insmod /lib/modules/4.18.0-394.el8.x86_64/kernel/net/ipv4/udp_tunnel.ko.xz
insmod /lib/modules/4.18.0-394.el8.x86_64/kernel/net/ipv4/netfilter/nf_defrag_ipv4.ko.xz
insmod /lib/modules/4.18.0-394.el8.x86_64/kernel/net/ipv6/netfilter/nf_defrag_ipv6.ko.xz
install /sbin/modprobe --ignore-install nf_conntrack $CMDLINE_OPTS && /sbin/sysctl --quiet --pattern 'net[.]netfilter[.]nf_conntrack.*' --system
insmod /lib/modules/4.18.0-394.el8.x86_64/kernel/net/netfilter/nf_nat.ko.xz
insmod /lib/modules/4.18.0-394.el8.x86_64/extra/openvswitch.ko

六、初始化数据库与启动OvS

# 创建 ovsdb 数据库目录
[root@localhost openvswitch-2.16.0]# mkdir -p /usr/local/etc/openvswitch

# 使用当前目录下的/vswitchd/vswitch.ovsschema创建一个名为 "conf.db" 的空数据库文件,并将其保存在上一步创建的目录中
[root@localhost openvswitch-2.16.0]# ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
[root@localhost openvswitch-2.16.0]#
[root@localhost openvswitch-2.16.0]# ls ./vswitchd/vswitch.ovsschema
./vswitchd/vswitch.ovsschema
[root@localhost openvswitch-2.16.0]# ls -l /usr/local/etc/openvswitch/
total 16
-rw-r----- 1 root root 14800 Dec 5 10:26 conf.db
[root@localhost openvswitch-2.16.0]#

# 配置启动 ovsdb 数据库
# 使用以下命令来启动 ovsdb-server 并加载刚才创建的数据库文件:
[root@localhost openvswitch-2.16.0]# ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
> --remote=db:Open_vSwitch,Open_vSwitch,manager_options \
> --private-key=db:Open_vSwitch,SSL,private_key \
> --certificate=db:Open_vSwitch,SSL,certificate \
> --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
> --pidfile --detach

# 初始化数据库
[root@localhost openvswitch-2.16.0]# ovs-vsctl --no-wait init

# 开启 Open vSwitch 守护进程
[root@localhost openvswitch-2.16.0]# ovs-vswitchd --pidfile --detach
2023-12-05T08:45:16Z|00001|ovs_numa|INFO|Discovered 32 CPU cores on NUMA node 0
2023-12-05T08:45:16Z|00002|ovs_numa|INFO|Discovered 32 CPU cores on NUMA node 1
2023-12-05T08:45:16Z|00003|ovs_numa|INFO|Discovered 2 NUMA nodes and 64 CPU cores
2023-12-05T08:45:16Z|00004|reconnect|INFO|unix:/usr/local/var/run/openvswitch/db.sock: connecting...
2023-12-05T08:45:16Z|00005|reconnect|INFO|unix:/usr/local/var/run/openvswitch/db.sock: connected

ovsdb-server中的参数含义

  • --remote: 指定 ovsdb-server 的远程访问方式。punix:/usr/local/var/run/openvswitch/db.sock 表示通过 Unix 域套接字连接本地主机,db:Open_vSwitch,manager_options 则指定了 Open_vSwitch 数据库和 manager_options 表。
  • --private-key: 指定 SSL 加密所用的私钥文件。
  • --certificate:指定 SSL 加密所用的证书文件。
  • --bootstrap-ca-cert:指定用于 CA 证书认证的根证书文件。
  • --pidfile:将 ovsdb-server 进程 ID 写入 PID 文件以便后续管理。
  • --detach:让 ovsdb-server 在后台以守护进程模式运行。

启动成功后,ovsdb-server 将加载 conf.db 数据库,并等待来自其他 Open vSwitch 组件的连接请求。

看到类似以下几行消息,表明 openvswitch 配置完毕

2023-12-05T08:45:16Z|00001|ovs_numa|INFO|Discovered 32 CPU cores on NUMA node 0
2023-12-05T08:45:16Z|00002|ovs_numa|INFO|Discovered 32 CPU cores on NUMA node 1
2023-12-05T08:45:16Z|00003|ovs_numa|INFO|Discovered 2 NUMA nodes and 64 CPU cores
2023-12-05T08:45:16Z|00004|reconnect|INFO|unix:/usr/local/var/run/openvswitch/db.sock: connecting...
2023-12-05T08:45:16Z|00005|reconnect|INFO|unix:/usr/local/var/run/openvswitch/db.sock: connected

注意:以上操作是在root账户下进行,普通账户请注意切换权限。

七、创建OvS自启动服务

创建 OvS 服务脚本。

[root@localhost ~]# touch /etc/systemd/system/ovs.service
[root@localhost ~]# vi /etc/systemd/system/ovs.service

脚本内容如下:

[Unit]
Description=Open vSwitch server daemon
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/share/openvswitch/scripts/ovs-ctl start
ExecStop=/usr/local/share/openvswitch/scripts/ovs-ctl stop

[Install]
WantedBy=multi-user.target

加载服务并设置开机自启

systemctl daemon-reload
systemctl enable ovs

查看重启操作系统后,OvS的状态:

# systemctl查看OvS服务的状态,可知系统启动后OvS服务已被自动启动
[root@localhost ~]# systemctl status ovs
● ovs.service - Open vSwitch server daemon
Loaded: loaded (/etc/systemd/system/ovs.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2023-12-06 04:21:51 SAST; 1min 31s ago
Process: 1766 ExecStart=/usr/local/share/openvswitch/scripts/ovs-ctl start (code=exited, status=0/SUCCESS)
Main PID: 1766 (code=exited, status=0/SUCCESS)
Tasks: 4 (limit: 409648)
Memory: 20.3M
CGroup: /system.slice/ovs.service
├─1833 ovsdb-server: monitoring pid 1834 (healthy)
├─1834 ovsdb-server /usr/local/etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/usr/local/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --cer>
├─2166 ovs-vswitchd: monitoring pid 2167 (healthy)
└─2167 ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/usr/local/var/log/openvswitch/ovs-vswitchd.log --pidfile=/usr/>

Dec 06 04:21:49 localhost ovs-ctl[1766]: Starting ovsdb-server [ OK ]
Dec 06 04:21:49 localhost ovs-vsctl[1841]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait -- init -- set Open_vSwitch . db-version=8.3.0
Dec 06 04:21:49 localhost ovs-ctl[1766]: system ID not configured, please use --system-id ... failed!
Dec 06 04:21:49 localhost ovs-vsctl[1868]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait set Open_vSwitch . ovs-version=2.16.0 "external-ids:system-id=\"\"" "external-ids:rundir=\"/usr/local/var/run/open>
Dec 06 04:21:49 localhost ovs-ctl[1766]: Configuring Open vSwitch system IDs [ OK ]
Dec 06 04:21:51 localhost ovs-ctl[1869]: Inserting openvswitch module [ OK ]
Dec 06 04:21:51 localhost ovs-ctl[1766]: Starting ovs-vswitchd [ OK ]
Dec 06 04:21:51 localhost ovs-vsctl[2179]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait add Open_vSwitch . external-ids hostname=localhost
Dec 06 04:21:51 localhost ovs-ctl[1766]: Enabling remote OVSDB managers [ OK ]
Dec 06 04:21:51 localhost systemd[1]: Started Open vSwitch server daemon.

# OvS已成功启动
[root@localhost ~]# ovs-vsctl show
d90dc0bb-1632-463a-b2ee-b266360b8b57
ovs_version: "2.16.0"

# systemctl命令停止OvS服务
[root@localhost ~]# systemctl stop ovs

# systemctl查看OvS服务的状态,可知OvS服务已停止运行
[root@localhost ~]# systemctl status ovs
● ovs.service - Open vSwitch server daemon
Loaded: loaded (/etc/systemd/system/ovs.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Wed 2023-12-06 04:23:54 SAST; 2s ago
Process: 2947 ExecStop=/usr/local/share/openvswitch/scripts/ovs-ctl stop (code=exited, status=0/SUCCESS)
Process: 1766 ExecStart=/usr/local/share/openvswitch/scripts/ovs-ctl start (code=exited, status=0/SUCCESS)
Main PID: 1766 (code=exited, status=0/SUCCESS)

Dec 06 04:21:51 localhost ovs-ctl[1869]: Inserting openvswitch module [ OK ]
Dec 06 04:21:51 localhost ovs-ctl[1766]: Starting ovs-vswitchd [ OK ]
Dec 06 04:21:51 localhost ovs-vsctl[2179]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait add Open_vSwitch . external-ids hostname=localhost
Dec 06 04:21:51 localhost ovs-ctl[1766]: Enabling remote OVSDB managers [ OK ]
Dec 06 04:21:51 localhost systemd[1]: Started Open vSwitch server daemon.
Dec 06 04:23:53 localhost systemd[1]: Stopping Open vSwitch server daemon...
Dec 06 04:23:53 localhost ovs-ctl[2947]: Exiting ovs-vswitchd (2167) [ OK ]
Dec 06 04:23:53 localhost ovs-ctl[2947]: Exiting ovsdb-server (1834) [ OK ]
Dec 06 04:23:54 localhost systemd[1]: ovs.service: Succeeded.
Dec 06 04:23:54 localhost systemd[1]: Stopped Open vSwitch server daemon.

# systemctl命令启动OvS服务
[root@localhost ~]# systemctl start ovs
# OvS已成功启动
[root@localhost ~]# ovs-vsctl show
d90dc0bb-1632-463a-b2ee-b266360b8b57
ovs_version: "2.16.0"
# systemctl查看OvS服务的状态,服务已成功启动
[root@localhost ~]# systemctl status ovs
● ovs.service - Open vSwitch server daemon
Loaded: loaded (/etc/systemd/system/ovs.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2023-12-06 04:24:02 SAST; 10s ago
Process: 2947 ExecStop=/usr/local/share/openvswitch/scripts/ovs-ctl stop (code=exited, status=0/SUCCESS)
Process: 2977 ExecStart=/usr/local/share/openvswitch/scripts/ovs-ctl start (code=exited, status=0/SUCCESS)
Main PID: 2977 (code=exited, status=0/SUCCESS)
Tasks: 4 (limit: 409648)
Memory: 4.0M
CGroup: /system.slice/ovs.service
├─2991 ovsdb-server: monitoring pid 2992 (healthy)
├─2992 ovsdb-server /usr/local/etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/usr/local/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --cer>
├─3008 ovs-vswitchd: monitoring pid 3009 (healthy)
└─3009 ovs-vswitchd unix:/usr/local/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/usr/local/var/log/openvswitch/ovs-vswitchd.log --pidfile=/usr/>

Dec 06 04:24:02 localhost systemd[1]: Starting Open vSwitch server daemon...
Dec 06 04:24:02 localhost ovs-ctl[2977]: Starting ovsdb-server [ OK ]
Dec 06 04:24:02 localhost ovs-vsctl[2993]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait -- init -- set Open_vSwitch . db-version=8.3.0
Dec 06 04:24:02 localhost ovs-ctl[2977]: system ID not configured, please use --system-id ... failed!
Dec 06 04:24:02 localhost ovs-vsctl[2997]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait set Open_vSwitch . ovs-version=2.16.0 "external-ids:system-id=\"\"" "external-ids:rundir=\"/usr/local/var/run/open>
Dec 06 04:24:02 localhost ovs-ctl[2977]: Configuring Open vSwitch system IDs [ OK ]
Dec 06 04:24:02 localhost ovs-ctl[2977]: Starting ovs-vswitchd [ OK ]
Dec 06 04:24:02 localhost ovs-ctl[2977]: Enabling remote OVSDB managers [ OK ]
Dec 06 04:24:02 localhost systemd[1]: Started Open vSwitch server daemon.
Dec 06 04:24:02 localhost ovs-vsctl[3017]: ovs|00001|vsctl|INFO|Called as ovs-vsctl --no-wait add Open_vSwitch . external-ids hostname=localhost

八、卸载OvS

[root@localhost ~]# lsmod | grep openvswitch
openvswitch 184320 2
nf_conncount 16384 1 openvswitch
nf_nat 45056 3 ipt_MASQUERADE,openvswitch,nft_chain_nat
nf_conntrack 172032 6 xt_conntrack,nf_nat,nfnetlink_cttimeout,ipt_MASQUERADE,openvswitch,nf_conncount
nf_defrag_ipv6 20480 2 nf_conntrack,openvswitch
libcrc32c 16384 5 nf_conntrack,nf_nat,openvswitch,nf_tables,xfs

# 停止ovs服务
[root@localhost ~]# /usr/local/share/openvswitch/scripts/ovs-ctl stop
Exiting ovs-vswitchd (951780) [ OK ]
Exiting ovsdb-server (951758) [ OK ]

#卸载openvswitch模块,报错显示openvswitch正在使用中
[root@localhost ~]# rmmod openvswitch
rmmod: ERROR: Module openvswitch is in use
[root@localhost ~]#

[root@localhost ~]# ovs-vsctl show
ovs-vsctl: unix:/usr/local/var/run/openvswitch/db.sock: database connection failed (No such file or directory)

# 查看内核,会有一个ovs-system的datapath
[root@localhost ~]# ovs-dpctl show
system@ovs-system:
lookups: hit:0 missed:0 lost:0
flows: 0
masks: hit:0 total:0 hit/pkt:0.00
caches:
masks-cache: size:256
port 0: ovs-system (internal)
port 1: br0 (internal)

# 删除上一步出现的datapath(不进行这一步,rmmod会报错)
[root@localhost ~]# ovs-dpctl del-dp ovs-system
[root@localhost ~]# ovs-dpctl show

# 卸载openvswitch内核模块
[root@localhost ~]# rmmod openvswitch

# 使用lsmod | grep openvswitch 没有openvswitch
[root@localhost ~]# lsmod | grep openvswitch

注意:上面最开始rmmod openvswitch失败,本质就是模块的模块的引用计数不为 0, 要解决此类问题,只需要使模块的引用计数为0即可。因OvSdatapath 即ovs-system会使用openvswitch模块,故如果不删除该datapath,则无法卸载openvswitch模块,删除后,则卸载openvswitch模块成功。

原创不易,点个赞或在看支持一下吧~


Linux二进制 Linux编程、内核模块、网络原创文章分享,欢迎关注"Linux二进制"微信公众号
评论
  • ALINX 正式发布 AMD Virtex UltraScale+ 系列 FPGA PCIe 3.0 综合开发平台 AXVU13P!这款搭载 AMD 16nm 工艺 XCVU13P 芯片的高性能开发验证平台,凭借卓越的计算能力和灵活的扩展性,专为应对复杂应用场景和高带宽需求而设计,助力技术开发者加速产品创新与部署。随着 5G、人工智能和高性能计算等领域的迅猛发展,各行业对计算能力、灵活性和高速数据传输的需求持续攀升。FPGA 凭借其高度可编程性和实时并行处理能力,已成为解决行业痛点的关
    ALINX 2024-12-20 17:44 66浏览
  • 国产数字隔离器已成为现代电子产品中的关键部件,以增强的性能和可靠性取代了传统的光耦合器。这些隔离器广泛应用于医疗设备、汽车电子、工业自动化和其他需要强大信号隔离的领域。准确测试这些设备是确保其质量和性能的基本步骤。如何测试数字隔离器测试数字隔离器需要精度和正确的工具集来评估其在各种条件下的功能和性能。以下设备对于这项任务至关重要:示波器:用于可视化信号波形并测量时序特性,如传播延迟、上升时间和下降时间。允许验证输入输出信号的完整性。频谱分析仪:测量电磁干扰(EMI)和其他频域特性。有助于识别信号
    克里雅半导体科技 2024-12-20 16:35 56浏览
  • 耳机虽看似一个简单的设备,但不仅只是听音乐功能,它已经成为日常生活和专业领域中不可或缺的一部分。从个人娱乐到专业录音,再到公共和私人通讯,耳机的使用无处不在。使用高质量的耳机不仅可以提供优良的声音体验,还能在长时间使用中保护使用者听力健康。耳机产品的质量,除了验证产品是否符合法规标准,也能透过全面性的测试和认证过程,确保耳机在各方面:从音质到耐用性,再到用户舒适度,都能达到或超越行业标准。这不仅保护了消费者的投资,也提升了该公司在整个行业的产品质量和信誉!客户面临到的各种困难一家耳机制造商想要透
    百佳泰测试实验室 2024-12-20 10:37 145浏览
  • 汽车行业的变革正愈演愈烈,由交通工具到“第三生活空间”。业内逐渐凝聚共识:汽车的下半场在于智能化。而智能化的核心在于集成先进的传感器,以实现高等级的智能驾驶乃至自动驾驶,以及更个性、舒适、交互体验更优的智能座舱。毕马威中国《聚焦电动化下半场 智能座舱白皮书》数据指出,2026年中国智能座舱市场规模将达到2127亿元,5年复合增长率超过17%。2022年到2026年,智能座舱渗透率将从59%上升至82%。近日,在SENSOR CHINA与琻捷电子联合举办的“汽车传感系列交流会-智能传感专场”上,艾
    艾迈斯欧司朗 2024-12-20 19:45 72浏览
  • 光耦合器,也称为光隔离器,是用于电气隔离和信号传输的多功能组件。其应用之一是测量电路中的电压。本文介绍了如何利用光耦合器进行电压测量,阐明了其操作和实际用途。使用光耦合器进行电压测量的工作原理使用光耦合器进行电压测量依赖于其在通过光传输信号的同时隔离输入和输出电路的能力。该过程包括:连接到电压源光耦合器连接在电压源上。输入电压施加到光耦合器的LED,LED发出的光与施加的电压成比例。光电二极管响应LED发出的光由输出侧的光电二极管或光电晶体管检测。随着LED亮度的变化,光电二极管的电阻相应减小,
    腾恩科技-彭工 2024-12-20 16:31 55浏览
  • 百佳泰特为您整理2024年12月各大Logo的最新规格信息。——————————USB▶ 百佳泰获授权进行 USB Active Cable 认证。▶ 所有符合 USB PD 3.2 标准的产品都有资格获得USB-IF 认证——————————Bluetooth®▶ Remote UPF Testing针对所有低功耗音频(LE Audio)和网格(Mesh)规范的远程互操作性测试已开放,蓝牙会员可使用该测试,这是随时测试产品的又一绝佳途径。——————————PCI Express▶ 2025年
    百佳泰测试实验室 2024-12-20 10:33 113浏览
  • 汽车驾驶员监控系统又称DMS,是一种集中在车辆中的技术,用于实时跟踪和评估驾驶员状态及驾驶行为。随着汽车产业智能化转型,整合AI技术的DMS逐渐成为主流,AI模型通过大量数据进行持续训练,使得驾驶监控更加高效和精准。 驾驶员监测系统主要通过传感器、摄像头收集驾驶员的面部图像,定位头部姿势、人脸特征及行为特征,并通过各种异常驾驶行为检测模型运算来识别驾驶员的当前状态。如果出现任何异常驾驶行为(如疲劳,分心,抽烟,接打电话,无安全带等),将发出声音及视觉警报。此外,驾驶员的行为数据会被记录
    启扬ARM嵌入式 2024-12-20 09:14 94浏览
  • //```c #include "..\..\comm\AI8051U.h"  // 包含头文件,定义了硬件寄存器和常量 #include "stdio.h"              // 标准输入输出库 #include "intrins.h"         &n
    丙丁先生 2024-12-20 10:18 84浏览
  • Supernode与艾迈斯欧司朗携手,通过Belago红外LED实现精准扫地机器人避障;得益于Belago出色的红外补光功能,使扫地机器人能够大大提升其识别物体的能力,实现精准避障;Belago点阵照明器采用迷你封装,兼容标准无铅回流工艺,适用于各种3D传感平台,包括移动设备、物联网设备和机器人。全球领先的光学解决方案供应商艾迈斯欧司朗(瑞士证券交易所股票代码:AMS)近日宣布,与国内领先的多行业三维视觉方案提供商超节点创新科技(Supernode)双方联合推出采用艾迈斯欧司朗先进Belago红
    艾迈斯欧司朗 2024-12-20 18:55 55浏览
  • 光耦固态继电器(SSR)作为现代电子控制系统中不可或缺的关键组件,正逐步取代传统机械继电器。通过利用光耦合技术,SSR不仅能够提供更高的可靠性,还能适应更加复杂和严苛的应用环境。在本文中,我们将深入探讨光耦固态继电器的工作原理、优势、挑战以及未来发展趋势。光耦固态继电器:如何工作并打破传统继电器的局限?光耦固态继电器通过光电隔离技术,实现输入信号与负载之间的电气隔离。其工作原理包括三个关键步骤:光激活:LED接收输入电流并发出与其成比例的光信号。光传输:光电传感器(如光电二极管或光电晶体管)接收
    腾恩科技-彭工 2024-12-20 16:30 45浏览
  • 随着工业自动化和智能化的发展,电机控制系统正向更高精度、更快响应和更高稳定性的方向发展。高速光耦作为一种电气隔离与信号传输的核心器件,在现代电机控制中扮演着至关重要的角色。本文将详细介绍高速光耦在电机控制中的应用优势及其在实际工控系统中的重要性。高速光耦的基本原理及优势高速光耦是一种光电耦合器件,通过光信号传递电信号,实现输入输出端的电气隔离。这种隔离可以有效保护电路免受高压、电流浪涌等干扰。相比传统的光耦,高速光耦具备更快的响应速度,通常可以达到几百纳秒到几微秒级别的传输延迟。电气隔离:高速光
    晶台光耦 2024-12-20 10:18 137浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦