BigAdmin System Administration Portal
特集記事: ZFS - Sun の最新ファイルシステム (パート 2: 管理の簡素化と将来の拡張機能)
Print-friendly VersionPrint-friendly Version

ZFS - Sun の最新ファイルシステム (パート 2: 管理の簡素化と将来の拡張機能)

パート 1: ストレージの完全性、安全性、およびスケーラビリティー Amy Rich、2006 年 9 月

ZFS リソース
トレーニングリソース
 
 

目次 :


はじめに

ZFS - Sun の最新ファイルシステム (パート 1:ストレージの完全性、安全性、およびスケーラビリティー) というこの 2 回シリーズの最初の記事では、Sun の画期的な新しいファイルシステムの概要を紹介し、データの完全性と安全性モデルと、その膨大なスケーラビリティーについても説明しました。今回の記事では、実際の使用のデモンストレーションや、次回のリリースで計画されている刺激的な新しい機能のいくつかを交えながら、管理の容易さに焦点を当てていきます。

ZFS は完全性と信頼性に優れ、パフォーマンスに優れ、さらに安全性も優れていますが、管理の容易さについてはどうでしょうか。システム管理者として、私達はファイルシステムをあれこれ調節し、そこから極限までパフォーマンスを引き出す必要のある立場にいます。あるいは、2 番目のミラー起動可能ディスクを作成せずに VxVM をセットアップする難しい方法を見つけ出したのかもしれません。正しい秘密の呪文を知らなければならないのではなく、ファイルシステムやボリュームマネージャーに適切なことを行わせるだけとは、すばらしいではありませんか。あなたは運がいいです。ZFS の技術者はあなたのことも考えていたのです。


オブジェクトベースのストレージ

ZFS はオブジェクトベースのストレージに関するすべてを含んでいます。ボリュームマネージャーのストレージプールを構築する基本ブロックは zpool です。すべてのファイルシステムの構成要素は zpool の上に乗ります。ストレージをプールに追加するときは、ZFS にファイル、スライス、またはディスク全体を渡すだけです。使用可能なファイルシステムを得るために、formatnewfs を実行する必要のある日々は過ぎ去りました。実際には、ZFS はディスク全体を渡されたときに、入出力をより最適化することができます。zpool(1M) マニュアルページのオプションを見てみましょう。

