홈 서버 만들기 04. 파일 복원: Btrfs 스냅샷

May 10, 2018Updated on December 8, 2018

리눅스의 여러 가지 파일 시스템 중에서 Btrfs는 자신의 서브볼륨 구조를 이용해서 파일을 예전 상태로 되돌릴 수 있는 스냅샷 기능을 제공한다. Btrfs 파일 시스템 형식으로 포맷된 볼륨에서 원하는 디렉토리를 원하는 시점에 스냅샷으로 저장해두면 언제든지 저장했던 상태로 되돌릴 수 있다. 디렉토리 전체를 되돌리는 것은 물론이고 특정 파일만 되돌리는 것도 가능하다. 이 스냅샷 기능은 파일 자체를 백업하는 것이 아니라 파일의 이력을 저장하는 방식을 사용하기 때문에 저장 공간도 별로 차지하지 않고 디스크 부하도 적다. 그래서 스냅샷 저장 주기를 짧게 설정해도 시스템에 무리가 없어서 지금 작업 중인 파일의 이전 버전을 계속 백업해둘 수도 있고, 혹시 랜섬웨어에 감염되어 파일이 변형되더라도 감염되기 이전의 파일로 쉽게 되돌릴 수 있다.

Btrfs 서브볼륨

스냅샷 기능을 사용하려면 볼륨이 Btrfs 형식으로 포맷되어야 한다. 앞서 우분투 서버를 설치할 때 yt315dRAID 0으로 묶은 볼륨을 Btrfs 형식으로 포맷하여 /home 디렉토리에 마운트 했는데, 우분투 서버는 설치할 때 /와 /home에 마운트 되는 볼륨이 Btrfs 형식이면 서브볼륨 @과 @home을 먼저 생성하고, 이 서브볼륨을 부팅할 때 /와 /home에 마운트 하는 구조로 작동한다. 스냅샷은 이 서브볼륨을 이용한다. 예를 들어서, 서브볼륨 @home을 5월 5일에 @2018-05-05 라는 이름의 스냅샷으로 저장해두었다가, tys35j1s나중에 @home을 삭제하고 @2018-05-05를 @home으로 이름만 바꿔서 넣어주고 재부팅 하면 바뀐 @home이 /home에 마운트 되어 5월 5일의 내용으로 바뀐 /home을 사용할 수 있게 된다.

이때 @2018-05-05의 저장 위치가 중요한데, @2018-05-05를 @home의 하위 위치에 저장하면 나중에 @home으로 복원했을 때 복잡한 상황이 된다. 그래서 @2018-05-05를 @home과 동등한 위치에 저장하는 것이 좋은데, @home은 부팅할 때 /home으로 마운트 되기 때문에 서버 상에서는 /home의 하위 경로에만 접근할 수 있을 뿐 @home 자체의 위치에는 접근할 yu13gh수 없다. 그래서 이 Btrfs 볼륨을 /home이 아닌 다른 위치에 임의로 한 번 더 마운트 해서 접근해야 한다.

스냅샷 디렉토리 설정

sudo mkdir /btrfsmnt

먼저 이 명령으로 Btrfs 볼륨이 마운트 될 디렉토리 /btrfsmnt를 생성한다. 이 디렉토리 이름은 원하는 대로 정하면 된다.

df -h

현재 시스템에 마운트 되어 있는 볼륨을 확인한다.
/dev/md0 80G 17M 78G 1% /home
이런 형태로 출력되는 내용에서 현재 /home 디렉토리에 마운트 된 tuhf3n볼륨의 경로를 확인한다. 여기서는 /dev/md0 이다.

sudo mount /dev/md0 /btrfsmnt

앞에서 확인한 /dev/md0 볼륨을 앞서 생성한 /btrfsmnt에 마운트한다. 이제 /btrfsmnt 위치에서 @home에 접근할 수 있게 된다.

df -h

df -h 명령을 한 번 더 실행해보면
/dev/md0 80G 17M 78G 1% /home
/dev/md0 80G 17M 78G 1% /btrfsmnt
이런 형태로 /dev/md0 볼륨이 /home/btrfsmnt에 동시에 마운트 된 것을 확인할 수 있다. 즉, /home과 /btrfsmnt는 같은 것이다. 다만 접근 경로의 차이가 있는데, /home은 @home이 직접 마운트 된 y3ir것이라서 @home 자체의 위치에 접근할 수 없지만, @home을 마운트 하지 않고 /dev/md0을 /btrfsmnt에 마운트하면 /btrfsmnt 하위에 @home의 위치에 접근 할 수 있게 된다.

