편집 시 새 파일로 연결되는 하드 링크가 포함된 `cp -al` 스냅샷

편집 시 새 파일로 연결되는 하드 링크가 포함된 `cp -al` 스냅샷

대용량 폴더의 스냅샷을 주기적으로 찍으려고 합니다.

나는 여기에서 읽었습니다:http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
cp -al폴더의 스냅샷을 찍으 려면 하드 링크를 복사하세요 .

이것은 모두 훌륭하지만 문제는 이 스냅샷에서 하나의 파일을 변경하면 모든 스냅샷에서 변경된다는 것입니다. 내가 원하는 것은 시스템이 변경될 때 새 파일을 생성하고 해당 파일에 연결하도록 하는 것입니다. 이렇게 하면 첫 번째 파일을 편집할 때 각 스냅샷이 무효화되지 않습니다.

어떻게 해야 하나요?

p.s. 시도해 보았지만 rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/동일한 문제가 발생했습니다.

답변1

이것이 하드 링크가 작동하는 방식입니다. 그러나 이 문제를 해결하는 몇 가지 방법이 있습니다.

몇 가지 옵션이 떠올랐습니다.

  • 예를 들어 쓰기 중 복사 파일을 지원하는 파일 시스템을 사용하십시오 btrfs. 물론 btrfs를 사용하는 경우 기본 스냅샷만 사용할 수 있습니다... 파일 시스템이 이를 지원한다면 cp --reflink=alwaysext4는 지원하지 않습니다. 이거 좀.
  • 하드 링크는 원본 스냅샷이 아닌 스냅샷 간에만 공유됩니다. 즉, 특정 버전의 파일이 처음 표시되면 해당 버전이 스냅샷에 복사됩니다. 하지만 다음 번에는 이전 스냅샷의 링크에 연결하세요. (10년 전에는 어떤 프로그램을 사용했는지 모르겠지만 검색 결과는 dirvish, obnam, storebackup, rsnapshot이었습니다)
  • 파일이 변경된 방식에 따라 임시 쓰기/이름 바꾸기를 사용하여 파일 변경을 보장할 수 있습니다. 그러면 하드 링크가 삭제되어 스냅샷의 버전이 원본으로 유지됩니다. 그러나 오류로 인해 스냅샷이 손상될 수 있으므로 이는 매우 안전하지 않습니다.
  • 전체 파일 시스템의 LVM 스냅샷을 찍습니다.

물론 또 다른 옵션이 있습니다. 적절한 백업 시스템을 사용하는 것입니다. 대부분의 사람들은 변경된 파일만 백업할 수 있습니다.

답변2

당신이 찾고있는 것은 양식입니다쓰기 중 복사, 동일한 내용을 가진 여러 파일이 파일 중 하나가 수정될 때까지 디스크의 동일한 공간을 사용합니다. 하드 링크는 쓰기를 수행하는 애플리케이션이 파일을 삭제하고 동일한 이름의 새 파일을 생성하는 경우에만 쓰기 중 복사를 구현합니다(일반적으로 다른 이름의 새 파일을 생성한 다음 해당 위치로 이동하여 수행됨). 사용하고 있는 응용 프로그램은 분명히 이 작업을 수행하지 않습니다. 기존 파일을 덮어씁니다.

일부 애플리케이션은 교체 정책을 사용하도록 구성할 수 있습니다. 일부 응용 프로그램은 기본적으로 교체 정책을 사용하지만 하드 링크가 끊어지지 않도록 여러 하드 링크가 있는 파일을 볼 때 덮어쓰기 정책을 사용합니다. 덮어쓰지 않고 교체하도록 애플리케이션을 구성할 수 있는 경우 현재 스냅샷 기술이 작동합니다.

앞소여러 개의 하드 링크가 있는 파일에 대해 대체 전략을 체계적으로 사용하도록 프로그램을 수정합니다.

또는 하드 링크에 대해 걱정할 필요 없이 기록 중 복사 또는 중복 제거를 수행하거나 스냅샷 기능이 있는 파일 시스템에 파일을 저장할 수 있습니다.BTRFS또는지브스. 파티션 구성표에 따라 LVM 스냅샷을 사용하는 것이 옵션일 수 있습니다.

내 조언은 적절한 스냅샷 도구를 사용하라는 것입니다. 안정적인 백업을 만드는 것은 어렵습니다. 당신은 원할 수도 있습니다스냅 사진.

답변3

다음은 "cp -al"과 rsync를 수동으로 또는 cron을 통해 실행할 수 있는 멋진 스크립트로 래핑하는 제가 작성한 Ruby 스크립트입니다. 대상은 로컬이거나 원격일 수 있습니다(Ssh를 통해).

게토 타임머신

이전 댓글에서 언급했듯이 귀하의 질문에 대한 기본적인 대답은 소스가 하드 링크와 분리되어야 한다는 것입니다. 예를 들어, 홈 디렉터리를 매일 백업한다고 가정해 보겠습니다.

원천:

  • /집/플라크라트

목적지:

  • /데이터/백업/매일
    • /월요일에
    • /화요일
    • /수요일
    • /목요일
    • ...

하드 링크는 어제 백업에서 "cp -al"을 실행하여 생성됩니다. 런타임이 화요일 아침이라고 가정합니다.

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/

답변4

rdiff-backup이 원하는 대로 작동하는 것 같습니다. 확인해 보세요.

rsync를 사용하려면 하드 링크를 사용하는 대신 먼저 전체 백업을 만들어야 합니다. 다음 백업은 이전 백업을 가리키고 하드 링크될 수 있습니다. 이렇게 하면 백업이 작업 파일(수정 중인 파일)에 하드 링크되지 않습니다. 예. 이전 백업이 backup.01 폴더인 경우 백업 스크립트는 먼저 폴더 이름을 1로 변경하여 backup.01이 backup.02가 되도록 폴더를 늘립니다. 그런 다음 스크립트는 backup.01이라는 빈 폴더를 새로 만듭니다. 그런 다음 새 백업을 새 폴더에 동기화하고 backup.02에 대한 하드 링크를 생성하여 새 파일만 백업 공간을 차지하게 합니다. rsync 명령은 다음과 같습니다: rsync -rlt sourcepath backuppath/backup.01 --link-dest=backuppath/backup.02

그러면 모든 하드 링크가 백업 경로에서 발생하고 있음을 알 수 있습니다. 이렇게 하면 소스 경로의 파일을 수정할 때 쓰기 중 복사에 대해 걱정할 필요가 없습니다.

관련 정보