2009年12月10日木曜日

(FreeBSD) はじめてのZFS

FreeBSD 7.0-RELEASEのときに鳴り物入りで登場(?)したZFSですが、どうも安定性がイマイチだとか、メモリがたくさんないとダメとか、そんな噂もあって、私は試したことがありませんでした。



でも、どうやら、FreeBSD 8.0のamd64版だと、十分実用的なんだそうです。



というわけで、いまさらですが、はじめてZFSを試しに使ってみました。



これ、昔使っていたvinumより、ずっと簡単で、しかも、すごく便利で使いやすいです!





一番信頼性のある情報は何? もちろん、FreeBSD Handbookですね。



FreeBSD Handbook
Chapter 20 File Systems Support
20.2 The Z File System (ZFS)
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/filesystems-zfs.html


それと、上記のページからリンクされていた、ここ。



ZFS Tuning Guide
http://wiki.freebsd.org/ZFSTuningGuide


くれぐれも、こんなブログは参考にしないでくださいね。



ブログに書かれた情報は、それが書かれた時点でのことなので、時間がたつと、もしかすると状況が変わっちゃうこともありますから。



何かをはじめるときのきっかけとしては、お気軽でいいかもしれませんけど…。





使ったOSとハードウェアは、こんな感じ。

FreeBSD 8.0-RELEASE amd64
CPU: Athlon II X4 605e
メモリ 4GB
ハードディスク 1.5TBを4個

FreeBSD HandbookとZFS Tuning Guideを参考にして、



/boot/loader.conf に、以下を追加。
(2009/12/15訂正) よく読んだら、amd64のFreeBSD7.,2以降の場合は、これは不要だと書いてあった。

vm.kmem_size_max="1024M"
vm.kmem_size="1024M"
vfs.zfs.arc_max="100M"

再起動しなくちゃいけないんだろうけど、めんどくさかったので、そのまま。



/etc/rc.confに、以下を追加。

zfs_enable="YES"

んでもって、以下のコマンドを実行。

/etc/rc.d/zfs start

メモリが4GB未満のときはナンタラ機能を無効にするよ、みたいなメッセージが出てたような気もしますが・・・はあ、そうですか。[E:catface]





今回使用するハードディスクドライブの一覧。



# atacontrol list
ATA channel 0:
    Master:      no device present
    Slave:       no device present
ATA channel 1:
    Master:      no device present
    Slave:       no device present
ATA channel 2:
    Master:  ad4 <WDC WD15EADS-00P8B0/01.00A01> SATA revision 2.x
    Slave:       no device present
ATA channel 3:
    Master:  ad6 <WDC WD15EADS-00P8B0/01.00A01> SATA revision 2.x
    Slave:       no device present
ATA channel 4:
    Master:  ad8 <WDC WD15EADS-00P8B0/01.00A01> SATA revision 2.x
    Slave:       no device present
ATA channel 5:
    Master:      no device present
    Slave:       no device present
ATA channel 6:
    Master: ad12 <WDC WD15EADS-00P8B0/01.00A01> SATA revision 2.x
    Slave:       no device present
ATA channel 7:
    Master: ad14 <WDC WD15EADS-00P8B0/01.00A01> SATA revision 2.x
    Slave:       no device present



ad4は、/とか/usrとかで、すでに使っているので、zfs用には、ad6、ad8、ad12、ad14だけを使いました。



一応、FreeBSD Handbookに書いてある順番に試してみて、念のための確認。
ざっくり、こんな感じです。



ad14を1個だけ使って、exampleという名前の「プール」を作る。
# zpool create example /dev/ad14



/exampleというのができていることが確認できる。
# df



普通のファイルシステムと同じように使える。
# cd /example
# touch testfile
# ls -al



gzipでデータ圧縮をするファイルシステムが作れちゃう。[E:happy02]
# zfs create example/compressed
# zfs set compression=gzip example/compressed



圧縮を止めることもできる。
# zfs set compression=off example/compressed



アンマウントする。
# zfs umount example/compressed
# df



マウントする。
# zfs mount example/compressed
# df



mountコマンドでも、マウントされていることを確認できる。
# mount



データを二重化して、信頼性を向上できる。
# zfs create example/data
# zfs set copies=2 example/data



以上のように、試しに作ったものを、全部ごっそりと削除。
# zfs destroy example/compressed
# zfs destroy example/data
# zpool destroy example



ZFSの何が一番すごいか、っていうと、個人的に思うのは、こんなところでしょうか。



  • /example と /example/compressed と /example/data の3つのファイルシステムがあるように見えるけど、それぞれに、どれだけの容量を割り当てるのか、指定する必要がない。
  • 今までだと、/usrには16GB、/usr/localには32GBを割り当てる、とか指定してた。いわゆる、「パーティションを切る」。


  • 使っているうちに容量が足りなくなったら、別のファイルシステムに一部のファイルを追い出して、シンボリックリンクを張っておく、とか苦肉の策をとったりしてた。


  • けど、ZFSならそんな必要ない。
  • データ圧縮とか、二重化(つまりミラーリング)とかを、自由自在に指定できる。




