科技 · 实用指南
systemd status=200/CHDIR?改权限前先证明服务看到的文件系统
读取生效单元和日志中的准确 errno,再以配置用户在服务命名空间内测试工作目录;不要用 User=root 或 chmod 777 掩盖原因。

status=200/CHDIR 表示 systemd 在执行服务命令之前,无法切换到请求的工作目录。可执行文件即使存在、在你的 shell 中也能运行,服务仍可能更早地卡在目录边界。
先保存生效单元、日志里完整的“Changing to the requested working directory failed”行、配置用户以及服务实际看到的文件系统。这样可区分路径不存在、父目录不可遍历和命名空间路径不一致。
冻结生效单元和第一次失败
先用 systemctl cat 捕获供应商单元和 drop-in,再用 systemctl show 读取 User、Group、WorkingDirectory、RootDirectory 与 RootImage。保存第一次失败附近的 journalctl 输出,包括错误文本。
不要先改权限。status=200/CHDIR 说明失败阶段,日志中的 errno 才决定分支:路径不存在、权限被拒、组件不是目录,或其他内核结果。
在服务文件系统视图中解析 WorkingDirectory
systemd 说明,当 RootDirectory 或 RootImage 生效时,WorkingDirectory 在该根中解释;挂载和用户命名空间还可能改变服务看到的内容。主机路径存在,并不证明服务环境中也存在。
遇到 ENOENT 时,应在生效根中逐段检查路径。WorkingDirectory 前的减号只是明确忽略缺失目录;若需要受管目录,可考虑 RuntimeDirectory 或 StateDirectory。
以配置的服务用户测试路径遍历
Linux 路径解析要求每个目录组件都具有搜索权限。最终目录看似可读,也可能被父目录、ACL 或强制访问控制阻挡。可用 namei -l 检查整条路径,并以配置用户执行只读的 cd 与 pwd 测试。
测试必须使用生效单元中的真实 User 和 Group。root shell 成功几乎不能证明服务用户可达;只修复证据指出的所有权、组、ACL、搜索位或策略规则。
根据记录的 errno 选择修复
ENOENT 应修正错误路径、在正确根中创建或挂载目录,或停止在步骤间删除它。EACCES 应修复具体的父目录遍历、ACL 或安全策略;ENOTDIR 则要找出普通文件或失效符号链接。
不要因为 User=root 能启动就把它当修复,也不要 chmod 777。若工作目录确实可选,应移除该依赖或明确使用文档化的减号行为,并说明回退。
在不削弱服务的前提下证明完成
配置有变更时执行 daemon-reload,然后重启一次并保存 status 与对应日志。确认进程仍以目标用户运行,并通过 /proc/$MainPID/cwd 等证据看到预期目录。
只有原始 200/CHDIR 消失、身份未被削弱、cwd 正确且第二次重启也成功,事件才算关闭。保留生效单元和 errno 记录以便未来比较。
