ZFS 기반의 NAS/SAN 스토리지 만들기

1.1 ZFS사용해 보기

1.1.1 zpool

zpool 이란 간단히 설명하자면 디바이스,파티션(slice),파일들을 이용하여 용도에 맞게 그룹화 해둔 가상의 공간이라고 생각하면 된다.
수영장을 떠올려보면 간단히 이해가 될 것이다. 유아용풀,1M풀,2M풀을 만들어서 적합한 사람들을 배분을 하듯
스토리지 영역을 용도에 맞게 생성해서 서비스를 하기 위한 것이 zpool인 것이다.

1.1.1.1 디스크 확인

먼저 시스템에 설치된 디스크를 검색한다. format 명령을 이용해서 확인한다.

root@zfs-storage:/# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c2t0d0 <VMware-Virtualdisk-1.0 cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c2t1d0 <VMware-Virtual disk-1.0-30.00GB>
          /pci@0,0/pci15ad,1976@10/sd@1,0
       2. c2t2d0 <VMware-Virtual disk-1.0-30.00GB>
          /pci@0,0/pci15ad,1976@10/sd@2,0
       3. c2t3d0 <VMware-Virtualdisk-1.0 cyl 1303 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@3,0
       4. c2t4d0 <VMware-Virtualdisk-1.0 cyl 1303 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@4,0
Specify disk (enter its number): ^C
root@zfs-storage:/# 

 

1.1.1.2 zpool 생성 및 확인

zpool create 스토리지풀이름 장치…

 c2t1d0,c2t2d0 두개의 디스크로 storagepool을 생성하는 예제이다.
zpool create storagepool c2t1d0 c2t2d0

 

zpool list 스토리지풀이름(생략가능) 또는 zpool status 스토리지풀이름(생략가능)

root@zfs-storage:/# zpool status storagepool
  pool: storagepool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        storagepool  ONLINE       0     0     0
          c2t1d0    ONLINE       0     0     0
          c2t2d0    ONLINE       0     0     0

errors: No known data errors
root@zfs-storage:/# zpool list storagepool
NAME          SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
storagepool  59.5G  98.5K  59.5G         -     0%     0%  1.00x  ONLINE  -
root@zfs-storage:/# 

 

파일로도 스토리지풀을 생성할 수 있다.

root@zfs-storage:/# mkdir /zfsfiles &&cd /zfsfiles&&mkfile 1g file1 file2 file3
root@zfs-storage:/zfsfiles# zpool create filepool /zfsfiles/file1 /zfsfiles/file2
root@zfs-storage:/zfsfiles# zpool status filepool
  pool: filepool
 state: ONLINE
  scan: none requested
config:

        NAME               STATE     READ WRITE CKSUM
        filepool           ONLINE       0     0     0
          /zfsfiles/file1  ONLINE       0     0     0
          /zfsfiles/file2  ONLINE       0     0     0

errors: No known data errors
root@zfs-storage:/zfsfiles# 

 

1.1.1.3 zpool 삭제

zpool destroy 스토리지풀네임

root@zfs-storage:/# zpool destroy storagepool
root@zfs-storage:/# zpool status
  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c2t0d0s0  ONLINE       0     0     0

errors: No known data errors
root@zfs-storage:/# 

 

1.1.1.4 zpool에 device 추가 하기

root@zfs-storage:/zfsfiles# zpool add storagepool c2t3d0
root@zfs-storage:/zfsfiles# zpool status storagepool
  pool: storagepool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        storagepool  ONLINE       0     0     0
          c2t1d0    ONLINE       0     0     0
          c2t2d0    ONLINE       0     0     0
          c2t3d0    ONLINE       0     0     0

errors: No known data errors

 

1.1.1.5 zpool에서 device 제거하기

제대로 쭉 읽어보신 분들은 센스가 넘치시기 때문에 당연히 아래의 명령을 생각할 것이다. :-)

zpool remove stroagepool c2t3d0

