ZFS 와 Btrfs





ZFS vs Btrfs

ZFS 는 SUN 에서 만든 파일시스템이며, Btrfs 는 리눅스 진영에서 만들고 있는(오라클이 후원입니다.) ZFS clone 입니다. 즉, 대항마입니다. 둘다 기존 파일시스템에 비해 높은 데이터 안정성을 보장하며 볼륨 매니징을 내장하는등 많은 기능들을 포함하고 있기때문에 차세대 파일시스템으로 자주 불리며, Btrfs 가 ZFS clone 이기때문에 컨셉트나 제공하는 기능 및 사용방식이 매우 유사합니다. 

일단, FreeBSD 에서는 ZFS 를 포팅하여 사용중인데, 리눅스의 경우 SUN 의 CDDL 라이센스 문제때문에 ZFS 를 커널에 포함시키지 않았고, 덕분에 FUSE 혹은 비공식적으로 native 로 포팅된 버전만이 존재합니다. 당연히 사용하기 좋다고 보기는 힘들고요. 리눅스 진영의 대항마인 Btrfs 의 경우는 아직 개발단계라 Production-ready 딱지가 붙고, 안정화 단계에 들어서기까지는 몇년 더 걸릴것으로 예상이 됩니다. 이때문에 현재 파일시스템에서만큼은 FreeBSD 가 리눅스에 비해 우위에 있다고 볼 수 있습니다. 

이 두가지 파일시스템은 기능도 기능이지만 데이터 안정성에서도 커다란 향상을 가지고 왔는데, bit 단위로 데이터 안정성을 보장하는 end-to-end data integrity  로 silent corruption(하드디스크 데이터가 bit 단위로 슬며시 변질되는것을 말합니다. 의외로 일어날 확률이 높지만, 기존 파일시스템의 경우는 이런 소규모의 변질은 아예 인식 자체를 하지 못했기때문에 모르는분들이 많습니다.) 을 방지하고 자체적인 셀프힐링 기능도 포함하고 있습니다. 

참고로, 여기서 설명하는 ZFS 는 FreeBSD 에서의 ZFS 이며, Btrfs 는 아치 리눅스에서의 Btrfs 입니다. Btrfs 의 경우 빠른속도로 개발되는중이기때문에 리눅스 커널과 소프트웨어 버전업 속도가 업스트림과 별 차이가 없는 아치 리눅스가 사용에 적합합니다. 물론, 아직 중요자료 저장용으로는 사용하면 안됩니다.

그리고, P2P 등의 용도로도 이들 파일시스템은 그다지 적합하지 않습니다. 별다른 이득은 없으면서 다른 간단한 파일시스템들에 비해 메모리나 CPU 점유율만 많이 높아집니다. 


64bit File system


ZFS 와 Btrfs 의 첫번째 특징은 64 비트 파일시스템이기때문에 볼륨 사이즈를 2^64 바이트 즉, 약 16 Exabyte 까지 설정이 가능하다는점입니다. 참고로, 1024 기가바이트가 1 테라바이트이고, 1024 테라바이트가 1 페타바이트이고, 1024 페타바이트가 1 엑사바이트입니다. 즉, 용량면에서 둘다 제한은 '없다' 라고 봐도 무방합니다.


ZFS Pool


둘째로 ZFS 와 Btrfs 의 가장 독특한 기능이라 볼 수 있는 부분이 바로 레이드와 볼륨매니징을 자체적으로 지원하고 있다는점입니다. 즉, 따로 파티션을 나눌 필요가 없이 그냥 raw disk 를 장착후 바로 파일시스템 생성이 가능합니다. 이렇게 구성된 레이드 시스템은 ZFS 에서 pool 이라 부르며, Btrfs 에서는 Volume 이라 합니다. ZFS 의 경우 pool 을 생성할때 raid0, mirror, raidz, raidz2 등을 지원하는데 각각 raid0, raid1, raid5, raid6 에 해당됩니다. 만드는법도 매우 간단하여 예를들어 3 개의 하드디스크(/dev/ada1, /dev/ada2, /dev/ada3)를 이용하여 foo 라는 이름의 raid5 pool 을 만들려면 root 계정으로

