zfs 사용기?

오랫동안 사용하던 E450이 문제가 있어서 수리를 하면서, 그동안 사용하던 solaris9를 solaris10으로 다시 설치했다. disksuit로 구성을 하려다가 오래전에 본 비디오가 생각나서 zfs로 구성을 해 보기로 했다.

개념은 굉장히 간단하며, 사용방법 또한 metadb를 구성하는 것보다 간단하다. 하지만, 아직 확실한 개념 정립이 되지 않아서…

사용하는 디스크는 모두 6개로, 9GB 3개와 18GB 3개다. 9GB 1개는 OS를 설치했고, 나머지는 모두 사용하지 않는 상태다. 디스크는 아래와 같다

bash-3.00# format
Searching for disks…done
AVAILABLE DISK SELECTIONS:
0. c0t0d0 <SUN9.0G cyl 4924 alt 2 hd 27 sec 133>
/pci@1f,4000/scsi@3/sd@0,0
1. c0t1d0 <FUJITSU-MAE3091L SUN9.0G-0706-8.43GB>
/pci@1f,4000/scsi@3/sd@1,0
2. c0t2d0 <IBM-DDRS39130SUN9.0G-S98E-8.43GB>
/pci@1f,4000/scsi@3/sd@2,0
3. c2t0d0 <FUJITSU-MAG3182L SUN18G-1111-16.87GB>
/pci@1f,4000/scsi@4/sd@0,0
4. c3t2d0 <SEAGATE-ST318203LSUN18G-034A-16.87GB>
/pci@1f,4000/scsi@4,1/sd@2,0
5. c3t3d0 <SEAGATE-ST318203LC-0002-16.96GB>
/pci@1f,4000/scsi@4,1/sd@3,0
Specify disk (enter its number):

먼저, zpool을 사용하여 디스크 풀(이름은 fox_pool로 했다)을 만든다. (18GB 짜리 3개)

#zpool create fox_pool c2t0d0 c3t2d0 c3t3d0

#zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
fox_pool               58.8G    102K   58.7G     0%  ONLINE     –

9GB 디스크를 하나 더 추가했다.

 #zpool add -f fox_pool c0t2d0

예전의 disk suit이 디스크 size에 민감했던 반면에, zfs는 디스크 size가 달라도 잘 추가가 된다.  상태를 확인해보면,

# zpool status
pool: fox_pool
state: ONLINE
scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
fox_pool    ONLINE       0     0     0
c2t0d0    ONLINE       0     0     0
c3t2d0    ONLINE       0     0     0
c3t3d0    ONLINE       0     0     0
c0t2d0    ONLINE       0     0     0

errors: No known data errors

이렇게  pool을 생성하면 /에 pool이름이 자동으로 마운트되어 사용가능한 상태가 된다. 이게 영 맘에 안들어서 zpool destroy로 만든 pool을 삭제하고 다시 생성했다(마운트하는 방법을 몰라서… ;ㅡㅡ)

#zpool create -f -m /export/home fox_pool c2t0d0 c3t2d0 c3t3d0 c0t2d0

그런데, 이것이 굳이 이럴 필요가 있는것인지 알 수가 없다. 왜냐하면, zfs 로  /export/home 에 zfs를 마운트할 수 있기 때문이다. 즉, 하나의 디스크 풀을 각기 다른 디렉토리에 마운트 할 수 있는것 같다. 그래서 oracle 프로그램용으로 zfs를 생성해서 마운트 해보았다.

 #zfs create fox_pool/oracle mount /oracle  —> error

#zfs create fox_pool/oracle

# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
fox_pool          130K  57.8G    31K  /export/home
fox_pool/oracle  24.5K  57.8G  24.5K  /export/home/oracle

생성은 잘 되었지만, 문제가 있다. 나는 oracle을 /에 마운트 하고 싶은 것이다.

# zfs destroy fox_pool/oracle
# zfs list
NAME       USED  AVAIL  REFER  MOUNTPOINT
fox_pool  99.5K  57.8G    30K  /export/home

그래서 삭제를 해 버렸다.

여기서 어떻게 해야할지 모르겠다……   자, 답을 알아냈다

#zfs create fox_pool/oracle
#zfs set mountpoint=/oracle   fox_pool/oracle

마운트 포인트를 변경하니 해결이 된다.

자, 여기서, 일부러 에러를 유발하여 복구시켜보았다.

#dd if=/dev/urandom of=/dev/c3t3d0s0 bs=1024 count=10000

