ZFS」タグアーカイブ

[物欲] ファイルサーバをリプレースしました

自宅のファイルサーバとしてNEC Express5800にCentOSを入れて運用していたのですが、こちらも5年間故障することなく安定稼働してくれたのでリプレースしました。

以前のサーバに関する記事:録画マシンまとめ

前回はmdadmのRAID5(1TB×4)でしたが、テレビの録画をしているとすぐに容量が枯渇して大変でした。HDD1台あたりの容量も増えたので本当は6TBのミラーで構成し、将来的に容量が枯渇したらもう1ペア追加、としたかったのですがまだ金額的に高かったので今回もRAID5です。

20160614_microserver01
新鯖のMicroserver。後ろが旧鯖のExpress5800

前回はシステムディスクとしてHDDを選択しました。奇跡的に5年間故障することがありませんでしたが、さすがに無謀だろうということで今回は故障しても復旧が楽なFreeNASをUSBメモリで構築することにしました。

また、Microserverは本体内にUSBスロットが搭載されているので見た目がシンプルになるのもナイスです。

20160614_microserver02
搭載されたHDD4発とUSBメモリ

 やっとZFSにリプレースすることができました。定期的にスナップショットを取ることでバックアップや不慮のデータ改編にも対応することができるので安心です。

Microserverはe-SATAポートも搭載されているので、将来的に外部に大容量HDDを接続してSend−Recvでの自動バックアップも行いたいです。

ZFSオワタ/(^o^)\

今日ファイルサーバを起動すると途中でリブートを繰り返すように・・・

こりゃいかんと思ってOpensolarisのLiveCDから起動してimportさせてみる。

rpoolは問題なくインポートできるけどraidzプールをインポートしたとたんpanic/(^o^)\

ZFSのバージョンか!?と思いOpensolaris 2009/06、2008/11とSolaris10 10/09で試してみたけど全てNG。ぎゃー!

どうしよう/(^o^)\

インポートせずに修復ってできないんだよね??誰か助けて!

調べてたらこんなのが!

起動のたびに ZFS がパニック状態になったらどうすればよいですか

ZFS は、ミラー化や RAID-Z など冗長性の使用により、どのようなハードウェア障害が発生しても破損しないようにデザインされています。残念ながら、レプリケートされていない構成では、一部の障害が発生した場合に、ZFS はプールを読み込む際にパニック状態になることがあります。これはバグで、近い将来に修正される予定です。その際、バックグラウンドでの消し込みや、破損したファイルのリスト表示機能など、その他いくつかのすばらしい機能も登場する予定です。それまでの間、プールが破損したために起動できなくなった場合は、次を実行してください。

  1. boot using ‘-m milestone=none’
  2. # mount -o remount /
  3. # rm /etc/zfs/zpool.cache
  4. # reboot

これにより、プールのすべてのデータがシステムから削除されます。プールを作成し直し、バックアップから復元してください。

/(^o^)\/(^o^)\/(^o^)\

ZFSでチェックサムエラーでまくりんぐ

まだまだ検証段階なので、夜起動して朝シャットダウンしてるサーバなのですが、1ヶ月ぶりぐらいにスクラブをかけてみました。

root@zfsmeister:/mtank/share# zpool scrub mtank

スクラブを停止するときは、上記コマンドに「-s」オプションをつけるだけです。

root@zfsmeister:~# zpool status -v mtank
pool: mtank
state: DEGRADED
status: One or more devices has experienced an error resulting in data
corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
entire pool from backup.
see: http://www.sun.com/msg/ZFS-8000-8A
scrub: scrub in progress for 0h28m, 96.15% done, 0h1m to go
config:

NAME        STATE     READ WRITE CKSUM
mtank       DEGRADED     0     0    36
raidz1    DEGRADED     0     0    72
c3t1d0  DEGRADED     0     0     0  too many errors
c3t2d0  DEGRADED     0     0     0  too many errors
c3t3d0  DEGRADED     0     0     0  too many errors
c3t4d0  DEGRADED     0     0     0  too many errors

