FreeBSD で ZFS を試してみる

ZFS は Sun が開発し,CDDL でオープンソースとして公開されている次世代ファイルシステムです.特徴として,ストレージプールの概念があり,ディスクの違いを気にせずに管理できる事や,ZFS 自身で RAID5 や RAID6 をサポートしている事等が挙げられます.また,128bit アドレッシングですので,理論的なファイルシステムの最大値は 16 エクサバイトです.最大値やストレージプールの概念,機能等から間違いなく次世代ファイルシステムと言えるでしょう.

現在,様々な OS で移植作業が行われており,FreeBSD には 7-current に移植されています.まだまだ実験段階の機能と言う事ですが,今後流行っていくと見ていますので試しに触ってみています.

試すにあたって参考にしたドキュメントは Sun の Solaris ZFS 管理ガイド です.さすが,商用 OS だけあり,ドキュメントはしっかりしているなぁと思いました.

ZFS を使ってみる

現在,7-current でのみ利用可能です.その為,普段から current を追っかけている人以外は VMware 等の仮想環境を用意した方が良いと思います.

必要要件

ZFS は,高機能なファイルシステムだからなのか,メモリ要件を満たす必要があります.FreeBSD だからなのかはわかりませんが,512MB 以上のメモリがないと kernel panic するようですので注意して下さい.プロセッサには特に要件は無いようにみえます.
ただ,Solaris でも,512MB 以上,1GB 以上を推奨とあるので,ある程度のスペックはもともと要求されているのかもしれません.

今回の環境

今回用意した環境は,VMware に 7-current を入れ,以下のようなディスク環境を用意しました.

zfs# atacontrol list
ATA channel 0:
    Master:  ad0 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
    Slave:   ad1 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
ATA channel 1:
    Master:  ad2 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
    Slave:   ad3 <VMware Virtual IDE Hard Drive/00000001> ATA/ATAPI revision 4
zfs# camcontrol devlist
<VMware, VMware Virtual S 1.0>     at scbus0 target 0 lun 0 (pass0,da0)
<VMware, VMware Virtual S 1.0>     at scbus0 target 1 lun 0 (pass1,da1)
<VMware, VMware Virtual S 1.0>     at scbus0 target 2 lun 0 (pass2,da2)
<VMware, VMware Virtual S 1.0>     at scbus0 target 3 lun 0 (pass3,da3)
<VMware, VMware Virtual S 1.0>     at scbus0 target 4 lun 0 (pass4,da4)
<VMware, VMware Virtual S 1.0>     at scbus0 target 5 lun 0 (pass5,da5)
<VMware, VMware Virtual S 1.0>     at scbus0 target 6 lun 0 (pass6,da6)

ZFS を使うための一手間

特に一手間という程の物ではありませんが,zfs.ko というカーネルモジュールを読み込ませる事が必要です.以下の何れかを行う事で読み込ませる事が可能です

zfs# zfs
zfs# kldload /boot/kernel/zfs.ko
zfs# /etc/rc.d/zfs forcestart

常用するにあたり一番無難な方法としては,/etc/rc.conf に記述し,rc.d でのモジュールの読み込みが無難だと思います.というのも後述する zfs ファイルシステムのマウント等を行う為に rc.d 機構が必要になる為です.
という訳で,/etc/rc.conf に以下の 1行を記述しましょう.

zfs_enable="YES"

その後,以下のように実行する事で kernel モジュールを読み込ませる事が可能です.

zfs# /etc/rc.d/zfs start

kldstat の結果を確認し,zfs.ko が表示されればこの作業は完了です.

zfs# kldstat
Id Refs Address    Size     Name
 1    4 0xc0400000 a00bbc   kernel
 2    1 0xc0e01000 7313c    acpi.ko
 3    1 0xc32c8000 c2000    zfs.ko

ストレージプールを理解する

まずは,ZFS のキモの部分でもある,ストレージプールを理解する所からはじめていきたいと思います.

ストレージプールって?