결과는 어떠한가? 불행히도 위의 명령은 아래와 같은 응답을 보내온다.

cannot remove c2t3d0: only inactive hot spares, cache, top-level, or log devices can be removed

 

뭐 당연하겠지만 데이터 무결성을 위해 실제 데이터가 담겨져있을지 모르는 장치는 zpool에서는 절대 삭제 할 수 없게 설계가 되어있다.
비활성화된 핫스페어,캐시,로그 디스크들만 스토리지 풀에서 제거가 가능하다.
따라서 무작정 스토리지풀에 장치들을 추가하지 말고 미리 잘 설계해서 생성을 하도록 하자.

1.1.1.6 zpool 장치 attach,detach

ZFS의 재미난 기능 중 하나이다. 혹자는 ZFS를 찰흙같은 파일시스템이라고도 이야기를 한다.
위의 명령은 싱글 디스크를 미러링 디스크로 생성하고자 하는 경우에 많이 사용한다.
제 강좌를 잘 읽어보신 분은 [http]OmniOS설치편에서 언급한 내용을 기억하시리라.
안전한 시스템을 위해서 OS가 설치된 디스크는 가급적 미러링을 하는 것이 좋다고.
기존 디스크에 데이터가 있는 경우에는 자동으로 데이터 복제(resilvering)를 한다.
 단일디스크 스토리지풀에 추가 디스크를 attach하여 미러링 한다. 
root@zfs-storage:/zfsfiles# zpool create storagepool c2t1d0
root@zfs-storage:/zfsfiles# zpool status storagepool
  pool: storagepool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        storagepool  ONLINE       0     0     0
          c2t1d0    ONLINE       0     0     0

errors: No known data errors
root@zfs-storage:/zfsfiles# zpool attach storagepool c2t1d0 c2t2d0
root@zfs-storage:/zfsfiles# zpool status storagepool
  pool: storagepool
 state: ONLINE
  scan: resilvered 59.5K in 0h0m with 0 errors on Tue May 12 20:19:45 2015
config:

        NAME        STATE     READ WRITE CKSUM
        storagepool  ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0

errors: No known data errors

 

미러상태의 mirror-0에서 c2t2d0를 제거한다.
root@zfs-storage:/zfsfiles# zpool detach storagepool c2t2d0
root@zfs-storage:/zfsfiles# zpool status storagepool
  pool: storagepool
 state: ONLINE
  scan: resilvered 59.5K in 0h0m with 0 errors on Tue May 12 20:19:45 2015
config:

        NAME        STATE     READ WRITE CKSUM
        storagepool  ONLINE       0     0     0
          c2t1d0    ONLINE       0     0     0

errors: No known data errors

1.1.1.7 zpool split

위의 기능도 나름 재미난 기능 중 하나이다.
아래를 보자 미러링된 storagepool 이 있다.

root@zfs-storage:/zfsfiles# zpool status storagepool
  pool: storagepool
 state: ONLINE
  scan: resilvered 74.5K in 0h0m with 0 errors on Tue May 12 20:35:28 2015
config:

        NAME        STATE     READ WRITE CKSUM
        storagepool  ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0

errors: No known data errors

 

아래는 기존의 storagepool을 storagepool과 newpool로 나누는 과정이다.
버전 관리 시스템을 사용하는 개발자들은 어디서 많이 보던것 같지 않나?
흡사 버전 관리 시스템의 branch 과정과도 닮아있다.
분리되는 시점부터는 각각의 스토리지풀에 데이터들을 다르게 저장할 수 있다.
참고) 분리될 때는 미러링풀에 추가된 마지막 디바이스가 분리가 된다.
root@zfs-storage:/zfsfiles# zpool split storagepool newpool
root@zfs-storage:/zfsfiles# zpool import newpool
root@zfs-storage:/zfsfiles# zpool status
  pool: newpool
 state: ONLINE
  scan: resilvered 74.5K in 0h0m with 0 errors on Tue May 12 20:35:28 2015
