하드 링크가 편집 될 때 새 파일로 연결되는`cp -al` 스냅 샷


11

방대한 폴더의 스냅 샷을 정기적으로 찍으려고합니다.

여기 읽고 : http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
cp -al단순히 하드 링크를 복사하여 폴더의 스냅 샷을합니다.

그것은 모두 훌륭하지만 문제는이 스냅 샷에서 파일을 변경하면 모든 스냅 샷에서 변경된다는 것입니다. 내가 대신하고 싶은 것은 시스템이 변경시 새 파일을 작성하고 그 대신 링크하는 것입니다. 이렇게하면 첫 번째 파일을 편집 할 때 각 스냅 샷이 유효하지 않게됩니다.

어떻게하면 되나요?

추신 시도 rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/했지만 같은 문제가 있습니다.

답변:


7

그것이 하드 링크가 작동하는 방식입니다. 그러나 그 주위에는 방법이 있습니다.

몇 가지 옵션이 떠 오릅니다.

  • 복사시 복사 파일을 지원하는 파일 시스템을 사용하십시오 (예 :) btrfs. 물론 btrfs를 사용하고 있었다면, 기본 스냅 샷 만 사용하면됩니다 ... 파일 시스템이 지원하는 경우을 사용할 수 있습니다 cp --reflink=always. 불행히도 ext4는 이것을 지원하지 않습니다.
  • 원본이 아닌 스냅 샷 전체에서 하드 링크 만 공유하십시오. 즉, 특정 버전의 파일이 처음 표시되면 스냅 샷에 복사하십시오. 그러나 다음에는 이전 스냅 샷의 링크에 연결하십시오. (10 년 전에이 작업을 수행하는 데 사용한 프로그램은 확실하지 않지만 검색은 dirvish, obnam, storebackup 및 rsnapshot을 나타냅니다)
  • 파일이 어떻게 변경되는지에 따라 쓰기 온도 / 이름 변경을 사용하여 파일을 변경 한 다음 하드 링크가 끊어 지도록 할 수 있습니다. 따라서 스냅 샷의 버전은 그대로 유지됩니다. 그러나 버그로 인해 스냅 샷이 손상 될 수 있으므로 안전하지 않습니다.
  • 전체 파일 시스템의 LVM 스냅 샷을 만듭니다.

물론 적절한 백업 시스템을 사용하는 다른 옵션도 있습니다. 대부분은 변경된 파일 만 백업하도록 관리 할 수 ​​있습니다.


대규모 폴더를 백업하는 방법으로 무엇을 권장합니까?
Hermann Ingjaldsson

rsync를 사용하여 서버에 정기적으로 cp -al을 수행하는 cronjob이있는 서버에 rsync를 사용하려고 생각했습니다. 더 많은 사본을 위해 rsync-ing과 함께 진행했습니다. 그 소리는 어때?
Hermann Ingjaldsson

@HermannIngjaldsson 음, 백업 방법에 달려 있습니다. 개인적으로, 나는 이것을 Bacula 설정에 추가하고 싶지만 백업 할 머신이 많거나 Bacula를 이미 알고 있지 않다면 권장하지 않습니다. 따라서 rsnapshot을 먼저 시도하는 것이 좋습니다.
derobert

rsnapshot좋은
developerbmw

4

찾고있는 내용은 copy-on-write 형식입니다 . 여기서 동일한 내용을 가진 여러 파일이 수정 될 때까지 디스크의 동일한 공간을 사용합니다. 쓰기를 수행하는 응용 프로그램이 파일을 삭제하고 동일한 이름으로 새 파일을 만드는 경우 (하드웨어는 일반적으로 다른 이름으로 새 파일을 만든 다음 제자리로 이동) 하드 링크는 쓰기 중 복사 만 구현합니다. 사용중인 응용 프로그램이이 작업을 수행하지 않는 것 같습니다. 기존 파일을 덮어 씁니다.

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

Fl-cow 는 여러 하드 링크가있는 파일에서 대체 전략을 체계적으로 사용하도록 프로그램을 수정합니다.

또는, 쓰기시 복사 또는 중복 제거를 수행하거나 스냅 샷 기능이있는 파일 시스템에 파일을 저장할 수 있으며 하드 링크에 대해 걱정하지 않아도됩니다 ( Btrfs 또는 Zfs) . 파티션 구성표에 따라 LVM 스냅 샷을 사용하는 것이 옵션 일 수 있습니다.

내 추천은 적절한 스냅 샷 도구를 사용하는 것입니다. 안정적인 백업을 만드는 것은 놀랍게도 어렵습니다. 아마도 rsnapshot을 원할 것입니다 .


2

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

빈민가 타임머신

이전 의견에서 언급했듯이 귀하의 질문에 대한 기본 답변은 소스를 하드 링크와 분리해야합니다. 예, 홈 디렉토리의 매일 백업을 가정하십시오.

출처:

  • / home / flakrat

목적지:

  • / data / backup / daily
    • /월요일
    • /화요일
    • /수요일
    • /목요일
    • ...

하드 링크는 어제의 백업에 대해 "cp -al"을 실행하여 작성됩니다. 화요일 아침에 실행한다고 가정 해보십시오.

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

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


0

rdiff-backup이 원하는 것을하는 것 같습니다. 확인하십시오.

rsync를 사용하면 먼저 하드 링크를 사용하지 않는 전체 백업을 만들어야합니다. 다음 백업은 이전 백업을 가리키고 하드 백업에 연결할 수 있습니다. 이렇게하면 백업이 작업중인 파일 (수정중인 파일)에 하드 링크되지 않습니다. 예. 이전 백업이 폴더 백업 인 경우 01. 백업 스크립트는 먼저 폴더 이름을 1 씩 증가 시켜서 폴더를 증가시켜 backup.01이 백업됩니다. 그런 다음 스크립트는 backup.01이라는 빈 폴더를 새로 만듭니다. 그런 다음 새 백업을 새 폴더에 rscync하고 백업에 대한 하드 링크를 수행합니다 .02 새 파일 만 백업에 공간을 차지합니다. rsync 명령은 다음과 같습니다. rsync -rlt sourcepath backuppath / backup.01 --link-dest = backuppath / backup.02

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.