トップページ > ZFS関連 > Solaris の ZFS はこんなにすごいぞ!
カテゴリー
オラクルエンジニア通信
サポートページ
マニュアルページ
ソフトウェアダウンロード
中古UNIXマシン購入
blogs.sun.com
お勧めサイト
プライベートリンク

Solaris の ZFS はこんなにすごいぞ!

Solaris 11 開発者バージョン(Nevada) でZFS(Zetabyte File System)の検証をしてみました。
【OSの入手】
以下のサイトでダウンロードできます。Build 27a からはZFSが標準で入ってます。
http://www.opensolaris.org/os/downloads/

【検証環境】
bash-3.00# more /etc/release
                           Solaris Nevada snv_27a SPARC
           Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
                        Use is subject to license terms.
                           Assembled 09 November 2005
bash-3.00# uname -a
SunOS s11test 5.11 snv_27 sun4u sparc SUNW,Ultra-5_10

【ZFSストレージプールの作成】
まずは以下のように zpool コマンドでミラー構成のストレージプール mypool を作成してみる。

bash-3.00# zpool create -f mypool mirror c1t2d0 c1t4d0

作成された mypool の容量などを確認してみると・・・こんな感じ。

bash-3.00# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
mypool                 8.38G   33.0K   8.37G     0%  ONLINE     -

びっくりなのは zpool create コマンドでストレージプールを作成しただけなのに以下のようにストレージプール名 mypool というディレクトリがルート( / )の下に自動的に作成され、既にそこにマウントされているところだ。

bash-3.00# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool                  32K  8.31G     8K  /mypool

さっそく、/mypool に移動して、ls で確認してみた。
当然だが、何もない。

bash-3.00# cd /mypool
bash-3.00# ls

ファイルシステムの利用状況が正しくチェックされているかを調べるために以下のように1MBのファイルを作成して確認してみた。

bash-3.00# mkfile 1m samplefile1
bash-3.00# df -h .
Filesystem             size   used  avail capacity  Mounted on
mypool                 8.3G   1.0M   8.3G     1%    /mypool

次に、ストレージプール mypool から用途に合わせて ZFS ファイルシステムを切り出してみる。
以下の実行例はユーザーのホームディレクトリ用に mypool/home ファイルシステムを作成し、さらにその配下に ユーザー毎に test1 や test2 といったファイルシステムを作成している。

bash-3.00# zfs create mypool/home
bash-3.00# zfs create mypool/home/test1
bash-3.00# zfs create mypool/home/test2

こちらも ZFS ファイルシステムの作成と同時に /mypool 以下に自動的にマウントされている。

bash-3.00# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool                1.07M  8.31G  1.01M  /mypool
mypool/home           25.5K  8.31G   9.5K  /mypool/home
mypool/home/test1        8K  8.31G     8K  /mypool/home/test1
mypool/home/test2        8K  8.31G     8K  /mypool/home/test2

このように自動的にマウントされることは便利ではあるが、管理者としては当然、指定したディレクトリにマウントさせたい場合もあるはずだ。
そのような場合は以下のように zfs set コマンドでマウントポイントを指定するだけでOK。

bash-3.00# mkdir /export/users
bash-3.00# zfs set mountpoint=/export/users mypool/home

上記のようにマウントポイントとなるディレクトリを作成して、zfs set コマンドでマウントポイントを指定するだけで、以下のように自動的に再マウントされ、指定した構成になる。

bash-3.00# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool                1.09M  8.31G  1.01M  /mypool
mypool/home           25.5K  8.31G   9.5K  /export/users
mypool/home/test1        8K  8.31G     8K  /export/users/test1
mypool/home/test2        8K  8.31G     8K  /export/users/test2

bash-3.00# df -k -F zfs
Filesystem            kbytes    used   avail capacity  Mounted on
mypool               8713216    1033 8712098     1%    /mypool
mypool/home          8713216       9 8712098     1%    /export/users
mypool/home/test1    8713216       8 8712098     1%    /export/users/test1
mypool/home/test2    8713216       8 8712098     1%    /export/users/test2

当然、以下のように移動してみると /export/users 以下には test1 や test2 というディレクトリが存在し、/mypool には先ほど作成した 1MB の samplefile1 が存在している。

bash-3.00# cd /export/users
bash-3.00# ls
test1  test2
bash-3.00# cd /mypool
bash-3.00# ls
samplefile1

