변경된 부분만 백업받으려면 어떻게 하나요?

저는 가끔, 시스템 설정 안에 있는 "백업"을 통해 /home폴더를 외장하드에 백업합니다.
그런데, 용량이 많다보니 이게 시간이 보통 많이 걸리는 것이 아니네요.
그래서 종종 백업받다가 중간에 중지하는 경우들이 많습니다.

어떻게 하면 전체를 다 백업하지 않고 그간 변경된 부분만 백업을 받을 수 있을까요?
혹시 그런 옵션이 있는지요?
그럼 백업 시간이 아주 단축될 듯 한데요 …

우선 데이터보호 방식에 대해서 생각해 보세요.
크게는 미러링, 스냅샷, 백업 이렇게 나뉩니다.

미러링은 있는 그대로 복사해두고… 일정 시간 간격으로 덮어써서… 항상 하나의 최신 복사본만을 유지하는 방식입니다.
뭐 따로히 설명드릴 것이 없습니다.
프로그램은 sync 종류의 프로그램이 여기에 해당됩니다.

스냅샷은 원본을 그대로 두고… 변경사항을 따로 저장하는 방식입니다.
파일을 지워도… 실제 파일이 지워지는 것이 아니라… 지워졌다고 뻥치고, 원본에 대해 보호조치를 하는 것입니다.
그리고 덮어 쓰더라도, 원본을 그대로 두고, 복사본에 대해서 변경을 가합니다.
그래서 스냅샷 방식은 스냅샷을 찍은 시점마다 그 영역을 보호하고, 변경사항을 모두 따로 저장합니다.
프로그램은 순간복구 종류가 될 것이고, 파일시스템으로는 ZFS와 BTRFS가 자체적으로 이것을 지원합니다.
그러나 이것은 백업이 아니고, 파일시스템에 대한 보호와 복사본이라는 개념이기에…
백업만큼 안정성을 제공하지 못합니다만… 순간적으로 데이터를 보호해두고 작업하여, 다시 복구하는 용도로는
최적입니다. 이 순간이라는 개념은 대체적으로 몇일정도는 안전합니다.

백업에 관해서 설명을 드리겠습니다.

백업은 방식에 따라 파일 단위 백업과 블럭 단위 백업으로 나눌 수 있습니다.
말그대로 파일을 모아 복사나, 압축해두는 방식이 파일 단위 백업이구요.
파티션이나 디스크를 통째로 뜰 때, 디스크,파티션,파일시스템 정보도 저장하고,
블럭단위로 복사해 그것을 압축해두는 방식이 블럭단위백업입니다.

전자는 파티션 정보와 파일시스템정보를 저장하지 않기 때문에…
어떤 파일시스템,파티션이더라도… 운영체제나 드라이버가 지원하는한…
백업 복구가 가능합니다.
대부분의 백업 프로그램이 여기에 해당됩니다.

그러나, 부팅정보를 저장하지 않기에… 부팅복구는 안되고, 원본과 복구본은 일치하지 않습니다.
후자는 모든 정보를 그대로 보존하기에… 원상복구가 가능하지만… 파티션테이블이나
파일시스템조차도 새로 만들게 됩니다. 이것은 해당 백업 안의 모든 정보는 무결성을 보장하지만…
백업되지 않은 정보와는 관계에서는 무결성을 보장하지는 않습니다.
노턴고스트, 트루이미지, 리눅스의 dd명령, clonezilla등이 이러한 작업을 합니다.

이제 백업의 유형에 대해서 설명드리겠습니다.
크게, 풀백업(Full-backup), 증분백업(Incremental-backup), 차분백업(Differential-backup)으로 나뉩니다.

풀백업은 그당시 정보를 모두 저장,
증분백업은 마지막백업에 대한 변화된 부분만 저장
차분백업은 기준백업본에 대한 변화된 부부만 저장

이것은 예로 설명하는게 편할것 같습니다.
0. 백업

  1. A를 만든 후, 백업
  2. B를 만든 후, 백업
  3. A를 지운 후, 백업

1-3번 과정이
모두 풀백업이라면…
1=0+A, 2=0+A+B 3=0+B
모두 증분 백업이라면…
1=A, 2=B, 3=-A
모두 차분 백업이라면…
1=A, 2=A+B, 3=B
이렇게 됩니다.

그런데, 복구과정에서
증분백업은 마지막 풀백업으로 복구 후, 모든 증분된 백업본에 대해서 차이를 비교해서 복구해야 합니다.
반면 차분백업은 마지막 풀백업으로 복구 후, 변화분만을 복구하면 됩니다.

백업횟수에 대해 디스크 공간 사용은 풀백업>차분백업>증분백업이고,
백업횟수에 대해 복구소요시간은 증분백업>차분백업>풀백업입니다.

