ZFS - Sun の最新ファイルシステム (パート 2: 管理の簡素化と将来の拡張機能)パート 1: ストレージの完全性、安全性、およびスケーラビリティー Amy Rich、2006 年 9 月
目次 : はじめにZFS - Sun の最新ファイルシステム (パート 1:ストレージの完全性、安全性、およびスケーラビリティー) というこの 2 回シリーズの最初の記事では、Sun の画期的な新しいファイルシステムの概要を紹介し、データの完全性と安全性モデルと、その膨大なスケーラビリティーについても説明しました。今回の記事では、実際の使用のデモンストレーションや、次回のリリースで計画されている刺激的な新しい機能のいくつかを交えながら、管理の容易さに焦点を当てていきます。 ZFS は完全性と信頼性に優れ、パフォーマンスに優れ、さらに安全性も優れていますが、管理の容易さについてはどうでしょうか。システム管理者として、私達はファイルシステムをあれこれ調節し、そこから極限までパフォーマンスを引き出す必要のある立場にいます。あるいは、2 番目のミラー起動可能ディスクを作成せずに VxVM をセットアップする難しい方法を見つけ出したのかもしれません。正しい秘密の呪文を知らなければならないのではなく、ファイルシステムやボリュームマネージャーに適切なことを行わせるだけとは、すばらしいではありませんか。あなたは運がいいです。ZFS の技術者はあなたのことも考えていたのです。 オブジェクトベースのストレージZFS はオブジェクトベースのストレージに関するすべてを含んでいます。ボリュームマネージャーのストレージプールを構築する基本ブロックは 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 つのスライスを使って # 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
ストレージの割り当てが済んだので、ファイルシステムの作成を開始することができます。ZFS では、ファイルシステムは階層型で、それにより有用な管理上の制御点となっています。ファイルシステムごとに設定できるのは、サイズ、予約、(データセットとその子孫に対して保証される最小容量)、割り当て、圧縮の選択、バックアップ、およびスナップショットです。たとえば、ホームディレクトリサーバー上に、誰でも自分のファイルシステムを取得することができ、そこでは合計使用容量を 1T バイトまでに制限し、圧縮を有効にすることができます。さらに、確実に特定の VIP ユーザー (またはアプリケーション) が常に少なくとも 1G バイトを利用できるようにし、1 時間ごとに (クローン経由で) スナップショットを作成できます。重要度の低いユーザーは、割り当てを制限したり、一日に 1 度だけスナップショットを作成できます。 次に、 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
# 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 つの簡単なコマンドを使用するだけです。 各 ZFS ファイルシステムは、プール内のすべてのリソースにアクセスできることがわかるでしょう。 # 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 は自動的に ファイルシステムに属性をいくつか設定する例を次に示します。 # 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 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 は、以前使っていたデバイスがミラー化されていたことを認識して、ミラー化されていないストレージを追加しようとしているという事実を捉えました。もし、これが本当にやろうとしたことなら、上記のとおり、 # 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
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 社の実装のように、変更されたデータだけが追跡されます。保持できるスナップショットの数は、ストレージの容量によって制限されるだけです。スナップショットを簡単に見てみましょう。 # 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 -
# 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 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 のメタデータブロックに対してのみ適用され、ユーザーデータには適用されないことに注意してください。 データディスクをあるマシンから別のマシンへと移行する場合、まず物理メディア上のすべてのプールをエクスポートし、ディスクを切り離し、それを新しいマシンに接続してから、プールをインポートします。
エクスポート中、サイズ、割り当て、予約、NFS エクスポート可能などのファイルシステムのメタデータはすべて保存され、ディスクとプールは論理的にシステムから削除されます。新しいマシンにデータをインポートするとき、特定のプールを指定することも、上記のように 将来の 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 はまた、ネットワーク上および物理メディア上での安全性についても取り組んでいます。OpenSolaris における ZFS のディスク上暗号化サポートプロジェクトでは、ZFS に対するディスク上の暗号化と復号化、および キー管理サポートを提供する取り組みが進行中です。Darren Moffat は opensolaris.org 向けの ZFS 暗号化プロジェクトの草案の中で、計画されている実装のさまざまな局面について詳しく述べています。目標は、信頼できないパス経由で SAN から提供されたデータを保護し、物理的なストレージの盗難からデータを保護し、安全な削除のメカニズムを提供することです。 ひとたびキーを失えばそのデータを検索する方法はないため、ZFS の暗号化されたファイルシステムのキーを破壊することは、安全な削除の方法として機能します。実現が差し迫っているその他の安全性機能の 1 つとして、DOD 準拠の安全な削除があります。このシナリオでは、ブロックが解放されるとすぐに、複数回上書きされます。 これらの取り組みの最新情報を得るために、opensolaris.org の Web サイトにアクセスして、zfs-discuss または zfs-code メーリングリストに参加してください。 関連情報
ここで取り上げたすべてのテクニカルマニュアル内のコード (記事、FAQ、サンプルを含む ) は、特にほかのライセンス供与がない限り、このライセンスの下に提供されています。 |
BigAdmin SubscriptionsBigAdmin Areas
BigAdmin Sun Center
BigAdmin Topics | ||||