【ZFS ストレージプールの拡張方法】

次にストレージプールの拡張方法を紹介する。
以下のように新しいディスク2つを再びミラー構成で既存のストレージプール mypool に追加してみる。

bash-3.00# zpool add -f mypool mirror c1t8d0 c1t11d0

以下のコマンドでストレージプール mypool の構成を確認してみる。
実はこの構成で、記録するデータは各ミラーのグループにストライピングされるようになる。
いわゆる RAID1+0構成だ。実に簡単な操作だし、直感的に明らかなので覚えやすい。

bash-3.00# zpool iostat -v
                capacity     operations    bandwidth
pool          used  avail   read  write   read  write
-----------  -----  -----  -----  -----  -----  -----
mypool       1.12M  16.7G      0      0      0  1.58K
  mirror     1.12M  8.37G      0      0      0  1.58K
    c1t2d0       -      -      0      0      0  2.81K
    c1t4d0       -      -      0      0      0  2.81K
  mirror         0  8.38G      0      0      0      0
    c1t8d0       -      -      0      0      0  39.2K
    c1t11d0      -      -      0      0      0  39.2K
-----------  -----  -----  -----  -----  -----  -----

上記構成の動きを確認するために、データを流し込んでみる。
まずは容量の確認をしてみる。

bash-3.00# zpool iostat -v
                  capacity     operations    bandwidth
pool            used  avail   read  write   read  write
-------------  -----  -----  -----  -----  -----  -----
mypool         1.10M  16.7G      0      0  2.30K    527
  mirror       1.06M  8.37G      0      0  2.30K      0
    c1t2d0s0       -      -      0      0  4.47K  1.37K
    c1t4d0s0       -      -      0      0  1.89K  1.37K
  mirror       38.5K  8.37G      0      0      0    527
    c1t11d0s0      -      -      0      0  1.89K  1.91K
    c1t8d0s0       -      -      0      0  1.89K  1.91K
-------------  -----  -----  -----  -----  -----  -----

次に以下のコマンドで継続的に無駄なデータを流し込んでおく。
&をつけてバックグラウンドで行っている。

bash-3.00# cat /dev/urandom > /export/users/test1/sample &
[1] 876

データを流し込んでいる間に以下のように何度か容量の確認をしてみる。
見てわかるとおり着実にデータが記録され、しかもちゃんとストライプされていることがわかる。

bash-3.00# zpool iostat -v
                  capacity     operations    bandwidth
pool            used  avail   read  write   read  write
-------------  -----  -----  -----  -----  -----  -----
mypool         10.9M  16.7G      0      0  1.95K  26.1K
  mirror       5.06M  8.37G      0      0  1.95K  10.5K
    c1t2d0s0       -      -      0      0  3.76K  11.6K
    c1t4d0s0       -      -      0      0  1.59K  11.6K
  mirror       5.80M  8.37G      0      0      0  15.6K
    c1t11d0s0      -      -      0      0  1.59K  16.8K
    c1t8d0s0       -      -      0      0  1.59K  16.8K
-------------  -----  -----  -----  -----  -----  -----

bash-3.00# zpool iostat -v
                  capacity     operations    bandwidth
pool            used  avail   read  write   read  write
-------------  -----  -----  -----  -----  -----  -----
mypool         22.6M  16.7G      0      0  1.92K  56.5K
  mirror       11.1M  8.36G      0      0  1.92K  25.8K
    c1t2d0s0       -      -      0      0  3.71K  27.0K
    c1t4d0s0       -      -      0      0  1.57K  27.0K
  mirror       11.6M  8.36G      0      0      0  30.7K
    c1t11d0s0      -      -      0      0  1.57K  31.9K
    c1t8d0s0       -      -      0      0  1.57K  31.9K
-------------  -----  -----  -----  -----  -----  -----

先ほどのコマンドをフォアグラウンドに変更し、Ctrl+C で止める。

bash-3.00# fg
cat /dev/urandom >/export/users/test1/sample
^C
bash-3.00#

【ZFSのクオータ機能】

次はZFSのクオータ機能を確認してみる。
これも直感的に明らかで作成したZFSのファイルシステムに quota キーワードで容量を設定するだけだ。

bash-3.00# zfs set quota=100m mypool/home/test1
bash-3.00# zfs set quota=2g mypool/home

