Btrfs Snapshot 에 대한 기초지식에 대해서는, 지난 글에 적당히 정리해놨다.
이 글에선, 어떻게 사용하는지에 대해서 역시 ‘적당히’ 정리해보겠다.
Btrfs 에 대한 모든 내용은, Btrfs SysAdminGuide 에서 찾을 수 있다. (읽어도 뭔 말인지 잘 감이 안와서 문제지.)
Snapshot 은, 간단히 말하면 이런 거다.
한 무리의 파일(특정 디렉토리 산하 모든 파일이라 가정..)을 보관해두려 한다. 그런데, 이 파일들 중, 보관해야하는 건 일부고, 그 ‘일부’는 ‘최초 설치 후 ‘변경’이 된 것들’이란 전제조건이 깔려있다.
예를 들면, /etc/ 밑의 파일들을 보관하려 하는데, 어떤 게 필요한 지는 잘 알 지 못한다. 내가 필요에 의해 추가한 파일들도 있고, OS 설치 시에 그냥 알아서 자리를 찾아간 파일들도 있다. 내가 수정을 가했다해도, 어느게 어느 건지 기억이 안날 때가 많다.
이런 상황에서, ‘변경’된 파일들만 찾아서 따로 복사본을 만든다면???
아주 예전 예전에, 같이 일하던 동료에게 Excel 로, 숫자가 증분하는 표(하위 셀로 갈수록 숫자가 일정 간격으로 증가하는 표)를 만들라고 했더니, 그걸 손으로 하고 앉아있던 모습을 본 기억이 난다. (아… 정말이지.)
지금 하고자 하는 것도 그와 비슷하다. ‘변경’된 파일을, ‘눈’으로 찾아 복사할 수도 있다. (지금까지 내가 쓰고 있는 서버도 그런 식으로 백업파일을 관리했다. 특정 파일들만 콕콕 집어서 특정 시점에 복사본을 만드는 방식. cron 을 사용했다.)
그런데, Snapshot 을 사용하면, 그런 무식함을 뽐낼 필요가 전혀 없어진다.
‘변경’을, 인간의 눈이 아닌 기계가 ‘알아서’ 판단해주기 때문이다.
게다가, ‘달라진 파일’만 따로 복사해놓지도 않는다. 내가 지정한 디렉토리(정확하게는 Subvolume)를 몽땅 사본으로 만들어주지만, 이전과 비교해서 수정이 가해진 파일들만 실제로 저장이 되고, 같은 파일들은 이전 내용을 그대로 쓴다.
예를 들어, 서브볼륨 전체 용량이 20GB 라고 했을 때, 이걸 그대로 보관하려면 20GB 가 필요하다. 그러나, 실제로 저기에서 ‘수정’이 이뤄진 파일은 1GB 라고 한다면, 실제로 필요한 공간은 1GB 뿐이다. 나머지는, ‘예전 거 그대로 써도 됩니다.’ 라는 꼬리표만 붙이면 될 일이다.
이 모든 작업을, 사용자가 알아서 하는 게 아니다. 사용자는 아무 것도 몰라도 된다. 옛 파일과 새 파일을 섞어서 마치 하나의 새로운 디렉토리(서브볼륨)인양 만들어주는 작업은 Btrfs 가 모두 담당한다.
사용자는 그저 그저 snapshot 명령만 내리면 될 뿐.
?? 다만 ??
원본 파일 ‘보관’이라는 면에서, 이 방법은 완전하진 못하다고 생각이 든다. 만약 원본이 파괴되면, 나머지 스냅샷들은 의미가 없어지지 않나? CoW 기술은, 결국 복사본이란게 없고, 파일은 오로지 하나만 (디스크 공간 어딘가에) 존재한다.
구 파일로 돌아가기 위한(마치 Git 처럼) 시스템으로는 꽤 만족스러울 수는 있어도, 데이터 보관(Backup; Redundancy)이란 측면에서 보면, 완벽한 해결책이라고는 볼 수 없다.
이를 위해선, 다른 물리공간에 또 데이터를 복제해야만 한다. (이 문제에 대해선 조금 더 공부가 필요하겠다.)
즉, 실제 데이터 복제가 이뤄진다고 볼 수는 없다. 이게 CoW 의 핵심 기술이자 목표긴 하지만, Backup 이란 측면에선 완전하진 않다.
배경은 이렇고, 실제 사용은 어떻게?
snapshot 자체보다는, 차라리 snapper(by Suse) 를 사용하는 편이 좋을 수도 있다. 이 내용은 또 다른 글에 정리했다.
단순 snapshot 사용법은, 다음 글을 참고하여 간단하게만 요약해본다.
- How to Manage Btrfs Storage Pools, Subvolumes And Snapshots on Linux (part 1)
- How to Create and Manage Btrfs Snapshots and Rollbacks on Linux (part 2)
Snapshot 을 만드는 명령은 cp 명령과 유사하다. ‘원본’을 ‘복사본’에 저장하는 형식이라 생각하면 기억하기에 편하다.
# btrfs subvolume snapshot /btrfs/sub1 /btrfs/sub1/snapshot
여기서 가장 중요한 점!
원본은 반드시 ‘Subvolume’ 이어야만 한다. 일반 디렉토리를 지정하면, 서브볼륨이 아니라는 오류가 발생한다.
또, 생성되는 복사본도 당연히 서브볼륨이 된다.
만약, Read Only snapshot 을 만들고 싶다면, -r 을 붙인다.
# btrfs subvolume snapshot -r /btrfs/sub1 /btrfs/sub1/snapshot
어떤 경우에 read only 가 필요한지는 잘 모르겠지만, snapper 가 생성하는 snapshot 은 모두 read only 다.
이것을 그냥 마운트하면, 말 그대로 Read Only 상태가 되므로 정상 사용이 불가능하다.
그럴 땐 그 스냅샷을 다시 일반 스냅샷(RW)으로 재생성한 후 사용해야 한다.
이것과 관련된 얘기는, 또 이런 저런 글들에서.