Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

出現「Invalid cross-device link」?複製或刪除前先證明系統呼叫

EXDEV 可能是跨掛載點 rename,也可能是路徑政策拒絕。保存呼叫者與系統呼叫、比較掛載身分,再選擇驗證目標前保留來源的傳輸契約。

出現「Invalid cross-device link」?複製或刪除前先證明系統呼叫
原創示意圖:記錄程式、參數、cwd、namespace、來源與目標的輸入及解析路徑、errno、時間,保留第一次失敗。 Watch at Ease

「Invalid cross-device link」只表示 errno 是 EXDEV。rename() 跨掛載時會回傳它,openat2() 的限制政策也可能回傳同一錯誤。

跨檔案系統移動通常是複製後刪除,不是單一原子 rename,必須在自動化與復原中明示。

固定精確失敗邊界

記錄程式、參數、cwd、namespace、來源與目標的輸入及解析路徑、errno、時間,保留第一次失敗。

trace 到能確認 syscall 與路徑即可;相同訊息不代表相同修復。

比較掛載身分與路徑解析

從實際程序可見的 mount ID 比較,不要猜 host 磁碟名稱。bind mount 與 container 會改變 rename domain。

另查目標父目錄、型別、權限、空間與碰撞策略;EXDEV 不證明它們正確。

不要混淆 rename 與 openat2 政策

rename() 的 EXDEV 指向不同 mount;openat2() 要檢查 flags 與 absolute path、symlink、..、mount crossing 是否違反 containment。

不要為消音而關閉安全邊界;修正 path contract 或用允許 root 內的目的地。

設計安全的跨 filesystem fallback

真跨 filesystem 時,在目的 filesystem 建 temporary entry,複製資料與 metadata、依 durability 契約 flush,再於目的地內 rename。

明確處理 collision;copy 或驗證失敗時保留來源,清除或隔離 partial destination。

刪除來源前驗證目標

比對 size 與適當 digest,並驗證 owner、mode、time、link、ACL、xattr;directory tree 還需完整 manifest。

目的地通過驗收後才移除來源,並記錄實際是 rename 或 copy-and-remove。

出現「Invalid cross-device link」?複製或刪除前先證明系統呼叫
原創示意圖:目的地通過驗收後才移除來源,並記錄實際是 rename 或 copy-and-remove。 Watch at Ease