次に、複数のドライブで試してみました。



# zpool create storage ad6 ad8 ad12 ad14
# zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
storage    72K  5.35T    18K  /storage
# df -h /storage
Filesystem    Size    Used   Avail Capacity  Mounted on
storage       5.4T      0B    5.4T     0%    /storage



わーい、5.4テラバイトのディスクができちゃった [E:happy01]



# zpool status
  pool: storage
state: ONLINE
scrub: none requested
config:



        NAME        STATE     READ WRITE CKSUM
        storage     ONLINE       0     0     0
          ad6       ONLINE       0     0     0
          ad8       ONLINE       0     0     0
          ad12      ONLINE       0     0     0
          ad14      ONLINE       0     0     0



errors: No known data errors



まあ、これは試してみただけです。削除、と。



# zpool destroy storage
# zpool status
no pools available
# zfs list
no datasets available





ZFSには、RAID-Zという目玉機能があるそうで、今度はそれを試してみました。



こんな感じで、4個のハードディスクドライブを使って、RAID5相当のものを作ってみました(最低3個のドライブからRAID-Zを作れます)。



# zpool create storage raidz ad6 ad8 ad12 ad14
# zpool status
  pool: storage
state: ONLINE
scrub: none requested
config:



        NAME        STATE     READ WRITE CKSUM
        storage     ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            ad6     ONLINE       0     0     0
            ad8     ONLINE       0     0     0
            ad12    ONLINE       0     0     0
            ad14    ONLINE       0     0     0



errors: No known data errors



# df -h /storage
Filesystem    Size    Used   Avail Capacity  Mounted on
storage       4.0T      0B    4.0T     0%    /storage



さっきの容量は5.4TBでしたが、RAID-Zのときはパリティのために1個分の容量がとられるので、4TBしか使えなくなってしまいます。まあ十分ですか。



ためしにportsのファイルを置いてみることにしました。ついでなのでgzip圧縮もしてみます。



# zfs create storage/ports
# zfs set compression=gzip storage/ports



# df -hl
Filesystem       Size    Used   Avail Capacity  Mounted on
(一部省略)
storage          4.0T    128K    4.0T     0%    /storage
storage/ports    4.0T    128K    4.0T     0%    /storage/ports



# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
storage         136K  4.00T  28.4K  /storage
storage/ports  26.9K  4.00T  26.9K  /storage/ports



cvsupの設定ファイルを用意。/storage/portsに、ファイルが置かれるようにします。



# cat /etc/cvsup.ports
*default  host=うちのサーバー
*default  base=/var/db
*default  prefix=/storage
*default  release=cvs tag=.
*default  delete use-rel-suffix



cvsup(csup)を実行



# csup /etc/cvsup.ports
Connected to うちのサーバー
Updating collection ports-all/cvs
Checkout ports/.cvsignore
Checkout ports/CHANGES
Checkout ports/COPYRIGHT
Checkout ports/GIDs
Checkout ports/KNOBS
Checkout ports/LEGAL
Checkout ports/MOVED
Checkout ports/Makefile
Checkout ports/Mk/bsd.apache.mk
Checkout ports/Mk/bsd.autotools.mk



途中省略



Checkout ports/x11-wm/xmonad-contrib/Makefile
Checkout ports/x11-wm/xmonad-contrib/distinfo
Checkout ports/x11-wm/xmonad-contrib/pkg-descr
Checkout ports/x11-wm/xmonad-contrib/pkg-plist
Finished successfully



# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
storage         197M  4.00T  28.4K  /storage
storage/ports   197M  4.00T   197M  /storage/ports



# du -sh /storage/ports/
206M    /storage/ports/



んーと、どうやら206MB、使用中らしいです。



/storage/portsを、普通のファイルシステムへコピーして、ディスク使用量を比較してみますか。



# mkdir /usr/local/tmp
# cd /storage
# tar cf - ports | tar xf - -C /usr/local/tmp/



しばらくかかる



# du -sh /usr/local/tmp/ports/
435M    /usr/local/tmp/ports/



えーと、435MB。ということで、たしかに圧縮の効果はあるみたいです。



こんなコマンドで、圧縮率を確認できるんだとか。



# zfs get compressratio
NAME           PROPERTY       VALUE          SOURCE
storage        compressratio  2.51x          -
storage/ports  compressratio  2.51x          -




まだあまり試してないですが、このまま使い続けてみます。



マウント場所を変更したり、RAID5以外にも、RAID10やRAID6などもできるみたいだし、スナップショットをとることもできるようだし、・・・機能がてんこもり。



いいかもしれない。







裏話。



ZFSを使う前に、

そういえば、最近、チップセットにRAID機能があるんだったよな~
Intel Matrix RAIDとかいったっけ?

と思いまして・・・



あ、これ、AMDじゃん [E:coldsweats01]









「ザ☆ネットスター! - 12月号 -」を見ました。



これ、ぜんぜん知らなかった。





20091209



別に、知ってなくてもいいか、と思った。





■ 関連記事







0 件のコメント:

コメントを投稿