이전 파일이 이미 존재하는 경우 --link-dest 옵션을 사용하여 동일한 파일을 연결하도록 rsync에 어떻게 알릴 수 있습니까?

이전 파일이 이미 존재하는 경우 --link-dest 옵션을 사용하여 동일한 파일을 연결하도록 rsync에 어떻게 알릴 수 있습니까?

--link-dest"동일한 파일에 액세스"가 모든 경우에 적용된다고 생각할 수도 있습니다 . 하지만 파일이 존재하는 경우 파일이 만료되었거나 내용이 달라도 발생하지 않습니다.

이 때문에 rsync 매뉴얼 페이지에서 다음을 수행하십시오 --link-dest.

"이 옵션은 빈 대상 계층에 복사할 때 가장 잘 작동합니다. 왜냐하면 rsync는 기존 파일을 명확한 파일로 처리하기 때문입니다.rsync는 대상 파일이 이미 존재할 때 링크 대상 디렉토리를 찾지 않습니다.)"

즉, y/file소스와 동일한 것이 있고 z/file오래된 경우,

rsync -a --del -link-dest=y source:/file z

y/file그러면 두 개의 inode가 사용되고(디스크 공간도 두 배로 증가) z/file동일한 내용과 날짜 스탬프를 갖게 됩니다.

기본적으로 백업을 수행하기 위해 이 스크립트를 하루에 한 번씩 실행했기 때문에 이 문제가 발생했습니다.

mv $somedaysago $today; 
yest=$today; today=`date +%Y%m%d`;
rsync -avPShyH --del --link-dest=../$yest host:/dirs $today

백업은 최대 10M 파일에 걸쳐 있기 때문에 시간이 rm -rf $olddir; rsync source:$dir newdir너무 오래 걸립니다(특히 매일 파일의 0.5%만 변경되는 경우 50,000개의 새 파일 또는 변경된 파일을 처리하는 것만으로도 1,000만 개의 삭제 및 생성 디렉터리 항목이 발생하므로 백업이 불가능해집니다). 다음날 시간에 맞춰 완료됩니다.)

다음은 상황을 보여주는 것입니다:

a소스는 번호 14매겨진 백업입니다.

$ mkdir -p 1 2; echo foo > 1/foobar; cp -lrv 1/* 2
`1/foobar' -> `2/foobar'
$ ls -i1 */foobar
1053003 1/foobar
1053003 2/foobar

$ mkdir a; echo quux > a/foobar
$ mv 1 3; rsync -avPhyH --del --link-dest=../2 a/ 3
sending incremental file list
./
foobar
           5 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 34 bytes  278.00 bytes/sec
total size is 5  speedup is 0.04

$ ls -i1 */foobar
1053003 2/foobar
1053007 3/foobar
1053006 a/foobar

$ mv 2 4; rsync -avPhyH --del --link-dest=../3 a/ 4
sending incremental file list
./
foobar
           5 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 34 bytes  278.00 bytes/sec
total size is 5  speedup is 0.04


$ ls -il1 */foobar
1053007 -rw-r--r-- 1 math math 5 Mar 30 00:57 3/foobar
1053008 -rw-r--r-- 1 math math 5 Mar 30 00:57 4/foobar
1053006 -rw-r--r-- 1 math math 5 Mar 30 00:57 a/foobar

$ md5sum [34a]/foobar
d3b07a382ec010c01889250fce66fb13  3/foobar
d3b07a382ec010c01889250fce66fb13  4/foobar
d3b07a382ec010c01889250fce66fb13  a/foobar

a/foobar이제 타임스탬프를 포함하여 모든 측면에서 동일하지만 다른 inode를 차지하는 두 개의 백업이 있습니다 .

한 가지 해결책은 --delete-before증분 검사의 이점을 제거하는 것이라고 생각할 수도 있지만 파일이 삭제되지 않고 가능한 증분 복사본의 기초로 사용되기 때문에 도움이 되지 않습니다.

우리가 이 증분 복사 헤징을 끌 수 있다고 더 추측할 수도 있지만 --whole-file, 이는 어떤 식으로든 알고리즘에 도움이 되지 않으며 우리가 원하는 것을 얻는 방법도 아닙니다.

나는 이 동작을 rsync의 또 다른 버그라고 생각합니다. 이는 다양한 명령 매개변수를 신중하게 선택하여 설명할 수 있지만 그렇지 않으면 원하는 결과를 얻을 수 있습니다.

불행하게도 해결책은 단일 rsync를 원자성 작업으로 사용하여 드라이 런(dry run)을 사용하고 -n, 기록하고, 해당 로그를 입력으로 처리하여 변경된 모든 파일을 수동으로 사전 삭제한 다음, rsync --link-dest우리가 원하는 것을 얻기 위해 실행하는 것입니다. 단일 깨끗한 rsync에 비해 큰 혼란입니다.

부록:프로덕션 박스를 백업하기 전에 백업 서버에서 사전 연결을 시도했지만 $yesterday결과는 동일함 -$todayrsync --link-dest=../$yesterday $yesterday/ $today어떤 방식으로든 존재하는 모든 파일은 길이가 0이더라도 삭제되지 않고 대상에 연결되지 않습니다. 대신 새 inode를 사용하여 sourcedir에서 완전히 새로운 복사본이 만들어지고 더 많은 디스크 공간을 사용합니다.

pax(1)가능한 사전 백업 사전 링크 솔루션을 찾고 있습니다 .

답변1

(질문 편집에서 변환됨)

이 문제는 rsync를 업그레이드하면 해결될 수 있습니다. 버전 3.1.1 이상에서는 이제 --link-dest대상 및 디렉터리의 동일한 파일을 하드 링크된 파일로 대체합니다. 많은 공간을 절약하십시오.

관련 정보