2014/09/24

btrfs Snapshot을 이용한 Roll-back


btrfs 파일시스템이 나온지도 꽤 됐지만 올해 처음으로 VirtualBox에 우분투 설치하면서 btrfs 를 기본 파일시스템으로 설정해서 설치해 보았다. 몇 달 써 봤는데 역시 가장 실용적인 장점은 Snapshot 기능이었다. Snapshot을 만들어 두었다가 불안정한 Software를 설치 후 문제가 생겨서 roll-back 할 때 실제로 매우 유용하게 써먹고 있다. btrfs 파일시스템은 지금도 리눅스 kernel 단에서 활발히 개선되고 있다.


btrfs 파일시스템 사용에 대한 고려 사항

Snapshot 기능 외에 나중에 몇가지 테스트 해 보고 싶은 것은 Subvolume 압축과 Sanpshot을 다른 Machine으로 ssh를 이용해 send/receive 하는 기능이다. 이외에도 서버 사용자라면 btrfs 파일시스템이 LVM을 대체할 수 있고 RAID 구성도 가능하며, Subvolume quota 기능도 유용할 수 있다.

btrfs 파일시스템이 장점만 있는 것은 아니다. 일단, Meta 정보를 따로 관리해야 하기 때문에 디스크 용량이 실제 데이터 용량보다 더 많이 소모될 수 있다. 실제로 Snapshot을 과도하게 사용하다보면 Meta Data 량이 과도하게 증가한다. 또한, 파일시스템 특성 상 디스크 사용량을 실시간으로 정확히 파악하기 어렵다. 서버 사용자라면 Disk full이 언제 발생할지 예측하기 어렵다. 기존의 df나 du와 같은 디스크 용량 정보는 거의 의미가 없다. 가능한 디스크 용량을 정확히 계산하기 위한 Tool을 만들려고 노력은 하고 있단다. 또한, 디스크 성능 이슈도 발생할 수 있다. 성능이 개선되고는 있지만 ext4 파일시스템에 비해 빠르지는 않은 듯하다. 이외에도 파일시스템 안정성은 이미 크게 개선이 된듯하다.

btrfs Subvolume

btrfs 파일시스템에서는 Subvolume 단위로 파일시스템을 관리할 수 있는데 Snapshot도 일종의 Subvolume이다. 또한, Subvolume은 폴더와 비슷하게 관리할 수 있는 장점이 있다. Subvolume 내에 또 다른 Subvolume을 생성할 수 있는 구조이다. Subvolume에 대해 mv나 rm도 가능하지만 rm을 직접 사용하는 것은 권장하지 않는다. Subvolume 간의 작업은 독립적이다. 즉, Subvolume 내에 하위 Subvolume이 있어도 상위 Subvolume의 Snapshot은 하위 Subvolume을 포함하지 않는다. 

우분투에서 설치시에 파일시스템을 btrfs로 선택해서 설치하면 @와 @home 두 개의 Subvolume을 자동으로 만들어 준다. @는 /(root) 파티션에 해당하고 @home은 /home 파티션에 해당한다. 즉, OS와 사용자 데이터를 Subvolume으로 나누어서 관리하도록 해준다. 그리고, 예전에는 Grub이 btrfs 파일시스템을 지원하지 않아서 /boot 파티션을 ext4 등으로 따로 만들어야 했던 문제는지금은 해결이 됐다. 참고로, Subvolume명 앞에 @를 사용할 필요는 없지만 @를 앞에 붙이는 것이 관리상 편리하다.

btrfs-tools

모든 btrfs 파일시스템 관리는 btrfs 명령으로 이루어지는데 우분투에서는 btrfs-tools 패키지에 들어 있다. 설치 시에 btrfs 파일시스템으로 지정하면 기본으로 btrfs-tools가 설치되지만, ext4 등의 다른 파일시스템으로 지정한 경우에는 별개로 설치해 주어야 한다. 참고로, ext2~4 파일시스템은 btrfs-tools를 이용해 btrfs 파일시스템으로 전환할 수 있고, 이렇게 변환된 btrfs 파일시스템을 다시 ext2~4 파일시스템으로 재변환 할 수도 있다. 다만, 원래부터 btrfs 파일시스템으로 우분투를 설치했다면 ext2~4 파일시스템으로의 전환은 불가능하다.

btrfs Subvolume Snapshot 만들기

우분투 처음 설치했을 때의 btrfs Subvolume은 아래와 같이 확인할 수 있다.

$ sudo btrfs subvolume list /
ID 258 gen 2987 top level 5 path @home
ID 286 gen 2988 top level 5 path @
우분투 OS 부분만 Backup 해 두기 위해 아래와 같이 @에 대해 @backup 이라는 Snapshot Subvolume을 아래와 같이 만든다.

