open vSwitch 安装
用 apt 安装
sudo apt install openvswitch-switch
查看Open vSwitch(OVS)的版本:
$ sudo ovs-vsctl show
cb860a93-1368-4d4f-be38-5cb9bbe5273d
ovs_version: "3.1.0"
从源码开始编译安装
参考官方文档:
https://github.com/openvswitch/ovs/blob/main/Documentation/intro/install/debian.rst
https://docs.openvswitch.org/en/stable/intro/install/debian/
下载源码
mkdir -p ~/temp/
cd ~/temp/
git clone https://github.com/openvswitch/ovs.git
cd ovs
git checkout v3.5.0
准备编译
apt-get install build-essential fakeroot
打开 ovs 源码文件中的 debian/control.in
文件,找到 Build-Depends:
这一段,将这里列出来的依赖都用 apt 安装一遍。
sudo apt install autoconf automake bzip2 debhelper-compat dh-exec dh-python dh-sequence-python3 dh-sequence-sphinxdoc graphviz iproute2 libcap-ng-dev
sudo apt install libdbus-1-dev libnuma-dev libpcap-dev libssl-dev libtool libunbound-dev openssl pkg-config procps python3-all-dev python3-setuptools python3-sortedcontainers python3-sphinx
sudo apt install libdpdk-dev
准备编译:
$ ./boot.sh && ./configure --with-dpdk=shared && make debian
检查依赖是否都满足要求:
$ dpkg-checkbuilddeps
dpkg-checkbuilddeps: error: Unmet build dependencies: libdpdk-dev (>= 24.11)
但 apt 能安装的最新版本也就是 22.11.7 版本:
apt list -a libdpdk-dev
Listing... Done
libdpdk-dev/stable,stable-security,now 22.11.7-1~deb12u1 amd64 [installed]
只好删除这个版本:
sudo apt remove libdpdk-dev
然后手工安装最新版本的 libdpdk-dev
安装 libdpdk-dev
下载页面:
https://core.dpdk.org/download/
找到 DPDK 24.11.2 (LTS) 这个版本,下载下来:
cd ~/temp/
wget https://fast.dpdk.org/rel/dpdk-24.11.2.tar.xz
tar xvf dpdk-24.11.2.tar.xz
cd dpdk-stable-24.11.2
参考文档: https://github.com/openvswitch/ovs/blob/main/Documentation/intro/install/debian.rst 以及参考 deepseek 的安装指导。
sudo apt install build-essential meson ninja-build python3-pyelftools libnuma-dev pkg-config
meson build
ninja -C build
cd build
sudo ninja install
# 更新动态链接库
sudo ldconfig
安装完成之后,验证一下:
pkg-config --modversion libdpdk
输出为:
24.11.2
继续安装
准备编译:
# 进入 ovs 源码目录
cd ovs
$ ./boot.sh && ./configure --with-dpdk=shared && make debian
检查依赖是否都满足要求:
$ dpkg-checkbuilddeps
dpkg-checkbuilddeps: error: Unmet build dependencies: libdpdk-dev (>= 24.11)
这里要求的是 libdpdk-dev,但前面源码安装出来的是 libdpdk
找到编译出来的 libdpdk.pc 文件:
sudo find / -name "libdpdk.pc" 2>/dev/null
/home/sky/temp/dpdk-stable-24.11.2/build/meson-private/libdpdk.pc
/usr/local/lib/x86_64-linux-gnu/pkgconfig/libdpdk.pc
将 libdpdk.pc 文件复制到 /usr/share/pkgconfig/ 目录:
sudo mkdir -p /usr/share/pkgconfig/
sudo cp /usr/local/lib/x86_64-linux-gnu/pkgconfig/libdpdk.pc /usr/share/pkgconfig/
更新 PKG_CONFIG_PATH:
export PKG_CONFIG_PATH=/usr/share/pkgconfig:$PKG_CONFIG_PATH
备注:如果想永久生效,可添加到 ~/.zshrc
sudo mkdir -p /usr/include/dpdk
sudo ln -s /usr/local/include/* /usr/include/dpdk/
sudo ldconfig
继续编译:
make debian-deb
报错:
dpkg-shlibdeps: error: no dependency information found for /usr/local/lib/x86_64-linux-gnu/librte_vhost.so.25 (used by debian/openvswitch-switch-dpdk/usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk)
Hint: check if the library actually comes from a package.
dh_shlibdeps: error: dpkg-shlibdeps -Tdebian/openvswitch-switch-dpdk.substvars debian/openvswitch-switch-dpdk/usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk returned exit code 255
dh_shlibdeps: error: Aborting due to earlier error
make[1]: *** [debian/rules:8: binary] Error 255
make[1]: Leaving directory '/home/sky/temp/ovs'
make: *** [Makefile:7300: debian-deb] Error 2
报错的原因是 dpkg-shlibdeps 是 Debian 打包工具的一部分,用于自动检测二进制文件的动态库依赖。由于我们通过源码安装了 DPDK,dpkg 不知道 librte_vhost.so.25 属于哪个包,因此报错。
考虑到生成 deb 包不是必须,我们可以直接安装 OVS(不打包成 .deb),这样就不触发 dpkg-shlibdeps 检查。
sudo make install
检查安装之后的版本:
$ ovs-vswitchd --version
ovs-vswitchd (Open vSwitch) 3.5.0
DPDK 24.11.2
安装不带 dpdk
不带 dpdk 会简单很多:
https://cloudspinx.com/build-open-vswitch-from-source-on-debian-and-ubuntu/
sudo dpkg -i ./openvswitch-common_3.5.0-1_amd64.deb sudo dpkg -i ./openvswitch-common-dbgsym_3.5.0-1_amd64.deb sudo dpkg -i ./openvswitch-switch_3.5.0-1_amd64.deb sudo dpkg -i ./openvswitch-switch-dbgsym_3.5.0-1_amd64.deb
sudo apt install libxdp1 libxdp-dev sudo apt install libfdt1 libfdt-dev
ovs-vsctl show ovs-vsctl: unix:/usr/local/var/run/openvswitch/db.sock: database connection failed (No such file or directory)