前からどうしようと思っていたNASのリプレイスのため、いくつか試験してみたのでメモ。環境はさっきダウンロードしてきたOpenIndiana(io_148) x86/64bitをVMWare上で動かした物。c2t0d0が起動ディスクで、c2t1d0, c2t2d0, c2t5d0が200MBの玉、c2t3d0, c2t4d0, c2t6d0が400MBの玉。連番じゃないのはちょっとミスしたからで他意はない。

容量制限したスライスでpool

市販されているHDDは、1TBと書いてあっても1TB(1 * 1000 * 1000 * 1000 * 1000 bytes)ではなくてそれよりいくらか多いのが普通だ。そのため、HDDをそのまま全容量でつかっていると、故障などの際に簡単に入れ替えられなくなる。それどころか違うインタフェイスに繋いだだけでそうなることもあるので(なっているので)、そうならないように容量制限したスライスを切って、スライスでRAIDZ1を組んでみる。

formatする

root@solaris:~# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c2t0d0 
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c2t1d0 
          /pci@0,0/pci15ad,1976@10/sd@1,0
       2. c2t2d0 
          /pci@0,0/pci15ad,1976@10/sd@2,0
       3. c2t3d0 
          /pci@0,0/pci15ad,1976@10/sd@3,0
       4. c2t4d0 
          /pci@0,0/pci15ad,1976@10/sd@4,0
       5. c2t5d0 
          /pci@0,0/pci15ad,1976@10/sd@5,0
       6. c2t6d0 
          /pci@0,0/pci15ad,1976@10/sd@6,0
Specify disk (enter its number): 1
selecting c2t1d0
[disk formatted]

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !     - execute , then return
        quit
format> p

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        expand - expand label to use whole disk
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        ! - execute , then return
        quit
partition> print
Current partition table (original):
Total disk sectors available: 402979 + 16384 (reserved sectors)

Part      Tag    Flag     First Sector      Size      Last Sector
  0        usr    wm               256   196.66MB       403012
  1 unassigned    wm                 0        0            0
  2 unassigned    wm                 0        0            0
  3 unassigned    wm                 0        0            0
  4 unassigned    wm                 0        0            0
  5 unassigned    wm                 0        0            0
  6 unassigned    wm                 0        0            0
  8   reserved    wm            403013     8.00MB       419396    

partition> 0
Part      Tag    Flag     First Sector      Size      Last Sector
  0        usr    wm               256   196.66MB       403012    

Enter partition id tag[usr]:
Enter partition permission flags[wm]:
Enter new starting Sector[256]:
Enter partition size[402757b, 403012e, 196mb, 0gb, 0tb]: 150mb
partition> print
Current partition table (unnamed):
Total disk sectors available: 402979 + 16384 (reserved sectors)

Part      Tag    Flag     First Sector      Size      Last Sector
  0        usr    wm               256   150.00MB       307455
  1 unassigned    wm                 0        0            0
  2 unassigned    wm                 0        0            0
  3 unassigned    wm                 0        0            0
  4 unassigned    wm                 0        0            0
  5 unassigned    wm                 0        0            0
  6 unassigned    wm                 0        0            0
  8   reserved    wm            403013     8.00MB       419396    

partition> label
Ready to label disk, continue? y

partition> quit

以下省略。とりあえず200MBの玉のなかに150MBのs0スライスを作った。

zpool作成

上記の玉3本でraidz1を作る

root@solaris:~# zpool create tank raidz1 c2t1d0s0 c2t2d0s0 c2t5d0s0
root@solaris:~# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            c2t1d0s0  ONLINE       0     0     0
            c2t2d0s0  ONLINE       0     0     0
            c2t5d0s0  ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zfs list tank
NAME                     USED  AVAIL  REFER  MOUNTPOINT
tank                     144K   258M  40.0K  /tank

特に問題なく作れたようだ。150MB*3でうち1本がパリティなので300MB弱程度あればいいはずなので若干容量が少ないが管理データだろうと思っておく。

ディスク丸ごと使ったディスクをスライスにreplace

zfsでは構成しているディスクを入れ替え(replace)が出来る。条件は容量が等しいか大きいか。元々丸ごとディスクで定義してあったものをスライスに持って行ければ自宅NASのリプレイスが簡単になる。早速試す。
下記作業の前にc2t3d0, c2t4d0, c2t6d0のs0はすべて350MBにして作っておいてある。長いので省略。

root@solaris:~# zpool create tank raidz1 c2t1d0 c2t2d0 c2t5d0
root@solaris:~# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c2t1d0  ONLINE       0     0     0
            c2t2d0  ONLINE       0     0     0
            c2t5d0  ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   120K   352M  40.0K  /tank

これで200MB*3のraidz1ができる。丸ごとHDDで構成した普通の作り。これをそれぞれc2t[3,4,6]d0s0にreplaceしていく。

root@solaris:~# zpool replace tank c2t1d0 c2t3d0s0
root@solaris:~# zpool status tank
  pool: tank
 state: ONLINE
 scan: resilvered 55K in 0h0m with 0 errors on Tue Jun 28 18:54:39 2011
config:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            c2t3d0s0  ONLINE       0     0     0
            c2t2d0    ONLINE       0     0     0
            c2t5d0    ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zpool replace tank c2t2d0 c2t4d0s0
root@solaris:~# zpool replace tank c2t5d0 c2t6d0s0
root@solaris:~# zpool status tank
  pool: tank
 state: ONLINE
 scan: resilvered 63K in 0h0m with 0 errors on Tue Jun 28 18:55:01 2011
config:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            c2t3d0s0  ONLINE       0     0     0
            c2t4d0s0  ONLINE       0     0     0
            c2t6d0s0  ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   138K   351M  40.0K  /tank

これで入れ替えは出来たが容量が変わらない。zpoolのautoexpand(自動容量拡張)プロパティを一度ONにしてやる必要がある。デフォルトはoffにしておいたほうが勝手に容量が変わらないので不慮の事故を防げるだろう。

root@solaris:~# zpool set autoexpand=on tank
root@solaris:~# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank   158K   658M  40.0K  /tank
root@solaris:~# zpool set autoexpand=off tank
root@solaris:~# zpool status tank
  pool: tank
 state: ONLINE
 scan: resilvered 63K in 0h0m with 0 errors on Tue Jun 28 18:55:01 2011
config:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            c2t3d0s0  ONLINE       0     0     0
            c2t4d0s0  ONLINE       0     0     0
            c2t6d0s0  ONLINE       0     0     0

errors: No known data errors

これで若干のresilverとともに移行が完了した。

本番での適用

この検証結果を適用したい本番サーバは1TBのHDD(WD10EADS)が10本ささっていて、うち8本でraidz2構成になっているサーバだが、この検証で安心してディスクリプレイスが可能になった。
ひとまずリプレイス時には3TBクラスのHDDを購入の上、スライスを3*10^12bytesに切ってreplaceしていくと良さそうだ。Oracleに買収されて今後のzfs開発がどうなるかわからないが、他に代替のないファイルシステムである以上今後も使っていくことになるだろう。今後もzfsが消えないで無償で提供され続けることを期待したい。

Something to say?