使用 C1模式,可以省去一台交换机。

1. 最终拓扑与物理网口

VIAVI QG2(最终 Grandmaster)
    │
Spark aerial00:SLAVE ── 共享 PHC 0 ── aerial01:MASTER
    │                                           │
    └─ phc2sys → Spark 系统时钟                  └─ WNC O-RU:SLAVE / locked
Linux 接口PCI 地址物理端口当次连接用途
aerial000000:01:00.0p0QG2,1 GbpsPTP 上游
aerial020002:01:00.0p0与 aerial00 对应同一物理端口本次不选用
aerial010000:01:00.1p1WNC,10 GbpsPTP 下游及 Aerial 前传
aerial030002:01:00.1p1与 aerial01 对应同一物理端口本次不选用

两组接口的对应关系由 phys_switch_id、phys_port_name、devlink、协商速率及物理收发计数交叉确认;不能把四个 Linux 接口名当成四条独立物理链路。

最初按 aerial02 作为下游进行过一次尝试,后发现它与 aerial00 同属 p0,因此改为 aerial01。中间版本保存在 c1-initial-aerial02/;最终应学习 c1/。当次可用以下只读命令复核映射:

devlink port show
cat /sys/class/net/aerial00/phys_port_name
cat /sys/class/net/aerial01/phys_port_name
cat /sys/class/net/aerial02/phys_port_name
cat /sys/class/net/aerial03/phys_port_name
ethtool -T aerial00
ethtool -T aerial01

2. /etc/ptp.conf:从单端口客户端改为双端口边界时钟

完整差异:change-diffs/01-ptp.conf.diff。

-clientOnly                      1
+clientOnly                      0
+clock_type                      BC
  • clientOnly 0:允许这个时钟向下游授时。
  • clock_type BC:明确采用边界时钟。
  • 原 [aerial00] 配置保留,继续从 QG2 接收时间。
  • 增加 [aerial01],使同一个 ptp4l 实例同时管理上下游。

新增的下游段:

[aerial01]
serverOnly 1
announceReceiptTimeout 3
delay_mechanism E2E
network_transport L2

serverOnly 1 使下游端口不进入客户端角色,避免从 RU 选择上游时间源。Spark 仍然以 QG2 为最终 GM;边界时钟从上游校准共享 PHC,再在下游发送 Sync/Announce 并回复 RU 的 Delay_Req。

原注释 # Role: client 被保留以兼容安装脚本的状态查询,表示上游客户端角色。实际时钟类型由 clock_type BC 决定,新增的 # Topology 注释也明确写出 C1。

以下为最终完整配置:

# PTP configuration for NVIDIA Aerial
# Role: client
# Topology: LLS-C1 boundary clock; client denotes the upstream role.
# Upstream: aerial00; downstream: aerial01.

[global]
dataset_comparison              G.8275.x
G.8275.defaultDS.localPriority  128
maxStepsRemoved                 255
logAnnounceInterval             -3
logSyncInterval                 -4
logMinDelayReqInterval          -4
G.8275.portDS.localPriority     128
network_transport               L2
domainNumber                    24
tx_timestamp_timeout            30
clientOnly                      0
clock_type                      BC

clock_servo pi
step_threshold 1.0
egressLatency 28
pi_proportional_const 4.65
pi_integral_const 0.1

[aerial00]
announceReceiptTimeout 3
delay_mechanism E2E
network_transport L2

[aerial01]
serverOnly 1
announceReceiptTimeout 3
delay_mechanism E2E
network_transport L2

上下游都报告 PHC 0,因此本次没有开启 boundary_clock_jbod,也没有增加 PHC 之间的同步进程。

3. /etc/systemd/system/ptp4l.service:补充下游网口初始化

原 aerial00 的初始化命令全部保留,新增:

ExecStartPre=/usr/sbin/ifconfig aerial01 up
ExecStartPre=/usr/sbin/ethtool --set-priv-flags aerial01 tx_port_ts on
ExecStartPre=/usr/sbin/ethtool -A aerial01 rx off tx off