errors: Permanent errors have been detected in the following files:

mtank/share:<0x30>

ちょwwwwwwwwwwwwwwwwwwwww

ありえんぐらいチェックサムエラー出てるんですけど・・・

とりあえずスクラブが終わったらクリアーしてみました。

root@zfsmeister:~# zpool clear mtank
root@zfsmeister:/mtank/share# zpool status -v mtank
pool: mtank
state: ONLINE
status: The pool is formatted using an older on-disk format.  The pool can
still be used, but some features are unavailable.
action: Upgrade the pool using ‘zpool upgrade’.  Once this is done, the
pool will no longer be accessible on older software versions.
scrub: scrub stopped after 0h3m with 0 errors on Mon Oct 19 21:45:21 2009
config:

NAME        STATE     READ WRITE CKSUM
mtank       ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c3t1d0  ONLINE       0     0     0
c3t2d0  ONLINE       0     0     0
c3t3d0  ONLINE       0     0     0
c3t4d0  ONLINE       0     0     0

errors: No known data errors

とりあえず、ファイルシステムには影響はなかったっぽいです。

しかし、ちょっと怖いのでバックアップ取っとこう。

あふん

うーん、巨大なデータを転送するとたまにNASがpanicしてしまう。
sambaが怪しい気もするけど、zfsな気もします。

