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)
|