# zpool create foo raidz ada1 ada2 ada3

을 입력해주면, pool 이 만들어지는 동시에 root directory / 에 foo 라는 디렉토리가 만들어지고 자동으로 마운트까지됩니다. 물론, 마운트장소는 후에 옵션을 통해 원하는대로 바꿀 수 있으니 현재 신경쓸 필요는 없습니다.

참고로, FreeBSD ZFS 의 경우 그냥 만들면 512B 섹터사이즈로 디스크가 잡히는데, 요즘 나오는 신형 디스크들은 4k 섹터사이즈를 갖고있기때문에 이에 맞춰 수정을 해주시는게 좋습니다. 원래대로라면 pool 을 만들때 간단한 옵션으로 섹터사이즈 지정이 가능하지만 FreeBSD ZFS 의 경우 이부분은 아직 구현이 안되어있기때문에 약간의 트릭을 이용하여야 합니다. FreeBSD 베이스시스템에 포함된 gnop 이라는것을 이용하면 되는데요. ZFS 레이드를 구성하기 전에 gnop 으로 먼저 위의 3 디스크중 하나를 골라

# gnop create -S 4096 /dev/ada1

을 해주면 /dev/ada1.nop 가 생성됩니다. 그럼 이것을 이용하여

# zpool create foo raidz ada1.nop ada2 ada3

해주시면 가장 큰 값인 ada1.nop 의 4k 섹터사이즈로 통일되어 만들어집니다. 4k 섹터사이즈로 만들어졌는지 확인하는 방법은 zdb 명령으로 가능합니다. zdb 명령을 실행해서 출력되는 값들중 ashift 값이 12(2^12=4096) 면 성공, 9(2^9=512) 면 실패입니다. 4k 사이즈로 만들어졌으면 이제 필요없는 ada1.nop 를 없애야 할텐데요.

# zpool export foo

명령을 주면 일단 ZFS pool 을 가상적으로 빼냅니다. 참고로, ZFS pool 을 물리적으로 떼어내어 다른 컴퓨터에 옮기거나 할때도 위 명령을 먼저 사용해서 일단 가상적으로 빼낸 후 작업해야합니다. 그리고, 이렇게 빠진 사이에

# gnop destroy ada1.nop

명령으로 기존에 만들었던 ada1.nop 를 지우고 다시

# zpool import foo

로 ZFS pool 을 가져오면 완성입니다. FreeBSD 에서는 ZFS 파일시스템으로 부팅도 가능하며(64k 부트 파티션은 만들어주어야 합니다.), ZFS 자체적으로 swap 파티션도 지원하기때문에 완전히 ZFS 만을 이용한 시스템 구성도 가능합니다.


Btrfs Volume


리눅스 Btrfs 의 경우도 역시 마찬가지로 간단히 Volume 생성이 가능한데, 아직 개발단계라 raid0, mirror(raid1), raid10, single 만 지원을 합니다.(리눅스 커널 버전 3.5 즈음 해서 Raid 5, Raid6 을 지원할거라는 언질이 있었습니다.) Btrfs 의 경우는 레이드 구성시 몇몇 옵션들을 제공하는데 -m 옵션으로 metadata 의 레이드 설정을, -d 옵션으로 일반 데이터의 레이드 설정이 가능합니다. 디폴트값은 metadata 의 경우 mirror 이며 일반 데이터의 경우 raid0 인데, raid5 나 raid6 이 지원되지 않는 현재로서는 가장 무난한 설정이니 잘 모르면 그냥 디폴트로 미는게 좋습니다. 즉, 3개의 하드디스크(/dev/sdb, /dev/sdc, /dev/sdd)로 레이드0 을 구성하려면

