sonic-net/sonic-buildimage
GitHub: sonic-net/sonic-buildimage
SONiC 官方构建系统,用于为多种 ASIC 平台编译可安装的白盒交换机网络操作系统镜像。
Stars: 930 | Forks: 1742
*master 构建*:
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=138&branchName=master)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=139&branchName=master)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=2432&branchName=master)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=141&branchName=master)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=999&branchName=master)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=1665&branchName=master)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=master)
*202511 构建*:
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=138&branchName=202511)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=139&branchName=202511)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=2432&branchName=202511)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=141&branchName=202511)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=999&branchName=202511)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=1665&branchName=202511)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=202511)
*202505 构建*:
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=138&branchName=202505)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=139&branchName=202505)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=141&branchName=202505)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=999&branchName=202505)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=1665&branchName=202505)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=202505)
*202411 构建*:
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=138&branchName=202411)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=143&branchName=202411)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=140&branchName=202411)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=139&branchName=202411)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=141&branchName=202411)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=999&branchName=202411)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=1665&branchName=202411)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=202411)
*202405 构建*:
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=138&branchName=202405)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=143&branchName=202405)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=140&branchName=202405)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=139&branchName=202405)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=141&branchName=202405)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=999&branchName=202405)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=1665&branchName=202405)
[](https://dev.azure.com/mssonic/build/_build/latest?definitionId=142&branchName=202405)
## SONiC 镜像 Azure Pipelines
所有 SONiC 项目构建管道均可在 [SONiC 镜像下载门户](https://sonic-build.azurewebsites.net/pipelines) 找到
# sonic-buildimage
## 构建 SONiC 交换机镜像
# 描述
以下是如何为网络交换机构建 [(ONIE)](https://github.com/opencomputeproject/onie) 兼容网络操作系统 (NOS) 安装镜像,以及如何构建在 NOS 内部运行的 docker 镜像的说明。
请注意,SONiC 镜像是按 ASIC 平台构建的。使用相同 ASIC 平台的交换机共享一个通用镜像。
有关支持的交换机和 ASIC 列表,请参阅此 [列表](https://github.com/sonic-net/SONiC/wiki/Supported-Devices-and-Platforms)
# 硬件
任何服务器都可以作为构建镜像服务器,只要它具备:
* 多个核心以增加构建速度
* 足够的 RAM(少于 8 GiB 可能会导致问题)
* 300G 的可用磁盘空间
* KVM 虚拟化支持。
目前构建 SONiC 的最佳操作系统选择是 Ubuntu 22.04 或 Ubuntu 24.04。
## 自动化先决条件安装和仓库克隆
为了方便起见,您可以使用自动化先决条件脚本来处理先决条件安装和仓库克隆:
```
curl -sSL https://raw.githubusercontent.com/sonic-net/sonic-buildimage/master/scripts/prerequisites.sh | bash
```
如果您已经克隆了仓库,请在本地运行它以仅安装先决条件
(该脚本会检测 `SONIC_DIR` 中已有的克隆并跳过克隆/检出步骤):
```
cd ~/sonic-buildimage # or wherever your clone lives
SONIC_DIR=$(pwd) bash scripts/prerequisites.sh
```
此脚本将自动:
* 安装所需的软件包 (pip, jinja, Docker)
* 配置 Docker 以允许非 root 用户使用
* 克隆仓库及所有子模块
完成此步骤后,请继续下方的 [使用方法](#usage) 部分。
## 手动安装先决条件
* 在主机构建机器上安装 pip 和 jinja,如果 j2/jinjanator 不可用,请执行以下命令:
```
sudo apt install -y python3-pip
pip3 install --user jinjanator
```
* 安装 [Docker](https://docs.docker.com/engine/install/) 并配置您的系统以允许在没有 'sudo' 的情况下运行 'docker' 命令:
* 将当前用户添加到 docker 组:`sudo gpasswd -a ${USER} docker`
* 登出并重新登录,以便重新评估您的组成员身份
* 如果您使用的是 Linux 内核 5.3 或更新版本,则必须使用 Docker 20.10.10 或更新版本。这是因为较旧的 Docker 版本不允许 `clone3` 系统调用,而该调用现在在 Bookworm 中被使用。
## 手动克隆包含所有 git 子模块的仓库
要递归克隆代码仓库:
```
git clone --recurse-submodules https://github.com/sonic-net/sonic-buildimage.git
```
## 使用方法
要构建 SONiC 安装镜像和 docker 镜像,请运行以下命令:
```
# 确保您的开发系统已加载 'overlay' 模块
sudo modprobe overlay
# 进入源代码目录
cd sonic-buildimage
# (可选)检出特定分支。默认情况下,使用 master 分支。
# 例如,要检出分支 201911,请使用 "git checkout 201911"
git checkout [branch_name]
# 在克隆 repo 后执行一次 make init,
# 或在获取包含 submodule 更新的远程 repo 后执行
make init
# 执行一次 make configure 以配置 ASIC
make configure PLATFORM=[ASIC_VENDOR]
# 使用 4 个并行任务构建 SONiC image。
# 注意:您可以设置更高的数值,但对于大多数情况,4 是一个不错的选择,
# 并且经过了充分测试。
make SONIC_BUILD_JOBS=4 all
```
### 构建性能提示
**并行度与内存:** 每个并行作业在 C++ 编译期间可能使用 4–6 GB RAM,外加约 4 GB 的基本开销。经验法则:`(JOBS × 6 GB) + 4 GB ≤ 可用 RAM`:
| JOBS | 大致所需 RAM | 典型 VS 构建时间 |
|------|-------------------|----------------------|
| 1 | ~10 GB | ~3 小时 |
| 4 | ~28 GB | ~1.5 小时 |
| 8 | ~52 GB | ~1 小时 |
**在构建容器中遏制 OOM**(保护主机进程):
```
# 添加到 rules/config.user(在 rebase 后保留):
SONIC_BUILD_MEMORY = 24g
```
**跳过测试以加快迭代:**
```
make SONIC_BUILD_JOBS=4 BUILD_SKIP_TEST=y all
```
**使用持久化配置文件** 代替 CLI 覆盖 —— 创建 `rules/config.user`(已被 git 忽略):
```
SONIC_CONFIG_BUILD_JOBS = 4
BUILD_SKIP_TEST = y
SONIC_BUILD_MEMORY = 24g
DEFAULT_BUILD_LOG_TIMESTAMP = simple
```
支持的 ASIC 供应商有:
* PLATFORM=barefoot
* PLATFORM=broadcom
* PLATFORM=marvell-prestera
* PLATFORM=marvell-teralynx
* PLATFORM=mellanox
* PLATFORM=centec
* PLATFORM=nephos
* PLATFORM=nvidia-bluefield
* PLATFORM=vs
## ARM 架构使用方法
```
sudo apt-get install --allow-downgrades -y docker-ce=5:18.09.0~3-0~ubuntu-xenial
sudo apt-get install --allow-downgrades -y docker-ce-cli=5:18.09.0~3-0~ubuntu-xenial
```
为 (ARMHF) 平台构建 Arm32 位
```
# 执行一次 make configure 以配置 ASIC 和 ARCH
make configure PLATFORM=[ASIC_VENDOR] PLATFORM_ARCH=armhf
make target/sonic-[ASIC_VENDER]-armhf.bin
```
_示例:_
```
make configure PLATFORM=marvell-prestera PLATFORM_ARCH=armhf
make target/sonic-marvell-prestera-armhf.bin
```
在 amd64 主机上为 debian buster 使用交叉编译构建 Marvell Prestera 平台的 Arm32 位 (ARMHF),请运行以下命令:
```
# 执行一次 make configure 以配置 ASIC 和 ARCH 用于 cross-compilation build
NOJESSIE=1 NOSTRETCH=1 BLDENV=buster CROSS_BLDENV=1 \
make configure PLATFORM=marvell-prestera PLATFORM_ARCH=armhf
# 使用 cross-compilation 环境执行 Arm32 build
NOJESSIE=1 NOSTRETCH=1 BLDENV=buster CROSS_BLDENV=1 make target/sonic-marvell-prestera-armhf.bin
```
运行上述使用交叉编译而不是 qemu 模拟器的 Arm32 构建可以大幅减少构建时间。
为平台构建 Arm64 位
```
# 执行一次 make configure 以配置 ASIC 和 ARCH
make configure PLATFORM=[ASIC_VENDOR] PLATFORM_ARCH=arm64
# 示例:
make configure PLATFORM=marvell-prestera PLATFORM_ARCH=arm64
```
**注意**:
* 建议保留至少 100G 的可用空间来构建一个平台,使用单个作业。
如果在 `SONIC_BUILD_JOBS` 中设置超过 1,构建过程将使用更多磁盘。
* 如果 Docker 的工作区文件夹 `/var/lib/docker` 所在的分区没有足够的可用空间,
您可能会在 Docker 容器构建作业期间遇到如下错误:
`/usr/bin/tar: /path/to/sonic-buildimage/: Cannot write: No space left on device`
解决方法是将[目录移动](https://www.ibm.com/docs/en/z-logdata-analytics/5.1.0?topic=compose-relocating-docker-root-directory)到具有更多可用空间的分区。
* 使用 `http_proxy=[your_proxy] https_proxy=[your_proxy] no_proxy=[your_no_proxy] make` 在构建过程中启用 http(s) 代理。
* 将您的用户账户添加到 `docker` 组并使用您的用户账户进行 make。
不支持 `root` 或 `sudo`。
* 有关交叉编译错误的更多详细信息,请参阅 [README.arm64_build_on_amd64.md](https://github.com/sonic-net/sonic-buildimage/blob/master/README.arm64_build_on_amd64.md)
SONiC 安装程序包含所需的所有 docker 镜像。
SONiC 对同一 ASIC 供应商的所有设备使用一个镜像。
对于 Broadcom ASIC,我们构建 ONIE 和 EOS 镜像。
EOS 镜像用于 Arista 设备,
ONIE 镜像用于所有其他基于 Broadcom ASIC 的设备。
```
make configure PLATFORM=broadcom
# 构建 debian stretch 所需目标
BLDENV=stretch make stretch
# 构建 ONIE image
make target/sonic-broadcom.bin
# 构建 EOS image
make target/sonic-aboot-broadcom.swi
```
您可能会发现 rules/config 文件很有用。
它包含构建过程的配置选项,
例如增加详细程度或显示依赖关系,
基础镜像的用户名和密码等。
每个 docker 镜像都构建并保存到 target/ 目录中。
因此,例如,要仅构建 docker-database,请执行:
```
make target/docker-database.gz
```
debian 软件包也是如此,它们位于 target/debs/ 下:
```
make target/debs/swss_1.0.0_amd64.deb
```
每个目标都有一个 clean 目标,因此为了清理 swss,请执行:
```
make target/debs/swss_1.0.0_amd64.deb-clean
```
建议使用 clean 目标来清理所有一起构建的软件包,
例如 dev 软件包。
为了更熟悉构建过程并对其进行一些更改,
建议阅读此简短[文档](README.buildsystem.md)。
## 构建调试 dockers 和调试 SONiC 安装镜像
SONiC 构建系统支持构建带有调试工具和调试符号的 dockers 和 ONIE-image,以帮助进行实时和核心调试。
有关详细信息请参阅 [SONiC Buildimage 指南](https://github.com/sonic-net/sonic-buildimage/blob/master/README.buildsystem.md)。
## SAI 版本
请参阅 [SONiC 路线图](https://github.com/sonic-net/SONiC/wiki/Sonic-Roadmap-Planning) 了解每个 SONiC 版本的 SAI 版本。
## 说明
* 如果您是第一次运行 make,将自动构建 sonic-slave-${USER} docker 镜像。
这可能需要一些时间,但这是一次性操作,请耐心等待。
* root 用户账户已禁用。但是,创建的用户可以 `sudo`。
* 目标目录是 `./target`,包含 NOS 安装镜像和 docker 镜像。
* sonic-generic.bin: SONiC 交换机安装镜像 (ONIE 兼容)
* sonic-aboot.bin: SONiC 交换机安装镜像 (Aboot 兼容)
* docker-base.gz: 基础 docker 镜像,其他 docker 镜像基于此构建,仅在构建过程中使用 (gzip tar 归档)
* docker-database.gz: 用于内存键值存储的 docker 镜像,用作进程间通信 (gzip tar 归档)
* docker-fpm.gz: 启用了 fpm 模块的 quagga 的 docker 镜像 (gzip tar 归档)
* docker-orchagent.gz: 用于 SWitch State Service (SWSS) 的 docker 镜像 (gzip tar 归档)
* docker-syncd-brcm.gz: 用于同步数据库和 Broadcom 交换机 ASIC 的守护进程的 docker 镜像 (gzip tar 归档)
* docker-syncd-cavm.gz: 用于同步数据库和 Cavium 交换机 ASIC 的守护进程的 docker 镜像 (gzip tar 归档)
* docker-syncd-mlnx.gz: 用于同步数据库和 Mellanox 交换机 ASIC 的守护进程的 docker 镜像 (gzip tar 归档)
* docker-syncd-nephos.gz: 用于同步数据库和 Nephos 交换机 ASIC 的守护进程的 docker 镜像 (gzip tar 归档)
* docker-syncd-mrvl-teralynx.gz: 用于同步数据库和 Marvell-Teralynx 交换机 ASIC 的守护进程的 docker 镜像 (gzip tar 归档)
* docker-syncd-mrvl-prestera.gz: 用于同步数据库和 Marvell-Prestera 交换机 ASIC 的守护进程的 docker 镜像 (gzip tar 归档)
* docker-sonic-p4.gz: 用于 p4 软件交换机的一体化 docker 镜像 (gzip tar 归档)
* docker-sonic-vs.gz: 用于软件虚拟交换机的一体化 docker 镜像 (gzip tar 归档)
* docker-sonic-mgmt.gz: 用于 [管理、配置和监控 SONiC](https://github.com/sonic-net/sonic-mgmt) 的 docker 镜像 (gzip tar 归档)
## 贡献指南
所有贡献者在贡献被接受之前必须签署贡献许可协议。
访问 [EasyCLA - Linux Foundation](https://easycla.lfx.linuxfoundation.org)。
## 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 跟踪正在发生的事情
本项目采用了 [Microsoft 开源行为准则](https://opensource.microsoft.com/codeofconduct/)。
有关更多信息,请参阅 [行为准则常见问题解答](https://opensource.microsoft.com/codeofconduct/faq/) 或联系 [opencode@microsoft.com](mailto:opencode@microsoft.com) 如有任何其他问题或意见。
标签:ASIC驱动, Azure, Broadcom, Debian, Makefile, Marvell, Mellanox, Nvidia, SDN, SONiC, SONiC构建镜像, 交换机, 固件构建, 客户端加密, 客户端加密, 开源网络, 数据中心网络, 构建系统, 编译脚本, 网络基础设施, 网络安全研究, 网络操作系统, 网络自动化, 裸机交换机, 请求拦截, 逆向工具