$ sudo btrfs subvolume snapshot @ @backup

Snapshot을 이용한 Roll-back

이제 불안정한 Software를 설치했는데 문제가 생겨서 원래 우분투 OS 설치 상태로 돌아가고 싶으면 앞서 만든 스냅샷을 이용해서 아래와 같이 복원할 수 있다.

먼저, 파티션이 여러 개라면 / 폴더가 위치한 파티션을 알아 둘 필요가 있다. 아래에서 /dev/sda2임을 알 수 있다.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        19G   12G  5.5G  69% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            991M   12K  991M   1% /dev
tmpfs           201M  888K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1001M  152K 1001M   1% /run/shm
none            100M   52K  100M   1% /run/user
/dev/sda2        19G   12G  5.5G  69% /home
/dev/sda1       197M  8.2M  189M   5% /boot/efi
아래와 같이 /dev/sda2를 마운트해서 roll-back 작업을 수행한다.

$ sudo mount /dev/sda2 /mnt
$ cd /mnt && ls -l
drwxr-xr-x 1 root root 226  9월 24 21:12 @/
drwxr-xr-x 1 root root 204  6월 13 01:32 @backup/
drwxr-xr-x 1 root root  12  6월 26 18:04 @home/
drwxr-xr-x 1 root root  58  6월 13 01:25 ubiquity-apt-clone/
drwxr-xr-x 1 root root   6  6월 13 01:25 var/
문제가 있는 @를 @problem이라는 Subvolume으로 옮기고 나서,

$ sudo mv @ @problem

@backup 스냅샷에 대한 스냅샷으로 다시 @를 만들어 roll-back 함으로써 @backup 스냅샷을 계속 보존할 수 있다.

$ sudo btrfs subvolume snapshot @backup @

이제 원복한 파일시스템을 사용하기 위해서 재부팅이 필요하다.

$ sudo reboot

재부팅 후, 모든 것이 정상임을 확인한 후에 문제가 됐던 @problem Subvolume을 삭제하려면,

$ sudo btrfs subvolume delete @problem

btrfs 명령어 축약

btrfs 명령이 너무 길기 때문에 사용하기 불편한데 아래와 같이 명령어를 단축할 수 있다.

subvloume = sub, snapshot = snap, filesystem = file, delete = del

예를 들어, 위에서 @backup Snapshot을 만들 때의 명령은 아래와 같이 해도 동일하다.

$ sudo btrfs sub snap @ @backup

사실은, 하위 명령어가 중복되지 않는 범위에서 하위 명령어들을 최대한 축약해도 된다. 즉, 위의 명령은 아래와 같이 해도 된다.

$ sudo btrfs su sn @ @backup

기타 btrfs 명령어

$ sudo btrfs filesystem show
Label: LRoot  uuid: 7f51f770-fe96-4f1f-860d-95215173b0f2
    Total devices 1 FS bytes used 11.00GiB
    devid    1 size 18.80GiB used 17.04GiB path /dev/sda2

Btrfs v3.12
$ sudo btrfs filesystem df /
Data, single: total=14.01GiB, used=10.33GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=1.50GiB, used=691.88MiB
Metadata, single: total=8.00MiB, used=0.00
$ sudo btrfs filesystem defragment /


참고 사이트

https://btrfs.wiki.kernel.org

댓글 2개:

  1. btrfs 쓰려면 우분투 설치시에 포멧이 되더군요. tool 도 함께 깔리구요.
    gparted에서 btr 포멧 지원이 안되서 궁시런 된게 자소스럽네요.
    정말 국내 우분투 유저들은 잘 안 쓰시나봐요.
    정보가 거의 없어서 헤메다가
    쉽고 편하게 설명해주신 포스팅을 찾은 덕분에
    직접 체험해볼 수 있었습니다.
    이번엔 테스트용으로 깔았지만
    다음번에 시스템을 재설치 할 땐 메인을
    btr로 해야겠어요.
    tar 백업에 비교해 스냅샷 너무 좋은것같습니다.
    감사합니다.

    답글삭제
  2. 상대적으로 새로운 파일시스템이니 사용자가 적겠죠. 새로운 명령도 알아야 하고 무엇보다 안정성이 중요한데 대규모 서버 환경에서 검증이 덜된 부분도 있겠구요. 스냅샷 기능과 Incremental Backup 기능이 btrfs의 장점인데 데스크탑 사용자들에게는 반드시 필요한 기능이 아닐 수도 있으니 익숙한 걸 쓰려는 경향도 있겠죠.
    그리고, 스냅샷이 백업은 아니므로 중요한 파일은 별도의 디스크에 백업하시길...

    답글삭제