s0는 디스크들의 정보가 기록되는 슬라이스로 보이는데, 이곳을 쓰레기 값으로 채워넣은 것이다.

#zpool scrub fox_pool

이 에러는 복구가 되지 않았다. 사실 내가 원하는것은 이것이 아니었다. 그 후 여러번의 시행 착오를 거쳐서 알아낸 것은, zpool 생성시 어떤 옵션도 주지 않으면 디스크들이 stripe 로 묶이는 것이며, mirror 옵션을 주던가 아니면 가장 중요한, raidz 옵션을 주는 것이다.  사실 내가 원하던 것은 Raid5 였다.  mirror도 좋지만, 디스크 두개중 한개밖에 사용할 수 없으니까.

아무튼, Raid-Z 로 디스크를 구성했다. Raid5와 다른점은 디스크 두개로도 구성이 가능하다는 점이다. 사실 이 경우는 mirror와 별 차이가 없는것 같다.

# zpool create fox_pool raidz c2t0d0 c3t2d0
# zpool status
pool: fox_pool
state: ONLINE
scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
fox_pool    ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c2t0d0  ONLINE       0     0     0
c3t2d0  ONLINE       0     0     0

errors: No known data errors
# df -h

fox_pool                16G    24K    16G     1%    /fox_pool

# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
fox_pool               33.5G    178K   33.5G     0%  ONLINE     –

두 개의 디스크에 다시 에러를 유발시킨다. 여기서는 두번째 디스크 c3t2d0s0에 쓰레기값을 넣었다.

# zpool scrub fox_pool
# zpool status
pool: fox_pool
state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using ‘zpool clear’ or replace the device with ‘zpool replace’.
see: http://www.sun.com/msg/ZFS-8000-9P
scrub: scrub completed with 0 errors on Tue May 27 22:00:49 2008
config:

NAME        STATE     READ WRITE CKSUM
fox_pool    ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c2t0d0  ONLINE       0     0     0
c3t2d0  ONLINE       0     0    27

errors: No known data errors

에러를 수정하는 방법에는 두가지가 있다. clear나 replace하는 방법이다. 나는 디스크가 하나 더 있기때문에, replace했다.

#zpool replace fox_pool c3t2d0 c3t3d0
# zpool status
pool: fox_pool
state: ONLINE
scrub: resilver completed with 0 errors on Tue May 27 22:02:22 2008
config:

NAME           STATE     READ WRITE CKSUM
fox_pool       ONLINE       0     0     0
raidz1       ONLINE       0     0     0
c2t0d0     ONLINE       0     0     0
replacing  ONLINE       0     0     0
c3t2d0   ONLINE       0     0    27
c3t3d0   ONLINE       0     0     0

errors: No known data errors

잠시후 확인해보면 디스크가 바뀌어 있는것을 확인 할 수 있다.

 zpool status
pool: fox_pool
state: ONLINE
scrub: scrub completed with 0 errors on Tue May 27 22:09:20 2008
config:

NAME        STATE     READ WRITE CKSUM
fox_pool    ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c2t0d0  ONLINE       0     0     0
c3t3d0  ONLINE       0     0     0

errors: No known data errors

 

fox_pool에 남은 c3t2d0를 추가하기 위하여 zpool add명령을 사용했다.

결과는 별로다. 디스크가 raidz로 추가되는 것이 아니라, 기존의 raidz1과 stripe로 묶여버린 것이다. 물론, raidz 옵션을 추가할때 넣어봤지만, 이경우역시 작동되지 않았다.

# zpool status
pool: fox_pool
state: ONLINE
scrub: none requested
config:

NAME        STATE     READ WRITE CKSUM
fox_pool    ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c2t0d0  ONLINE       0     0     0
c3t3d0  ONLINE       0     0     0
c3t2d0    ONLINE       0     0     0

errors: No known data errors

그래서 다시 디스크 세개로 fox_pool을 생성하였으며, 역시 에러를 유발한 후 테스트 하였다.

# zpool scrub fox_pool
# zpool status
pool: fox_pool
state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using ‘zpool clear’ or replace the device with ‘zpool replace’.
see: http://www.sun.com/msg/ZFS-8000-9P
scrub: scrub completed with 0 errors on Tue May 27 21:44:42 2008
config:

NAME        STATE     READ WRITE CKSUM
fox_pool    ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c2t0d0  ONLINE       0     0     0
c3t2d0  ONLINE       0     0     0
c3t3d0  ONLINE       0     0    38

errors: No known data errors