ZFS では物理ストレージを管理するために ストレージプール という概念が導入されました.ストレージプールはボリュームの管理を不要にしました.ZFS ファイルシステムを作成する為に,ストレージプールにデバイスを集約します.ストレージプールは,そのプールを利用する ZFS ファイルシステムで共有され,プールにデバイスが追加されるとファイルシステムが自動的に拡張される為,ファイルシステムサイズを事前に決定する必要も無くなりました.

ストレージプールの基本要素は,128MB 以上の物理ディスクで,ディスク全体 (ad0) 又は個別のスライス (ad0s1) をストレージデバイスとして利用する事が可能です. ストレージプールは,1つ以上の仮想デバイスで構成され,仮想デバイス は物理ストレージのレイアウト,障害特性を定義したストレージプールの内部表現です.最上位レベルの仮想デバイスはデータの冗長性を備えており,ミラー,RAID-Z 仮想デバイスと呼ばれます.

ストレージプールにディスクを追加する

冗長性の無い単純な構成,ミラー,RAID-Z を利用したストレージプールを作成していきます.

単純なストレージプールを作成する

単純にストレージプールを作成するには,以下のようなコマンドを発行します.以下の場合,zpool0 というストレージプールが作成され,4GB x 2 の容量でプールが構成されます.この場合,RAID0 と同様にストライプされてディスクに書き込まれるようになります.

zfs# zpool create zpool0 ad0 ad2

作成したプールのステータスは以下の通り zpool status コマンドを利用します.zpool0 という名前のプールが作成されており,ad0 と ad2 がプールに追加されている事がわかります.

zfs# zpool status
  pool: zpool0
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          ad0       ONLINE       0     0     0
          ad2       ONLINE       0     0     0

errors: No known data errors

ミラー化されたストレージプールを作成する

RAID1 のようなミラー化されたプールを作成するには,mirror キーワードを追加し,追加するストレージを選択します.以下の場合は,ad0ad2 をミラーのペアとしたプールを作成します.

zfs# zpool create zpool0 mirror ad0 ad2

ミラーの場合,ステータスを表示するとストレージのペアがわかるように表示されます.

zfs# zpool status
  pool: zpool0
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            ad0     ONLINE       0     0     0
            ad2     ONLINE       0     0     0

errors: No known data errors

zpool0 というプールに,mirror ストレージ ad0, ad2 が追加されている事がわかります.

複数のミラーペアを指定する場合,コマンドを数回に分ける事も可能ですが,以下の様に mirror キーワードを複数指定する事も可能です.以下の場合,ad0ad2ad1ad3 をミラーペアとしてプールを作成します.

zfs# zpool create zpool0 mirror ad0 ad2 mirror ad1 ad3

先と同様にステータスには,ミラーペア毎に参加ディスクが表示されます.今回の場合,mirror が2つ表示され,それぞれのペアストレージが表示されます.

zfs# zpool status
  pool: zpool0
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            ad0     ONLINE       0     0     0
            ad2     ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            ad1     ONLINE       0     0     0
            ad3     ONLINE       0     0     0

errors: No known data errors

シングルパリティ RAID-Z ストレージプールを作成する

RAID-Z プールの作成は,ミラー化されたプールの作成とほぼ同様です.違いは mirror キーワードではなく raid キーワードを使用する点と,最低現必要となるディスク数になります.RAID-Z はシングルパリティの冗長性を持った構成で RAID5 と同様の動きをします.
以下の例では,3つのディスクで構成される RAID-Z プールを作成します.

zfs# zpool create zpool0 raidz ad0 ad2 da1

プールのステータスを表示すると,先ほどの mirror と違い raidz1 と表示され,raidz にアサインされたディスクの一覧が表示されます.raidz では無く,raidz1 と表示されるのは,後述するダブルパリティ RAID-Z2 と違いを明らかにする為だと考えられます.

zfs# zpool status
  pool: zpool0
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            ad0     ONLINE       0     0     0
            ad2     ONLINE       0     0     0
            da1     ONLINE       0     0     0

errors: No known data errors

ダブルパリティ RAID-Z ストレージプールを作成する

