두 가지 질문에 대한 답변을 바탕으로더 일찍 질문, 그것~인 것 같다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()
실패할 경우에만 느린 버전으로 되돌아간다고 결론을 내릴 수 있습니다 .