# mkfs.btrfs /dev/sd[b-d]

해주면 자동으로 디폴트값이 적용되어 raid0 시스템이 구성됩니다. [b-d] 는 정규표현식인데, 그냥

# mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd

한것과 동일합니다. 메타데이터는 어차피 용량도 별로 차지하지 않고 메타데이터가 날아가면 디스크가 먹통되는걸 의미하기때문에 안전하게 디폴트옵션인 mirror 로 설정하는게 좋으며, 볼륨 레이블도 -L 옵션으로 설정이 가능합니다. 참고로, 저는 파티션이나 Btrfs 나 언제나 레이블을 설정하여 사용합니다. /dev/sdX 로 기억하고 설정하는것은 왠만하면 피하는데요. 이런경우는 물리적으로 하드디스크를 뺏다가 다시 끼거나 할경우 이름이 뒤바뀌는 경우도 있기때문에 그다지 추천하지 않습니다. /dev/sdX 대신 사용가능한것중에 UUID 라는것도 있는데, 한번 만들어지면 포맷하기 전까지 항상 동일하기때문에 /dev/sdX 보다는 나은 솔루션이지만, 사람의 눈으로 기억하고 구분하기가 힘듭니다. 즉, 가장 간단한 솔루션은 역시 유니크한 이름을 정확히 지정하고 그것을 사용하는것이라 봅니다. 일단, 여기서는 foo 라는 이름을 지정하여

# mkfs.btrfs -m raid1 -d raid0 -L foo /dev/sd[b-d]

로 레이드를 구성한 시나리오를 적용하고 다음으로 넘어가겠습니다.(메타데이터는 mirror, 데이터는 raid0 인 디폴트값을 적용하여 만든것과 동일합니다.) 


Volume managing


레이드 시스템을 구성하였으면 이제 볼륨 매니징 순서인데, 간단히 말하자면 파일시스템 자체적인 파티션 구성을 하는것입니다. Btrfs 와 ZFS 에서 이렇게 만들어진 볼륨은 서브볼륨이라 칭합니다. 전통적인 파일시스템 개념에 의하면 파티션 구성을 먼저 하고 각 파티션에 파일시스템을 설치하는것이 순서인데, ZFS 와 Btrfs 는 이걸 반대로 뒤집어서 디스크 전체를 파일시스템으로 구성하고 그 후에 파일시스템 자체적인 볼륨 매니징을 하는식입니다. 물론, 파티션을 먼저 나눈 후, 그 파티션에 ZFS 혹은 Btrfs 파일시스템을 구성할수도 있는데, 이 두 파일시스템의 가장 강점중 하나가 자체적인 볼륨매니징인만큼 그다지 의미는 없다 볼 수 있겠죠. 

일반적으로 파티션을 나누게 되면 용량을 먼저 정확히 나누고 파티션을 구성하게 되는데, Btrfs 나 ZFS 에서는 그런게 없고, 그냥 모든 용량을 서로 공유합니다. 물론, 원하면 특별한 옵션을 주어 그것이 '가능하게' 할수도 있지만, 전적으로 옵션입니다. 그냥 만들면 마치 일반 디렉토리처럼 용량을 전부 공유합니다. 즉, 유닉스 처음 설치할때 초보자들이 골치썪는 문제중 하나인 각 파티션별로 용량을 얼마나 할당할것인가라는 문제에서 완전히 자유롭게 됩니다. 

그럼에도 불구하고 마운트 옵션등 파티션이 갖는 여러가지 이점들은 대부분 다 가지고 있기때문에 디렉토리가 갖는 장점(만들기 간단하며 용량을 공유)과 파티션이 갖는 장점(여러가지 마운트 옵션과 백업의 용이성등)을 공유하는 시스템이라 볼 수 있고요. 굳이 나쁜점을 꼽자면 ZFS 에서 만들어진 서브볼륨에는 다른 파일시스템을 사용할 수 없고 ZFS 만 사용해야 하고, Btrfs 도 마찬가지인데 기능면에서 현재 이 둘을 쫓아올만한 파일시스템은 존재하지 않기때문에 사실상 단점이라 보기는 힘듭니다.

