Snapper, 용어 설명 및 기초 개념.

tldr;

중요한 점은 한가지다.
스냅샷은 자동생성되고, 자동생성된 스냅샷들은 시간이 지남에 따라 알아서 지워진다.
물론, 수동생성한 스냅샷은 자동삭제되지 않는다.

Snapper 에 의해 생성된 Snapshot 은 크게 두가지다. apt 등을 실행했을 때 자동생성되는 스냅샷과, 한시간에 한번씩 만들어지는 스냅샷.

이 두 스냅샷은 영구 보존되는게 아니고, 미리 설정한 기준에 의해 시간이 지남에 따라 예전 것들부터 자동 삭제된다.


진작에 알아봤어야 하는 걸, 미루고 미루다 오늘에야 공부를 했다.

Snapper.io Tutorial, openSUSE Snapper Tutorial, SuSe Documentation 을 참고했다.

snapper 환경 설정 목록

: snapper list-configs

$ sudo snapper list-configs
Config | Subvolume
-------+----------
root   | /        

snapper 목록

: snapper list

$ sudo snapper list
  # | Type   | Pre # | Date                            | User | Cleanup  | Description                      | Userdata
----+--------+-------+---------------------------------+------+----------+----------------------------------+---------
 0  | single |       |                                 | root |          | current                          |         
 1  | single |       | Mon 27 Jan 2020 05:31:03 PM KST | root |          |                                  |         
 2  | pre    |       | Mon 27 Jan 2020 05:32:56 PM KST | root | number   | apt                              |         
 3  | post   |     2 | Mon 27 Jan 2020 05:35:44 PM KST | root | number   | apt                              |         
 4  | pre    |       | Mon 27 Jan 2020 05:38:06 PM KST | root | number   | apt                              |         
 5  | post   |     4 | Mon 27 Jan 2020 05:39:16 PM KST | root | number   | apt                              |         
 6  | pre    |       | Mon 27 Jan 2020 05:39:54 PM KST | root | number   | apt                              |         
 7  | post   |     6 | Mon 27 Jan 2020 05:40:06 PM KST | root | number   | apt                              |         
 8  | pre    |       | Mon 27 Jan 2020 05:41:08 PM KST | root | number   | apt                              |         
 9  | post   |     8 | Mon 27 Jan 2020 05:41:17 PM KST | root | number   | apt                              |         
10  | pre    |       | Mon 27 Jan 2020 08:44:19 PM KST | root | number   | apt                              |         
11  | post   |    10 | Mon 27 Jan 2020 08:44:28 PM KST | root | number   | apt                              |         
12  | pre    |       | Mon 27 Jan 2020 08:48:58 PM KST | root | number   | apt                              |         
13  | post   |    12 | Mon 27 Jan 2020 08:49:10 PM KST | root | number   | apt                              |         
14  | pre    |       | Mon 27 Jan 2020 08:50:14 PM KST | root | number   | apt                              |         
15  | post   |    14 | Mon 27 Jan 2020 08:50:21 PM KST | root | number   | apt                              |         
16  | pre    |       | Mon 27 Jan 2020 08:50:35 PM KST | root | number   | apt                              |         
17  | post   |    16 | Mon 27 Jan 2020 08:50:41 PM KST | root | number   | apt                              |         
18  | single |       | Mon 27 Jan 2020 09:17:01 PM KST | root | timeline | timeline                         |         
19  | pre    |       | Mon 27 Jan 2020 10:39:20 PM KST | root | number   | apt                              |         
20  | post   |    19 | Mon 27 Jan 2020 10:39:28 PM KST | root | number   | apt                              |         
21  | single |       | Mon 27 Jan 2020 11:17:01 PM KST | root | timeline | timeline                         |         
22  | single |       | Mon 27 Jan 2020 11:57:31 PM KST | root |          | 여기는 cmatrix 없고, sl 도 없다. |   

snapper 목록 용어정리

: Type, Pre #, Cleanup

Type 에는 single, pre, post 가 있다.

  • single : 사용자가 임의로 실행한 Snapper 에 의해 생성된 Snapshot
  • pre : apt(yast,zypper 등) 를 실행하기 전에 생성된 Snapshot
  • post : apt(yast,zypper 등) 를 실행한 후에 생성된 Snapshot