같은방식으로 에러를 유발했다. c3t3d0의 체크섬이 38이다. 이것은 아래 명령으로 수정가능하다.

bash-3.00# zpool clear fox_pool c3t3d0
bash-3.00# zpool status
pool: fox_pool
state: ONLINE
scrub: scrub completed with 0 errors on Tue May 27 21:44:42 2008
config:

NAME        STATE     READ WRITE CKSUM
fox_pool    ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c2t0d0  ONLINE       0     0     0
c3t2d0  ONLINE       0     0     0
c3t3d0  ONLINE       0     0     0

errors: No known data errors

다음은 snapshot을 만들어 보았다. snapshot은 만드는 시점의 데이타를 한번만 반영하는것 같다. 말 그대로 스냅샷을 수행하던 시점의 백업을 만드는 것 같다.

fox_pool에 zfs로 화일시스템을 만들고 세개의 화일(test.txt, last.txt, words)을 생성했다.  그리고 스냅샷을 만들었다.

# ls -al
total 576
drwxr-xr-x   2 root     sys            5 May 27 22:26 .
drwxr-xr-x   3 root     sys            3 May 27 22:25 ..
-rw-r–r–   1 root     root        7105 May 27 22:26 last.txt
-rw-r–r–   1 root     root       16566 May 27 22:26 test.txt
-r–r–r–   1 root     root      206663 May 27 22:26 words

# zfs snapshot fox_pool/home@snap1
bash-3.00# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
fox_pool              424K  33.1G  35.3K  /fox_pool
fox_pool/home         316K  33.1G   316K  /fox_pool/home
fox_pool/home@snap1      0      –   316K  –

# rm words
# ls -al
total 58
drwxr-xr-x   2 root     sys            4 May 27 22:37 .
drwxr-xr-x   3 root     sys            3 May 27 22:25 ..
-rw-r–r–   1 root     root        7105 May 27 22:26 last.txt
-rw-r–r–   1 root     root       16566 May 27 22:26 test.txt
bash-3.00# zfs snapshot fox_pool/home@snap2
bash-3.00# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
fox_pool              467K  33.1G  35.3K  /fox_pool
fox_pool/home         348K  33.1G  57.9K  /fox_pool/home
fox_pool/home@snap1   290K      –   316K  –
fox_pool/home@snap2      0      –  57.9K  –

스냅샷은 /fox_pool/home/.zfs/snapshot/snap1 과, /fox_pool/home/.zfs/snapshot/snap2에 각각 저장되어 있다.

# pwd
/fox_pool/home/.zfs/snapshot/snap2
# ls
last.txt  test.txt
# cd ../snap2
# ls
last.txt  test.txt

snap1로 롤백을 해보았다.

# zfs rollback fox_pool/home@snap1
cannot rollback to ‘fox_pool/home@snap1’: more recent snapshots exist
use ‘-r’ to force deletion of the following snapshots:
fox_pool/home@snap2
# zfs rollback -r fox_pool/home@snap1
cannot unmount ‘/fox_pool/home’: Device busy
bash-3.00# pwd
/fox_pool/home
# ls
# cd ..
# zfs rollback -r fox_pool/home@snap1
# cd home
# ls
last.txt  test.txt  words

이때, 나중에 만든 snap2는 snap1이 만들어지던 시점에는 존재하지않았기때문에, 지워져 버렸다.. 🙁 그래서 경고메시지가 나왔었군…

암튼, 스냅샷은 디스크를 차지하고 있으므로, 필요가 없으면 제거해준다.

#zfs  destroy fox_pool/home@snap1

스냅샷이 저장되는 디렉토리 .zfs 는 ls -al로는 확인이 되지 않았지만, 그 이후는 확인이 가능했다. 아울러, 필요한 화일을 직접 복사하는것도 가능했다.

여기까지 사용해본 소감은, 참 편리하다는거. newfs도 필요없고, 마운트도 필요없고. 생성속도 또한 빠르다. disksuit을 사용해야할 이유를 더 이상 찾을 수가 없다.(물론, solaris10이 아니라면 선택의 여지가 없겠지만…)

마지막으로 참고사이트 : http://docs.sun.com/app/docs/doc/819-5461?l=en  너무 늦게 발견 ;ㅡㅡ

1 comment

    • on 2008년 11월 3일 at 10:55 오전
    • Reply

    https://skyfox.gaegle.co.kr:6789/zfs

    만약, 접속 안되면
    /usr/sbin/smcwebserver start

답글 남기기

Your email address will not be published.