ZFS 에서 pool 을 만들고 관리하는 명령이 zpool 이라면 각 pool 에 서브볼륨을 만들고 관리하는 명령은 zfs 입니다. Btrfs 역시 이 방식을 따라 처음 레이드시스템을 만드는 명령은 mkfs.btrfs 이고, 서브볼륨을 만들고 관리하는 명령은 btrfs 입니다.

그럼 위에서 만든 ZFS pool 과 Btrfs 레이드 시스템에서 서브볼륨 foosub 을 만들어보겠습니다. 위에서 ZFS pool 을 만들때 Btrfs 와는 달리 pool 의 이름을 반드시 설정하여야 하는것을 보셨을겁니다. 덕분에 ZFS 에서는 해당 pool 이 마운트가 되어있건 안되어있건 상관없이 그냥 해당 pool 의 이름을 이용하여 

# zfs create foo/foosub

명령으로 만드는게 가능합니다. 반면, 그런 이름을 정해주지 않는 Btrfs 의 경우는 조금 돌아가야 하는데, 일단 먼저 해당 레이드시스템을 마운트하고 명령을 내려줘야 합니다. 즉,

# mount LABEL=foo -t btrfs /mnt
# cd /mnt
# btrfs subvolume create foosub

이런식으로 사용합니다. 


Mount subvolume


ZFS

그럼 이제 만들어진 서브볼륨을 부팅시 원하는 디렉토리에 자동으로 마운트되게 하고싶을텐데요. ZFS 의 경우 자체적인 옵션을 통해 가능합니다. foo 라는 pool 은 마운트하지 않고 foosub 만 따로  /usr/home/kreoso/foosub 에 마운트하고싶을경우 

# zfs set mountpoint=legacy foo
# zfs set mountpoint=/usr/home/kreoso/foosub foo/foosub

으로 가능합니다. 여기서, set mountpoint 라는 부분에 주목해야 하는데, zfs 에는 여러가지 '속성'이 존재하고 그 속성을 바꾸는것은 set, 현재 속성을 보는것은 get 으로 이루어집니다. mountpoint 는 여러가지 속성중 하나이고요. 

FreeBSD ZFS 는 /etc/rc.conf 에서 zfs_enable="YES" 에 의해 부팅시 자동으로 모든 ZFS pool 과 서브볼륨이 옵션에 설정된대로(디폴트값은 /pool/subvolume 으로 pool 이나 서브볼륨이나 만드는 즉시 이렇게 마운트가 됩니다. 즉, 위의 경우는 /foo/foosub 에 이미 마운트가 된 상태입니다.) 마운트되고요. 레거시 마운트포인트는 말그대로 수동으로 마운트를 한다는 의미이기때문에 부팅시 자동 마운트를 하고싶지 않은 모든 pool 이나 subvolume 은 마운트포인트를 레거시로 바꿔주면 됩니다. 참고로, 위의 명령들은 즉각 적용되기때문에 실행하고 뒤져보면 /foo 가 사라져있고, /usr/home/kreoso/foosub 이 새로 생긴것을 보실 수 있을겁니다. 이제 foosub 의 소유자를 해당 유저(이경우 kreoso)로 돌려주기만 하면 됩니다. 


Btrfs

Btrfs 의 경우는 각 서브볼륨을 만들때마다 ID 가 생성되는데요. 이것을 이용하여 각 서브볼륨마다의 마운트장소를 지정할 수 있습니다. 서브볼륨의 ID 를 확인하는 방법은 마운트 후 간단한 명령으로 가능합니다. 즉,

# mount LABEL=foo -t btrfs /mnt
# btrfs subvolume list /mnt