사용자가 snapper create --description "그냥 해봤어" 등으로 스냅샷을 만들었거나, 또는 Cron 등으로 정해진 시간에 자동으로 스냅샷이 생성됐을 때 ‘single’ 로 할당된다.

pre/post 는 말 그대로. Debian 계열에서는 apt, openSUSE 에서는 yast 나 zypper 등이 실행되기 전/후에 각각 pre/post 로 Type 이 지정된다.
위의 경우 2 번은 Pre, 3 번은 Post 인데, 3번 Pre # 항목에 ‘2’ 라고 기록되어 있다. 즉, 2와 3이 한 쌍이라는 뜻이 된다. 2 이후에 apt 를 했고, 그 결과가 3 이 되었다.

apt 를 하면 어떻게 snapper 가 가동될까?

이 비밀은 /etc/apt/apt.conf.d/80snapper 에 숨어있다. snapper 를 설치하면 이 파일도 같이 설치되고, apt 수행 시에 작동된다. (이건 우분투 저장소에 있는 snapper 를 설치했을 때에만 해당되고, OBS 저장소에서 설치하면 apt 작동은 되지 않는다.
apt 와 연동하는 방법은 다른 글에 정리했다.)
openSUSE 는, /etc/sysconfig/yast2USE_SNAPPER=yes 항목이 추가되면서 yast/zypper 와 연동이 이뤄진다.

22번 을 보면, single 로 Type 이 설정돼 있고, Cleanup 항목은 비어있다. 나머지는 모두(1번 제외) number 나 timeline 으로 설정돼있다.

과연, Cleanup 은 뭘까?

Snapshot 자동 삭제 체계

위에서 보는 대로, apt 를 실행하기만 해도 snapper 가 가동 되어 한쌍씩 스냅샷이 생성된다. 게다가 Cron 으로 인해 특정 시간 간격을 두고 스냡샷이 생성되기도 한다.
이렇게 계속 만들어지기만 한다면, 아무리 CoW 방식이라고 해도 디스크 공간 낭비가 예상이 되므로, snapper 는 일정 시간(1일)이 지나면 자동 삭제시도를 한다.

우분투 snapper 꾸러미는 cron 을 사용하고, 이 내용은 /etc/cron.daily/snapper 에 기록되어 있다.

이 ‘삭제’는 몇가지 미리 짜여진 방식(Algorithms)에 의해 수행되는데, 총 세가지로 나뉜다.

  • number : pre/post 에 해당하는데, 특정 갯수가 넘어가면 오래된 것부터 삭제.
  • timeline : single 에 해당. Hourly ~ Yearly Limit 규칙에 의거 삭제.
  • empty-pre-post : 잘 모르겠음!

empty-pre-post 는 snapper list 에 현재 내 시스템에서 나오지 않기 때문에 설명만 봐선 잘 모르겠다.

Snapshot 자동 삭제 설정

이 설정은 /etc/snapper/configs/root 에 정의돼 있다.
용어가 약간 헷갈리는데, 설명서에 적힌 그대로를 받아들여야 이해하기가 쉽다. (Hourly, Daily 를 글자 그대로 이해하면 뭔 소린지 도무지 감이 잡히질 않는다.)

timeline 에 대해서만 설명한다.
기본 설정값은 다음과 같다.

# create hourly snapshots
TIMELINE_CREATE="yes"

# cleanup hourly snapshots after some time
TIMELINE_CLEANUP="yes"

# limits for timeline cleanup
TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="10"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="10"
TIMELINE_LIMIT_YEARLY="10"

TIMELINE_CREATE=”yes”
snapper 를 매시간 자동으로 실행할지 여부. (그냥 꺼둬도 될 듯 하다.)
‘매시간’인 근거는 /etc/cron.hourly/snapper 에 있다.

또, 이 파일은 /etc/crontab 에 의하여, 매시 17분에 실행된다.

cat /etc/crontab 
...
# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Timeline_Min_Age 는 초단위로 1800, 즉 30분으로 설정돼 있다. 한번 만들어진 스냅샷은, 어떤 삭제 규칙에 걸리더라도 최소 30분간은 지우지 않고 남겨놓는다는 의미로 보인다.