上記のように実行するだけで mypool/home/test1 は 100MB に、mypool/home は 2GB で制限されることがわかる。
test2 には quota の設定をしていないので、mypool/home の容量と同じになることも確認できる。

bash-3.00# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool                38.1M  16.6G  1.01M  /mypool
mypool/home           37.0M  1.96G   9.5K  /export/users
mypool/home/test1     37.0M  63.0M  37.0M  /export/users/test1
mypool/home/test2        8K  1.96G     8K  /export/users/test2

【ZFSのスナップショット機能】

以下のように zfs snapshot コマンドで簡単にファイルシステム毎にスナップショットを作成することができる。
下記コマンドで mypool/home/test1 のスナップショットを today という名前で作成される。

bash-3.00# zfs snapshot mypool/home/test1@today

スナップショットへのアクセスは以下のパスを使用する。
先ほど作った sample というファイルが存在することがわかる。
当然、スナップショットなので元のファイルシステムを変更しても、スナップショットは変更されないし、read-only なのでスナップショットのディレクトリに新規にファイルを作成することもできない。
あくまでバックアップなどの用途で使用するものだ。

bash-3.00# ls /export/users/test1/.zfs/snapshot/today
sample
bash-3.00# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool                38.1M  16.6G  1.01M  /mypool
mypool/home           37.0M  1.96G   9.5K  /export/users
mypool/home/test1     37.0M  63.0M  37.0M  /export/users/test1
mypool/home/test1@today      0      -  37.0M  -
mypool/home/test2        8K  1.96G     8K  /export/users/test2

【ZFS の RAID-Z】

RAID-Z とは簡単に言うと ZFS 版の RAID-5 だ。
すごいところはN本のディスクでN本のディスク分のデータ領域が確保できることだ。
以下のように約8.37GBのディスク4本で RAID-Z 構成の raidzpool を作成してみたところ、raidzpool の容量は約 33.5GB になった。

bash-3.00# zpool create raidzpool raidz c1t2d0 c1t4d0 c1t8d0 c1t13d0
bash-3.00# zpool iostat -v
                capacity     operations    bandwidth
pool          used  avail   read  write   read  write
-----------  -----  -----  -----  -----  -----  -----
raidzpool    54.0K  33.5G      0      4      0  8.07K
  raidz      54.0K  33.5G      0      4      0  8.07K
    c1t2d0       -      -      0      4  11.4K   150K
    c1t4d0       -      -      0      4  11.4K   150K
    c1t8d0       -      -      0      5  11.4K   150K
    c1t13d0      -      -      0      4  11.4K   150K
-----------  -----  -----  -----  -----  -----  -----

単なる RAID-0 (ストライピング)との違いを確認するために、適当なディスクをオンラインで交換してみる。
以下のように zpool replace コマンドで c1t13d0 ディスクを c1t11d0 ディスクと交換できる。

bash-3.00# zpool replace raidzpool c1t13d0 c1t11d0
bash-3.00# zpool iostat -v
                capacity     operations    bandwidth
pool          used  avail   read  write   read  write
-----------  -----  -----  -----  -----  -----  -----
raidzpool     109K  33.5G      0      1  2.86K  3.09K
  raidz       109K  33.5G      0      1  2.86K  3.09K
    c1t2d0       -      -      0      1  3.02K  41.5K
    c1t4d0       -      -      0      1  5.21K  41.5K
    c1t8d0       -      -      0      1  5.21K  41.5K
    c1t11d0      -      -      0     15  26.2K   454K
-----------  -----  -----  -----  -----  -----  -----

このように瞬時にディスクを交換した後も、自動的に再同期処理が行われるようで、データが格納されていても壊れることはなかった。

全体的な感想としては恐ろしいくらい簡単で、直感的な操作が可能なので、管理者としては非常にありがたい。それでいて、ZFSはボリュームマネージメント機能も標準で組み込まれた高機能なファイルシステムなので、ディスクマネージメントの負荷がびっくりするほど削減できそうだ。 早く正式リリースして欲しい。VxVMなんていらないよ。

今後も少しずつ検証を続けていく予定。

オラクルユニバーシティSolaris系技術トレーニング一覧

Solarisお勧め書籍

Solaris 11.2 システムハンドブック
Oracle Solaris 11 試験対策本(OCA)