ext4의 mv가 inode 재배치 대신 복사 및 삭제를 수행하고 있습니다.

ext4의 mv가 inode 재배치 대신 복사 및 삭제를 수행하고 있습니다.

mv나는 ext4 파티션에서 그 자체로 파일을 복사하는 경우 디렉토리 항목을 업데이트하고 inode를 동일하게 유지함으로써 일정한 시간 내에 즉시 수행될 수 있다고 믿습니다 .

대신 전체(30GB) 파일이 복사된 후 원본 파일이 삭제되는 경우가 가끔 있습니다.

왜 이런 일이 발생합니까?

답변1

mv명령은 내부적으로 호출되며 rename()단일 파일 시스템 마운트 지점 내에서 이름을 바꾸면 이름 항목만 변경됩니다(동일한 디렉터리 내에서 또는 한 디렉터리에서 다른 디렉터리로 이름 이동).

그러나 일부 경우 ("교차 장치 링크 오류") 가 호출자에게 rename()반환되며 , 이 경우 파일(또는 전체 디렉터리 트리)을 새 위치로 복사하고 위치에 있는 파일을 삭제하도록 대체됩니다. at /directory: 그 이후의 이전 위치.EXDEVmv

rename()반환의 가장 일반적인 이유 EXDEV는 호출의 소스 및 대상 디렉터리가 rename()서로 다른 파일 시스템에 있고 동일한 파일 시스템이 서로 다른 마운트 지점을 가질 수 있다는 것입니다. 프로젝트 할당량이 사용 중이고(소스 파일/디렉터리 및 대상 디렉터리에서 "lsattr -p"를 실행하여 확인) 소스/대상이 다른 프로젝트 ID를 사용하는 경우에도 EXDEV사용자 공간으로 대체되며 mv복제 대상은 다음을 수행해야 합니다. 파일/디렉토리 트리를 만들고 새 상위 항목과 일치하도록 projid를 변경합니다.

소스 및 대상 디렉터리의 서로 다른 프로젝트 ID가 프로젝트 ID를 직접 업데이트하는 대신 복사본을 트리거하는 이유 rename()는 projid를 변경해야 하는 전체 디렉터리 트리가 있는 경우 커널에서 원자적으로 변경하기에는 너무 복잡해질 수 있기 때문입니다. 이 경우 업데이트해야 할 파일이 수천 또는 수백만 개 있을 수 있습니다. 즉, projid 업데이트할 수 있다rename()이름 변경 시 직접 완료단일 파일, 그러나 이는 아직 ext4 코드에서 구현되지 않았습니다.

프로젝트 ID가 관련되어 있다는 것을 알고 있는 경우 소스 파일/디렉터리 트리의 프로젝트 ID를 대상 프로젝트 ID와 일치하도록 "사전 변경"하여 대용량 파일이나 디렉터리 트리의 "대체 복사본"을 방지할 수 있습니다. 소스와 대상 projid를 동일하게 만들기 위해 "mv"를 사용하기 전에 "chattr -R -p <target_projid>"를 실행하면 반환 이나 복사 트리거 없이 rename()작동해야 합니다 .EXDEV

관련 정보