第一步:确认渲染管道是否真的被 SELinux 阻塞
现象识别:延迟表象与 SELinux 可疑点
渲染管道延迟的常见表象包括帧率骤降、I/O 写回超时、进程 D 状态(不可中断睡眠)堆积。若以上现象同时出现且系统日志中频繁出现 type=AVC 记录,则 SELinux 策略限制是首要排查方向。
故障树根节点判断规则: 延迟 → 进程状态检查 → 发现大量 D 状态进程 → 检查 /var/log/audit/audit.log 含 AVC → 进入 SELinux 阻塞分支。
数据采集:三要素并行取证
在同一时间窗口内采集以下三类数据,交叉验证延迟根因。
| 采集对象 | 命令/路径 | 关键字段 |
|---|---|---|
| 进程状态 | ps aux | grep render + cat /proc/[pid]/status | State: D (uninterruptible sleep), wchan (等待通道) |
| 渲染服务日志 | journalctl -u render.service --since "5 min ago" | Permission denied, Operation not permitted, AVC |
| 时间戳对比 | ausearch -ts recent -m AVC | aureport -f | AVC 时间 vs 渲染延迟起始时间 |
采集技巧:同时运行
strace -p [pid] -e trace=network,file 可快速定位被 SELinux 拒绝的系统调用。若 strace 输出 EACCES 且 audit.log 有对应 AVC,证据链即闭合。
原因定位:时间戳对齐与 AVC 解析
- 使用
ausearch -ts 14:30:00 -te 14:31:00 -m AVC提取目标时段内的所有 AVC 记录。 - 使用
audit2why -a自动分析拒绝原因,输出建议的布尔值或策略模块。 - 将 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.sock | semanage fcontext -a -t render_tmpfs_t '/run/render(/.*)?.sock' |
| 紧急绕过(仅限测试) | setenforce 0 | 不推荐,需后续恢复 |
最佳实践:永远使用
audit2allow -a -M render_local 生成策略模块,然后 semodule -i render_local.pp 永久加载。避免直接修改布尔值导致覆盖不足。
复测:验证管道恢复
- 应用修复后,使用
ps aux确认渲染进程不再处于 D 状态。 - 查看渲染服务日志最后 100 行,确认无新的 Permission denied 或 AVC 记录。
- 运行压力测试:
render-benchmark --duration 60 --output /tmp/result.log,观察帧率或吞吐量是否恢复至基准线。 - 使用
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静态验证。