수십 기가바이트의 대용량 파일을 삭제하고 휴지통까지 비웠는데도 여전히 macOS 시스템에서 "시동 디스크가 거의 가득 찼습니다"라는 경고 메시지가 뜨거나, 개발 환경에서 필요한 저장 공간이 확보되지 않아 답답함을 느낀 경험이 있으신가요? df -h 명령으로 확인한 전체 디스크 사용량과 du -sh /* 명령으로 각 최상위 디렉토리의 합산 공간을 비교했을 때, 예상치 못한 큰 차이가 발생하여 당황스러웠다면, 이 문제는 macOS의 APFS 스냅샷과 깊은 관련이 있을 가능성이 높습니다.
겉보기에는 삭제된 파일들이 공간을 차지하지 않는 것처럼 보이지만, 실제로는 APFS의 내부 메커니즘과 Time Machine의 로컬 스냅샷 기능이 백그라운드에서 특정 시점의 파일 시스템 상태를 유지하고 있기 때문입니다. 이는 시스템 복원력과 데이터 안전성을 높이는 중요한 기능이지만, 관리되지 않을 경우 예기치 않게 귀중한 디스크 공간을 잠식하여 개발 및 작업 환경에 심각한 지장을 초래할 수 있습니다. 본 가이드에서는 이러한 APFS 스냅샷으로 인한 디스크 공간 부족 문제를 심층적으로 분석하고, 실무에서 안전하게 해결하는 방법을 제시합니다.
macOS 디스크 공간 부족: 겉으로 보이는 것과 다른 실제 원인
macOS에서 디스크 공간 부족을 겪을 때, 많은 엔지니어와 개발자들은 가장 먼저 대용량 파일을 찾아 삭제하거나, 캐시를 비우는 등의 조치를 취합니다. 하지만 이러한 일반적인 방법으로도 해결되지 않는 경우가 빈번하게 발생합니다. 이는 df -h (파일 시스템의 디스크 사용량)와 du -sh /* (특정 디렉토리의 실제 파일 사용량) 간의 불일치로 명확히 드러납니다. df -h는 전체 APFS 컨테이너의 사용량을 표시하는 반면, du -sh는 특정 시점의 파일 시스템에서 접근 가능한 파일들의 크기만을 계산합니다. 이 간극을 만드는 주범이 바로 APFS 스냅샷입니다.
APFS 스냅샷은 특정 시점의 파일 시스템 상태를 '읽기 전용'으로 저장하는 기능입니다. 파일 시스템 수준에서 동작하기 때문에, 스냅샷이 차지하는 공간은 일반적인 du 명령으로는 집계되지 않습니다. 마치 숨겨진 볼륨처럼 존재하며, 시스템이 필요할 때 해당 시점으로 돌아갈 수 있게 해줍니다. 이로 인해 사용자는 파일을 삭제했다고 생각하지만, 해당 파일이 포함된 스냅샷이 남아있다면 실제 물리적 공간은 여전히 스냅샷에 의해 점유될 수 있습니다. 이러한 상황을 진단하기 위해서는 macOS의 tmutil 및 diskutil과 같은 시스템 유틸리티를 활용하여 현재 활성화된 스냅샷들을 파악하는 것이 필수적입니다.
APFS 스냅샷의 작동 원리와 Time Machine 로컬 백업
macOS High Sierra부터 도입된 Apple File System (APFS)는 기존 HFS+와는 다른 혁신적인 파일 시스템 아키텍처를 가지고 있습니다. 그 핵심 기능 중 하나가 바로 Copy-on-Write (CoW) 메커니즘을 기반으로 하는 스냅샷입니다. CoW는 데이터가 변경될 때 원본 데이터를 덮어쓰지 않고, 변경된 내용을 새로운 블록에 기록한 후 메타데이터만 업데이트하는 방식입니다. 이 덕분에 스냅샷은 특정 시점의 파일 시스템 상태를 매우 효율적으로 저장할 수 있습니다. 전체 데이터를 복사하는 대신, 스냅샷 생성 이후 변경된 블록에 대한 참조만 유지하면 되므로, 스냅샷 자체는 처음에는 매우 적은 공간을 차지합니다.
이러한 APFS 스냅샷 기능을 가장 적극적으로 활용하는 것이 바로 macOS의 Time Machine입니다. Time Machine은 외장 백업 디스크가 연결되어 있지 않은 상태에서도 일정 시간 동안 내부적으로 로컬 스냅샷을 생성하여 유지합니다. 이는 노트북 사용자가 외부에서 작업할 때도 백업 기능을 제공하고, 나중에 외장 디스크가 연결되면 이 로컬 스냅샷들을 외장 디스크로 옮겨 동기화하는 방식으로 작동합니다. 로컬 스냅샷은 일반적으로 24시간마다 생성되며, 디스크 공간이 부족해지면 macOS가 자동으로 오래된 스냅샷을 삭제하여 공간을 확보하려 시도합니다.
하지만 Time Machine 외에도 macOS 시스템 업데이트 과정, 특정 소프트웨어 설치(예: Xcode), 그리고 Parallels Desktop이나 VMware Fusion과 같은 가상화 소프트웨어가 VM의 특정 상태를 저장하기 위해 APFS 스냅샷을 생성하기도 합니다. 이처럼 다양한 주체에 의해 생성된 스냅샷들이 누적되면, 시스템의 자동 삭제 메커니즘이 원활하게 작동하지 않거나, 사용자가 예상치 못한 상황에서 디스크 공간 부족을 겪게 되는 원인이 됩니다.
현재 APFS 스냅샷 식별 및 상세 정보 확인
디스크 공간을 잠식하고 있는 APFS 스냅샷을 정확히 파악하는 것이 문제 해결의 첫걸음입니다. macOS는 이를 위해 강력한 터미널 유틸리티인 tmutil과 diskutil을 제공합니다.
먼저, Time Machine에 의해 생성된 로컬 스냅샷 목록을 확인해봅시다.
tmutil listlocalsnapshots / # 현재 시스템에 저장된 Time Machine 로컬 스냅샷 목록을 확인합니다.
# 출력 예시:
# Snapshots for disk /:
# com.apple.TimeMachine.2023-10-26-103000
# com.apple.TimeMachine.2023-10-27-090000
# com.apple.TimeMachine.2023-10-27-180000
# 위 출력은 YYYY-MM-DD-HHMMSS 형식으로 스냅샷 이름을 보여줍니다.
이 명령어는 / (루트) 볼륨에 저장된 Time Machine 로컬 스냅샷들을 나열합니다. 이름에서 알 수 있듯이, Time Machine과 관련된 스냅샷들입니다.
다음으로, Time Machine 스냅샷뿐만 아니라 시스템 업데이트, 가상화 소프트웨어 등 모든 APFS 스냅샷을 확인하려면 diskutil을 사용합니다.
diskutil apfs listSnapshots / # 모든 APFS 스냅샷을 나열합니다. UUID와 크기 정보를 포함합니다.
# 출력 예시:
# Snapshot: 2023-10-26-103000
# UUID: 1234ABCD-ABCD-ABCD-ABCD-1234ABCDABCD
# XID: 1234567
# Retention: com.apple.TimeMachine.2023-10-26-103000
# Parent UUID: 5678EFGH-EFGH-EFGH-EFGH-5678EFGHEFGH
# Size: 10.0 GB (10000000000 Bytes) # 이 스냅샷이 현재 점유하고 있는 공간 추정치
#
# Snapshot: com.apple.TimeMachine.2023-10-27-090000
# UUID: ABCD1234-ABCD-ABCD-ABCD-ABCD1234ABCD
# XID: 7654321
# Retention: com.apple.TimeMachine.2023-10-27-090000
# Parent UUID: 1234ABCD-ABCD-ABCD-ABCD-1234ABCDABCD
# Size: 5.0 GB (5000000000 Bytes)
diskutil apfs listSnapshots / 명령어는 각 스냅샷의 고유한 UUID, 생성 시간(Retention 필드에서 유추 가능), 그리고 해당 스냅샷이 현재 얼마나 많은 공간을 점유하고 있는지(Size 필드)에 대한 정보를 제공합니다. Size 필드는 스냅샷이 생성된 이후 변경된 데이터 블록의 총 크기를 나타내며, 이 공간은 다른 스냅샷과 공유될 수 있으므로 정확한 단일 스냅샷의 크기라기보다는 해당 스냅샷이 "참조하는" 변경된 데이터의 총량으로 이해하는 것이 좋습니다. 이 정보를 통해 어떤 스냅샷이 가장 많은 공간을 차지하고 있는지, 그리고 Time Machine과 관련이 있는지 여부를 판단할 수 있습니다.
불필요한 APFS 스냅샷 안전하게 제거하기
스냅샷 목록을 확인했다면, 이제 불필요한 스냅샷을 삭제하여 디스크 공간을 확보할 차례입니다. 스냅샷 삭제는 시스템의 복원 기능에 직접적인 영향을 미치므로 신중하게 접근해야 합니다.
가장 먼저 고려해야 할 것은 Time Machine 로컬 스냅샷입니다. macOS는 디스크 공간이 부족해지면 자동으로 오래된 로컬 스냅샷을 삭제하려 하지만, 때로는 이 과정이 제대로 작동하지 않거나, 사용자가 즉각적인 공간 확보를 원할 때 수동 개입이 필요합니다.
Time Machine 로컬 스냅샷을 삭제하는 명령어는 다음과 같습니다.
sudo tmutil deletelocalsnapshots 2023-10-26-103000 # 지정된 날짜/시간의 로컬 스냅샷을 삭제합니다.
# '2023-10-26-103000' 부분은 'tmutil listlocalsnapshots /' 명령으로 확인한 스냅샷 이름으로 정확히 대체해야 합니다.
# 여러 개의 스냅샷을 삭제하려면 이 명령어를 반복하여 실행합니다.
이 명령어는 com.apple.TimeMachine 접두사가 붙은 특정 스냅샷을 지정하여 삭제합니다. sudo 권한이 필요하며, 삭제가 완료되면 해당 스냅샷이 점유하고 있던 공간이 해제됩니다.
Time Machine 스냅샷이 아닌 다른 APFS 스냅샷 (예: 시스템 업데이트 스냅샷, 가상화 소프트웨어 스냅샷)을 삭제해야 할 경우, diskutil 명령어를 사용합니다. 이 경우 스냅샷의 UUID를 정확히 지정해야 합니다.
sudo diskutil apfs deleteSnapshot / -uuid 1234ABCD-ABCD-ABCD-ABCD-1234ABCDABCD # 특정 UUID의 APFS 스냅샷을 삭제합니다.
# '1234ABCD-ABCD-ABCD-ABCD-1234ABCDABCD' 부분은 'diskutil apfs listSnapshots /' 명령으로 확인한 UUID로 정확히 대체해야 합니다.
# 이 명령은 매우 강력하므로, 삭제하려는 스냅샷이 무엇인지 명확히 인지하고 실행해야 합니다.
주의사항: diskutil apfs deleteSnapshot 명령은 Time Machine 스냅샷이 아닌 다른 종류의 스냅샷을 삭제할 때 유용하지만, 이 스냅샷이 어떤 목적으로 생성되었는지 알 수 없는 경우도 많습니다. 예를 들어, macOS 시스템 업데이트나 롤백을 위해 생성된 스냅샷을 삭제하면 향후 시스템 복원 옵션에 영향을 줄 수 있습니다. 따라서 이 명령을 사용할 때는 해당 스냅샷의 Retention 정보나 UUID를 통해 그 목적을 최대한 파악하고, 불필요하다고 확신할 때만 사용하는 것이 중요합니다. 일반적으로는 Time Machine 로컬 스냅샷을 관리하는 것만으로도 상당한 공간을 확보할 수 있습니다.
공간 확보 검증 및 재발 방지 전략
스냅샷을 삭제한 후에는 실제로 디스크 공간이 확보되었는지 확인하는 과정이 필수적입니다.
df -h # 디스크 공간 사용량을 다시 확인하여 확보된 공간을 검증합니다.
df -h 명령을 다시 실행하여 'Available' 공간이 증가했는지 확인합니다. 일반적으로 스냅샷 삭제 후에는 즉시 반영되어 사용 가능한 공간이 늘어나는 것을 볼 수 있습니다.
재발 방지를 위한 전략도 중요합니다.
- Time Machine 설정 최적화: Time Machine을 사용하는 경우, 외장 백업 드라이브를 주기적으로 연결하여 로컬 스냅샷이 외장 드라이브로 옮겨지도록 하는 것이 좋습니다. 이렇게 하면 내장 디스크의 로컬 스냅샷이 쌓이는 것을 방지할 수 있습니다. 또한, Time Machine 설정에서 불필요한 대용량 폴더(예: 개발 프로젝트의
node_modules, Docker 볼륨 등)를 백업 제외 항목에 추가하여 백업 용량을 줄일 수 있습니다. - 개발 환경 관리: Docker Desktop, Parallels Desktop, VMware Fusion과 같은 가상화 및 컨테이너 도구는 자체적으로 스냅샷이나 이미지/볼륨을 생성하고 관리합니다. 이러한 도구의 설정에서 오래된 이미지, 컨테이너, 볼륨, VM 스냅샷 등을 주기적으로 정리하는 습관을 들이는 것이 중요합니다. 예를 들어, Docker의 경우
docker system prune명령으로 사용되지 않는 이미지, 컨테이너, 볼륨, 네트워크를 정리할 수 있습니다. - 정기적인 디스크 공간 점검:
df -h와 같은 명령어를 주기적으로 실행하여 디스크 공간 사용량을 모니터링하고,DaisyDisk나OmniDiskSweeper와 같은 시각화 도구를 활용하여 어떤 파일이나 폴더가 공간을 많이 차지하는지 파악하는 것도 좋은 방법입니다.
실무 엔지니어가 자주 겪는 APFS 스냅샷 FAQ
Q. Time Machine을 비활성화하면 로컬 스냅샷이 모두 삭제되나요?
A. 일반적으로 Time Machine을 비활성화하면 macOS는 모든 로컬 스냅샷을 삭제합니다. 하지만 이 과정이 즉시 완료되지 않을 수 있으며, 시스템에 따라 일부 스냅샷이 남아있는 경우도 있습니다. Time Machine 비활성화는 시스템 복원 기능을 완전히 제거하는 것이므로, 디스크 공간 확보만을 위한 목적으로는 권장하지 않습니다. 대신, 외장 드라이브를 주기적으로 연결하여 로컬 스냅샷을 동기화하거나, 위에서 설명한 tmutil deletelocalsnapshots 명령을 통해 특정 스냅샷을 수동으로 삭제하는 것이 더 안전하고 효율적인 방법입니다.
Q. diskutil apfs listSnapshots에 나오는 스냅샷 중 Time Machine 스냅샷이 아닌 것은 무엇인가요?
A. diskutil apfs listSnapshots 출력에서 com.apple.TimeMachine 접두사가 없는 스냅샷들은 주로 macOS 시스템 자체에서 생성한 스냅샷이거나, 특정 서드파티 애플리케이션이 생성한 것일 수 있습니다. 예를 들어, macOS 업데이트 시 시스템 복구를 위해 생성되는 스냅샷, 또는 Xcode의 개발자 도구 설치 과정에서 생성되는 스냅샷 등이 있습니다. 또한, Parallels Desktop이나 VMware Fusion과 같은 가상화 소프트웨어는 가상 머신의 특정 상태를 저장하기 위해 APFS 스냅샷을 활용하기도 합니다. 이러한 비-Time Machine 스냅샷을 삭제할 때는 해당 스냅샷의 목적을 명확히 알지 못한다면 시스템 기능이나 설치된 소프트웨어에 영향을 줄 수 있으므로 매우 신중해야 합니다.
Q. 스냅샷을 삭제했는데도 여전히 디스크 공간이 부족합니다. 다른 원인이 있을까요?
A. APFS 스냅샷은 디스크 공간 부족의 흔한 원인이지만, 유일한 원인은 아닙니다. 스냅샷 삭제 후에도 공간이 부족하다면 다음 사항들을 추가로 점검해볼 수 있습니다.
~/Library폴더: 사용자 라이브러리 폴더(~/Library)에는 애플리케이션 캐시, 로그 파일, 메일 데이터, iOS 백업 등 매우 많은 데이터가 쌓일 수 있습니다. 특히~/Library/Caches,~/Library/Logs,~/Library/Developer(Xcode 관련 데이터) 등을 확인해보세요.- 개발 환경 관련 데이터: Docker 이미지/볼륨, npm/yarn 캐시, Homebrew 캐시, Git 리포지토리의
.git폴더 등 개발 관련 데이터가 예상보다 많은 공간을 차지할 수 있습니다.docker system prune,npm cache clean --force,brew cleanup등의 명령으로 정리할 수 있습니다. - 대용량 파일: 스냅샷이 아닌, 단순히 사용자가 인지하지 못하는 곳에 숨겨진 대용량 파일이 있을 수 있습니다.
DaisyDisk나OmniDiskSweeper와 같은 시각화 도구를 사용하면 디스크 공간을 차지하는 요소들을 쉽게 파악할 수 있습니다. - APFS 컨테이너의 다른 볼륨: APFS는 하나의 컨테이너 안에 여러 볼륨(예: Macintosh HD - Data, Macintosh HD)을 가질 수 있습니다.
diskutil list명령으로 볼륨 구성을 확인하고, 특정 볼륨에 문제가 있는지 살펴볼 수 있습니다.
