【飞腾平台实时Linux方案系列】第二十二篇 - 飞腾平台实时Linux容器化部署实践。
一、简介:容器 ≠ 非实时,国产芯也需要“敏捷实时”
-
传统认知:容器只适用 Web 微服务,实时控制必须“裸机 + 裸进程”。
-
现实痛点:
-
能源变电站同型号屏需部署 30+ 节点,手动拷镜像 2 天,版本回滚无记录。
-
矿山控制器 CPU 富余 60%,却为“隔离”硬拆两台物理机,成本翻倍。
-
-
新方案:基于国产容器引擎(iSula/Kata 安全容器)+ PREEMPT_RT 实时内核,在飞腾 FT-2000/4 上实现:
-
毫秒级循环控制任务 < 500 μs 延迟
-
一键打包、30 秒冷启动、远程 OTA 回滚
-
满足 IEC 61508 SIL2 文档追溯
-
掌握“飞腾 + 实时容器”技术 = 既能享受 DevOps 速度,又能通过功能安全认证,国产自主可控落地最后一公里。
二、核心概念:5 个关键词先搞懂
| 关键词 | 一句话 | 本文出现场景 |
|---|---|---|
| iSula | 华为开源的轻量容器引擎,C/S 架构,支持 docker CLI 语法 | 替代 Docker,通过工信部认证 |
| Kata | 安全容器,一 Pod 一轻量 VM,内核独立,隔离性强 | 跑 SIL2 级控制逻辑 |
| PREEMPT_RT | Linux 实时补丁,可让内核完全可抢占 | 宿主机与容器共用同一 RT 内核 |
| cpu-set / cpu-quota | cgroup 子系统,限制容器可用 CPU 核与带宽 | 保障实时任务独享核 |
| OCI Hook | 容器启动前后执行的自定义脚本,用于绑定中断、调优 | 自动完成实时性配置 |
三、环境准备:10 分钟搭好“飞腾 + 实时容器”实验台
1. 硬件
-
飞腾 FT-2000/4 工业主板(4 核 2.2 GHz,8 GB DDR4)
-
256 GB 国产 SSD( Yuanxin )
-
以太网 ≥ 2 × 1 GbE(用于冗余通信)
2. 软件栈版本
| 组件 | 版本 | 获取方式 |
|---|---|---|
| 银河麒麟 V10 SP3 | 内核 5.15.71-rt53 | 厂商提供 ISO |
| iSula | 2.1.0 | 麒麟仓库 apt install iSula |
| Kata-Containers | 3.2.0 | 源码编译,已适配 ARM64 |
| RT-Tests | 2.5 | apt install rt-tests |
3. 一键安装脚本(可复制)
#!/bin/bash
# setup_rt_container.sh
set -e
echo "1) 更新源"
sudo apt update
echo "2) 装 iSula"
sudo apt install -y iSula iSula-build
echo "3) 加载 PREEMPT_RT 内核"
sudo apt install -y linux-image-5.15.71-rt53
echo "4) 装 Kata"
wget https://github.com/kata-containers/kata-containers/releases/download/3.2.0/kata-static-3.2.0-arm64.tar.xz
sudo tar -xvf kata-static-3.2.0-arm64.tar.xz -C /
sudo systemctl enable --now kata-qemu
echo "5) 验证"
sudo isula version
kata-runtime --version
重启选 RT 内核进入。
四、应用场景(300 字):能源变电站“集控单元”
某 220 kV 变电站集控单元需同时运行:
-
实时保护任务 — 每周波 1 ms 采样,差动保护算法 ≤ 500 μs。
-
GOOSE 通信 — IEC 61850-8-1 报文收发,抖动 < 100 μs。
-
故障录波 — 大文件顺序写,不能影响保护核。
传统方案:双 CPU 板(一颗 DSP + 一颗 ARM)成本高 40%。
新方案:单颗 FT-2000/4,宿主机 PREEMPT_RT + Kata 安全容器:
-
保护容器独占 CPU2 + FIFO:99,通过 OCI Hook 绑定 MSI 中断亲和性;
-
录波容器限制 CPU3 + I/O 带宽 30%;
-
网络双网卡冗余,宿主机运行 RSTP 协议栈。 现场型式试验:保护动作时间 14.7 ms(含出口继电器),满足国标 ≤ 20 ms;GOOSE 抖动 68 μs;通过 SIL2 认证,成本下降 35%。
五、实际案例与步骤:15 分钟跑通“实时容器”
实验目录:~/rt-container-lab,全部脚本可拷贝运行。
5.1 构建实时应用镜像
# Dockerfile.rt-app
FROM arm64v8/ubuntu:22.04
RUN apt update && apt install -y rt-tests
COPY control_loop.c /usr/src/
RUN gcc /usr/src/control_loop.c -o /usr/bin/control_loop -pthread -static
CMD ["/usr/bin/control_loop"]
control_loop.c 简例(1 ms 周期,打印最大延迟):
#include <stdio.h>
#include <time.h>
#include <pthread.h>
#define NSEC_PER_SEC 1000000000L
static int max_us = 0;
void *loop(void *arg){
struct timespec next, act;
clock_gettime(CLOCK_MONOTONIC, &next);
while(1){
next.tv_nsec += NSEC_PER_SEC/1000; /* +1 ms */
if(next.tv_nsec >= NSEC_PER_SEC){ next.tv_sec++; next.tv_nsec -= NSEC_PER_SEC; }
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next, NULL);
clock_gettime(CLOCK_MONOTONIC, &act);
int us = (act.tv_sec - next.tv_sec)*1000000 + (act.tv_nsec - next.tv_nsec)/1000;
if(us > max_us) max_us = us;
if(us > 500) printf("Overrun: %d us\n", us);
}
return NULL;
}
int main(){
pthread_t t;
pthread_attr_t attr;
struct sched_param param = { .sched_priority = 99 };
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
pthread_attr_setschedparam(&attr, ¶m);
pthread_create(&t, &attr, loop, NULL);
pthread_join(t, NULL);
}
构建镜像:
sudo isula build -t rt-app:1.0 -f Dockerfile.rt-app .
5.2 创建 Kata 实时容器
# kata-pod.yaml
metadata:
name: rt-pod
annotations:
io.katacontainers.config_path: /usr/share/kata-containers/configuration.toml
spec:
containers:
- name: rt-app
image: rt-app:1.0
resources:
limits:
cpu: "2"
memory: "512Mi"
requests:
cpu: "2"
memory: "512Mi"
env:
- name: TSYNC
value: "1"
cpu_set: "2-3" # 独占核 2-3
runtime: kata-runtime
5.3 OCI Hook 自动绑中断(可复用)
// /etc/kata-containers/hooks.json
{
"version": "1.0.0",
"hook": {
"path": "/usr/local/bin/bind-irq.sh",
"args": ["bind-irq.sh", "eth0"],
"env": []
},
"when": ["prestart"]
}
bind-irq.sh 内容:
#!/bin/bash
# 将 eth0 的 MSI 中断绑定到 CPU2
irq=$(cat /proc/interrupts | grep eth0 | awk '{print $1}' | tr -d :)
echo 4 > /proc/irq/$irq/smp_affinity # 4 = CPU2
赋予可执行:
sudo chmod +x /usr/local/bin/bind-irq.sh
5.4 启动并验证实时性
sudo isula run -d --runtime kata-runtime --cpuset-cpus 2 \
--name rt-app-1 rt-app:1.0
sudo isula logs -f rt-app-1
另开终端压测宿主机:
stress-ng --cpu 3 --timeout 30s
观察日志:最大延迟应 < 500 μs(CPU2 未被压测任务抢占)。
5.5 快速迁移(OTA)
# 导出镜像
sudo isula save rt-app:1.0 | gzip > rt-app-1.0.tar.gz
# 到目标飞腾板
sudo isula load < rt-app-1.0.tar.gz
sudo isula run ... # 同上一模一样,30 s 完成
六、常见问题与解答(FAQ)
| 问题 | 现象 | 解决 |
|---|---|---|
kata 启动报 kernel module kvm not found | 未开虚拟化 | BIOS 打开 Virtualization;飞腾 BIOS 选项叫 SMMU |
| cyclictest 在容器内延迟飙到 2 ms | 默认调度策略非 RT | Dockerfile 里加 chrt -f 99 或 systemd 设置 CPUAffinity |
| OCI Hook 不执行 | 无日志 | 在 hooks.json 加 "debug": true,输出重定向到 /var/log/kata-hook.log |
镜像导入失败 gzip: not in gzip format | 管道用错 | isula save 直接输出 tar,无需再 gzip |
| 录波容器影响保护容器 | 偶发 600 μs 抖动 | 给录波容器加 --blkio-weight=100 且绑到非实时核 |
七、实践建议与最佳实践
-
核隔离
在 GRUB 加isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3确保宿主机不把普通任务派到实时核。 -
中断亲和性固化
/etc/systemd/system/irq-aff.service开机一次性绑定,避免手动脚本遗漏。 -
镜像最小化
使用multi-stage构建,最终镜像 < 30 MB,拉取时间 < 10 s(矿山 4G 网络场景)。 -
安全容器选型
-
SIL1-SIL2:Kata 足够,已有证书参考。
-
超 SIL3:考虑 gVisor + 二级 MPU 隔离。
-
-
版本锁定与 BOM
内核、iSula、Kata、rootfs 哈希值写入《安全配置清单》,任何升级走“变更影响分析”。 -
CI 门禁
GitLab Runner 在飞腾板原生运行:-
自动跑 cyclictest → 延迟 > 500 μs 即 pipelines 失败。
-
自动生成追溯矩阵(PlantUML)PDF 存入发布包。
-
八、总结:一张脑图带走全部要点
飞腾实时容器化
├─ 宿主机:银河麒麟 + PREEMPT_RT
├─ 引擎:iSula(国产) + Kata(安全容器)
├─ 实时保障:cpu_set + isolcpus + OCI Hook 绑中断
├─ 测试:cyclictest < 500 μs
├─ 文档:SIL2 追溯矩阵自动生成
└─ OTA:isula save/load,30 s 迁移
“国产芯 + 实时容器”不再是概念:
-
成本降 35%,部署快 40 倍,还能通过功能安全认证。
-
把本文脚本 push 到你的 GitLab,下次能源、矿山、轨交项目投标,直接附上实时性测试报告——让自主可控真正落地,让实时性能插上 DevOps 的翅膀!
更多推荐
所有评论(0)