reflect 리눅스 백업 용량의 차이 나는 이유

동일한 용량의 NVMe 드라이브(256GB)에 실제 사용 데이터가 약 8GB임에도 불구하고, Macrium Reflect 같은 툴로 백업했을 때 백업 파일 크기가 어떤 서버는 10GB, 어떤 서버는 120GB나 되는 현상은 파일 시스템 구조, 디스크의 사용 상태, 압축 효율, 빈 블록의 처리 방식 등 여러 요인에 의해 발생한다.

파일 시스템의 차이 (ext4, xfs, btrfs 등)

Reflect는 섹터 단위로 이미지를 생성하기 때문에, 사용 데이터만 복사하는 것이 아니라 파일 시스템의 메타데이터나 예약 영역도 포함될 수 있다.

  • 예시:
    • ext4는 기본적으로 디스크의 약 5%를 예약 블록으로 할당한다.
    • xfs는 메타데이터가 많이 분산되어 있어 압축 효율이 낮을 수 있다.
      ➡️ 즉, 파일 시스템 종류와 설정에 따라 “실제 사용량 8GB”라도 백업 이미지에서 차이가 발생한다.

빈 블록(Zero Block) 처리 방식

Reflect는 백업 시 빈 섹터(값이 0인 블록)를 자동으로 감지해 스킵하거나 압축한다.

  • 어떤 서버에서는 Reflect가 TRIM/UNMAP 명령을 통해 “빈 섹터”로 인식한 부분을 제외할 수 있음.
  • 하지만 다른 서버에서는 SSD 컨트롤러나 커널 설정 문제로 빈 섹터를 사용 중으로 인식할 수 있다.
    ➡️ 결과적으로 “사용량은 8GB로 보이지만 실제 백업에서는 120GB의 섹터가 복제”되는 상황이 생긴다.

압축 옵션 차이

Reflect의 백업 설정에서 압축 수준(없음 / 중간 / 고압축)에 따라 결과가 달라진다.

  • 고압축: 8GB 사용 시 약 6~9GB 정도의 이미지 예상
  • 압축 없음: 동일한 데이터라도 1:1 섹터 이미지로 생성되어 수십 GB 가능
    ➡️ 서버별로 Reflect 설정(압축, 스냅샷 모드 등)이 다르다면 크기가 크게 달라질 수 있다.

스왑(Swap), 로그, 임시 파티션 포함 여부

Reflect가 전체 디스크 백업(디스크 이미지) 으로 동작한다면, /swap, /var/log, /tmp, 심지어 /boot 영역까지 포함한다.

  • 한 서버에서는 swap이 8GB이지만 실제로 거의 비어 있어서 압축 후 0.5GB 정도만 됨.
  • 다른 서버에서는 swap이나 log 파티션이 남은 공간까지 쓰레기 데이터(garbage data)로 채워져 압축 효율이 매우 낮음.
    ➡️ 따라서 두 서버 모두 “사용 데이터 8GB”처럼 보여도, 백업 시 swap/log에 따라 100GB 이상 차이 날 수 있다.

TRIM / UNMAP 수행 여부

Reflect가 백업 전, SSD에서 TRIM이 제대로 수행되지 않은 상태라면, 비어 있는 블록이 실제로는 쓰레기 값으로 남아 있는 공간으로 인식된다.

  • fstrim -av 명령으로 수동 TRIM 수행 후 다시 백업하면, 크기가 확 줄어드는 경우가 많다.

요약 정리

원인백업 크기 증가 요인해결 방법
파일시스템 메타데이터예약 블록, inode 정보예약 블록 조정 (tune2fs -m 0 /dev/nvme0n1pX)
빈 섹터 인식 불가TRIM 미적용fstrim -av 실행 후 백업
압축 설정 차이압축 미적용 또는 낮음Reflect 압축 옵션 “고압축” 사용
Swap/Log 포함불필요한 파티션 포함파티션 단위 백업 설정
SSD 컨트롤러 문제Zero-block 최적화 미지원Reflect에서 “Intelligent sector copy” 옵션 활성화

원하신다면, 네가 실제 사용하는 Reflect 백업 옵션(예: “Intelligent sector copy”, “Auto verify”, 압축 수준 등)을 알려주면 구체적으로 어떤 조합에서 크기 차이가 발생했는지 더 정확히 분석해줄 수 있다.

Reflect 백업 시 어떤 설정으로 실행했는지 알려줄 수 있을까?

fstrim -av 명령은 리눅스에서 SSD의 미사용(빈) 블록을 실제로 정리하는 명령어다.
좀 더 구체적으로 설명하면, 파일 시스템이 “삭제되었다”고 표시한 공간을 SSD 컨트롤러에게 “이 부분은 진짜로 비어 있다”고 알려주는 작업을 수행한다.

명령어 구조 분석

fstrim -av
  • fstrim : TRIM 명령을 실행하는 도구 (파일시스템 수준에서 SSD에게 빈 블록을 통보)
  • -a : 모든 마운트된 파일시스템에 대해 TRIM 수행
  • -v : verbose 모드, 즉 얼마나 많은 데이터가 해제되었는지 출력

예시 출력:

/: 5.8 GiB (6233645056 bytes) trimmed on /dev/nvme0n1p2
/boot: 23.5 MiB (24674304 bytes) trimmed on /dev/nvme0n1p1

⚙️ 동작 원리 요약

  1. 리눅스에서 파일을 삭제하면 실제로 데이터는 지워지지 않고 파일시스템의 메타데이터에서만 ‘삭제됨’으로 표시된다.
  2. SSD 입장에서는 그 공간이 여전히 데이터가 있는 블록으로 보인다.
  3. fstrim을 실행하면 커널이 SSD 컨트롤러에게 “이 블록들은 진짜로 비어 있음”을 알려준다.
  4. SSD는 해당 블록을 완전히 초기화하고, 이후 백업 도구(예: Reflect)는 이 영역을 0으로 인식하거나 스킵할 수 있게 된다.

백업과의 관계

Reflect 같은 백업 프로그램이 섹터 단위 이미지를 만들 때,

  • TRIM이 수행되지 않은 SSD는 삭제된 파일의 흔적 데이터를 그대로 포함하므로 백업 용량이 커진다.
  • TRIM을 수행하면 빈 섹터들이 “제로 블록(0-filled)”로 인식되어 백업 시 압축률이 급격히 향상된다.

따라서, 백업 전에 아래 순서로 작업하면 효율적이다:

sudo fstrim -av
# 이후 Reflect 백업 실행
  • 대부분의 최신 리눅스 배포판에서는 fstrim자동으로 주 1회 systemd 타이머(fstrim.timer) 를 통해 수행된다.
    확인 명령: systemctl status fstrim.timer
  • 수동으로 수행하는 것은 대규모 파일 삭제 후나 백업 전이 특히 유용하다.