그렇기에 대체적으로 백업정책은

  1. 풀백업
  2. 증분 백업
  3. 일정기간 동안 2번 작업
  4. 차분백업, 증분백업을 삭제하거나, 따로 보관
  5. 일정기간 동안 2번-4번 작업
  6. 풀백업 하고, 차분백업을 삭제하거나, 따로 보관
  7. 다시 2번-6번 작업
    이렇게 하게 됩니다.

그리고, 리눅스 파일시스템 및 윈도우즈 파일시스템은 기본적으로 스냅샷을 파일시스템레벨에서 지원하지 않습니다.
Btrfs나, Zfs를 사용하여야 하지만, btrfs는 아직 안정화 되려면 멀었고,
zfs는 라이선스문제로 인해 커널에 포함되지 못하고, fuse-filesystem으로만 지원합니다.

이에, 사람들은 그에 대한 대안으로 하드링크를 사용하기도 합니다.
이제 심볼릭,하드링크에 대해 개념적인 설명을 드리겠습니다.
실제데이터 "10"을 가지는 파일 F가 있다고 할 때
이 파일을 가리키는 파일포인터(이후 화살표라고 하겠습니다)가 존재하게 됩니다.
리눅스에서는 inode라고 부르는 것이지요.
이때 심볼릭링크는 이 화살표를 가리키는 다른 화살표를 만듭니다.
그리고, 하드링크는 실제 파일에 대해서 다른 화살표를 만듭니다. (이것은 화살표에 대한 화살표가 아닙니다)

F를 지우게 되면 심볼릭링크는 대상을 가리키지 못하게 됩니다.
이후 "20"이라는 데이터로 파일 F를 만들게 되면 심볼링크의 대상값은 "20"이 됩니다.

F를 지우더라도 하드링크는 "10"이라는 데이터를 가리킵니다.
이후 "20"이라는 데이터로 파일 F를 만들게 되더라도, 여전히 "10"을 가리킵니다.
이후 이 하드링크를 삭제하게되면 "10"이라는 데이터가 사라집니다.

그러니까, 왠지 스냅샷과 비슷하죠?
실제 데이터를 가리키는 화살표가 모두 사라져야 실제 데이터가 사라지기 때문에…
원래 데이터에 대해, 하드링크를 걸어두면… 마치 복사해 둔 것과 같이 동작합니다만
실제로 복사하지 않기 때문에… 시간과 공간이 절약됩니다.
심볼릭링크는 실제 데이터가 아닌 이름으로 링크를 걸기 때문에…
아무이름이나 적어놓을 수 있고, 해당 데이터가 있건 없건 상관하지 않습니다만…
하드링크는 대상이 같은 파일시스템 내에 존재해야 하고, 실제로 존재하는 파일에 대해 링크할 수 있습니다.

DejaDup가 이와 같이 하드링크를 사용하여 스냅샷을 흉내내는 것으로 알고 있습니다.

저는 하루 빨리 Btrfs가 안정화 되어, 정말 리눅스의 강력함을 누려보고 싶습니다.
snappy와 lz4(저장형 압축)을 지원하여 속도가 개선되고…
온라인 파일시스템 체크와 안정적인 파일시스템 복구만 된다면…
btrfs가 현존 최강의 파일시스템이 되지 않을까 싶습니다.

와우~~ 엄청 자세하게 적어 주셨네요.

제가 이렇게 머리가 나쁜 줄 몰랐는데, 이 글 읽다가 깨닫게 되었습니다. ^^

너무 전문적이고 수준 있는 글이라서 그런지 잘 알아 듣기는 쉽지 않네요.

어쨌든, 성의껏 잘 답변해 주셔서 감사합니다.

우선은 그냥 데자덥을 쓰고 있으라는 뜻으로 이해할게요.

그래도 되지요? (혹시, 혼 안 나려냐?)

데자덥은 CLI의 ‘듀플리시티’(duplicity)를 기반으로 만든 것으로 알고 있습니다.

듀플리시티 자체가 '변경된 부분’만을 백업하도록 설계되어져 있으며 때문에…

이미 '변경된 부분’만을 백업하고 있는 형태로 사용하고 계신 것입니다.

다만, /home폴더가 덩치가 크다 보니 반영하는데 시간이 오래 걸리지 않나 싶네요.

속도를 더 줄이시기 원하신다면 데자덥의 설정을 통해 ‘필요한’ 파일만 백업해서 쓰시는게

훨씬 효율적이실 것입니다. 가령, '문서’폴더나 '사진’폴더와 같이 주로 작업하는 파일들만

모여있는 폴더들 말이죠.

감사합니다. 명심하겠습니다.