를 해주면 서브볼륨의 ID 가 죽 출력됩니다. foosub 의 ID 는 256 이라 가정하겠습니다. ID 를 알았으면 이제 /home/kreoso/foosub 에 마운트해봅시다.(FreeBSD 의 경우 홈 파티션이 /usr/home 이고, 아치 리눅스(그리고 대부분의 리눅스 배포판)의 경우는 /home 입니다.)


Btrfs 의 마운트는 기존 파일시스템과 크게 다르지 않기때문에 ZFS 와 달리, 먼저 해당 디렉토리를 만들어주고 마운트하여야 합니다.  

# mkdir -p /home/kreoso/foosub
# mount LABEL=foo -t btrfs -o subvolid=256 /home/kreoso/foosub 

(user 디렉토리에 있고, user 가 사용할 목적이지만 그래도 root 소유로 디렉토리를 만드는것을 추천합니다. 어차피 마운트 되지 않은 상태의 디렉토리는 껍데기에 불과하여 유저가 그곳에 쓰기작업등을 할 필요도 없고 오히려 쓰기작업을 하면 안되기때문에 유저에게 쓰기권한을 주지 않는것이 좋습니다. 해당 디렉토리에 Btrfs 파일시스템이 마운트가 되면 그때 유저의 소유권으로 바꿔주면 되는데, 이때도 다시 언마운트 하면 껍데기는 root 소유로 돌아가므로 혹시 부팅시 어떤 문제로 마운트가 되지 않았을경우 유저가 마운트된것으로 착각하여 쓰기작업을 시도하는것을 방지할 수 있습니다.)

부팅시 자동으로 마운트되게 하려면 다른 파일시스템과 동일하게 /etc/fstab 를 이용하여 마운트합니다. 다만 옵션란에 ID 로 어떤 서브볼륨인지를 구분해주어야 합니다. 즉, /etc/fstab 에

LABEL=foo /home/kreoso/foosub btrfs subvolid=256 0 0

를 추가해주면 만들어주면 부팅시 /home/kreoso/foosub 에 foosub 서브볼륨이 자동으로 마운트됩니다. 이제 해당 서브볼륨 권한을 해당 유저로 돌려주기만 하면 유저는 해당 서브볼륨을 문제없이 사용가능하겠죠.


Btrfs 의 경우 각 서브볼륨을 파티션처럼 마운트하여 사용하기때문에 당연히 보안을 위한 exec=off 혹은 setuid=off 등의 옵션도 주는것이 가능합니다. 반면, ZFS 의 경우는 마운트하는 방식이 전통적인 파일시스템과 다르기때문에 이 방식도 조금 다른데요. 어떻게 보면 오히려 더 간단합니다. 

# zfs set setuid=off foo/foosub

이면 끝입니다. 이외에도 ZFS 는 서브볼륨 미러링도 제공하는데(raid1 이 디바이스 단위의 미러링이라면 ZFS 의 서브볼륨 미러링은 파일시스템 자체적인 미러링입니다.), foosub 에 중요자료를 저장할경우

zfs set copies=3 foo/foosub

옵션을 주시면 foosub 의 데이터가 총 3곳에 동일하게 쓰여져, 디스크 특정부분에 문제가 생겨 해당 디렉토리/파일에 액세스가 불가능할경우에 대비할 수 있습니다. 


Compression


