RHEL/CentOS 7에서 mv는 실제로 동일한 파일 시스템에서 cp 및 rm 작업을 수행합니까?

RHEL/CentOS 7에서 mv는 실제로 동일한 파일 시스템에서 cp 및 rm 작업을 수행합니까?

두 가지 질문에 대한 답변을 바탕으로더 일찍 질문, 그것~인 것 같다RHEL/CentOS 7에서는 mv동일한 파일 시스템 cp이더라도 rm.

이전 버전의 CentOS/RHEL에서는 mv대용량 파일(예: 설치 미디어 또는 대용량 비디오 모음)을 작업할 때에도 동일한 파일 시스템(심지어 딥 디렉터리에서 새 딥 디렉터리로 이동하는 경우에도)이 매우 빨랐습니다.

그런데 제 개인 CentOS 서버에서는 mv대용량 파일을 옮길 때 실제로 어떤 일이 일어나는지 cp보면 rm.

이로 인해 왜 이 동작이 래퍼에서 rename()(에 따르면) 로 변경되었는지 궁금합니다.POSIX기준).

맞습니까? 그렇다면 mv이 유틸리티가 CentOS 7의 동작을 변경하는 이유는 무엇입니까?

답변1

CentOS 7.2 mv명령은 해당 호출을 사용하려고 시도합니다 rename(3).

예를 들어 이렇게 하면 strace mv X Y출력에 다음이 표시됩니다.

rename("X", "Y")                        = 0

mv이렇게 하면 이름 바꾸기 호출이 성공했음을 확인할 수 있습니다 .

이 디렉터리의 이름을 다른 디스크로 바꾸려고 하면 다음과 같습니다.

rename("X", "/home/sweh/X")             = -1 EXDEV (Invalid cross-device link)

mv호출을 사용하려고 시도했지만 rename()실패했음을 알 수 있습니다 . 이 시점에서 재귀 작업이 시작됩니다.

rmdir("/home/sweh/X")                   = -1 ENOENT (No such file or directory)
mkdir("/home/sweh/X", 0700)             = 0
lstat("/home/sweh/X", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
openat(AT_FDCWD, "X", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 2 entries */, 32768)     = 48

여기서는 대상 디렉터리가 된 다음 느린 복사/삭제를 위해 현재 디렉터리를 읽기 시작하는 것을 볼 수 있습니다.

mv따라서 빠른 호출이 시도되고 rename()실패할 경우에만 느린 버전으로 되돌아간다고 결론을 내릴 수 있습니다 .

관련 정보