Watch at Ease看见世界,读懂生活。

科技 · 实用指南

出现“Invalid cross-device link”?复制或删除前先证明系统调用

EXDEV 可能是跨挂载点 rename,也可能是路径策略拒绝。保存调用者与系统调用,比较挂载身份,再采用在目标验证前保留源文件的传输约定。

出现“Invalid cross-device link”?复制或删除前先证明系统调用
原创示意图:记录程序、参数、工作目录、容器或命名空间、输入路径、解析路径、errno 与时间;在包装器重试前保留首次失败。 Watch at Ease

“Invalid cross-device link”只说明 errno 是 EXDEV,不是完整诊断。rename() 在两个挂载文件系统间返回它,openat2() 的限制策略也可能返回同一错误。

跨文件系统移动通常是复制后删除源文件,而不是一次原子 rename;自动化和恢复必须明确这一区别。

固定精确失败边界

记录程序、参数、工作目录、容器或命名空间、输入路径、解析路径、errno 与时间;在包装器重试前保留首次失败。

只跟踪到能确认失败系统调用与路径;相同错误文字并不允许相同修复。

比较挂载身份与路径解析

从实际进程可见的命名空间比较挂载 ID,而不是猜宿主机盘符。bind mount 与容器会改变 rename 边界。

另行检查目标父目录、类型、权限、空间与碰撞策略;EXDEV 不证明这些条件已满足。

不要把 rename 与 openat2 策略混为一谈

rename() 的 EXDEV 指向不同挂载点;openat2() 则要检查 resolve flags、绝对路径、符号链接、.. 或跨挂载是否违反限制。

不能为消除错误而关闭安全边界;应修正路径契约或选择允许根目录内的目标。

设计安全的跨文件系统回退

真实跨文件系统时,在目标文件系统创建临时目标,复制数据和必要元数据,按持久性要求刷新,再在目标内部重命名。

明确处理同名目标;复制或验证失败时保留源,并删除或隔离部分副本,不能声称原子移动。

删除源之前验证目标

比较大小和适当摘要,并验证该数据类型要求的属主、mode、时间、链接、ACL 或扩展属性。目录树还要核完整清单与错误数。

目标验收后才删除源,并记录本次是 rename 还是 copy-and-remove,以便恢复判断权威副本。

出现“Invalid cross-device link”?复制或删除前先证明系统调用
原创示意图:目标验收后才删除源,并记录本次是 rename 还是 copy-and-remove,以便恢复判断权威副本。 Watch at Ease