依次用于拉起网口、启用该网口的硬件 TX 端口时间戳,以及关闭该网口的 RX/TX pause 流控。实际检查时,时间戳和流控参数已经是这些值;把它们写入服务可在后续启动时重新应用。

ExecStart=/usr/sbin/ptp4l -f /etc/ptp.conf、CPU 绑定 4、自动重启策略均保持原样。文件差异见 change-diffs/02-ptp4l.service.diff。

安装配置后,脚本按顺序停止 phc2sys、停止 ptp4l,写入文件并执行 daemon-reload,再启动 ptp4l 和 phc2sys。这些命令会中断授时,仅阅读本文无需重新执行。

4. phc2sys 与时间尺度:文件没有修改

以下命令完整保留:

/usr/sbin/phc2sys -s aerial00 -c CLOCK_REALTIME -n 24 -O 0 -R 256 -u 256

它继续把 aerial00 对应的 PHC 同步到系统时钟。-O 0 保留了 Aerial 原有的 TAI 时间尺度设置;本次没有把系统时间切换为 UTC。C3 和 C1 归档中的 phc2sys.service 完全相同。

同样保留了 domain 24、L2、E2E、G.8275.x 数据集比较、Sync/Announce 频率、PI 参数、egressLatency 等参数。ptp_minor_version 也没有新增或修改。

5. 启动 Aerial 时的另一个必要改动:业务前传网口

文件:/home/airan/aerial-cuda-accelerated-ran/cuPHY-CP/cuphycontroller/config/cuphycontroller_P5G_WNC_DGX.yaml。

-nic: '0000:01:00.0'
+nic: '0000:01:00.1'

总计替换 9 处:1 处 NIC 定义和 8 处 cell 配置中的 NIC 引用。修改 cell 模板引用不等于启用了 8 个小区;当次运行的是 1 个小区。

这让 Aerial 的业务报文使用连接 RU 的 p1,而不是连接 QG2 的 p0。src_mac_addr 仍为全零,由 Aerial 使用所选网口的实际 MAC,即 aerial01 的 4c:bb:47:30:5a:8e。

修改前的完整文件保存在 aerial-runs/20261030-182605/before/,逐行差异见 change-diffs/03-aerial-nic.diff。重新核对确认,当前文件相对启动前备份只有这 9 处替换。

RU 目的 MAC e8:c7:cf:ad:8f:1a、VLAN 2、workers_ul、pusch_aggr_per_ctx 和 E3/data_config 等改动,在此次启动前已经存在。它们可能出现在相对 Git 提交的 diff 中,但不属于本次新增修改。

6. WNC 四路 radio 的业务配置及启用状态

通过 115200 波特率串口登录,修改 radio 1–4 的 transport peer-mac:

-transport peer-mac 4c:bb:47:30:45:3f
+transport peer-mac 4c:bb:47:30:5a:8e

这是 RU 发送业务报文时使用的 DU 对端 MAC,必须与本次 Aerial 选择的 aerial01 对应。

当次实际执行的 CLI 命令:

config
radio 1
transport peer-mac 4c:bb:47:30:5a:8e
exit
radio 2
transport peer-mac 4c:bb:47:30:5a:8e
exit
radio 3
transport peer-mac 4c:bb:47:30:5a:8e
exit
radio 4
transport peer-mac 4c:bb:47:30:5a:8e
exit
exit
radio enable

前后 running-config 对比确认,radio enable 对四路 radio 还产生了:

-shutdown
+no shutdown
-lna shutdown
+no lna shutdown

RU 的 PTP 配置本来就是 domain 24、G.8275.1、eth1、Ethernet forwardable,因此没有修改 RU 的 PTP 参数。中心频率 3350010 kHz、带宽 100 MHz、SCS 30 kHz、VLAN 2、eAxC、压缩和发射功率也保持原值。

