深入兔子洞:Bash、OverlayFS 以及一个 30 岁的惊喜

主要观点:通过一次调试发现涉及 Bash、getcwd()和 OverlayFS 的一系列问题,从客户报告的 OpenSSH scp 在切换到 OverlayFS 后失败开始,逐步深入探究原因。
关键信息

  • 客户报告 OpenSSH scp 失败及相关错误日志。
  • 排除内核问题,发现 Bash 自带getcwd()函数且受GETCWD_BROKEN影响。
  • 追溯到交叉编译环境导致GETCWD_BROKEN,以及各项目对 Bash 交叉编译的处理。
  • 分析 Bashgetcwd()实现,揭示 OverlayFS 中 inode 相关问题及 Bash 对readdir()的错误使用。
    重要细节
  • Bash 日志中getcwd错误,分析发现来自 Bash shell 而非 scp 本身。
  • 检查内核 OverlayFS 源代码未找到相关代码路径。
  • Bash 中nm -D bash | grep getcwd的输出情况及相关代码注释。
  • configure脚本输出导致GETCWD_BROKEN的原因。
  • OverlayFS 的合并机制及对 inode 编号的影响。
  • Bashgetcwd()readdir()的错误使用及对errno的影响。
阅读 9
0 条评论