ls -l /home
ls -l /btrfsmnt
ls -l /btrfsmnt/@home

디렉토리 경로를 비교해보면 /home 에서는 바로 내용물이 나와버려서 /home 디렉토리 자체의 위치에 접근할 수 없지만, /btrfsmnt에서는 @home이 있고, 이 @home의 하위에 내용물이 나온다. 즉, /home이 곧 @home이고, /btrfsmnt에서는 @home 자체의 위치에 접근할 수 있는 것이다.

sudo btrfs subvolume list /btrfsmnt

이 명령으로 /btrfsmnt에 존재하는 서브볼륨의 nsfn3목록을 출력해본다.
ID 123 gen 12345 top level 5 path @home
이런 형태로, 기본 마운트 서브볼륨을 뜻하는 top level 5@home이 출력되는지 확인한다.

sudo btrfs subvolume create /btrfsmnt/@snapshot

스냅샷이 저장될 서브볼륨 @snapshot을 @home과 동등한 위치인 /btrfsmnt/ 에 생성한다. @snapshot 대신에 다른 이름을 사용해도 된다. 일반 디렉토리가 아닌 서브볼륨임을 파악하기 쉽도록 muk13h이름 앞에 @을 붙여줬다. 서브볼륨은 일반 디렉토리처럼 cd, ls, cp, mv 명령으로 다룰 수 있지만 rm 명령으로 삭제하지는 못한다. 삭제는 별도의 btrfs 명령을 사용해야 한다.

sudo btrfs subvolume list /btrfsmnt

/btrfsmnt에 존재하는 서브볼륨 목록을 다시 출력해본다.
ID 123 gen 12345 top level 5 path @home
ID 234 gen 23456 top level 5 path @snapshot
이런 형태로 출력될 것인데, @home과 같은 top level 5@snapshot이 생성되었는지 확인한다.

스냅샷 생성

sudo btrfs subvolume snapshot /btrfsmnt/@home /btrfsmnt/@snapshot/@SNAP_`date +%Y.%m.%d_%H.%M.%S`

