Snapper 가 생성한 btrfs subvolume 순차 삭제 (Recursive Deletion)

예를 들어, 아래와 같이 Btrfs Subvolume 이 있다고 가정해본다.

$ sudo btrfs sub list /mnt/@snapshots/
ID 260 gen 881 top level 5 path @home
ID 261 gen 882 top level 5 path @var
ID 262 gen 795 top level 5 path @opt
ID 271 gen 856 top level 5 path @snapshots
ID 273 gen 667 top level 271 path 2/snapshot
ID 273 gen 668 top level 271 path 2/snapshot
ID 274 gen 673 top level 271 path 3/snapshot
ID 275 gen 689 top level 271 path 4/snapshot
ID 277 gen 695 top level 271 path 5/snapshot
ID 278 gen 882 top level 5 path @
ID 279 gen 707 top level 271 path 6/snapshot
ID 280 gen 718 top level 271 path 7/snapshot
ID 281 gen 719 top level 271 path 8/snapshot
ID 282 gen 720 top level 271 path 9/snapshot
ID 283 gen 723 top level 271 path 10/snapshot
ID 284 gen 725 top level 271 path 11/snapshot
ID 285 gen 726 top level 271 path 12/snapshot
ID 286 gen 728 top level 271 path 13/snapshot
ID 287 gen 729 top level 271 path 14/snapshot
ID 288 gen 730 top level 271 path 15/snapshot
ID 289 gen 732 top level 271 path 16/snapshot
ID 290 gen 733 top level 271 path 17/snapshot
ID 291 gen 734 top level 271 path 18/snapshot
ID 292 gen 741 top level 271 path 19/snapshot
ID 293 gen 754 top level 271 path 20/snapshot
ID 294 gen 785 top level 271 path 21/snapshot
ID 295 gen 797 top level 271 path 22/snapshot

눈에 확 들어오지는 않기 때문에, 위 상황을 아래와 같이 표현해 보도록 한다.

@snapshot(subvolid=271)
   |
   ├── /1/snapshot(subvolid=667)
   ├── /2/snapshot(subvolid=668)
   ├── /3/snapshot(subvolid=673)
   ├── ....
   └── ......

@snapshot 이라는 서브볼륨이 있고, 그 아래에 이름이 1,2,3… 인 ‘디렉토리‘들이 있으며, 각각 디렉토리안에 snapshot 으로 명명된 서브볼륨들이 존재한다.
toplevel 271(@snapshots) 하에 숫자로된 디렉토리/snapshot 들이 있음을 볼 수 있다. (눈에 잘 안들어와서 그렇지.)

지금 나는, 저 서브볼륨들을 모두 지우고 싶다.
어찌해야 하나?

간단하게, 그냥 최상위 디렉토리를 지우면 된다.

sudo rm -rf /mnt/@snapshots

이러면 @snapshot 서브볼륨은 물론, 아래 서브볼륨들까지 모두 지워진다.

허나, 이렇게 최상위 서브볼륨을 지우려고 하면 오류가 발생한다.

sudo btrfs subvolume delete /mnt/@snapshots

이럴 때는 아래에 있는 서브볼륨들을 먼저 모두 지워야만 한다.
다음과 같은 간단한 스크립트로 이 작업을 해낼 수 있다.

#!/bin/bash
for i in {1..22}
do
  filen=/mnt/@snapshots/"$i"/snapshot
  if [[ -d "$filen" ]]; then
        echo "디렉토리 있음"
        sudo btrfs sub delete "$filen"
  fi
done

위의 예를 보면, 서브볼륨은 1 부터 22 까지 디렉토리 산하에 있으므로 for 문은 {1..22} 까지로 설정했다. 이건 경우에 따라 적절히 조절하면 된다.

허나, 그냥 몽땅 지워버릴 생각이라면 간단히 rm -rf 가 더 낫겠다.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.