zpool - configures ZFS storage pools
zpool create [-fn] [-R root] [-M mountpoint] pool vdev...
zpool add [-fn] pool vdev...
zpool list [-H] [-o field[,fi] [pool] ...
zpool status [-xv] [pool] ...

zpool destroy [-f] pool
zpool iostat [-v] [pool] ... [interval [count]]

zpool attach [-f] pool device new_device
zpool detach pool device

zpool replace [-f] pool device [new_device]

zpool scrub [-s] pool ...

zpool offline pool device ...
zpool online pool device ...

zpool export [-f] pool
zpool import [-d dir]
zpool import [-d dir] [-f] [-o options] [-R root] pool |  id [newpool]
zpool import [-d dir] [-f] [-a]

ここで、実際の例を使って自分でやってみましょう。最初に、ミラー化された 2 つのスライスを使って testpool と呼ばれる zpool を作成します。

# zpool create testpool mirror c0t0d0s5 c0t1d0s5

# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
testpool               7.94G    164K   7.94G     0%  ONLINE     -

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

        NAME          STATE     READ WRITE CKSUM
        testpool      ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c0t0d0s5  ONLINE       0     0     0
            c0t1d0s5  ONLINE       0     0     0

metainit のようなものを使用してミラーの両方を設定する必要はなく、Solaris Volume Manager や VxVM に付随していた GUI 的な抽象概念はまったく必要ないほどに簡単でした。たった 1 つのコマンドで完了です。それでも GUI を好むなら、ZFS の管理では /usr/sbin/smcwebserver を実行することで Web 経由で実行することも、または Solaris Express の svcadm enable svc:/system/webconsole:console で実行することもできます。

ストレージの割り当てが済んだので、ファイルシステムの作成を開始することができます。ZFS では、ファイルシステムは階層型で、それにより有用な管理上の制御点となっています。ファイルシステムごとに設定できるのは、サイズ、予約、(データセットとその子孫に対して保証される最小容量)、割り当て、圧縮の選択、バックアップ、およびスナップショットです。たとえば、ホームディレクトリサーバー上に、誰でも自分のファイルシステムを取得することができ、そこでは合計使用容量を 1T バイトまでに制限し、圧縮を有効にすることができます。さらに、確実に特定の VIP ユーザー (またはアプリケーション) が常に少なくとも 1G バイトを利用できるようにし、1 時間ごとに (クローン経由で) スナップショットを作成できます。重要度の低いユーザーは、割り当てを制限したり、一日に 1 度だけスナップショットを作成できます。

次に、zfs(1M) のマニュアルページから、そのオプションを示します。

zfs create filesystem
zfs create [-s] [-b blocksize] -V size volume
zfs destroy [-rRf] filesystem|volume|snapshot
zfs clone snapshot filesystem|volume
zfs rename  filesystem|volume|snapshot filesystem|volume|snapshot
zfs snapshot  filesystem@name|volume@name
zfs rollback [-rRf] snapshot
zfs list [-rH] [-o property[,property]...] [ -t type[,type]...][filesystem|volume|snapshot] ...
zfs set property=value filesystem|volume...
zfs get [-rHp] [-o field[,field]...] [-s source[,source]...]all | 
	property[,property]... filesystem|volume|snapshot...
zfs inherit [-r] property filesystem|volume...
zfs mount
zfs mount [-o options] [-O] -a
zfs mount [-o options] [-O] filesystem
zfs unmount [-f] -a
zfs unmount [-f] [filesystem|mountpoint]
zfs share -a
zfs share filesystem
zfs unshare [-f] -a
zfs unshare [-f] [filesystem|mountpoint]
zfs backup [-i snapshot] snapshot
zfs restore [-vn ] filesystem|volume|snapshot
zfs restore [-vn ] -d filesystem

testfstestfs2 という名前の 2 つのファイルシステムを、プール testpool 内に作成しましょう。

# zfs create testpool/testfs

# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
testpool               268K  7.88G    99K  /testpool
testpool/testfs       98.5K  7.88G  98.5K  /testpool/testfs

# zfs create testpool/testfs2

# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
testpool               376K  7.88G  99.5K  /testpool
testpool/testfs       98.5K  7.88G  98.5K  /testpool/testfs
testpool/testfs2      98.5K  7.88G  98.5K  /testpool/testfs2

# df -k
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/md/dsk/d0         8262869    751774   7428467  10% /
swap                  11800800       784  11800016   1% /etc/svc/volatile
/dev/md/dsk/d30        8262869     23616   8156625   1% /var
swap                  11800016         0  11800016   0% /tmp
swap                  11800040        24  11800016   1% /var/run
testpool               8257771       100   8257672   1% /testpool
testpool/testfs        8257770        99   8257672   1% /testpool/testfs
testpool/testfs2       8257770        99   8257672   1% /testpool/testfs2

今度も、1 つの簡単なコマンドを使用するだけです。newfsmount を実行したり、vfstab を編集する必要はありませんでした。ZFS がすべてをやってくれます。

各 ZFS ファイルシステムは、プール内のすべてのリソースにアクセスできることがわかるでしょう。/testpool/testfs の下にファイルシステムを作成した場合、明確に上書きしない限り、/testpool/testfs のすべての属性は継承されます。ファイルシステムを / 以外の場所にマウントし、いくつかの子ファイルシステムを作成する場合、次のようにすれば目的の場所にまで到達することができます。

# zfs set mountpoint=/devel/testfs testpool/testfs
# zfs create testpool/testfs/dir1
# zfs create testpool/testfs/dir2
# zfs create testpool/testfs/dir3

# df -k
Filesystem           1k-blocks    Used Available Use% Mounted on
/dev/md/dsk/d0         8262869  751774   7428467  10% /
swap                  11800800     784  11800016   1% /etc/svc/volatile
/dev/md/dsk/d30        8262869   23616   8156625   1% /var
swap                  11800016       0  11800016   0% /tmp
swap                  11800040      24  11800016   1% /var/run
testpool               8257771     100   8257672   1% /testpool
testpool/testfs2       8257770      99   8257672   1% /testpool/testfs2
testpool/testfs       16515535      99  16515437   1% /devel/testfs
testpool/testfs/dir1  16515214      99  16515115   1% /devel/testfs/dir1
testpool/testfs/dir2  16515214      99  16515115   1% /devel/testfs/dir2
testpool/testfs/dir3  16515214      99  16515115   1% /devel/testfs/dir3

ZFS は自動的に testpool/testfs/dir1 を正しいマウントポイントに再配置しますが、これはその親である testpool/testfs から継承したからです。ここでも、新しいファイルシステムの作成は、新しいディレクトリまたはファイルを作成するのと同じくらいまったく簡単です。

ファイルシステムに属性をいくつか設定する例を次に示します。

# zfs set sharenfs=rw testpool/testfs
# zfs compression=on testpool/testfs
# zfs set quota=10g testpool/testfs/dir1
   (論理的に容量を制限)
# zfs set reservation=20g testpool/testfs/dir2
   (論理的に容量を事前割り当て)

さて、プール内の容量が不足していてもっと追加したい場合はどうしますか。zpool add を使用してさらにいくつかのデバイスを追加するだけです。

# zpool add testpool c0t0d0s6 c0t1d0s6
invalid vdev specification
use '-f' to override the following errors:
mismatched replication level: pool uses 2-way mirror and 
new vdev uses 1-way disk

ZFS は利口です。ZFS は、以前使っていたデバイスがミラー化されていたことを認識して、ミラー化されていないストレージを追加しようとしているという事実を捉えました。もし、これが本当にやろうとしたことなら、上記のとおり、-f を指定して操作を実行することもできました。しかし、たしかにこれはこちらのミスだったので、元に戻って正しい情報を指定することにします。

# zpool add testpool mirror c0t0d0s6 c0t1d0s6

  # zfs list
  NAME                   USED  AVAIL  REFER  MOUNTPOINT
  testpool               396K  15.8G  99.5K  /testpool
  testpool/testfs       98.5K  15.8G  98.5K  /testpool/testfs
  testpool/testfs2      98.5K  15.8G  98.5K  /testpool/testfs2

ここでも、動的メタデータのため、新しいスペースを使用する前に、プールがそのサイズを調整したり、ミラーが再同期するのを待つ必要はありません。この時点で zpool status を実行すると、ミラーは一緒にストライプ化された 2 つのミラーから成り、各ミラーには 2 つのデバイスが含まれていることがわかります。

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

        NAME          STATE     READ WRITE CKSUM
        testpool      ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c0t0d0s5  ONLINE       0     0     0
            c0t1d0s5  ONLINE       0     0     0
          mirror      ONLINE       0     0     0
            c0t0d0s6  ONLINE       0     0     0
            c0t1d0s6  ONLINE       0     0     0

RAID-Z

ここまで、ミラー化されたストレージだけを見てきました。ZFS は RAID-Z と呼ばれる別のタイプの RAID を実装しており、これは RAID-5 と似ていますが、RAID-5 書き込みホールと呼ばれる RAID-5 の問題を解消するために可変ストライプ幅を使用しています。RAID-5 では、書き込みは 2 つ以上の独立したデバイスに対して実行され、パリティーブロックは各ストライプの構成要素として書き込まれます。このような書き込みは不可分ではないので、データとパリティーのトランザクション中に電源障害が発生すると、データが破壊されてしまう可能性があります。

パリティーリージョンログ (ダーティーリージョンログのようなもので、パリティーディスクのみを対象とする) やバッテリーバックアップの NVRAM を使用してこの問題に取り組んでいるベンダーもあります。NVRAM を使用した解決策では、データが NVRAM に書き込まれてから、データとパリティーがディスクに書き込まれ、最後に NVRAM が解放されます。NVRAM は高価な上、ボトルネックになることも時々あります。また、NVRAM に保存されたデータは 3 日間のダウンタイムのあとに消失してしまいます。長期間に及ぶ障害回復の状況では、このようなデータの消失は容認できません。

RAID-5 とは異なり、RAID-Z のすべての 書き込みはストライプ全体の書き込みであり、これはすべてのディスクに対して書き込みが行われることを意味します。読み込み・修正・書き込みのオーバーヘッドも、RAID-5 書き込みホールもありませんし、ハードウェアに NVRAM も必要ありません。ストレートミラー化や RAID-Z をいつ使用するかを決定しようとしているならば、Roch Bourbonnais の 「When to (and not to) use RAID-Z 」ブログエントリを参照してください。


ファイルシステムのスナップショットとクローン

データでいっぱいのファイルシステムをいくつか持ったところで、ユーザー (またはシステム管理者) が誤って何かを変更または削除してしまい、データを復元したい場合、何が起こるでしょうか。バックアップテープやディスクを使うのは時間がかかりますし、エンドユーザーが自分で簡単にできることではありません。幸いにも ZFS にはスナップショットの機能 (ほかのストレージベンダーが提供しているのと同等) が備わっており、さらにもっとうれしいことに、書き込み時コピーアーキテクチャーのため、実質上オーバーヘッドがありません。実際に、スナップショットを作成する方が、古いデータを含むブロックを解放するよりも速い場合があります。

ZFS の元で、Network Appliance 社の実装のように、変更されたデータだけが追跡されます。保持できるスナップショットの数は、ストレージの容量によって制限されるだけです。スナップショットを簡単に見てみましょう。.zfs ディレクトリが各 ZFS ファイルシステムにスナップショットのサブディレクトリとともに存在します。

# cd /testpool/testfs2
# ls -al .zfs/snapshot

total 0
dr-xr-xr-x    2 root     root            2 Jun 29 17:18 .
dr-xr-xr-x    3 root     root            3 Jun 29 17:18 ..

# cp /bin/sh /bin/tcsh /bin/ksh .
# zfs snapshot testpool/testfs2@snap1
# ls -al .zfs/snapshot/snap1/

total 786
drwxr-xr-x    2 root     sys             5 Jun 29 17:17 .
dr-xr-xr-x    3 root     root            3 Jun 29 17:19 ..
-r-xr-xr-x    1 root     other      238332 Jun 29 17:17 ksh
-r-xr-xr-x    1 root     other      113160 Jun 29 17:17 sh
-r-xr-xr-x    1 root     other      364176 Jun 29 17:17 tcsh

# zfs list testpool/testfs2@snap1

NAME                     USED  AVAIL  REFER  MOUNTPOINT
testpool/testfs2@snap1      0      -   882K  -

ksh を削除して、元に戻したい場合、.zfs/snapshot/snap1 ディレクトリからコピーできます。

# rm ksh
# ls -al

total 514
drwxr-xr-x    2 root     sys             4 Jun 29 17:24 .
drwxr-xr-x    4 root     sys             4 May 22 10:48 ..
dr-xr-xr-x    3 root     root            3 Jun 29 17:25 .zfs
-r-xr-xr-x    1 root     other      113160 Jun 29 17:17 sh
-r-xr-xr-x    1 root     other      364176 Jun 29 17:17 tcsh

# cp .zfs/snapshot/snap1/ksh .
# ls -al
total 787
drwxr-xr-x    2 root     sys             5 Jun 29 17:26 .
drwxr-xr-x    4 root     sys             4 May 22 10:48 ..
dr-xr-xr-x    3 root     root            3 Jun 29 17:27 .zfs
-r-xr-xr-x    1 root     other      238332 Jun 29 17:26 ksh
-r-xr-xr-x    1 root     other      113160 Jun 29 17:17 sh
-r-xr-xr-x    1 root     other      364176 Jun 29 17:17 tcsh

これとは別に、特定のスナップショットと一致させるために、ファイルシステム全体のロールバックを実行してみます。

# rm ksh
# cp /bin/bash .
# ls -al
total 515
drwxr-xr-x    2 root     sys             5 Jun 29 17:28 .
drwxr-xr-x    4 root     sys             4 May 22 10:48 ..
dr-xr-xr-x    3 root     root            3 Jun 29 17:28 .zfs
-r-xr-xr-x    1 root     other      737148 Jun 29 17:28 bash
-r-xr-xr-x    1 root     other      113160 Jun 29 17:17 sh
-r-xr-xr-x    1 root     other      364176 Jun 29 17:17 tcsh

# ls -al .zfs/snapshot/snap1/
total 786
drwxr-xr-x    2 root     sys             5 Jun 29 17:19 .
dr-xr-xr-x    3 root     root            3 Jun 29 17:28 ..
-r-xr-xr-x    1 root     other      238332 Jun 29 17:19 ksh
-r-xr-xr-x    1 root     other      113160 Jun 29 17:17 sh
-r-xr-xr-x    1 root     other      364176 Jun 29 17:17 tcsh

# cd /
# zfs rollback testpool/testfs2@snap1
# ls -al /testpool/testfs2/
total 787
drwxr-xr-x    2 root     sys             5 Jun 29 17:19 .
drwxr-xr-x    4 root     sys             4 Jun 29 17:29 ..
dr-xr-xr-x    3 root     root            3 Jun 29 17:29 .zfs
-r-xr-xr-x    1 root     other      238332 Jun 29 17:19 ksh
-r-xr-xr-x    1 root     other      113160 Jun 29 17:17 sh
-r-xr-xr-x    1 root     other      364176 Jun 29 17:17 tcsh

スナップショットがもう必要なければ、zfs destroy を使用してスペースを回復させることができます。

# zfs destroy testpool/testfs2@snap1
# ls -al testpool/testfs2/.zfs/snapshot/
total 0
dr-xr-xr-x    2 root     root            2 Jun 29 17:31 .
dr-xr-xr-x    3 root     root            3 Jun 29 17:31 ..

ヒントとして、多くの場合、日付でスナップショットに名前をつけると、簡単に追跡を行うのに有効です。

スナップショットと似た、もう 1 つの有用な機能はクローンです。スナップショットとは異なり、クローン内のファイルは変更や書き込みが可能です。ほとんど同じだけれど全く同一ではないデータセットを持っている場合に、これが非常に有用です。1 つの例として、ディスクレスクライアントを起動するサーバーが挙げられます。次に示す例では、最初のディスクレスクライアントに対しファイルシステムを設定し、スナップショットを作成し、スナップショットのクローンを作成してから、クローン内のファイルの 1 つを変更します。

# zfs create testpool/diskless/nevada
   (testpool/diskless/nevada 上に起動可能ファイルシステムを作成)
# zfs create testpool/diskless/sb2500
# zfs snapshot testpool/diskless/nevada@snap1
# zfs clone testpool/diskless/nevada@snap1 \
  testpool/diskless/sb2500/nevada
# vi /testpool/diskless/sb2500/nevada/etc/hosts
   (ホスト名を sb2500 に変更して保存)

自動エンディアン適応

UFS と同じく、ZFS は SPARC と x64 ハードウェアの両方をサポートします。UFS とは異なり、フォーマットやエンディアンの問題を気にする必要なく、あるアーキテクチャーからデータディスクを削除して、ほかのアーキテクチャーに追加することができます。データディスクを SPARC プロセッサで実行しているシステムから削除し、x64 ボックスへと接続することは、現在完全に透過的に行われます。Sun ではこれを自動エンディアン適応と呼んでいます。

ブロックがディスクから読み取られるときに、ZFS はエンディアンをチェックします。エンディアンが現在のアーキテクチャーと一致すれば何も変更されません。一致しない場合、ZFS はデータを表示する前にファイルをバイトスワップしてから、固有のネイティブエンディアンでブロックを書き戻します。ネイティブでないブロックへのアクセスは、多少のオーバーヘッドがかかりますが、このブロックが新しいマシンのネイティブエンディアンで再書き込みされるよりも低い頻度でしか起こりません。このエンディアン変換は ZFS のメタデータブロックに対してのみ適用され、ユーザーデータには適用されないことに注意してください。

データディスクをあるマシンから別のマシンへと移行する場合、まず物理メディア上のすべてのプールをエクスポートし、ディスクを切り離し、それを新しいマシンに接続してから、プールをインポートします。

# zpool export testpool
   (物理的にディスクを移動)
# zpool import

エクスポート中、サイズ、割り当て、予約、NFS エクスポート可能などのファイルシステムのメタデータはすべて保存され、ディスクとプールは論理的にシステムから削除されます。新しいマシンにデータをインポートするとき、特定のプールを指定することも、上記のように import コマンドを実行するだけで、現在システム部分でないプールをスキャンしてそれをすべてインポートすることもできます。


将来の ZFS の機能拡張

ご覧のように、時間と経費を節約するための多くの機能がすでに ZFS には組み込まれています。しかし、もちろんプロジェクトは終了していません。さらにもっとすばらしい機能の実現が差し迫っています。

最新の ZFS のトピックスの 1 つは起動可能 ZFS で、このサブプロジェクトは現在 OpenSolaris で進行中です。現在、冒険心に富んだ技術者達は、ZFS Mountroot についての Tabriz Leman のブログエントリの指示に従い、UFS shim を使用して、x64 上の ZFS ルートファイルシステムに起動することができます。GRUB をブートローダーとして利用することを SPARC OBP に伝えることで、SPARC 技術に基づいて実行するマシンへすぐに ZFS の起動可能性を追加することについて Sun は話し合ってきました。

ZFS 起動は zfs-discuss メーリングリストの Jeff Bonwick のメッセージでも議論されています。「[zfs-discuss] Re: Re: 起動可能 ZFS とライブアップグレード」

さまざまな人が、ファイルシステムを簡単にバックアップするために ZFS スナップショットを使用してきましたが、今後はスナップショットと実際に市販されているバックアップソフトウェアがさらに緊密に統合されるでしょう。スナップショットの動作方法に関するコードレベルの議論については、スナップショットに関する Matthew Ahrens のブログエントリを参照してください。

Eric Schrock の起動可能 ZFS とライブアップグレードに関する zfs-discuss の投稿によると、ZFS クローンを使用したライブアップグレードをサポートする計画があります。これが実現されるためには、インストールとアップグレードのツールがまず変更され、クローンスワップのサポートが ZFS に追加されなければなりません。この機能はすでに Solaris Express に追加されています。

ZFS はまた、ネットワーク上および物理メディア上での安全性についても取り組んでいます。OpenSolaris における ZFS のディスク上暗号化サポートプロジェクトでは、ZFS に対するディスク上の暗号化と復号化、および キー管理サポートを提供する取り組みが進行中です。Darren Moffat は opensolaris.org 向けの ZFS 暗号化プロジェクトの草案の中で、計画されている実装のさまざまな局面について詳しく述べています。目標は、信頼できないパス経由で SAN から提供されたデータを保護し、物理的なストレージの盗難からデータを保護し、安全な削除のメカニズムを提供することです。

ひとたびキーを失えばそのデータを検索する方法はないため、ZFS の暗号化されたファイルシステムのキーを破壊することは、安全な削除の方法として機能します。実現が差し迫っているその他の安全性機能の 1 つとして、DOD 準拠の安全な削除があります。このシナリオでは、ブロックが解放されるとすぐに、複数回上書きされます。

これらの取り組みの最新情報を得るために、opensolaris.org の Web サイトにアクセスして、zfs-discuss または zfs-code メーリングリストに参加してください。


関連情報

ここで取り上げたすべてのテクニカルマニュアル内のコード (記事、FAQ、サンプルを含む ) は、特にほかのライセンス供与がない限り、このライセンスの下に提供されています。


BigAdmin