홈으로 돌아가기

ext4 Linux 롤백을 위한 Rsync 하드링크

이 글은 rsync와 hardlink를 사용한 ext4 스냅샷 및 롤백 구현을 설명합니다. 시스템/Docker 분리, 원자성, 복원 명령어. 중급/시니어 devops를 위한 제한 및 자동화.

Linux ext4 롤백: rsync와 hardlink 실전
Advertisement 728x90

ext4에서 rsync와 하드링크를 활용한 시스템 롤백: 실전 구현 가이드

표준 ext4 기반 리눅스 설치에는 기본 스냅샷 지원이 없어, 이전 상태로 빠르게 롤백하기가 어렵습니다. borg나 restic 같은 백업 도구들은 장기 데이터 저장에 초점을 맞춰 로컬 롤백에는 적합하지 않습니다. 전체 백업에서 복원하는 데는 수 시간이 걸리고 대량의 데이터를 처리해야 하므로, 로컬 설정 오류나 업데이트 후 문제를 해결하는 데 비효율적입니다.

이 솔루션은 의존성을 최소화합니다: 파일 시스템 변경, LVM 사용, Btrfs/ZFS 같은 특수 파일 시스템 도입이 필요 없습니다. 이 접근법은 중복 제거를 위해 하드링크 지원 rsync에 의존합니다.

작동 원리: rsync + 하드링크

rsync는 변경사항만 복사하여 디렉터리를 동기화합니다. --link-dest 옵션을 사용하면 이전 스냅샷을 참조할 수 있습니다: 변경되지 않은 파일은 하드링크를 통해 재사용되어 저장 공간 사용을 최소화합니다. 하드링크는 동일한 inode에 대한 추가 이름으로, 변경되지 않은 데이터에 대해 오버헤드가 전혀 없습니다.

Google AdInline article slot

스냅샷 생성 기본 명령어:

rsync -aHAX --numeric-ids --delete --link-dest="$PREV" "$SRC" "$DEST_TMP/"
  • -a: 아카이브 모드 (재귀적, 권한, 타임스탬프 보존).
  • -H: 하드링크 보존.
  • -A: ACL 보존.
  • -X: 확장 속성 보존.
  • --numeric-ids: 숫자 UID/GID 사용.
  • --delete: 대상 디렉터리에서 추가 파일 제거.

이를 통해 현재 상태를 스냅샷으로 가져오며, 델타만 복사합니다.

스냅샷 저장 구조

스냅샷은 .infra_snapshots/에 타임스탬프가 붙은 일반 디렉터리로 저장됩니다:

Google AdInline article slot
.infra_snapshots/
├── system/
│   ├── 2026-03-01_00-30-00/
│   ├── 2026-03-02_00-30-00/
│   └── LATEST -> 2026-03-02_00-30-00/
├── docker/
│   ├── 2026-03-01_23-30-00/
│   └── LATEST -> 2026-03-01_23-30-00/

LATEST 심볼릭 링크는 자동화를 위해 가장 최근 스냅샷을 가리킵니다. systemdocker를 분리하면 시스템 파일과 컨테이너 데이터를 격리할 수 있습니다: Docker 볼륨은 변경 가능한 데이터 문제를 피하기 위해 제외됩니다.

생성 과정:

  • 임시 디렉터리 .tmp-YYYY-MM-DD_HH-MM-SS 생성.
  • rsync 실행.
  • 원자적 이름 변경: mv -T "$TMP_DEST" "$FINAL_DEST".
  • LATEST 업데이트: ln -sfn "$FINAL_DEST" "$LATEST_LINK".

이를 통해 원자성이 보장됩니다: 스냅샷은 완전히 생성되거나 존재하지 않습니다.

Google AdInline article slot

상태 복원

롤백은 미리보기를 위한 드라이런과 함께 역동기화를 포함합니다:

rsync -aHAX --numeric-ids --delete --dry-run "$SNAP/" "/"

확인 후 --dry-run을 제거하여 적용합니다. rsync는 루트 시스템을 스냅샷 상태로 가져오며, 새 파일을 삭제하고 하드링크를 통해 이전 파일을 복원합니다.

Docker의 경우: 유사하지만 컨테이너 디렉터리만 대상으로 하며 볼륨은 제외합니다.

접근법의 한계

  • 시스템 원자성 부족: rsync는 파일을 순차적으로 읽습니다; 생성 중 시스템이 변경될 수 있습니다. 스냅샷은 파일 일관성을 가지지만 즉각적이지 않습니다.
  • 변경 가능 데이터: 로그, 데이터베이스, 임시 파일은 중간 상태일 수 있습니다. rsync에서 --exclude를 사용해 제외하세요.
  • 디스크 공간: 새 파일 버전은 공간을 차지합니다; 주기적으로 오래된 스냅샷을 정리하세요.
  • 고부하 프로덕션 환경에 부적합: 스냅샷 생성 중 활동이 적은 서버/데스크톱에 적합합니다.

| 시나리오 | 생성 시간 (대략) | 디스크 사용량 |

|----------|---------------------------|---------------|

| 일일 시스템 | 2-5분 | 100-500 MB |

| 업데이트 후 Docker | 1-3분 | 50-200 MB |

자동화

일일 스냅샷을 위해 cron에 통합:

  • 00:30: 시스템.
  • 23:30: docker.

스크립트는 rsync 출력을 기록하고, 종료 코드를 확인하며, 오류 시 알림을 보내야 합니다.

핵심 포인트:

  • rsync와 --link-dest를 사용해 FS 변경 없이 ext4에서 스냅샷을 에뮬레이션합니다.
  • 하드링크는 중복 제거를 제공합니다: 변경되지 않은 파일은 중복되지 않습니다.
  • 임시 디렉터리를 통한 원자성으로 부분적 스냅샷을 방지합니다.
  • system/docker 분리는 롤백 정확도를 향상시킵니다.
  • 드라이런은 복원 전 안전을 위해 필수적입니다.

이 접근법은 투명하며, 표준 리눅스 유틸리티만 사용하고, 모든 ext4 시스템으로 확장 가능합니다.

— Editorial Team

Advertisement 728x90

다음 읽기