panic[cpu1]/thread=ffffff01cd933e20:
BAD TRAP: type=e (#pf Page fault) rp=ffffff00080787a0 addr=ffffff016c8fc5d0

smbd:
#pf Page fault
Bad kernel fault at addr=0xffffff016c8fc5d0
pid=579, pc=0xfffffffff78a1e11, sp=0xffffff0008078890, eflags=0x10282
cr0: 8005003b<pg,wp,ne,et,ts,mp,pe> cr4: 6f8<xmme,fxsr,pge,mce,pae,pse,de>
cr2: ffffff016c8fc5d0
cr3: 12b45c000
cr8: c

        rdi: fffffffffbd05cd0 rsi: ffffff01ea195480 rdx: ffffff01cd933e20
        rcx: ffffff0008078928  r8:              156  r9: 34f281a695b9d73c
        rax: ffffff016c8fc5d0 rbx: fffffffffbd05cd0 rbp: ffffff00080788f0
        r10:                0 r11:                1 r12:             d73c
        r13:             57ea r14: ffffff01ea195480 r15: ffffff0008078928
        fsb:                0 gsb: ffffff01cca74540  ds:               4b
         es:               4b  fs:                0  gs:              1c3
        trp:                e err:                0 rip: fffffffff78a1e11
         cs:               30 rfl:            10282 rsp: ffffff0008078890
         ss:               38

ffffff0008078680 unix:die+10f ()
ffffff0008078790 unix:trap+1752 ()
ffffff00080787a0 unix:cmntrap+e9 ()
ffffff00080788f0 zfs:buf_hash_find+71 ()
ffffff0008078990 zfs:arc_read_nolock+67 ()
ffffff0008078a30 zfs:arc_read+75 ()
ffffff0008078ad0 zfs:dbuf_read_impl+159 ()
ffffff0008078b30 zfs:dbuf_read+fe ()
ffffff0008078bf0 zfs:dmu_buf_hold_array_by_dnode+1bf ()
ffffff0008078c80 zfs:dmu_buf_hold_array+73 ()
ffffff0008078d00 zfs:dmu_read_uio+4d ()
ffffff0008078d90 zfs:zfs_read+19a ()
ffffff0008078e00 genunix:fop_read+6b ()
ffffff0008078ec0 genunix:pread64+1f8 ()
ffffff0008078f10 unix:brand_sys_sysenter+1e6 ()

syncing file systems...
 2
 done
dumping to /dev/zvol/dsk/rpool/dump, offset 65536, content: kernel
NOTICE: ahci0: ahci_tran_reset_dport port 0 reset port
>
> $c
buf_hash_find+0x71(725747c4ac661726, ffffff01ea195480, 57ea, ffffff0008078928)
arc_read_nolock+0x67(ffffff01e9a935b0, ffffff01cb24c800, ffffff01ea195480,
fffffffff78a9850, ffffff01e4c231c8, 0)
arc_read+0x75(ffffff01e9a935b0, ffffff01cb24c800, ffffff01ea195480, ffffff01ea142938,
fffffffff78a9850, ffffff01e4c231c8)
dbuf_read_impl+0x159(ffffff01e4c231c8, ffffff01e9a935b0, ffffff0008078ae8)
dbuf_read+0xfe(ffffff01e4c231c8, ffffff01e9a935b0, 12)
dmu_buf_hold_array_by_dnode+0x1bf(ffffff01e4bcea78, 4d2a000, 1000, 1, fffffffff791e2d2,
ffffff0008078ca4)
dmu_buf_hold_array+0x73(ffffff01d028fac0, 137d, 4d2a000, 1000, 1, fffffffff791e2d2)
dmu_read_uio+0x4d(ffffff01d028fac0, 137d, ffffff0008078e40, 1000)
zfs_read+0x19a(ffffff01e2858840, ffffff0008078e40, 0, ffffff01d5939928, 0)
fop_read+0x6b(ffffff01e2858840, ffffff0008078e40, 0, ffffff01d5939928, 0)
pread64+0x1f8(1a, 8467ef7, 1000, 4d2a000, 0)
_sys_sysenter_post_swapgs+0x14b()
> ::ps
S    PID   PPID   PGID    SID    UID      FLAGS             ADDR NAME
R      0      0      0      0      0 0x00000001 fffffffffbc2c030 sched
R      3      0      0      0      0 0x00020001 ffffff01cd007a48 fsflush
R      2      0      0      0      0 0x00020001 ffffff01cd0086a8 pageout
R      1      0      0      0      0 0x4a004000 ffffff01cd009308 init
R    569      1    569    569  60001 0x52000000 ffffff01cd8b9010 proftpd
R    801    569    569    569    104 0x52000000 ffffff01cfddec78 proftpd
R    567      1    567    567      0 0x42000000 ffffff01cfdc9c88 fmd
R    512      1    492    492      0 0x42000000 ffffff01d18d6330 iscsitgtd
R    509      1    509    509      0 0x52000000 ffffff01d18d3e10 gdm-binary
R    533    509    533    509      0 0x52000000 ffffff01cfdc9028 gdm-binary
R    557    533    557    557     50 0x4a004000 ffffff01cfddc6c0 gdmgreeter
R    554    533    533    509      0 0x4a004000 ffffff01cfdd7020 fbconsole
R    534    533    534    534      0 0x4a004000 ffffff01cfde1198 Xorg
R    498      1    493    493      0 0x4a004000 ffffff01cd8b9c70 intrd
R    484      1    484    484     25 0x52010000 ffffff01d18d0c90 sendmail
R    483      1    483    483      1 0x52000000 ffffff01d18d0030 avahi-daemon-bri
R    463      1    462    462  60002 0x52000000 ffffff01d18d2550 mdnsd
R    457      1    457    457      0 0x42000000 ffffff01cd003008 syslogd
R    450      1    450    450      0 0x42000000 ffffff01cfdcb548 rmvolmgr
R    333      1    333    333      0 0x42000000 ffffff01cfde1df8 hald
R    334    333    333    333      0 0x4a004000 ffffff01cd8be6b0 hald-runner
R    412    334    333    333      0 0x4a004000 ffffff01d33aa6d8 hald-addon-stora
R    366    334    333    333      0 0x4a004000 ffffff01cd8bda50 hald-addon-acpi
R    365    334    333    333      0 0x4a004000 ffffff01cd8bcdf0 hald-addon-cpufr
R    363    334    333    333      0 0x4a004000 ffffff01cfdd9540 hald-addon-netwo
R    447      1    447    447      0 0x42000000 ffffff01cfdde018 sshd
R    748    447    447    447      0 0x42010000 ffffff01ccff4340 sshd
R    749    748    447    447    101 0x52010000 ffffff01d18d4a70 sshd
R    752    749    752    752    101 0x4a014000 ffffff01d33a81b8 bash
R    764    752    764    752      0 0x4a014000 ffffff01d33a9a78 bash
R    385      1    385    385      0 0x42000000 ffffff01cfdcda68 inetd
R    392      1    392    392      0 0x42000000 ffffff01d18d31b0 utmpd
R    390      1    390    390      0 0x42000000 ffffff01cfde4318 slpd
R    371      1    371    371      0 0x42000000 ffffff01cfde36b8 automountd
R    372    371    371    371      0 0x42000000 ffffff01cd005528 automountd
R    362      1    362    362      0 0x42000000 ffffff01cfde2a58 in.ndpd
R    354      1    354    354      1 0x42000000 ffffff01cfdcce08 rpcbind
R    335      1    335    335      0 0x52010000 ffffff01cfdda1a0 smbd
R    579    335    335    335    103 0x52010000 ffffff01cfddf8d8 smbd
R    344    335    335    335      0 0x52000000 ffffff01cfdce6c8 smbd
R    314      1    314    314      0 0x42000000 ffffff01cd8bc190 dbus-daemon
R    279      1    279    279      0 0x42010000 ffffff01cfdca8e8 cron
R    216      1    216    216      0 0x42000000 ffffff01cd8bb530 xntpd
R    181      1    181    181      0 0x42000000 ffffff01cfddae00 picld
R    126      1    126    126      0 0x42000000 ffffff01cfddba60 syseventd
R    145      1    145    145      0 0x42000000 ffffff01cfde0538 nscd
R    142      1    142    142      0 0x42000000 ffffff01cfdd88e0 powerd
R     70      1     70     70      0 0x42000000 ffffff01cd8ba8d0 devfsadm
R     55      1     55     55      1 0x42000000 ffffff01cd003c68 kcfd
R     15      1     15     15     15 0x42000000 ffffff01cd006de8 dlmgmtd
R      9      1      9      9      0 0x42000000 ffffff01cd0048c8 svc.configd
R      7      1      7      7      0 0x42000000 ffffff01cd006188 svc.startd
R    394      7    394    394      0 0x4a004000 ffffff01cfdcc1a8 ttymon
R    377      7    377    377      0 0x4a014000 ffffff01cfddd320 sac
R    430    377    377    377      0 0x4a014000 ffffff01cfdcf328 ttymon
> q

一つずつ潰しこんでいくしかなさそうです。

vdbenchを使ってみた。

vdbenchというストレージのパフォーマンスを計測したり負荷を与えたりするツールがあるのですが、これがなかなか便利そうなので試しに使ってみました。

参考:vdbench でディスクの性能を測定する(やっぱりSunがすき!)

21:38:20.014            rate  resp total  sys   rate  resp   rate  resp read write   size
21:38:20.014        1  23984   0.3  25.0 22.4  23984   0.3    0.0   0.0  187   0.0   8192
21:38:30.012        2  24150   0.3  24.4 21.7  24150   0.3    0.0   0.0  188   0.0   8192
21:38:40.012        3  23107   0.3  26.1 23.6  23107   0.3    0.0   0.0  180   0.0   8192

だいたい、毎秒200M弱ですので、一昔前のストレージ並の速度が出ていますね。

OpenSolaris + ZFS + iSCSI + MacOS(GlobalSAN)

とりあえず安定してきたのでいろいろ検証してみたいと思います。ディスクは5400rpmの1Tが4発です。

root@zfsmeister:~# pfexec format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c3t0d0
          /pci@0,0/pci1033,88f7@1f,2/disk@0,0
       1. c3t1d0
          /pci@0,0/pci1033,88f7@1f,2/disk@1,0
       2. c3t2d0
          /pci@0,0/pci1033,88f7@1f,2/disk@2,0
       3. c3t3d0
          /pci@0,0/pci1033,88f7@1f,2/disk@3,0
       4. c3t4d0
          /pci@0,0/pci1033,88f7@1f,2/disk@4,0

さて、これからZFSでアレをナニします。

root@zfsmeister:~# zpool create -f mtank raidz c3t1d0 c3t2d0 c3t3d0 c3t4d0
root@zfsmeister:~# zfs list
NAME                       USED  AVAIL  REFER  MOUNTPOINT
mtank                     92.0K  2.67T  26.9K  /mtank

Raidz(RAID5)なので、ディスク1本分容量は減ってしまいますが、その分1本壊れても大丈夫。本当はRaidz-2にしたかったんだけど今回は容量優先で。

ていうかディスク4本ならRaidz-2よりRAID1+0のほうがいいんだけど!

とまぁ、これでディスクを4発使ったボリュームができあがったので、ここからiSCSI用のボリュームを切り出していきます。

まずはiSCSIのpkgを導入します。pkgコマンドって便利だね!

root@zfsmeister:~# pkg install SUNWiscsi
root@zfsmeister:~# pkg install SUNWiscsitgt

パッケージのインストールが終わったら、有効化します。

root@zfsmeister:~# svcadm enable iscsitgt

ここからが正念場です。iSCSI用にプールから容量を切り出します。今回は500Gで作成します。

root@zfsmeister:~# zfs create -V 500gb mtank/iscsivol
root@zfsmeister:~# zfs list
NAME                       USED  AVAIL  REFER  MOUNTPOINT
mtank                      500G  2.18T  26.9K  /mtank
mtank/iscsivol             500G  2.67T  23.9K  -

切り出したボリュームをiSCSI Targetで使えるようにします。専門用語でbacking storeディレクトリ言います。

backing store ディレクトリは、iSCSI Target が Initiator に提供する領域 に使われる場所となるらしいので、ここでは、emulated vlume を作成した /mtank (ZFS pool) を指定するみたいです。

root@zfsmeister:~# iscsitadm modify admin -d /mtank
root@zfsmeister:~# iscsitadm show admin
iscsitadm:
    Base Directory: /mtank
    CHAP Name: Not set
    RADIUS Access: Not set
    RADIUS Server: Not set
    iSNS Access: Not set
    iSNS Server: Not set
    iSNS Server Status: Not applicable
    Fast Write ACK: Not set
さて、次のコマンドで、iSCSI Target としての情報が登録されます。
root@zfsmeister:~# zfs set shareiscsi=on mtank/iscsivol
iSCSIドライブをMacOSから参照する為には、IPアドレス以外にiqn.で始まる識別子を登録してやる必要があります。今回ですと、「iqn.1986-03.com.sun:02:5648289d-1671-c1ca-fe19-ae2aa7a6a333」になります。
root@zfsmeister:~# iscsitadm list target -v
Target: mtank/iscsivol
    iSCSI Name: iqn.1986-03.com.sun:02:5648289d-1671-c1ca-fe19-ae2aa7a6a333
    Alias: mtank/iscsivol
    Connections: 0
    ACL list:
    TPGT list:
    LUN information:
        LUN: 0
            GUID: 0
            VID: SUN
            PID: SOLARIS
            Type: disk
            Size:  500G
            Backing store: /dev/zvol/rdsk/mtank/iscsivol
            Status: online

以上になります。あとはクライアントから上記の情報でマウントしてやればローカルドライブのように使えます。
ちなみに、MacOSではiSCSIはAppleから提供されていませんので、GlobalSANをインストールして使います。WindowsはMicrosoftから提供されていたような気がしますが、よく知りません。

気になる転送速度ですが、だいたい40~50MByte/Secぐらいでしょうか。まあジャンボフレームを設定していないのでこれくらいかなと。FireWireの外付けディスク並の速度は出ていますので、これ以上の速度は必要ないと思います。