config:

        NAME        STATE     READ WRITE CKSUM
        newpool     ONLINE       0     0     0
          c2t2d0    ONLINE       0     0     0

errors: No known data errors

  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c2t0d0s0  ONLINE       0     0     0

errors: No known data errors

  pool: storagepool
 state: ONLINE
  scan: resilvered 74.5K in 0h0m with 0 errors on Tue May 12 20:35:28 2015
config:

        NAME        STATE     READ WRITE CKSUM
        storagepool  ONLINE       0     0     0
          c2t1d0    ONLINE       0     0     0

errors: No known data errors
root@zfs-storage:/zfsfiles#

 

1.1.1.8 zpool history

zpool 관련 기록을 확인할 수 있다.

root@zfs-storage:/zfsfiles# zpool history storagepool
History for 'storagepool':
2015-05-12.20:19:24 zpool create storagepool c2t1d0
2015-05-12.20:19:50 zpool attach storagepool c2t1d0 c2t2d0
2015-05-12.20:21:31 zpool detach storagepool c2t2d0
2015-05-12.20:35:33 zpool attach storagepool c2t1d0 c2t2d0
2015-05-12.20:37:52 zpool split storagepool newpool
2015-05-12.20:54:45 zpool add storagepool c2t2d0

 

1.1.1.9 zpool iostat

zpool의 I/O 상태를 볼 수 있다.

root@zfs-storage:/zfsfiles# zpool iostat -v(device별로 보고자 할 때) storagepool(스토리지풀이름) 2(2초 간격으로 갱신)
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
storagepool   120K  59.5G      0      0    518  3.14K
  c2t1d0     108K  29.7G      0      0    354  2.32K
  c2t2d0      12K  29.7G      0      0    589  2.92K
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
storagepool   120K  59.5G      0      0      0      0
  c2t1d0     108K  29.7G      0      0      0      0
  c2t2d0      12K  29.7G      0      0      0      0
----------  -----  -----  -----  -----  -----  -----

 

1.1.1.10 zpool export/import

zpool split에서도 잠깐 언급되었던 zpool import 명령이다.
zfs의 장점중 하나인 스토리지풀 export/import 기능이다.
zfs를 사용 가능한 모든 시스템과 데이터를 주고 받을 수 있다.
참고)
zpool export 를 하게 되면 시스템상에서는 더이상 접근이 안된다(umount된다고 보면 된다)
zpool import 명령은 가져올 수 있는 스토리지풀을 보여주고 실제로는 가져오지 않는다. 반드시 가져올 스토리지풀이름과 같이 사용해야 한다.
예제는 같은 시스템에서 export/import를 했지만 실제로는 export한 상태에서
다른 시스템에 디스크들을 장착하고 import 하면 즉시 사용이 가능하다.

root@zfs-storage:/zfsfiles# zpool export storagepool
root@zfs-storage:/zfsfiles# zpool status storagepool
cannot open 'storagepool': no such pool
root@zfs-storage:/zfsfiles# zpool import            
   pool: storagepool
     id: 7781812689192487853
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

        storagepool  ONLINE
          c2t1d0    ONLINE
          c2t2d0    ONLINE
root@zfs-storage:/zfsfiles# zpool import storagepool
root@zfs-storage:/zfsfiles# zpool status storagepool
  pool: storagepool
 state: ONLINE
  scan: resilvered 74.5K in 0h0m with 0 errors on Tue May 12 20:35:28 2015
config:

        NAME        STATE     READ WRITE CKSUM
        storagepool  ONLINE       0     0     0
          c2t1d0    ONLINE       0     0     0
          c2t2d0    ONLINE       0     0     0

errors: No known data errors

 

1.1.2 zfs

1.1.2.1 zfs create

zfs 파일시스템또는 볼륨을 생성한다.
기본적으로 스토리지풀 하위 디렉토리로 생성이 된다.
zfs create storagepool/home
zfs create -V 10G storage/zvol1

 

