rsync 후에 참조된 zfs를 해석할 수 없습니다.

rsync 후에 참조된 zfs를 해석할 수 없습니다.

몇 가지 다른 ZFS 데이터 세트가 포함된 오래된 Centos NFS 서버가 있습니다. 저는 rsync를 사용하여 데이터를 최신 NFS 서버로 마이그레이션했습니다. 새 서버는 Centos ZFS 호스트이기도 합니다. 내 문제는 한 데이터 세트의 경우 이전 서버와 새 서버 간의 참조 크기가 크게 다르며 그 이유를 알 수 없다는 것입니다.

압축이나 중복 제거를 사용하지 않습니다. zfs 속성이 동일할 것으로 예상했지만 이전 호스트에는 데이터 세트(device, exec 및 setuid)에 대해 다음 속성이 활성화되어 있는 것으로 나타났습니다. 내가 찾은 유일한 차이점은 CentOS 및 ZFS 버전입니다.

이전 호스트: zfs 0.6.5, centos 7.3, zfs 목록에는 참조 2.00T가 표시됩니다.

새 호스트: zfs 0.7.2 centos 7.4, zfs 목록에는 참조된 1.29T가 표시됩니다.

데이터를 복사하기 위해 새 서버에 이전 내보내기를 설치하고 -avhH --delete rsync 옵션을 사용했습니다. df를 보면 inode 개수는 같지만 df는 사용공간(1.3T vs. 2T)에서 큰 차이를 보인다. 저는 Find를 사용하여 데이터 세트에 있는 모든 파일의 크기 및 디스크 사용량에 대한 csv를 작성했습니다. 행 수와 크기 열의 합은 두 호스트 간에 동일합니다(크기의 합은 약 1.29TB입니다). 디스크 사용량은 두 호스트 간에 약간만 다르며 1.3T와 거의 일치합니다. 또한 이전 서버에서 lsof를 실행하여 용량 차이를 소비하는 링크되지 않은 파일이 있는지 확인하려고 시도했지만 아무것도 "(삭제됨)"으로 반환되지 않았습니다... 차이점을 설명할 수 있는 다른 아이디어나 제안이 있습니까?

답변1

압축이 비활성화되면 ZFS는 0으로 채워진 블록을 찾지 않습니다(이는 zio_compress_data()코드에서 발생함). 따라서 이전 시스템에서는 디스크에 0으로 설정된 블록이 많이 있을 수 있습니다.

저는 전문가는 아니지만 아마도 시간/네트워크 대역폭을 절약하기 위해 0이 된 블록을 보내지 않을 것이라고 rsync추측합니다 . rsync대상 시스템에서는 0으로 지정된 블록이 전혀 기록되지 않기 때문에 공간을 덜 사용하게 된다는 의미입니다.

zfs send어떤 이유로 시스템이 서로 정확하게 복사본이 되도록 하려면 소스 시스템 및 zfs receive대상 시스템에서 ZFS의 내장 복사 도구를 사용할 수 있습니다 . 또한 각 파일의 메타데이터를 확인하고 변경된 파일의 전체 내용을 읽어 무엇이 다른지 확인하는 rsync대신 변경된 파일 시스템 트리 부분만 탐색하면 되기 때문에 더 효율적입니다.rsync

관련 정보