2009年 1月 23日 金曜日
やっぱり Sun がスキ!
ZFS クローン機能で「ディスク容量削減&リカバリ時間短縮」
今回は ZFS クローン機能を使用して
- ディスク容量削減
- リカバリ時間短縮
環境
この環境で使用しているのは Sun SPARC Enterprise T2000 + LDoms です。LDoms は Sun の Ultra SPARC T シリーズで使用できる 仮想化機能です。LDoms では、mkfile で作成した任意のファイルを Guest Domain ブート用の仮想ディスクデバイスとして設定することが可能です。 LDoms の詳細はこちら→過去記事(LDoms のポイント), LDoms 1.0.3 管理ガイド(LDoms の詳細)
ZFS クローン機能で便利になったこと - ディスク容量削減
この T2000 にはディスクが 73.4GB x 1 本しかありません。Guest Domain x 8 個 + Control Domain x 1 個 なので、Solaris 10 10/08 で全体ディストリビューションをインストールした場合、 (6.7GB + 0.5GB) x 9 = 66.6GB が必要となり UFS の管理領域や 73.4GB/(1024^3) を考えると不足してしまいます。(Solaris 10 10/08 推奨ディスク容量 = 6.7GB, スワップがデフォルトで 512MBの根拠はこちら)
そこで ZFS クローン機能を使用して以下のような方法でディスク容量に余裕を 持たせてみました。
- ZFS のプール作成。今回は zfs boot 環境を使っているので、すでに solpool(default では rpool という名前ですが、名前変更してます) という プールを作成済み
- Guest Domain 1 用の solpool/ldg1 というファイルシステムを作成
# zfs create solpool/ldg1
- solpool/ldg1 の下にファイルを作成(ブートディスクとして設定)。
少し大きめですが12GB のファイルを mkfile で作成しました。
# mkfile 12G solpool/ldg1/bootdisk
- Guest Domain 1 を起動し、OS をインストール・パッチを適用・必要な設定を行った後 sys-unconfig する。
- Guest Domain 1 のスナップショット作成
# zfs snapshot solpool/ldg1@base
- Guest Domain 2 〜 8 用にクローン作成
zfs clone solpool/ldg1@base solpool/ldg2 zfs clone solpool/ldg1@base solpool/ldg3 zfs clone solpool/ldg1@base solpool/ldg4 zfs clone solpool/ldg1@base solpool/ldg5 zfs clone solpool/ldg1@base solpool/ldg6 zfs clone solpool/ldg1@base solpool/ldg7 zfs clone solpool/ldg1@base solpool/ldg8
- Guest Domain 2 〜 8 用に LDoms の設定
ここでは省略します。 - 実際どうなったのか確認
73.4GB のディスク 1 本で以下のように 33.9GB の空き容量がある状態に することが出来ました。もちろん ldg1 〜 ldg8 のすべてを起動した 状態で確認しています。# zfs list NAME USED AVAIL REFER MOUNTPOINT solpool 33.1G 33.9G 103K /solpool solpool/ROOT 12.6G 33.9G 18K legacy solpool/ROOT/s10s_u6wos_07b 12.6G 33.9G 12.6G / solpool/dump 1.50G 33.9G 1.50G - solpool/export 2.05M 33.9G 20K /export solpool/export/home 2.03M 33.9G 2.03M /export/home solpool/ldg1 12.3G 33.9G 12.0G /solpool/ldg1 solpool/ldg1@base 265M - 12.0G - solpool/ldg2 322M 33.9G 12.0G /solpool/ldg2 solpool/ldg3 306M 33.9G 12.0G /solpool/ldg3 solpool/ldg4 317M 33.9G 12.0G /solpool/ldg4 solpool/ldg5 311M 33.9G 12.0G /solpool/ldg5 solpool/ldg6 325M 33.9G 12.0G /solpool/ldg6 solpool/ldg7 624M 33.9G 12.5G /solpool/ldg7 solpool/ldg8 544M 33.9G 12.5G /solpool/ldg8 solpool/swap 4G 37.9G 16K -
なぜ空き容量が出来たのでしょうか? 本来であれば各ドメイン毎に 12GB 割り当てたので Guest Domain 用に 12 GB x 8 domain = 96 GB 必要です。 しかしクローンはブロック単位の差分で管理している為、 ldg2 〜 ldg8 では、実際には差分のみ(上記の USED の値) の ディスクしか消費されません。
ZFS クローン機能で便利になったこと - リカバリ時間短縮
この利点も具体例を用いながら説明したいと思います。少し前 ldg8 を後輩に貸し出しました。そうしたらなんと ldg8 の ルート直下で rm -rf * をしたとのこと。ZFS クローン機能を使用していなければ、 OS インストール、パッチ適用、設定し直し等々待ち時間を含めるとリカバリが 1 日仕事になりそうです。しかしクローン機能を使用していたので、 以下の(1)のような方法で簡単にリカバリ出来ました。 (2) は rm -rf * をされた後に気がついた方法です。
- クローンを再作成
# zfs destroy solpool/ldg8 # zfs clone solpool/ldg1@base solpool/ldg8
と実行し、ldg8 を起動させ初期設定を行ったらすぐ元通り。
- 事前にクローンのスナップショットを作成しておく
事前に# zfs snapshot solpool/ldg8@bak
としてクローンのスナップショットを取得しておけば、 もしルートで rm -rf * を実行されても# zfs rollback solpool/ldg8@bak
で、すぐ元通りということも可能です。(この場合は初期設定すら不要です)
まとめ
ZFS クローン機能を使うと、例えば開発環境等で以下のことが実現可能です。- ディスク容量削減
- リカバリ時間短縮
補足
- ディスク IO が多い場合は LDom 配下のディスクをわけた方が良いです。 ですが、IO 負荷はそんなにかからない予定だが、沢山 OS を起動していろいろなことを 試したいという開発環境にはこの機能を使うと便利なことこの上無いかと。。
- このような「ディスク容量の削減」「迅速なリカバリ」は、Solaris Containers でも全く同様のことが可能です。
Posted at 03:00午後 1 23, 2009 by Chizu Kitano in Sun | 投稿されたコメント[2]
Solaris 10 10/08 SPARC使ってます。
この記事と直接関係ないのですが、
ZFS root環境でのベアメタルリカバリ手順を紹介してもらえるとうれしいなぁと思ってます。(他力本願で済みません)
zfs send -R rpool@snap > /dev/rmt/0c
したのを
zfs recieve -v -F -d rpool < /dev/rmt/0c
すると、
cannot mount '/export': failed to create mountpoint
で復元できませんでした。
しかたないので、再帰的にzfs send -Rするのはやめて、zfsの階層ごとにzfs sendしたのをそれぞれzfs recieveしてinstallbootしたら復元できたのですが、rpoolもzfs send -Rでバックアップしたのを復元できると便利だな、と思いました。。
Posted by 山本 宏 on 2月月 05日, 2009年 at 11:47 午前 JST #
rpoolの復元手順、こちらにみつかりました。
まだ、再帰的にzfs sendしたものを復元する手順はないのですね。。。
http://www.solarisinternals.com/wiki/index.php/ZFS_Troubleshooting_Guide#ZFS_Root_Pool_Recovery
Posted by 山本 宏 on 2月月 10日, 2009年 at 11:26 午前 JST #