第一步:确认渲染管道是否真的被 SELinux 阻塞

现象识别:延迟表象与 SELinux 可疑点

渲染管道延迟的常见表象包括帧率骤降、I/O 写回超时、进程 D 状态(不可中断睡眠)堆积。若以上现象同时出现且系统日志中频繁出现 type=AVC 记录,则 SELinux 策略限制是首要排查方向。

故障树根节点判断规则: 延迟 → 进程状态检查 → 发现大量 D 状态进程 → 检查 /var/log/audit/audit.log 含 AVC → 进入 SELinux 阻塞分支。

数据采集:三要素并行取证

在同一时间窗口内采集以下三类数据,交叉验证延迟根因。

采集对象命令/路径关键字段
进程状态ps aux | grep render + cat /proc/[pid]/statusState: D (uninterruptible sleep), wchan (等待通道)
渲染服务日志journalctl -u render.service --since "5 min ago"Permission denied, Operation not permitted, AVC
时间戳对比ausearch -ts recent -m AVC | aureport -fAVC 时间 vs 渲染延迟起始时间
采集技巧:同时运行 strace -p [pid] -e trace=network,file 可快速定位被 SELinux 拒绝的系统调用。若 strace 输出 EACCES 且 audit.log 有对应 AVC,证据链即闭合。

原因定位:时间戳对齐与 AVC 解析

  1. 使用 ausearch -ts 14:30:00 -te 14:31:00 -m AVC 提取目标时段内的所有 AVC 记录。
  2. 使用 audit2why -a 自动分析拒绝原因,输出建议的布尔值或策略模块。
  3. 将 AVC 时间戳与渲染服务日志中的延迟事件时间戳逐行对齐,确认因果关系。

典型对齐结果示例:

# audit.log 条目
type=AVC msg=audit(1712345678.123:456): avc:  denied  { read write } for  pid=1234 comm="render" name="socket" scontext=system_u:system_r:render_t:s0 tcontext=system_u:object_r:tmpfs_t:s0 tclass=sock_file

# render.log 对应记录
[2025-04-06 14:30:01] ERROR: Failed to write to /run/render/pipeline.sock: Permission denied

上例中 render_t 域对 tmpfs_t 类型的 Unix socket 文件缺乏读写权限,时间差 <1 秒,确认为阻塞原因。

避坑:切勿仅凭 AVC 出现次数判断严重性。部分 AVC 是宽松模式下也被记录的无害尝试,必须结合进程状态和延迟时间戳才能定性。

修复动作:临时与永久策略

场景临时修复永久修复
AVC 表明需要布尔值setsebool -P render_use_tmpfs 1写入策略模块 render_local.te
AVC 表明需要文件上下文chcon -t render_tmpfs_t /run/render/pipeline.socksemanage fcontext -a -t render_tmpfs_t '/run/render(/.*)?.sock'
紧急绕过(仅限测试)setenforce 0不推荐,需后续恢复
最佳实践:永远使用 audit2allow -a -M render_local 生成策略模块,然后 semodule -i render_local.pp 永久加载。避免直接修改布尔值导致覆盖不足。

复测:验证管道恢复

  1. 应用修复后,使用 ps aux 确认渲染进程不再处于 D 状态。
  2. 查看渲染服务日志最后 100 行,确认无新的 Permission denied 或 AVC 记录。
  3. 运行压力测试:render-benchmark --duration 60 --output /tmp/result.log,观察帧率或吞吐量是否恢复至基准线。
  4. 使用 ausearch -m AVC --just-one 确认审计队列中无新拒绝。
复测指标:延迟恢复必须满足:渲染管道中 99 分位延迟 ≤ 修复前延迟基线值的 1.2 倍,且无新增 AVC。

预防:监控与自动化

  • 部署 auditd 规则:-w /run/render -p wa -k render_pipeline,实时捕获文件写操作。
  • 集成 setroubleshoot 服务,当出现新 AVC 时自动发送告警并附加建议。
  • 将策略变更纳入 CI/CD:每次新部署前运行 checkmodule -M -m render.te -o render.mod 静态验证。
SELinux 阻塞排查流程(第4章核心步骤) 渲染管道延迟 三要素并行采集 进程状态 | 服务日志 | 时间戳 时间戳对齐 + AVC解析 有AVC → 策略修复 无AVC → 检查其他项 修复动作 + 复测验证 临时/永久策略 → 压力测试 → 无AVC 监控告警 + CI/CD策略