이외에 Btrfs 나 ZFS 나 둘다 서브볼륨에 압축옵션도 지정이 가능합니다. 압축옵션은 두가지 목적으로 사용이 가능한데, 하나는 속도이고 다른 하나는 용량입니다. 오늘날 CPU 는 충분히 빠르지만, 디스크 I/O 는 느린경우가 많기때문에 남아도는 CPU 자원을 활용하여 빠르게 순간적으로 압축을 시켜서 10메가 I/O 작업이 필요한것을 5메가 I/O 작업정도로 줄여 빠르게 끝내는 경우 큰 속도이득을 볼 수 있고, 반대로 좀더 강력한 압축방식을 사용할경우 CPU 부담이 커져 오히려 속도면에서 떨어지는 경향이 있지만, 용량면에서는 더 이득을 볼 수 있습니다. 물론, 압축이 잘되는 데이터일수록 효과가 크며, 이미 압축되어 배포되는 미디어 및 사진등에는 거의 효과가 없고 CPU 리소스만 축내게 됩니다. 압축방식은 여러가지를 지원하니 속도와 용량 사이에 적절한 밸런스를 고려하여 선택하시면 됩니다. ZFS 의 경우 예를들어 gzip 방식으로 압축한다 할때, 

# zfs set compression=gzip foo/foosub

으로 지정해주면 되고 Btrfs 의 경우는 마운트 옵션인 compress 를 이용하여 예를들어 lzo 방식으로 압축한다 할때, 마운트시

# mount LABEL=foo -t btrfs -o compress=lzo /home/kreoso/foosub

으로 마운트해주시면 됩니다. 


Snapshots


ZFS

이제 본격적인 테마인 스냅샷에 대해 이야기해볼까 합니다. ZFS 와 Btrfs 는 모두 COW(Copy-on-write) 방식의 스냅샷을 지원하여 용량에 무관하게 1초백업 1초롤백이 가능합니다. COW 방식의 스냅샷이란 간단히 디스크의 특정 영역을 보호하는 기능이라 보시면 됩니다. 즉, COW 스냅샷을 걸면 처음에는 추가적인 쓰기작업등이 없이 그냥 해당 영역을 확보하고 종전과 똑같이 이용합니다. 다만, 해당 영역에 변화를 주는 작업이 이뤄지는 상황이 오게되면(예를들어 a.txt 파일이 스냅샷이 걸려있는데 이 파일을 조작하면) 이 a.txt 라는 파일이 새로운 영역에 카피되고 그 파일을 조작하는 방식으로 기존 영역을 보호합니다. 마찬가지로, 지울때도 기존 영역에 데이터는 그대로 보호된 상태로 남아있으며 유저에게 보이지만 않게 됩니다.(사실 스냅샷이 걸려있지 않은 일반적인 영역에서의 지우는 작업 역시 이와 마찬가지로 유저에게 보이지만 않을뿐인데, 일반적인 지우기 작업의 경우 데이터는 디스크에 남아있더라도 OS 레벨에서 그 데이터를 찾을 수 있는 실마리 자체를 완전히 없애며, 해당 데이터가 있는 영역을 따로 보호하지도 않기때문에 추가적인 쓰기작업이 있을시 해당 장소에 덧쓰기도 문제없이 가능하여 그냥 날아가는거라 보시면 됩니다.) 덕분에 COW 방식의 스냅샷은 백업시에 그저 기존 영역을 그대로 사용할뿐이니 1초만에 백업이 되고, 롤백시에도 보호하던 영역을 되돌리는것뿐이니 역시 1초만에 가능해집니다. 

물론, 위 설명에서 볼 수 있듯이, 이 스냅샷 백업은 동일 pool 내로 한정이고 다른 pool 혹은 파일시스템에 백업데이터의 전송을 시도할경우는 전통적인 백업과 똑같이 오랜 시간이 걸리며 용량도 똑같이 잡아먹습니다. 덕분에 본격적인 백업용도라기보다는 일종의 타임머신 기능이라 볼 수 있겠습니다. 즉, 특정 시점에 스냅샷을 걸어놓고 뭔가 잘못돌아갔다 싶으면 롤백하는 용도로 자주 쓰입니다. 또한 여러개의 스냅샷을 걸어주는것 역시 가능하기때문에 4월1일 스냅샷, 4월5일 스냅샷등등으로 여러개를 만들거나 혹은 일주일/한달간격으로 주기적으로 스냅샷을 만들도록 크론잡을 설정해서 돌려도 됩니다. 물론, 너무 많아지면 용량면에서 문제가 있을수도 있으니 자동으로 만들어지도록 설정할경우, 일정 이상 시간이 지난것은 자동으로 파괴되도록 설정해놓는것이 좋습니다. 