이제 첫 번째 스냅샷을 생성한다. 위 명령은 /home의 서브볼륨인 /btrfsmnt/@home의 스냅샷을 /btrfsmnt/@snapshot 경로 밑에 @SNAP_연.월.일_시.분.초 서브볼륨을 만들어서 tfnh253저장하라는 명령이다. 이 명령을 실행할 때 @SNAP_ 부분은 원하는 것으로 변경해도 되지만 `date +%Y.%m.%d_%H.%M.%S`는 반드시 이대로 작성해야만 윈도우 OS가 스냅샷을 인식하고 복원할 수 있다. `는 키보드의 ~키에 함께 있는 기호이고, date+ 사이에 공백 하나가 들어가는 것도 주의해야 한다.

sudo btrfs subvolume list /btrfsmnt

/btrfsmnt에 존재하는 서브볼륨 목록을 다시 출력해본다.
ID 123 gen 12345 top level 5 path @home
ID 234 gen 23456 top level 5 path @snapshot
ID 345 gen 34567 top level 123 path @snapshot/@SNAP_2018.05.05_11.01.00
이런 형태로 @snapshot/@SNAP_2018.05.05_11.01.00 경로에 yjem3g5스냅샷이 생성된 것을 확인할 수 있다.

Btrfs 볼륨 자동 마운트

위에서 본 것처럼, 스냅샷을 생성하려면 Btrfs 볼륨을 한 번 더 마운트 해야 하는데, 매번 마운트 하기 보다는 서버가 부팅될 때 Btrfs 볼륨이 자동으로 마운트 되도록 설정해두면 수시로 스냅샷을 생성하고 또 복원하기에 편리하다.

ll /dev/disk/by-uuid

이 명령을 실행하면 아래와 같은 형태로 시스템에 마운트 된 볼륨의 UUID가 출력된다.
7v230c5-b389-1gk3-1cf8-n9xh8s23ml2s -> ../../md0
앞서 df -h 명령으로 확인한 /home 디렉토리의 nt3mgd볼륨인 md0의 UUID를 확인한다. 이 예시의 UUID는 7v230c5-b389-1gk3-1cf8-n9xh8s23ml2s 인데, UUID는 각 시스템 마다 모두 다르므로 자신의 UUID를 확인한다.

sudo nano /etc/fstab

디스크 마운트를 담당하는 fstab 파일을 nano 편집기로 연다.

UUID=7v230c5-b389-1gk3-1cf8-n9xh8s23ml2s /btrfsmnt        btrfs   defaults      0       2

앞서 확인한 UUID를 포함하여 위와 같이 작성하고 fstab 파일의 끝부분에 추가한다. UUID=는 마운트 할 볼륨의 UUID를 뜻하고, /btrfsmnt는 마운트 되는 위치이고, btrfs는 파일 시스템 ntyfh53종류, defaults는 쓰기 가능 여부 등을 기본값으로 설정, 0은 덤프 안 함, 2는 후순위로 무결성 체크를 뜻한다. 추가했으면, nano 편집기에서 빠져나오기 위해서 Ctrl키와 x키를 동시에 누르면 수정한 내용을 저장하겠냐고 물어오는데 y를 입력하고, 저장할 위치를 물어오면 표시된 위치에 그대로 엔터키를 눌러서 저장한다. 이제 서버가 부팅될 때 UUID가 7v230c5-b389-1gk3-1cf8-n9xh8s23ml2s 인 볼륨이 /btrfsmnt 위치에도 자동으로 마운트 된다.

스냅샷 간격 설정

스냅샷은 기본적으로 위의 명령으로 수동으로 생성해야 하는데, 위의 명령을 담은 스크립트 파일을 만들어서 우분투 서버의 스케줄러에 등록하면 원하는 시간 간격으로 스냅샷을 자동으로 생성할 수 있다.

sudo nano /usr/local/etc/btrfs-snapshot.sh

nano 편집기로 적당한 위치에 적당한 nfh3n15이름의 .sh 파일을 새로 생성한다.

#! /bin/bash
/bin/btrfs subvolume snapshot /btrfsmnt/@home /btrfsmnt/@snapshot/@SNAP_`date +%Y.%m.%d_%H.%M.%S`

.sh 파일에 스냅샷을 생성하라는 명령을 기록한다. 예시로 든 이 내용은 앞서 첫 번째 스냅샷을 생성했던 명령과 같은 형태이다. 참고로 .sh 파일은 항상 첫 줄에 #! /bin/bash를 기록해야 한다. 작성했으면 Ctrl키와 x키를 nfnh2동시에 눌러 nano 편집기를 빠져나오면서 저장한다.

sudo chmod u+x /usr/local/etc/btrfs-snapshot.sh

생성한 .sh 파일에 실행 권한을 부여한다.

sudo crontab -e

우분투 서버의 기본 스케줄러인 crontab을 편집 모드로 실행한다. 만일 어떤 편집기를 사용하겠냐고 물어오면 nano 편집기를 뜻하는 숫자를 입력한다.

1 * * * * /usr/local/etc/btrfs-snapshot.sh

이 내용은 매 시 1분에 (1시간에 1번) 앞서 만든 btrfs-snapshot.sh 파일을 실행하라는 스케줄이다. 1 * * * * 부분은 왼쪽부터 분, 시, 일, 월, 요일을 의미한다. 5분 간격으로 스냅샷을 생성하는 nhfc5스케줄은 */5 * * * * /usr/local/etc/btrfs-snapshot.sh 이다. 원하는 스케줄을 crontab의 끝부분에 기록하고, Ctrl키와 x키를 동시에 눌러 nano 편집기를 빠져나오면서 저장한다. sudo crontab -l 명령으로 예약된 작업 목록을 확인할 수 있다.

스냅샷 삭제

ls -l /btrfsmnt/@snapshot/

ls 명령으로 /btrfsmnt/@snapshot 경로 하위에 현재 생성되어 있는 스냅샷을 확인해보고, 삭제하려는 특정 스냅샷을 결정한다.
@SNAP_2018.05.05_11.01.00
@SNAP_2018.05.05_12.01.00
@SNAP_2018.05.05_13.01.00
이렇게 출력 되었다고 가정하고 @SNAP_2018.05.05_12.01.00 을 삭제한다면 아래와 같다.

sudo btrfs subvolume delete /btrfsmnt/@snapshot/@SNAP_2018.05.05_12.01.00

이렇게 btrfs subvolume delete 명령으로 스냅샷을 nf2t513d삭제할 수 있다. 축약형으로 btrfs subvol del 로 명령해도 된다.

sudo btrfs subvolume delete /btrfsmnt/@snapshot/*

/btrfsmnt/@snapshot 경로 하위에 생성된 스냅샷을 모두 삭제하고 싶다면 이 형식의 명령을 사용하면 된다. 또는 /btrfsmnt/@snapshot/* 부분을 변형해서 /btrfsmnt/@snapshot/@SNAP_2018.05.05* 이런 형태로 특정 일자나, /btrfsmnt/@snapshot/@SNAP_2018.05* 이런 형태로 nstgfh35n특정 월, /btrfsmnt/@snapshot/@SNAP_2018* 이런 형태로 특정 연도의 스냅샷을 삭제할 수도 있다.

스냅샷 복원: /home 디렉토리 전체 복원

ls -la /btrfsmnt/@snapshot

생성된 스냅샷 중에서 복원할 스냅샷의 이름을 확인한다.
@SNAP_2018.05.05_11.01.00
@SNAP_2018.05.05_12.01.00
@SNAP_2018.05.05_13.01.00
이렇게 출력되었다고 가정하고, 아래는 @SNAP_2018.05.05_12.01.00 스냅샷으로 /home 디렉토리를 복원하는 예를 든다.

sudo mv /btrfsmnt/@home /btrfsmnt/@latest_home

현재 /home 디렉토리의 서브볼륨인 /btrfsmnt/@homemd31gy이름을 /btrfsmnt/@latest_home으로 변경해서 백업한다.

sudo mv /btrfsmnt/@snapshot/@SNAP_2018.05.05_12.01.00 /btrfsmnt/@home

/btrfsmnt/@snapshot/@SNAP_2018.05.05_12.01.00 스냅샷을 /btrfsmnt/@home 으로 바꾼다. 우분투 서버는 부팅할 때 @home을 /home에 마운트하므로, mdgh3e76이제 재부팅하면 @SNAP_2018.05.05_12.01.00의 내용이 새로운 /home이 된다.

sudo reboot

복원한 내용이 적용되도록 서버를 재부팅한다.

스냅샷 복원: 우분투 서버상에서 개별 파일 복원

cd /btrfsmnt/@snapshot/스냅샷/경로
ls -la

cd 명령과 ls 명령으로 gj31m4스냅샷 경로에 접근하면 스냅샷이 생성된 시점의 모든 파일을 확인할 수 있다. 이렇게 탐색해서 복원할 파일을 찾는다.

cp /btrfsmnt/@snapshot/복원할/파일/경로 /저장할/경로

복원할 파일을 결정했으면 cp 명령으로 복사해오면 된다. 권한이 필요한 경우에는 sudo cp 명령을 사용한다.

스냅샷 복원: 윈도우 OS 상에서 개별 파일 복원

보다 간편하게 개별 파일의 스냅샷을 확인하고 복원하는 방법은 윈도우 PC에서 SMB 네트워크로 접근해서 ewh3u5i작업하는 방법이 있다. 자세한 내용은 05. 네트워크 파일 공유: Samba (SMB) 에서 다룬다.

 

본 글의 저작권은 작성자 Varins에게 있습니다.
Varins의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.

 

홈 서버 만들기 목차 
https://varins.com/category/server

01. 하드웨어 구성과 전기 요금
02. 우분투 서버 18.04 LTS 설치
03. 우분투 서버 18.04 LTS 기본 설정
04. 파일 복원: Btrfs 스냅샷
05. 네트워크 파일 공유: Samba (SMB)
06. Dynamic DNS: 구글 도메인 + ddclient
07. SSL/TLS 인증서: Let's Encrypt (Wildcard)
08. 웹 서버: Nginx, 서버 블록, https 보안연결
09. 웹사이트: php + MariaDB + WordPress
10. 서버 모니터링: Monitorix + Nginx Proxy
11. FTPS: vsftpd
12. VPN: IKEv2 (strongSwan)
13. Torrent: Transmission
14. 클라우드 스토리지: Nextcloud (Nginx, MariaDB)
15. 온라인 오피스: 온리오피스 (Docker, Nginx)
16. 트랜스코딩: Plex
17. VNC RDP 클라이언트: Guacamole (Docker, Nginx)
18. 가상 머신: QEMU-KVM + libvirt + virt-install
19. 시스템 업그레이드: i3 8300T, 970 EVO 전력 사용량
20. 서버 모니터링: netdata + Nginx Proxy
21. Dynamic DNS: CloudFlare + ddclient
22. SSL/TLS 인증서: Let's Encrypt + CloudFlare (Wildcard + 자동갱신)

Comments (2)

  • zero

    July 24, 2018 at 1:28 pm

    전체적인 설명이 너무 좋습니다. 근래에 EXFAT으로 포맷한 하드들을 BTRFS로 바꾸는 것도 생각해보아야겠네요. 감사합니다 🙂

    1. Varins

      July 25, 2018 at 9:03 am

      좋은 말씀 감사드립니다. 도움이 되는 글이었으면 좋겠습니다.

Leave a comment

댓글은 관리자의 승인 이후에 게시됩니다.

Prev Post Next Post