Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

‘Invalid cross-device link’? 복사·삭제 전에 syscall을 증명하세요

EXDEV는 mount 간 rename뿐 아니라 path policy 거부에서도 나옵니다. caller, syscall, mount ID를 보존하고 destination 검증 전까지 source를 유지하는 계약을 선택하세요.

‘Invalid cross-device link’? 복사·삭제 전에 syscall을 증명하세요
원본 일러스트: program, arguments, cwd, namespace, 입력·해석 경로, errno, 시간을 기록하고 wrapper 재시도 전 첫 실패를 보존하세요. Watch at Ease

‘Invalid cross-device link’는 EXDEV errno 이름이지 완전한 진단이 아닙니다. rename()의 mount 경계와 openat2() containment policy를 구분해야 합니다.

filesystem 간 move는 보통 copy 후 source 제거이며 하나의 atomic rename이 아닙니다.

정확한 실패 경계 고정

program, arguments, cwd, namespace, 입력·해석 경로, errno, 시간을 기록하고 wrapper 재시도 전 첫 실패를 보존하세요.

syscall과 path를 확인할 만큼만 trace하세요. 같은 메시지가 같은 수정을 허용하지 않습니다.

mount identity와 path resolution 비교

host drive 이름이 아니라 실제 process가 보는 mount ID를 비교하세요. bind mount와 container는 rename domain을 바꿉니다.

destination parent, type, permission, space, collision policy는 별도로 점검하세요.

rename과 openat2 policy 구분

rename()이면 mount 차이를, openat2()이면 flags와 absolute path, symlink, .., mount crossing의 containment 위반을 확인하세요.

오류를 숨기려고 security boundary를 끄지 말고 path contract나 허용 root 내부 destination을 고치세요.

안전한 cross-filesystem fallback 설계

실제 cross-filesystem이면 destination filesystem에 temporary entry를 만들고 data·metadata를 복사하고 durability contract에 따라 flush한 뒤 그 안에서 rename하세요.

collision을 명시하고 copy 또는 verify 실패 시 source를 유지하며 partial destination을 격리하세요.

source 제거 전 destination 검증

size와 적절한 digest, owner, mode, time, link, ACL, xattr를 확인하세요. tree는 manifest와 error count도 필요합니다.

destination acceptance 뒤에만 source를 제거하고 rename인지 copy-and-remove인지 기록하세요.

‘Invalid cross-device link’? 복사·삭제 전에 syscall을 증명하세요
원본 일러스트: destination acceptance 뒤에만 source를 제거하고 rename인지 copy-and-remove인지 기록하세요. Watch at Ease