다음, Timeline Limit 들이 Hourly 부터 Yearly 까지 있는데, 이 용어 정의를 확실히 할 필요가 있다.
각 Limit 들은, 해당 시간(Hourly, Daily..)동안 만들어진 Snapshot 들의 최대 허용 수다.

  • HOURLY (Snapshot) : 한 시간 동안 만들어진 스냅샷 중 제일 오래된 스냅샷 (An hourly snapshot is the first snapshot in an hour.)
  • DAILY (Snapshot) : 하루 동안 만들어진 스냅샷 중 제일 오래된 스냅샷.
  • WEEKLY (Snapshot) : 일주일 동안 만들어진 스냅샷 중 제일 오래된 스냅샷. (아마도 주초에 만들어진? 일-토를 한주로 계산?)
  • MONTHLY (Snapshot) : 한달동안 만들어진 스냅샷 중 제일 오래된 스냅샷.
  • YEARLY (Snapshot) : 일년동안 만들어진 스냅샷 중 제일 오래된 스냅샷.

** 시간 단위가, 날짜로 구분되는 건지, Cleanup 하는 시간으로 부터인건지 확실하지 않다.

다시 말해, Hourly 라는게, Cleanup 을 하는 시점에서 24시간 전까지를 말하는 건지, 아니면 달력 날짜상 ‘전 날’인건지 모르겠다.
결과를 놓고 추론해봐도 잘 모르겠다.
대충만 이해해도 별 무리는 없겠으나, 그래도 정확한 내용을 알고 싶긴 하다.

이렇게 정리는 해놨지만, 잘 이해가 되진 않는다.
TIMELINE_LIMIT_HOURLY=”10″ 일 때와 “3” 일 때를 비교하면 그래도 이해가 좀 되는 듯..??

10 인 경우

$ sudo snapper ls -t single
  # | Date                            | User | Description                      | Userdata
----+---------------------------------+------+----------------------------------+---------
 0  |                                 | root | current                          |         
 1  | Mon 27 Jan 2020 05:31:03 PM KST | root |                                  |         
18  | Mon 27 Jan 2020 09:17:01 PM KST | root | timeline                         |         
21  | Mon 27 Jan 2020 11:17:01 PM KST | root | timeline                         |         
22  | Mon 27 Jan 2020 11:57:31 PM KST | root | 여기는 cmatrix 없고, sl 도 없다. |         
36  | Wed 29 Jan 2020 12:17:02 AM KST | root | timeline                         |         
39  | Wed 29 Jan 2020 04:17:01 PM KST | root | timeline                         |         
40  | Wed 29 Jan 2020 05:17:01 PM KST | root | timeline                         |         
41  | Wed 29 Jan 2020 06:17:01 PM KST | root | timeline                         |         
50  | Wed 29 Jan 2020 09:17:02 PM KST | root | timeline                         |         
51  | Wed 29 Jan 2020 10:17:01 PM KST | root | timeline                         |         
52  | Thu 30 Jan 2020 05:17:01 PM KST | root | timeline                         |         
53  | Thu 30 Jan 2020 06:17:01 PM KST | root | timeline                         |         
54  | Thu 30 Jan 2020 09:17:02 PM KST | root | timeline                         |         
55  | Thu 30 Jan 2020 10:17:01 PM KST | root | timeline                         |         
56  | Thu 30 Jan 2020 10:42:04 PM KST | root | 그냥 한번 만들어봤어             |         
57  | Thu 30 Jan 2020 11:17:01 PM KST | root | timeline                         |         
58  | Fri 31 Jan 2020 11:17:02 AM KST | root | timeline                         |         
61  | Fri 31 Jan 2020 12:17:01 PM KST | root | timeline                         |         
62  | Fri 31 Jan 2020 03:17:02 PM KST | root | timeline                         |         
63  | Fri 31 Jan 2020 04:17:01 PM KST | root | timeline                         |         
64  | Fri 31 Jan 2020 05:17:01 PM KST | root | timeline                         |         

그리고 3 인 경우.

# 오후 11:30 경에 다음 명령 실행
$ sudo snapper cleanup timeline
$ sudo snapper ls -t single
  # | Date                            | User | Description                      | Userdata
----+---------------------------------+------+----------------------------------+---------
 0  |                                 | root | current                          |         
 1  | Mon 27 Jan 2020 05:31:03 PM KST | root |                                  |         
