主要观点:
- 团队在存储和分发公司交易活动数据的关键系统 Gord 中遇到奇怪的 higgs-bugson,在 Kerberized NFS 环境下,大文件复制偶尔会因权限被拒绝而失败,即使权限设置正确,且与 Kerberos 凭证可能有关。
- 为调试该 bug,进行了多种尝试,包括运行缓慢的写入操作、创建内存文件系统、插入 eBPF 代码收集调试信息、编写 Wireshark 插件等,最终发现是内核在处理 NFS 数据包时的序列号匹配问题导致校验和验证失败。
- 已向团队报告发现,Linux 内核团队将添加相关功能的补丁并上游合并,同时还写了第二个补丁防止因校验和错误而重传。
关键信息:
- NFS 协议用于通过网络访问常规 POSIX 文件系统,默认安全模式在不可信网络上“无安全”,另一个安全选项是 Kerberos。
- Gord 大文件复制常失败,关闭开发环境中的 Kerberos 后复制不再失败,推测 Kerberos 凭证可能有问题。
- 内核通过 root 用户空间守护进程
rpc_gssd
获取 Kerberos 凭证,在 NFS 操作时与rpc_gssd
通信。 - 尝试通过多种方式重现 bug,包括运行缓慢写入、创建内存文件系统等,最终在使用小测试 NFS 服务器时成功重现。
- NFS 请求和响应有 XID 和 GSS 序列号等字段,内核在处理重传请求时会更新 GSS 序列号,导致校验和验证失败,进而返回 -EACCES。
- 编写 Wireshark 插件计算响应的校验和,发现存在多个相同 XID 的请求导致校验和匹配问题,最终确定内核存在相同 bug。
- 已向团队报告,Linux 内核将添加相关补丁,包括添加缓存功能和防止因校验和错误而重传的功能。
重要细节:
- 文中详细介绍了各种调试方法的过程和遇到的问题,如在编写 Wireshark 插件时处理重传请求的困难。
- 提及了相关技术如 eBPF、NFQUEUE 等的使用和原理。
- 介绍了 NFS 数据包的格式和相关字段的作用。
- 强调了该 bug 重现的条件是使用小测试 NFS 服务器导致高延迟。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。