sonic-net/sonic-swss
GitHub: sonic-net/sonic-swss
SONiC 网络操作系统的交换机状态服务组件,通过 Redis 数据库提供网络应用与交换机硬件之间的状态同步和通信接口。
Stars: 219 | Forks: 685
*静态分析:*
[](https://lgtm.com/projects/g/sonic-net/sonic-swss/alerts/)
[](https://lgtm.com/projects/g/sonic-net/sonic-swss/context:python)
[](https://lgtm.com/projects/g/sonic-net/sonic-swss/context:cpp)
*sonic-swss 构建:*
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=15&branchName=master)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=15&branchName=202205)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=15&branchName=202111)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=15&branchName=202106)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=15&branchName=202012)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=15&branchName=201911)
# SONiC - SWitch State Service - SWSS
## 描述
SWitch State Service (SWSS) 是一个软件集合,它提供了一个数据库接口,用于网络应用程序和网络交换机硬件之间的通信以及状态表示。
## 入门指南
### 前置条件
安装以下依赖项:
```
sudo apt install redis-server
sudo apt install libhiredis0.14
sudo apt install libzmq5 libzmq3-dev
sudo apt install libboost-serialization1.74.0
sudo apt install libboost1.71-dev
sudo apt install libasan6
```
**注意:** 如果您使用的是 Ubuntu 18.04,请改为安装 `libhiredis0.13`。
访问 [VS 平台的官方 sonic-buildimage Azure 流水线](https://dev.azure.com/mssonic/build/_build?definitionId=142&view=branches),并选择与您尝试构建或安装的 sonic-swss 分支相匹配的分支。然后选择最新成功的构建。
从 Summary(摘要)选项卡中,访问构建产物。
下载文件夹 `sonic-buildimage.vs/target/debs/{您主机的 Debian 代号}`。您可以通过运行 `cat /etc/debian_version` 来查看您机器的 Debian 代号。
使用 `unzip sonic-buildimage.vs.zip` 解压下载的 zip 文件。然后导航到 `sonic-buildimage.vs/target/debs/{Debian 代号}/` 并安装以下 Debian 软件包:
```
sudo dpkg -i libdashapi_1.0.0_amd64.deb libnl-3-200_3.5.0-1_amd64.deb libnl-3-dev_3.5.0-1_amd64.deb libnl-cli-3-200_3.5.0-1_amd64.deb libnl-cli-3-dev_3.5.0-1_amd64.deb libnl-genl-3-200_3.5.0-1_amd64.deb libnl-genl-3-dev_3.5.0-1_amd64.deb libnl-nf-3-200_3.5.0-1_amd64.deb libnl-nf-3-dev_3.5.0-1_amd64.deb libnl-route-3-200_3.5.0-1_amd64.deb libnl-route-3-dev_3.5.0-1_amd64.deb libprotobuf32_3.21.12-3_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaivs_1.0.0_amd64.deb libsaivs-dev_1.0.0_amd64.deb libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb libteam5_1.31-1_amd64.deb libteamdctl0_1.31-1_amd64.deb libyang_1.0.73_amd64.deb libyang-dev_1.0.73_amd64.deb python3-swsscommon_1.0.0_amd64.deb
```
**注意:** 您也可以 [自己构建这些软件包(针对 VS 平台)](https://github.com/sonic-net/sonic-buildimage/blob/master/README.md)。
现在,您可以直接安装 SONiC SWSS 软件包,也可以从源代码构建然后安装。要安装 `sonic-buildimage.vs/target/debs/{Debian 代号}/` 中已有的 SONiC SWSS 软件包,只需运行以下命令:
```
sudo dpkg -i swss_1.0.0_amd64.deb
```
#### 从源代码安装
安装构建依赖项:
```
sudo apt install libtool
sudo apt install autoconf automake
sudo apt install dh-exec
sudo apt install nlohmann-json3-dev
sudo apt install libgmock-dev
```
在您的主机上克隆 `sonic-swss` 仓库:`git clone https://github.com/sonic-net/sonic-swss.git`。
确保 SAI 头文件存在于 `/usr/include/sai` 中。由于您已经安装了 `libsairedis-dev`、`libsaimetadata-dev` 和 `libsaivs-dev`,情况应该已经如此。如果您自己编译了 `libsairedis`,请确保将 SAI 头文件复制到 `/usr/include/sai`。
您可以使用以下命令从源代码进行编译和安装:
```
./autogen.sh
./configure
make && sudo make install
```
**注意:** 这不会运行位于 `tests/mock_tests` 下的 mock 测试。
您也可以使用以下命令构建 debian 软件包:
```
./autogen.sh
fakeroot debian/rules binary
```
## 常见问题
#### 找不到 `libboost-serialization1.74.0`
遗憾的是,即使在 Debian 11 (bullseye) 上受支持,`libboost-serialization1.74.0` 在 Ubuntu 20.04 (focal) 上并未得到官方支持。因此,您必须从源代码构建此软件包。您可以使用类似 [这个](https://github.com/ulikoehler/deb-buildscripts/blob/master/deb-boost.sh) 的脚本,但您只需要为 Boost serialization 库创建一个软件包。您还应确保生成的软件包命名为 `libboost-serialization1.74.0`。软件包创建完成后,您可以通过运行 `sudo dpkg -i libboost-serialization1.74.0_1.74.0_amd64.deb` 来安装它。
#### 安装 `libzmq3-dev` 时的依赖问题
如果由于依赖问题无法安装 `libzmq3-dev`,请检查您主机上安装的 `libkrb5` 软件包的版本:
```
sudo dpkg -l | grep "libkrb5"
```
如果版本不是 `1.17-6ubuntu4.7`,那么您需要安装正确的版本:
```
sudo apt install libkrb5support0=1.17-6ubuntu4.7
sudo apt install libzmq3-dev
```
**警告:** 这可能会删除您系统上已安装的许多软件包。请注意正在删除的内容。
**注意:** 不要安装您下载的 `sonic-buildimage.vs` 文件夹中的 `*krb5*` 软件包。这些软件包的版本较高,会导致依赖问题。
#### 安装某些软件包时的依赖问题
如果您在安装软件包期间遇到依赖问题,可以运行 `sudo apt -f install` 来修复该问题。但请注意,如果 `apt` 无法修复依赖问题,它将尝试删除有问题的软件包。
#### 打开的文件过多
如果在 mock 测试期间收到描述为“Too many open files”的 C++ 异常,您应该检查系统上允许打开的最大文件数:
```
ulimit -a | grep "open files"
```
您可以通过执行此命令来增加它:`ulimit -n 8192`。请随意更改 `8192`。这个值对我来说运行良好。
**注意:** 此更改仅对当前终端会话有效。如果您希望永久更改,请将 `ulimit -n 8192` 附加到 `~/.bashrc`。
## 需要帮助?
如有一般问题、安装帮助或故障排除:
- [Google Groups 上的 sonicproject](https://groups.google.com/g/sonicproject)
对于错误报告或功能请求,请开启一个 Issue。
## 贡献指南
有关如何贡献的信息,请参阅[贡献者指南](https://github.com/sonic-net/SONiC/wiki/Becoming-a-contributor)。
### GitHub 工作流
我们遵循基本的 GitHub Flow。如果您不知道我们在说什么,请查看 [GitHub 官方指南](https://guides.github.com/introduction/flow/)。请注意,合并仅由仓库维护者执行。
执行提交的指南:
* 将每次提交隔离到一个组件/错误修复/问题/功能中
* 使用标准的提交消息格式:
例如:
* 每位开发人员都应 fork 此仓库,并[将团队添加为贡献者](https://help.github.com/articles/adding-collaborators-to-a-personal-repository)
* 将您的更改推送到您的私有 fork,并对此仓库进行“pull-request”
* 使用 pull request 进行代码审查
* 使用 issues 来跟踪正在发生的事情
下载文件夹 `sonic-buildimage.vs/target/debs/{您主机的 Debian 代号}`。您可以通过运行 `cat /etc/debian_version` 来查看您机器的 Debian 代号。
使用 `unzip sonic-buildimage.vs.zip` 解压下载的 zip 文件。然后导航到 `sonic-buildimage.vs/target/debs/{Debian 代号}/` 并安装以下 Debian 软件包:
```
sudo dpkg -i libdashapi_1.0.0_amd64.deb libnl-3-200_3.5.0-1_amd64.deb libnl-3-dev_3.5.0-1_amd64.deb libnl-cli-3-200_3.5.0-1_amd64.deb libnl-cli-3-dev_3.5.0-1_amd64.deb libnl-genl-3-200_3.5.0-1_amd64.deb libnl-genl-3-dev_3.5.0-1_amd64.deb libnl-nf-3-200_3.5.0-1_amd64.deb libnl-nf-3-dev_3.5.0-1_amd64.deb libnl-route-3-200_3.5.0-1_amd64.deb libnl-route-3-dev_3.5.0-1_amd64.deb libprotobuf32_3.21.12-3_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaivs_1.0.0_amd64.deb libsaivs-dev_1.0.0_amd64.deb libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb libteam5_1.31-1_amd64.deb libteamdctl0_1.31-1_amd64.deb libyang_1.0.73_amd64.deb libyang-dev_1.0.73_amd64.deb python3-swsscommon_1.0.0_amd64.deb
```
**注意:** 您也可以 [自己构建这些软件包(针对 VS 平台)](https://github.com/sonic-net/sonic-buildimage/blob/master/README.md)。
现在,您可以直接安装 SONiC SWSS 软件包,也可以从源代码构建然后安装。要安装 `sonic-buildimage.vs/target/debs/{Debian 代号}/` 中已有的 SONiC SWSS 软件包,只需运行以下命令:
```
sudo dpkg -i swss_1.0.0_amd64.deb
```
#### 从源代码安装
安装构建依赖项:
```
sudo apt install libtool
sudo apt install autoconf automake
sudo apt install dh-exec
sudo apt install nlohmann-json3-dev
sudo apt install libgmock-dev
```
在您的主机上克隆 `sonic-swss` 仓库:`git clone https://github.com/sonic-net/sonic-swss.git`。
确保 SAI 头文件存在于 `/usr/include/sai` 中。由于您已经安装了 `libsairedis-dev`、`libsaimetadata-dev` 和 `libsaivs-dev`,情况应该已经如此。如果您自己编译了 `libsairedis`,请确保将 SAI 头文件复制到 `/usr/include/sai`。
您可以使用以下命令从源代码进行编译和安装:
```
./autogen.sh
./configure
make && sudo make install
```
**注意:** 这不会运行位于 `tests/mock_tests` 下的 mock 测试。
您也可以使用以下命令构建 debian 软件包:
```
./autogen.sh
fakeroot debian/rules binary
```
## 常见问题
#### 找不到 `libboost-serialization1.74.0`
遗憾的是,即使在 Debian 11 (bullseye) 上受支持,`libboost-serialization1.74.0` 在 Ubuntu 20.04 (focal) 上并未得到官方支持。因此,您必须从源代码构建此软件包。您可以使用类似 [这个](https://github.com/ulikoehler/deb-buildscripts/blob/master/deb-boost.sh) 的脚本,但您只需要为 Boost serialization 库创建一个软件包。您还应确保生成的软件包命名为 `libboost-serialization1.74.0`。软件包创建完成后,您可以通过运行 `sudo dpkg -i libboost-serialization1.74.0_1.74.0_amd64.deb` 来安装它。
#### 安装 `libzmq3-dev` 时的依赖问题
如果由于依赖问题无法安装 `libzmq3-dev`,请检查您主机上安装的 `libkrb5` 软件包的版本:
```
sudo dpkg -l | grep "libkrb5"
```
如果版本不是 `1.17-6ubuntu4.7`,那么您需要安装正确的版本:
```
sudo apt install libkrb5support0=1.17-6ubuntu4.7
sudo apt install libzmq3-dev
```
**警告:** 这可能会删除您系统上已安装的许多软件包。请注意正在删除的内容。
**注意:** 不要安装您下载的 `sonic-buildimage.vs` 文件夹中的 `*krb5*` 软件包。这些软件包的版本较高,会导致依赖问题。
#### 安装某些软件包时的依赖问题
如果您在安装软件包期间遇到依赖问题,可以运行 `sudo apt -f install` 来修复该问题。但请注意,如果 `apt` 无法修复依赖问题,它将尝试删除有问题的软件包。
#### 打开的文件过多
如果在 mock 测试期间收到描述为“Too many open files”的 C++ 异常,您应该检查系统上允许打开的最大文件数:
```
ulimit -a | grep "open files"
```
您可以通过执行此命令来增加它:`ulimit -n 8192`。请随意更改 `8192`。这个值对我来说运行良好。
**注意:** 此更改仅对当前终端会话有效。如果您希望永久更改,请将 `ulimit -n 8192` 附加到 `~/.bashrc`。
## 需要帮助?
如有一般问题、安装帮助或故障排除:
- [Google Groups 上的 sonicproject](https://groups.google.com/g/sonicproject)
对于错误报告或功能请求,请开启一个 Issue。
## 贡献指南
有关如何贡献的信息,请参阅[贡献者指南](https://github.com/sonic-net/SONiC/wiki/Becoming-a-contributor)。
### GitHub 工作流
我们遵循基本的 GitHub Flow。如果您不知道我们在说什么,请查看 [GitHub 官方指南](https://guides.github.com/introduction/flow/)。请注意,合并仅由仓库维护者执行。
执行提交的指南:
* 将每次提交隔离到一个组件/错误修复/问题/功能中
* 使用标准的提交消息格式:
例如:
* 每位开发人员都应 fork 此仓库,并[将团队添加为贡献者](https://help.github.com/articles/adding-collaborators-to-a-personal-repository)
* 将您的更改推送到您的私有 fork,并对此仓库进行“pull-request”
* 使用 pull request 进行代码审查
* 使用 issues 来跟踪正在发生的事情标签:Azure, C++, Python, Redis数据库, SDN, SONiC, SwSS, 中间件, 交换机状态服务, 开源网络, 搜索引擎查询, 数据中心网络, 数据擦除, 无后门, 状态管理, 白盒交换机, 网络同步, 网络基础设施, 网络抽象层, 网络操作系统, 网络设备, 逆向工具, 通信协议