참고로, 이 스냅샷은 '서브볼륨 단위'로 가능하며, 위의 파티션 옵션, 압축옵션과 함께 서브볼륨을 어떤식으로 나누어야 하는가를 결정하는 가장 중요한 요소중 하나입니다. 즉, 스냅샷으로 타임머신 기능이 필요한 파일들이 있는 장소, 파티션 옵션을 주고싶은 장소, 특별히 압축이 잘되는 파일들이 있는 장소(보통 텍스트파일들이 압축이 가장 잘됩니다.)는 모두 서브볼륨으로 만들어주시고 적절한 옵션을 걸어주시면 큰 이득을 볼 수 있습니다. 

그럼 ZFS 와 Btrfs 의 서브볼륨인 foosub 에 스냅샷을 만들고 롤백하고 지우는 방법을 알아보겠습니다. 위에서도 말했듯이 타임머신 기능으로 자주 쓰이기때문에 일반적으로 스냅샷 이름을 날짜정보로 만들어 구분을 하며, ZFS 의 경우 스냅샷 이름은 pool이름/서브볼륨이름@스냅샷이름 형식입니다. 물론, 날짜정보 대신 다른것을 이용해도 됩니다. 먼저 ZFS 는

# zfs snapshot foo/foosub@2012-04-01

와 같은 방식으로 스냅샷을 만드는데, foosub 안의 모든 파일과 디렉토리의 스냅샷이 만들어집니다. 하지만, foosub 내에 또다른 ZFS 서브볼륨이 있을경우, 이 서브볼륨은 스냅샷에 포함되지 않습니다. foosub 내의 모든 서브볼륨을 포함하여 스냅샷을 만들어주고싶을 경우에는 -r, 즉 recursively 라는 옵션을 주어

# zfs snapshot -r foo/foosub@2012-04-01

로 해주시면 됩니다. 롤백도 마찬가지로 간단히 

# zfs rollback foo/foosub@2012-04-01

명령으로 가능하며, 마찬가지로 foosub 내의 모든 서브볼륨도 같이 롤백시키고 싶을때는(물론, 스냅샷을 만들때 -r 옵션을 주었어야 합니다.)

# zfs rollback -r foo/foosub@2012-04-01

로 가능합니다.

그럼 스냅샷이 제대로 만들어졌는지 확인을 해봅시다.

# zfs list -t snapshot

에서 만든 스냅샷이 보이면 성공입니다.  ZFS 의 스냅샷은 해당 서브볼륨의 .zfs/snapshot 안에 저장되기때문에

# ls /usr/home/kreoso/foosub/.zfs/snapshot

명령으로도 구경할 수 있습니다. 

만들고보니 날짜를 착각해서 2012-04-01 이 아니고 2012-04-2 로 바꿔야 한다면 간단히 다음과 같은 rename 명령으로 가능합니다.

# zfs rename foo/foosub@2012-04-01 foo/foosub@2012-04-02 

그럼 이제 필요없는 스냅샷을 지워봅시다. 각각의 스냅샷들은 서브볼륨을 삭제할때와 동일하게

# zfs destroy foo/foosub@2012-04-02

으로 스냅샷을 지울 수 있습니다.


Btrfs