这些变更只写入当时的 running-config。本次没有执行 copy running-config startup-config,因此不能假定它们会在 RU 重启后保留。完整前后差异见 change-diffs/04-wnc-radio.diff,命令回显在 /home/airan/aerial-runs/20261030-182605/oru-configuration-transcript.json。

7. 配套进程启动与其他文件

使用现有镜像,先启动核心网,再启动 Aerial/OAI:

cd /home/airan/openairinterface5g/doc/tutorial_resources/oai-cn5g
docker compose up -d --pull never
cd /home/airan/openairinterface5g/ci-scripts/yaml_files/sa_gnb_aerial
docker compose up -d --pull never

本次没有修改两个 docker-compose.yaml 或 OAI gNB.conf;与启动前备份逐一比对均一致。没有重建镜像、修改驱动/固件、修改 TDD、重新运行 installer 或创建 Git 提交。

另生成了串口查询、监测、ping 和测速工具及其日志。这些是诊断辅助文件,不是 C1 授时必须加载的配置。临时 HTTP 测速服务已停止;手机端 iPerf3 服务未监听,标准 30 秒双向测试未完成。速率观测和稳定性结果见 /home/airan/aerial-runs/20261030-182605/RESULTS.md。

8. 验证方法和当次结果

python3 /home/airan/ptp-modes/20261030-180950/verify-c1.py

脚本检查两个服务、aerial00=SLAVE、aerial01=MASTER、GM 存在,以及下游 Sync/Announce 的发送计数。RU 的独立串口验证命令是:

show ptp clock
show ptp parent
show s-plane status

当次 RU 返回 locked,父时钟为 Spark 4cbb47.fffe.305a8d 的端口 2,最终 GM 为 QG2 fcaf6a.fffe.06aa9d,stepsRemoved=2,记录的一次偏差为 18 ns。这里的“端口 2”是 ptp4l 中第二个配置端口,不是 Linux 接口 aerial02。

L1 初始化时曾发生一次下游 TX 时间戳超时,约 16 秒后自动恢复。之后正式 10 分钟观察中没有新的 PTP 故障或容器重启。满载时出现过 RLC 缓冲区满和约 1 秒的时延峰值,见性能报告;这些结果不能等同于长期满载稳定性保证。

9. 备份、脚本与回退范围

文件/目录用途
c3-backup/原 ptp.conf、ptp4l.service、phc2sys.service;附 SHA256 和权限清单
/var/backups/aerial-ptp/c3-SjV4M5Sm/首次切换时建立的 root 所有备份
c1/最终 C1 文件及校验值
activate-c1.sh从已备份的原 C3 状态切换,预检查、root 备份、安装、验证、失败回退
apply-c1-update.sh当次将初始 aerial02 方案纠正为最终 aerial01 的更新脚本;更新前也备份
restore-c3.sh恢复原三个 Spark PTP 文件并重启 PTP 服务
verify-c1.pySpark 侧只读检查;不代替 RU 自身的锁定检查
VERIFICATION.md当次成功锁定的原始输出
change-diffs/本文涉及的四份完整差异

activate-c1.sh 会先检查当前文件是否等于原 C3 备份,因此当前已经是 C1 时,重复执行会因原文件校验不符而停止。它不是任意当前状态上的幂等安装器。

恢复原 Spark PTP 配置的命令(仅供需要回退时使用):

sudo bash /home/airan/ptp-modes/20261030-180950/restore-c3.sh

该回退脚本只恢复 Spark 的三个 PTP 文件;不会回退 Aerial YAML、RU 的 peer MAC/无线启用状态,或物理连线。完整回到操作前状态还需恢复 Aerial 的启动前 YAML,以及 RU 四路 radio 的旧 peer MAC、shutdown 和 lna shutdown。仅恢复 Spark 客户端配置,也不会自动建立完整 C3 的外部 RU 授时链路。

原 install_services.sh 没有被修改,重新安装仍可能覆盖这里的双端口 C1 配置。重新生成配置前应先保留当前配置。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