前からどうしようと思っていた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が消えないで無償で提供され続けることを期待したい。