이제 Btrfs 입니다. Btrfs 스냅샷은 ZFS 스냅샷과 달리 그냥 해당 서브볼륨을 하나 더 만들어 카피하는 형식입니다. 물론, 위에서 설명한 COW 방식이 적용되기때문에 용량을 공유하여 실제 카피는 아닙니다. 다만, 원래 서브볼륨 안의 데이터야 당연히 바꾸는게 가능하고, 거기 더해서 Btrfs 의 경우는 스냅샷 내부의 데이터에도 일반 서브볼륨처럼 간단히 접근하여 바꾸는게 가능하기때문에 그냥 동일한 데이터는 서로 공유하고 바뀌는 데이터만 서로 따로 카피하여 사용하는 형식의 서브볼륨 카피라 볼 수 있습니다. 만드는 방식도 일반적인 카피와 비슷하게 소스 타겟을 따로 지정하여 만듭니다. 단, 위의 COW 방식에서 설명했듯이 소스와 타겟은 '같은 파일시스템' 안이어야 합니다. 어떻게 보면 더 유연한 방식입니다. 

스냅샷을 만드는 방법은

# btrfs subvolume snapshot /home/kreoso/foosub /home/kreoso/foosub/snapshot01

이러면 그냥 간단히 foosub 안에 snapshot01 이라는 서브볼륨이 생기고 그곳에 찾아들어가보면 foosub 내부와 동일하게(물론, 새로 생성된 snapshot01 을 제외하고) 모든 데이터가 존재합니다. 물론 쓰고 조작하는것도 가능하고요. 덕분에 롤백명령이 따로 필요하지도 않은데, 그냥 카피하면 되기때문입니다. ZFS 와 마찬가지로 foosub 안의 모든 서브볼륨에도 스냅샷을 다 생성하고싶다면 -r 을 붙여주면 됩니다. 이경우, 

# btrfs subvolume snapshot -r /home/kreoso/foosub /home/kreoso/foosub/snapshot01

이 되겠죠. 지우는 방법도 그냥 아래에 설명할 서브볼륨 지우는것과 동일합니다. 


Destroy subvolume


자, 이제 그럼 만들고 사용하는 방법을 알았으니 서브볼륨이나 파일시스템을 지우는 방법도 알아야겠죠. 

위의 foosub 서브볼륨이 마음에 안들어 지우고싶을때는 ZFS 의 경우 마운트가 되어있건 안되어있건, 어디에 마운트되어있건 상관없이 그냥

# zfs destroy foo/foosub

으로 가능하며, Btrfs 는 역시 먼저 마운트된곳으로 이동 후

# cd /home/kreoso

# btrfs subvolume delete foosub

같은 방식으로 삭제합니다. 

마지막으로 ZFS pool 인 foo 자체를 지우고싶을때는 모든 서브볼륨을 다 지운 후,

# zpool destroy foo

해주시면 됩니다. Btrfs 는 그냥 일반 파일시스템들처럼 다른 파일시스템으로 포맷하면 되고요.

추가적으로 Btrfs 는 트림을 지원하고 SSD 를 위한 옵션이 있는데, 마운트 옵션에서 ssd 를 더해주시면 됩니다.

ZFS 의 경우는 그런 옵션이 없고 트림같은것도 지원을 하지 않는데, 그 이유는 엔터프라이즈 레벨의 고용량 디스크 기준으로 만들어졌기때문입니다. ZFS 는 'SSD  와 같이 작은 디스크에 사용' 하는것이 아닌, 'SSD 같은 작고 빠른 디스크를 캐시로 이용'하는것에 최적화된 파일시스템입니다.


Conclusion


지금까지 ZFS 와 Btrfs 의 기본적인 사용방법등을 알아보았는데, ZFS 의 경우 사실 파일시스템 자체적으로 NFS 나 CIFS/Samba 등도 지원하며 메모리와 SSD 를 캐시로 이용하여 고가의 하드웨어 레이드 카드 수준의 큰 속도향상을 노릴수도 있는등 이보다 훨씬 많은 옵션들을 지원하고 덕분에 제성능을 위해서는 여러가지 튜닝도 필요합니다.  즉, 일반적인 데스크탑 용도로는 좀 오버라 할 수 있습니다. 

출처 : http://korerk.blogspot.kr/2012/04/zfs-btrfs.html

ZFS 와 Btrfs

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다