ttt

getttyent

(FreeBSD) はじめてのZFS

2009-12-09 23:44:35 | デジタル・インターネット

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未満のときはナンタラ機能を無効にするよ、みたいなメッセージが出てたような気もしますが・・・はあ、そうですか。

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

# 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でデータ圧縮をするファイルシステムが作れちゃう。
# 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テラバイトのディスクができちゃった 

# 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じゃん 

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

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

20091209

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

■ 関連記事