
저장 장치에 ZFS를 사용하기로 결정했다면 축하합니다! 지금 사용하게 될 ZFS는 세상에서 가장 복잡하고 기능이 풍부한 파일시스템 중 하나입니다. 특히 가족 사진이나 영상처럼 장기간 보관해야 할 데이터를 저장할 계획이라면 ZFS를 진지하게 고려해볼 만합니다. 네 개의 미러링된 하드 드라이브처럼 이중화된 구성에서는 비트 로트(bit rot)나 시간이 지나며 발생하는 저장 매체 열화, 컴퓨터 오류 등으로 인해 단 한 비트의 데이터도 잃지 않도록 보장합니다. ZFS는 데이터를 자가 치유(self-healing)하고 자동으로 복구할 수 있으며, 복잡한 알고리즘, 해시, 머클 트리(Merkle tree)가 데이터 무결성을 보장합니다.
다만 이 글에서는 ZFS가 장기 데이터 아카이빙에 최적의 선택인 이유까지 다루지는 않습니다. 대신 스냅샷(snapshot)과 클론(clone)이 실무에서 어떤 도움을 줄 수 있는지 집중적으로 살펴보겠습니다.
ZFS 스냅샷과 클론이란?
스냅샷은 특정 시점의 데이터 상태를 그대로 담은 정확한 '사진'입니다. 예를 들어 복잡한 웹사이트를 작업한다고 가정해봅시다. 모든 코드, 데이터베이스, 이미지를 ZFS 데이터셋에 저장하고 있다면, 웹사이트 디자인을 바꾸고 이미지를 수정하고 레이아웃 크기를 조정하며 코드를 일부 변경하게 됩니다. 이전 디자인으로 되돌리고 싶다면 원래라면 모든 변경 사항을 하나씩 되돌려야겠죠. 하지만 ZFS를 사용하면 현재 상태의 스냅샷을 찍어두고 자유롭게 작업한 뒤, 새 디자인이 마음에 들지 않으면 이전 스냅샷으로 간단히 롤백하면 됩니다.
물론 Git이나 GitHub, 심지어 스냅샷 및 롤백 기능을 내장한 코드 에디터도 있습니다. 하지만 ZFS에는 다음과 같은 강력한 장점이 있습니다:
- 스냅샷은 전역적입니다. 프로젝트에 포함된 모든 데이터를 통째로 스냅샷으로 만듭니다.
- 프로젝트 크기와 관계없이(수백 GB 규모라 해도) 스냅샷 생성과 롤백이 거의 즉각적으로 이루어집니다.

스냅샷 개수에는 제한이 없습니다. "디자인 1", "디자인 2", "디자인 3"을 만들어두고 자유롭게 전환하거나, 변경을 가한 후 "디자인 2 – 개선본" 같은 새 스냅샷을 생성할 수도 있습니다.
클론(Clone)
스냅샷이 돌아갈 수 있는 '얼어붙은' 데이터 상태라면, 클론은 공통 분기점에서 시작되는 '브랜치(branch)'와 같습니다. 더 쉽게 이해하기 위해 다음 시나리오를 상상해보세요. 광고 캠페인용 영상을 제작했습니다. 그런 다음 이 영상이 저장된 ZFS 데이터셋의 스냅샷을 찍습니다. 이제 이 스냅샷을 세 번 클론하여 "클론 1"은 첫 번째 직원에게, "클론 2"는 두 번째 직원에게, "클론 3"은 세 번째 직원에게 전달합니다. 이제 각자 독립된 작업 공간에서 원하는 대로 수정 작업을 진행할 수 있습니다.
왜 이것이 유용할까요? 영상 파일은 막대한 디스크 공간을 차지합니다. 고해상도 원본 필름은 수백~수천 GB의 저장 공간을 요구할 수 있습니다. 메인 영상이 500GB를 차지하고 세 사람이 서로 다른 방향으로 편집하려면 원래라면 1,500GB 이상의 저장 공간이 필요합니다.
하지만 ZFS에서는 스냅샷 하나와 클론 셋(그 이상)이 약 501GB면 충분합니다. 변경되지 않는 데이터 블록(모든 클론이 공유하는 부분)은 단 한 번만 저장되고, 각 편집자가 추가하는 변경 사항만 추가 데이터로 기록됩니다. 실제 환경에서는 세 클론 전체에 약 650GB 정도면 충분할 것입니다. 저장 공간과 리소스를 효율적으로 활용하면서도 데이터는 완벽히 격리되어 각 편집자가 마음껏 작업할 수 있습니다.
물론 디스크 공간이 문제가 되지 않는 상황이라도, 동일한 콘텐츠를 여러 방향으로 분기해야 하는 다양한 시나리오에서 클론은 유용하게 활용됩니다.
ZFS 스냅샷 관련 명령어
다른 리눅스 배포판에서도 이 파일시스템/볼륨 매니저를 사용할 수 있지만, 현재까지 ZFS 지원이 가장 좋은 배포판은 우분투(Ubuntu)입니다.
모든 사용자가 ZFS에 할당할 온전한 디스크를 가진 것은 아니므로, 빈 파티션 위에도 풀(pool)을 생성할 수 있다는 점을 알아두면 유용합니다. 예를 들어 sudo zpool create pool_name /dev/sda3 명령으로 풀을 만들 수 있으며, 여기서 /dev/sda3는 첫 번째 디스크의 세 번째 파티션 장치명입니다.
필요한 패키지를 설치하고 첫 ZFS 데이터셋을 생성했다면, 이제 스냅샷을 만드는 방법을 알아보겠습니다.
먼저 스냅샷을 찍고자 하는 ZFS 데이터셋의 이름을 확인합니다.
zfs list

이 예제에서는 데이터셋 이름이 data, 스냅샷 이름이 snap1입니다. 다음 명령에서 이 값들을 자신의 환경에 맞게 바꿔 입력하세요. 스냅샷을 생성하려면 다음을 실행합니다:
sudo zfs snapshot data@snap1
만약 데이터셋 이름이 videos이고 스냅샷 이름을 first로 지정하고 싶다면 명령은 다음과 같습니다:
sudo zfs snapshot videos@first
변경 사항을 롤백하여 데이터셋을 스냅샷을 찍던 시점의 정확한 상태로 복원하려면 다음을 사용합니다:
sudo zfs rollback data@snap1
더 이상 필요 없는 스냅샷은 다음 명령으로 삭제합니다:
sudo zfs destroy data@snap1
ZFS 클론 관련 명령어
"data@snap1"이라는 스냅샷이 있다고 가정하고, 다음 명령으로 클론을 생성합니다:
sudo zfs clone data@snap1 data/clone1

클론을 삭제하려면:
sudo zfs destroy data/clone3
클론 역시 스냅샷을 찍을 수 있습니다.
sudo zfs snapshot data/clone2@snap_of_clone
나중에 지금까지 만든 모든 스냅샷과 클론을 확인하고 싶다면 다음 명령을 사용하세요:
zfs list -t all

마무리
여기까지 ZFS 스냅샷과 클론으로 수행할 수 있는 모든 기본 작업을 살펴봤습니다. 추가로 알아두면 좋은 팁이 있습니다. 각 데이터셋에는 ".zfs"라는 숨김 디렉터리가 존재합니다. ls /data/.zfs/snapshot/snap1/ 같은 명령으로 스냅샷 시점의 파일 상태를 직접 확인할 수 있습니다. 이 디렉터리는 일반적인 읽기 전용 디렉터리처럼 동작하므로, 전체 스냅샷을 롤백할 필요 없이 특정 파일만 골라서 복사할 수도 있습니다.