RAID-Z は,シングルパリティではなく,ダブルパリティによる冗長構成でプールを作成する事が出来ます.一般的には RAID6 と呼ばれるものと同等の動作を行います.プールの作成時に raidz2 キーワードを指定する事でダブルパリティ RAID-Z 構成を作成出来ます.

zfs# zpool create zpool0 raidz2 ad0 ad2 da1 da2

ステータスは以下の通り,raidz2 でのプールが作成されている事がわかります.

zfs# zpool status
  pool: zpool0
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          raidz2    ONLINE       0     0     0
            ad0     ONLINE       0     0     0
            ad2     ONLINE       0     0     0
            da1     ONLINE       0     0     0
            da2     ONLINE       0     0     0

errors: No known data errors

スペアドライブ付きのダブルパリティ RAID-Z ストレージプールの作成

今までは,スペアドライブが無い状態でのストレージプールを作成していました.この場合,何れかのディスクが故障するといわゆる RAID が DEGRADE している状態となります.ZFS では,ホットスペア付きでストレージプールを作成が可能です.これは mirror でも raidz 及び raidz2 の全てで可能ですので,実運用においてはスペア付きでの作成が望ましいでしょう.
ここでは,ダブルパリティ RAID-Z ストレージプールに,スペアドライブが付いている構成で作成してみます.

zfs# zpool create zpool0 raidz2 ad0 ad2 da1 da2 spare da3

ステータスを表示すると,spare の項が追加され,スペアドライブが有効になっている事がわかります.

zfs# zpool status
  pool: zpool0
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          raidz2    ONLINE       0     0     0
            ad0     ONLINE       0     0     0
            ad2     ONLINE       0     0     0
            da1     ONLINE       0     0     0
            da2     ONLINE       0     0     0
        spares
          da3       AVAIL

errors: No known data errors

ストレージプールを削除する

間違って作成してしまった場合や,不要になったストレージプールは削除する事を簡単なコマンドで実行可能です.ただし,一度削除したら元には戻せない為,使用中のストレージプールを削除しないように注意を払う必要があります.
一応,使用中のストレージプールを削除しようとした場合,警告が表示され削除されない仕組みがありますが,100% 信頼出来る訳ではありません.必ず自分で確認を行ってからオペレーションするようにしましょう.実際の削除は以下のように実行します.

zfs# zpool destroy zpool0

上記の場合 zpool0 プールを削除しています.

ストレージプールを管理する

日々の運用の中には,作成したストレージプールの容量を追加したり削除したりする事もあります.

ストレージプールにデバイスを追加する

新しいデバイスを追加する事で,プールの領域を動的に拡張出来ます.プール内の全てのデータセットは,追加された領域を意識せずにすぐに利用できます.zpool add コマンドを使用してプールにストレージを追加可能です.
注意点として,既に作成してあるストレージプールで定義済みの RAID の構成で追加する必要があるという事です.例えば,raidz で作成してあれば raidz で追加する必要があります.厳密に言えば,無理やり違う構成で追加する事も可能ですが推奨されません.理由としては,パフォーマンス及び信頼性の低下があげられているようです.その為,最初のストレージプールの作成時のプランニングは重要だと言えます.とはいえ,後に出てくる ZFS の管理の方法でいくらでも対処は可能ですので神経質になる必要は無いと思います.
以下は,先のシングルパリティ RAID-Z プールに追加している例です.

zfs# zpool add zpool0 raidz ad1 ad3 da2

上記コマンドで今まで違う所は zpool createzpool add に変わっているだけです.後の構文は今までと同様ですのでこの場合はシングルパリティ RAID-Z で ad1, ad3, da2 が構成されており,zpool0 に追加しています.
ステータスは以下の様に表示されます.

zfs# zpool status
  pool: zpool0
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool0      ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            ad0     ONLINE       0     0     0
            ad2     ONLINE       0     0     0
            da1     ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            ad1     ONLINE       0     0     0
            ad3     ONLINE       0     0     0
            da2     ONLINE       0     0     0

errors: No known data errors



Hiroyuki Seino http://www.seichan.org/ http://www.seichan.org/blog/
Today:2 Yesterday:0 All:44263