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