18  | Mon 27 Jan 2020 09:17:01 PM KST | root | timeline                         |         
22  | Mon 27 Jan 2020 11:57:31 PM KST | root | 여기는 cmatrix 없고, sl 도 없다. |         
36  | Wed 29 Jan 2020 12:17:02 AM KST | root | timeline                         |         
52  | Thu 30 Jan 2020 05:17:01 PM KST | root | timeline                         |         
56  | Thu 30 Jan 2020 10:42:04 PM KST | root | 그냥 한번 만들어봤어             |         
58  | Fri 31 Jan 2020 11:17:02 AM KST | root | timeline                         |         
65  | Fri 31 Jan 2020 06:17:01 PM KST | root | timeline                         |         
66  | Fri 31 Jan 2020 10:17:01 PM KST | root | timeline                         |         
69  | Fri 31 Jan 2020 11:17:01 PM KST | root | timeline                         |  

1월 31일만 보자. (사실 이 개념이 확 와닿질 않는다.)
Hourly 를 10개로 설정했을 때, 31일엔 58,65,66,69 까지 6개의 스냅샷이 있었다.
이걸 3개로 바꾸고, snapper cleanup timeline 하고 나면, 58,65,66,69 로 4개만 남는다.

왜 4개가 남았을까? (아래 내용은 확실하진 않고, 그냥 내 추론이다.)
일단, 69 는 23:17 에 생성됐고, cleanup 을 수행한 시간이 23:30 경이므로, 69 는 생성된지 30분이 지나지 않은 상태다. 따라서, 어떤 상황에서도 살아남을 수 밖에 없다.
이 규칙을 무시하더라도, Hourly Limit 가 3 이므로, 65,66,69 3개가 살아남게 된다.
다시 말해, Hourly Limit 는, 당일에 생성된 스냅샷을 몇개까지 남겨둘지에 대한 설정이다.
날이 바뀌어 다음 날이 되면, 전 날 생성한 스냅샷은 Daily Snapshot 을 제외하곤 모두 지워진다. (이 부분, 역시 확실하지 않다.)

이 Daily Snapshot 이 바로 58 이다.
Daily_Limit 는 10으로 설정되어 있으므로, 열흘분 스냅샷이 살아남게 되고, 11개가 될 때부터 시간 순, 즉 오래된 스냡샷 부터 먼저 삭제 된다.

위 목록에서도 보면, 18, 36, 52, 58 이 Daily Snapshot 이 된다.
아직 일주일도 지나지 않아서 Weekly, Monthly 는 없으나, 아마도 18 이 Weekly 이자 Monthly 가 되지 않으려나.

1 은, 최초에 생성된 스냅샷으로, cleanup 이 설정되어 있지 않다. snapper ls 로 보면, Cleanup 항목이 비어있다. 따라서, 자동 삭제 대상이 아니므로, Hourly ~ Yearly 에 포함되지 않고, 수동으로 지우기 전엔 그냥 남아있는다.

** 한가지 의문.

23:30 에 Cleanup 을 하기 전에, 스냅샷을 2개 더 만들었었다.

sudo snapper create --description="test" --cleanup-algorithm="timeline"
58  | Fri 31 Jan 2020 11:17:02 AM KST | root | timeline                         |         
64  | Fri 31 Jan 2020 05:17:01 PM KST | root | timeline                         |         
65  | Fri 31 Jan 2020 06:17:01 PM KST | root | timeline                         |         
66  | Fri 31 Jan 2020 10:17:01 PM KST | root | timeline                         |         
67  | Fri 31 Jan 2020 10:53:44 PM KST | root | test                             |         
68  | Fri 31 Jan 2020 10:57:12 PM KST | root | test2                            |         
69  | Fri 31 Jan 2020 11:17:01 PM KST | root | timeline                         |         

67, 68 두 개가 바로 그것들인데, 23:30 에 Cleanup 을 하고 났더니, 이것들이 지워져버렸다. 왜 67,68 이 지워지고 65,66 이 살아남았을까???
내가 지금까지 학습한 바 대로라면, 67, 68, 69 가 남아야할 듯 한데.. 설명서에는 “The youngest hourly snapshots will be kept.” 라고 되어 있으니 67~69 가 맞지 않나??

이 문제는 나중에 숙제로 남겨두고.. 오늘은 여기까지만. (뭔가 풀지 못한게 꽤 많은 듯 하긴 한데..)

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