ZFS クローン機能で「ディスク容量削減&リカバリ時間短縮」 : やっぱり Sun がスキ! やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20090123 2009年 1月 23日 金曜日

ZFS クローン機能で「ディスク容量削減&リカバリ時間短縮」

今回は 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 クローン機能を使用して以下のような方法でディスク容量に余裕を 持たせてみました。
  1. ZFS のプール作成。今回は zfs boot 環境を使っているので、すでに solpool(default では rpool という名前ですが、名前変更してます) という プールを作成済み
  2. Guest Domain 1 用の solpool/ldg1 というファイルシステムを作成
    # zfs create solpool/ldg1
    
  3. solpool/ldg1 の下にファイルを作成(ブートディスクとして設定)。 少し大きめですが12GB のファイルを mkfile で作成しました。
    # mkfile 12G solpool/ldg1/bootdisk
    
  4. Guest Domain 1 を起動し、OS をインストール・パッチを適用・必要な設定を行った後 sys-unconfig する。
  5. Guest Domain 1 のスナップショット作成
    # zfs snapshot solpool/ldg1@base
    
  6. 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
    
  7. Guest Domain 2 〜 8 用に LDoms の設定
    ここでは省略します。
  8. 実際どうなったのか確認

    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 * をされた後に気がついた方法です。
  1. クローンを再作成
    # zfs destroy solpool/ldg8
    # zfs clone   solpool/ldg1@base solpool/ldg8
    
    と実行し、ldg8 を起動させ初期設定を行ったらすぐ元通り。

  2. 事前にクローンのスナップショットを作成しておく
    事前に
    # zfs snapshot solpool/ldg8@bak
    
    としてクローンのスナップショットを取得しておけば、 もしルートで rm -rf * を実行されても
    # zfs rollback solpool/ldg8@bak
    
    で、すぐ元通りということも可能です。(この場合は初期設定すら不要です)
今度 Guest Domain を貸し出すときは、 スナップショットを作成して貸し出すことにします。。。。。

まとめ

ZFS クローン機能を使うと、例えば開発環境等で以下のことが実現可能です。
  • ディスク容量削減
  • リカバリ時間短縮
非常に便利な機能だと思いますので、これを機会に是非 ZFS を ご検討ください。

補足

  • ディスク IO が多い場合は LDom 配下のディスクをわけた方が良いです。 ですが、IO 負荷はそんなにかからない予定だが、沢山 OS を起動していろいろなことを 試したいという開発環境にはこの機能を使うと便利なことこの上無いかと。。
  • このような「ディスク容量の削減」「迅速なリカバリ」は、Solaris Containers でも全く同様のことが可能です。

投稿されたコメント:

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 #

コメント
  • HTML文法 不許可