참고)
-V 옵션으로 생성된 zvol은 가상의 블럭디바이스로 만들어서 즉시 사용은 불가능하며
일반적인 디스크 처럼 파티션을 나누고 포맷을 해야지만 사용이 가능하다.
보통 block device 기반의 iscsi나 FC target mode에서 가상의 하드디스크를 제공하고자 하는 경우 많이 사용한다.

1.1.2.2 zfs set

zfs 파일시스템의 환경설정을 하고자 하는 경우 사용한다.
파일시스템 성능과도 관련된 플래그들이 많이 존재하므로 정확하지 않는다면 설정값으 바꾸지 말기를 바란다.
몇 가지 예제를 보겠다.

zfs set mountpoint=/export/home tank/home(zfs를 특정 디렉토리로 마운트 한다)
zfs set sharenfs=on tank/home (zfs의 nfs공유기능을 사용한다)
zfs set compression=on tank/home(zfs의 압축기능을 사용한다)
zfs set quota=10G tank/home(tank/home 파일시스템에 대해서는 10G로 용량을 제한한다) 
zfs set dedup=on tank/home (중복제거 기능을 활성화 한다)

 

1.1.2.3 zfs get

zfs 파일시스템이나 볼륨에 대한 환경 설정값을 확인한다.
강좌의 첫장에서도 언급했지만 zfs는 별도의 환경 설정파일이 존재하지 않는다.
다양한 정보들을 확인할 수 있을 것이다.

root@zfs-storage:/zfsfiles# zfs get all storagepool/home
NAME              PROPERTY              VALUE                  SOURCE
storagepool/home  type                  filesystem             -
storagepool/home  creation              Tue May 12 21:40 2015  -
storagepool/home  used                  19K                    -
storagepool/home  available             47.3G                  -
storagepool/home  referenced            19K                    -
storagepool/home  compressratio         1.00x                  -
storagepool/home  mounted               no                     -
storagepool/home  quota                 none                   default
storagepool/home  reservation           none                   default
storagepool/home  recordsize            128K                   default
storagepool/home  mountpoint            /storagepool/home      local
storagepool/home  sharenfs              off                    default
storagepool/home  checksum              on                     default
storagepool/home  compression           off                    default
storagepool/home  atime                 on                     default
storagepool/home  devices               on                     default
storagepool/home  exec                  on                     default
storagepool/home  setuid                on                     default
storagepool/home  readonly              off                    default
storagepool/home  zoned                 off                    default
storagepool/home  snapdir               hidden                 default
storagepool/home  aclmode               discard                default
storagepool/home  aclinherit            restricted             default
storagepool/home  canmount              on                     default
storagepool/home  xattr                 on                     default
storagepool/home  copies                1                      default
storagepool/home  version               5                      -
storagepool/home  utf8only              off                    -
storagepool/home  normalization         none                   -
storagepool/home  casesensitivity       sensitive              -
storagepool/home  vscan                 off                    default
storagepool/home  nbmand                off                    default
storagepool/home  sharesmb              off                    default
storagepool/home  refquota              none                   default
storagepool/home  refreservation        none                   default
storagepool/home  primarycache          all                    default
storagepool/home  secondarycache        all                    default
storagepool/home  usedbysnapshots       0                      -
storagepool/home  usedbydataset         19K                    -
storagepool/home  usedbychildren        0                      -
storagepool/home  usedbyrefreservation  0                      -
storagepool/home  logbias               latency                default
storagepool/home  dedup                 off                    default
storagepool/home  mlslabel              none                   default
storagepool/home  sync                  standard               default
storagepool/home  refcompressratio      1.00x                  -
storagepool/home  written               19K                    -
storagepool/home  logicalused           9.50K                  -
storagepool/home  logicalreferenced     9.50K                  -
storagepool/home  filesystem_limit      none                   default
storagepool/home  snapshot_limit        none                   default
storagepool/home  filesystem_count      none                   default
storagepool/home  snapshot_count        none                   default
storagepool/home  redundant_metadata    all                    default

 

Pages:

stone has written 25 articles

Leave a Reply