I ♥ WordPress

ZFSを試してみる
2009/05/05 22:30 posted by kunkichi

世の中はGW真っ最中ですが、こういうときに限って風邪を引いてしまい、昨日まで寝込んでいました。休み前の忙しさの疲れがドッと出たのかなぁ、、、とりあえず、ずっと寝てたので腰が痛い、アタタタタ、、、

でも今日は熱も下がってやっと回復してきたので、前から気になっていた ZFS を試してみました。

環境

  • サーバは前にヤフオクで買った Sun Fire V120。この日のために、元々ディスク1本だったのを、これまたヤフオクで2本目を用意しておきました。36GB玉です。
  • OS はもちろん Solaris10 10/08 for SPARC!FreeBSD やOpenSolaris でもできるのだけど、ここはやっぱりネイティブなOSで。
  • ディスクは2本なのでRAID1(ミラー)。

ZFSの手順を紹介しているサイトをいろいろ調べてみたけど、どこも大体、既に稼働しているシステムに新たにディスクを追加してその領域だけでZFSを試してる場合が多いみたいで、ルートファイルシステムのディスクは別にあってそっちはZFSにしてなかったりするんだよね。

Sun Fire V120の場合、ディスクは2本だけなので、ルートファイルシステム自体ZFSでミラーにできないと、ZFSを使う意味がない。ということで、目的としては、一般的な Solaris のソフトウェアRAID方式だけど、いろいろめんどくさい Solaris Volume Manager(旧DiskSuite)と比較したいと思います。

手順

  1. まずはディスク1本だけでSolaris10をインストール。

    基本的には通常通りのインストール手順でOK。

    UFS か ZFS かを聞かれたときにZFSを指定する。

    あと、UFSのときはスライス(一般的にいうパーティション)を細かく切ってからやるのが普通だと思うのだけど、ZFSの場合は1スライスにしちゃうみたいで、ここはちょっと面食らった。まあ確かにスライスごとの容量の概念自体がZFSでは「ない」ようなので当然かも。

    ということでスライスをどう切るか?みたいな選択はインストーラではほとんどないに等しいのだけど、/ と /var を分けるか?というオプションはあったので、ここはなんとなく分けておいた。

  2. OSインストールが終わって起動してきたらいろいろ確認してみる。
    • まず現在のZFSプールの一覧を zpool list で確認する# zpool list
      NAME    SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
      rpool  33.8G  5.66G  28.1G    16%  ONLINE  -
      rootプールであるrpoolが一つだけ。容量もディスク全部になっているので、まるまるZFSのプールになっていることがわかる。
    • 次にZFSプールの状態を zpool status で確認# zpool status
        プール: rpool
      状態: ONLINE
      スクラブ: 何も要求されませんでした
      構成:
       
              NAME          STATE     READ WRITE CKSUM
              rpool         ONLINE       0     0     0
                c1t0d0s0    ONLINE       0     0     0
       
      エラー: 既知のデータエラーはありません
      1本目のディスク(c1t0d0s)のみがプールに属している状態ということがわかる。
    • df -kの結果ファイルシステム     kbytes     使用済み   使用可能   容量   マウント先
      rpool/ROOT/s10s_u6wos_07b
                          34836480   4799940   28392451   15%   /
      /devices            0          0         0          0%    /devices
      ctfs                0          0         0          0%    /system/contract
      proc                0          0         0          0%    /proc
      mnttab              0          0         0          0%    /etc/mnttab
      swap                1054048    1304      1052744    1%    /etc/svc/volatile
      objfs               0          0         0          0%    /system/object
      sharefs             0          0         0          0%    /etc/dfs/sharetab
      fd                  0          0         0          0%    /dev/fd
      rpool/ROOT/s10s_u6wos_07b/var
                          34836480   69509     28392451   1%    /var
      swap                1052744    0         1052744    0%    /tmp
      swap                1052776    32        1052744    1%    /var/run
      rpool/export        34836480   20        28392451   1%    /export
      rpool/export/home   34836480   24        28392451   1%    /export/home
      rpool               34836480   94        28392451   1%    /rpool
    • rpool自体が/rpoolとしてマウントされている。で、その中の個々のディレクトリがマウントされている感じ?以前はスライスに分けてマウントしていたような、/、/var、/exportなどは、一応マウントされて入るけど、/rpool配下にあるのがマウントされているだけだし、/ と /var は /rpool配下のROOTディレクトリ配下がマウントされてる。なーんかよくわからん。

    • vfstabの内容#device    device     mount     FS        fsck    mount     mount
      #to mount  to fsck    point     type      pass    at boot   options
      #
      fd         -          /dev/fd   fd        -       no        -
      /proc      -          /proc     proc      -       no        -
      /dev/zvol/dsk/rpool/swap
                 -          -         swap      -       no        -
      /devices   -          /devices  devfs     -       no        -
      sharefs    -          /etc/dfs/sharetab
                                      sharefs   -       no        -
      ctfs       -          /system/contract
                                      ctfs      -       no        -
      objfs      -          /system/object
                                      objfs     -       no        -
      swap       -          /tmp      tmpfs     -       yes       -
      vfstabには 全くといっていいほど記載がないね。vfstabによる設定は不要みたいなことが書いてあったけど、ここまでまったくないとは思わなかった。

    とりあえずZFSの第一印象としては、

    • 結局のところ、1スライス(/rpool)で切っているので、今までやってたような個々のスライスの容量は意味がなくなってくる。
    • df の出力はもうほとんど意味を持たないかも。
    • 上にも書いたけど、/と/varはrpool配下のROOT/s10s_u6wos_07b以下なんだけど、/exportと/export/home はrpool直下。この違いは何?

    というところかなぁ。この辺はちょっと置いといてとりあえず先に進めます。

  3. ディスク2本目を追加して、スライスを切る。$ format -e
    ・・・
    >p
    ・・・
    Part      Tag    Flag     Cylinders         Size            Blocks
      0 unassigned    wm       0 - 49394       33.92GB    (49395/0/0) 71128800
      1 unassigned    wu       0                0         (0/0/0)            0
      2     backup    wu       0 - 49394       33.92GB    (49395/0/0) 71128800
      3 unassigned    wm       0                0         (0/0/0)            0
      4 unassigned    wm       0                0         (0/0/0)            0
      5 unassigned    wm       0                0         (0/0/0)            0
      6 unassigned    wm       0                0         (0/0/0)            0
      7 unassigned    wm       0                0         (0/0/0)            0
    ・・・
    事前に1本目のディスクのスライスを確認しておいたのだけど、やっぱり1スライスだけ切って全部割り当ててありました。従って2本目も同じように切ります。

    スライスを切り終わったらlabelする。> label
    [0] SMI Label
    [1] EFI Label
    Specify Label type[0]:
    Ready to label disk, continue? y
    実はここでかなりはまったんだけど、ディスクのlabelの仕方には二種類あって、新しいより拡張性のあるEFIラベル(1TB以上のディスクとか扱える)ではなくて、昔からあるSMIラベル(VTOCラベル)でないと、rootファイルシステムのZFSミラーはできない、らしいです。(format -eだと両方のラベルを扱える)

    最初にどうやって追加するかもよくわかんなくていろいろやってるうちに勝手にEFIラベルでlabelしちゃってたみたいで、こんな風になってました。Part      Tag    Flag     First Sector        Size        Last Sector
      0        usr    wm                34      33.91GB         71116541    
      1 unassigned    wm                 0          0              0    
      2 unassigned    wm                 0          0              0    
      3 unassigned    wm                 0          0              0    
      4 unassigned    wm                 0          0              0    
      5 unassigned    wm                 0          0              0    
      6 unassigned    wm                 0          0              0    
      8   reserved    wm          71116542       8.00MB         71132925
    これ自体はEFIラベルでlabelした場合にはこうなるのでおかしくはないのだけど、なんせ見たことなかったもんで(笑)スライス8消せねーとか言いながら、はまってた訳です(苦笑)formatコマンドも-eオプションつけずに実行してたので今となってはそのときの状況が既によく見えませんが、とりあえず、ZFSのrootプールでは、

    • format コマンドは -e オプションをつけて実行
    • スライス0に全部割り当て。
    • labelはEFIではなく、SMIで。

    と覚えておけば大丈夫ですかね。

  4. なんとかスライスを切れたので、既存のrootファイルシステムのプールに2本目のディスクをミラーとして追加します。# zpool attach -f rpool c1t0d0s0 c1t1d0s0特にエラーがなければ何も表示されません。
    zpool statusで状態を確認してみます。# zpool status
      プール: rpool
    状態: ONLINE
    状態: 1 つまたは複数のデバイスの再同期化が進行中です。
            プールはおそらく縮退状態で動作を継続します。
    アクション: 再同期化が完了するまでお待ちください。
    スクラブ: resilver が 0h0m で進行中、3.53% 完了、0h4m 開始待ち
    構成:
     
            NAME          STATE     READ WRITE CKSUM
            rpool         ONLINE       0     0     0
              mirror      ONLINE       0     0     0
                c1t0d0s0  ONLINE       0     0     0
                c1t1d0s0  ONLINE       0     0     0
     
    エラー: 既知のデータエラーはありません
    ミラーの同期が行われます。Solaris Volume Manager のころはこの同期に死ぬほど時間がかかったのだけど、ZFSは早いです。数分で終わります。# zpool status
      プール: rpool
    状態: ONLINE
    スクラブ: Tue May  5 20:44:04 2009
    上で 0 エラーが発生した 0h5m のあとの resilver completed構成:
     
            NAME          STATE     READ WRITE CKSUM
            rpool         ONLINE       0     0     0
              mirror      ONLINE       0     0     0
                c1t1d0s0  ONLINE       0     0     0
                c1t0d0s0  ONLINE       0     0     0
     
    エラー: 既知のデータエラーはありません
    同期が終わりました。
  5. 同期が終わったら、2本目のディスクからも起動できるようにbookblkを2本目のディスクにコピーします。なんかこの辺LinuxのソフトウェアRAIDでgrubをインストールするのと似てますね。# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t1d0s0
  6. RAIDミラーが正しく構築されているかを確認するために、一旦電源を落として、1本目のディスクを抜いて、2本目だけで起動できるかを確認してみます。ほんとは強制的に引っこ抜いてもいいのだけど、さすがに故障すると怖いので。。。

    まずシャットダウン# shutdown -y -i0 -g0
    ok
    物理的に1本目のディスクを抜きます。一応、念のためにブートデバイスの設定を確認しておきます。OKプロンプトでprintenv boot-deviceを実行。(というか実はPROMのboot-deviceの設定に2番目のディスクが含まれていなかったことに気づかず、一回起動に失敗したことは内緒です)printenv boot-device
    /pci@1f,0/pci@1/scsi@8/disk@0,0:a disk net
    最初の長いのが1本目のディスク、2番目の”disk”は1本目のディスクを指定するエイリアス。ちなみにエイリアスを確認するにはPROMでdevaliasを実行します。ok devalias
    ・・・
    disk                     /pci@1f,0/pci@1/scsi@8/disk@0,0
    disk3                    /pci@1f,0/pci@1/scsi@8/disk@3,0
    disk2                    /pci@1f,0/pci@1/scsi@8/disk@2,0
    disk1                    /pci@1f,0/pci@1/scsi@8/disk@1,0
    disk0                    /pci@1f,0/pci@1/scsi@8/disk@0,0
    ・・・
    これをみると、1本目のディスクが”disk”、2本目のディスクは”disk1″となっています。これに併せてさっきの設定をみると、最後がネットワークブートなので、ブートデバイスの順序は、1本目のディスク→1本目のディスク→ネットワークブート、となっており、2本目のディスクがブートでバイスとして含まれていないので、このままだとブートしてもブートデバイスが見つからないということで失敗します。
    では2本目のディスクをブートデバイスとして含めてあげます。ブートデバイスの変更はsetenvでboot-deviceを指定します。さっきのエイリアスを見ると、disk1というのがそれにあたるので、コマンドは以下。setenv boot-device disk disk1 net長ったらしいのは、結局”disk”と同じなので外しました。
    最後にこの設定をNVRAMに記憶しておくために、nvstoreを実行します。ok nvstore
    では起動します。ok boot
    Sun Fire V120 (UltraSPARC-IIe 648MHz), No Keyboard
    OpenBoot 4.0, 1024 MB memory installed, Serial #59084701.
    Ethernet address XX:XX:XX:XX:XX:XX, Host ID: 83858f9d.
     
    Executing last command: boot                                          
    Drive not ready
    Can't read disk label.
    Can't open disk label package
    Boot device: disk1  File and args:
    SunOS Release 5.10 Version Generic_137137-09 64-bit
    Copyright 1983-2008 Sun Microsystems, Inc.  All rights reserved.
    Use is subject to license terms.
    SUNW,eri0 : 100 Mbps full duplex link up
    Hostname: XXX.YYY.com
    Reading ZFS config: done.
    Mounting ZFS filesystems: (6/6)
     
    XXX.YYY.com console login:
    最初は”disk”(1本目のディスク)からブートしようとして失敗して、次に”disk1″(2本目のディスク)から起動しているのがわかりますねー。とりあえず起動してきました。

  7. 正常に起動しているか銅貨を確認するために、片方のディスクだけで起動した状態でZFSのプールの状態を確認してみます。  プール: rpool
    状態: DEGRADED
    状態: 1 つまたは複数のデバイスを開くことができませんでした。
            十分な複製が存在するため、プールは縮退状態で動作を継続できます。
    アクション: 見つからなかったデバイスを接続し、'zpool online' を使用してオンライラインにしてください。
    次のサイトを参照してください: http://www.sun.com/msg/ZFS-8000-2Q
    スクラブ: 何も要求されませんでした
    構成:
     
            NAME          STATE     READ WRITE CKSUM
            rpool         DEGRADED     0     0     0
              mirror      DEGRADED     0     0     0
                c1t1d0s0  ONLINE       0     0     0
                c1t0d0s0  UNAVAIL      0     0     0  オープンに失敗しました。
     
    エラー: 既知のデータエラーはありません
    1本目のディスクが見えないので「縮退」状態になってますが、少なくともこれで片方のディスクに障害が起きても問題なく起動してくることがわかりました。
    次に新しいディスクを追加して元のミラー状態に戻します。新しいディスクを接続してformatコマンドでスライスを切り直す必要がありますが、プールに属しているとformat等が実行できないので、一旦プールから削除します。# zpool detach rpool c1t0d0s0その後、format -eコマンドを実行してスライスを切り直します。SMIラベルでlabelすることを忘れないように。
    切り直したら再度プールに追加します。# zpool attach -f rpool c1t1d0s0 c1t0d0s0今度はデバイスの指定が逆になりますね。
    最後に2本目のディスクを追加したときと同じようにbootblkをコピーします。# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t0d0s0これで終わりです。

最後ちょっと駆け足になっちゃった感がありますが、確かにZFSらくちんです。同期も早いし、Solaris Volume Managerと比べてコマンドや設定が直感的な感がします。

ただし、これまでのスライス(パーティション)単位的な考え方とは全く異なるので、その辺り、ちょっと受け入れ難い人もいるかもしれないです、bootblkをディスクごとにコピーするあたり、あんまりこなれてない気もしますし。
ただそれを差し引いてもこのらくちん差には逆らえないものがあります。

あとは、ヘビーな壊れ方をしたときにどうなるか?とか、書き込みのパフォーマンスとかが気になりますね、この辺がある程度クリアになれば十分本番運用でも使えそうですが、この辺は実際に動かしてノウハウを蓄積していかないとわからないところですね。まずはあまりクリティカルな用途ではないサーバで運用してみようかと思います。

コメント&トラックバック

トラックバックURL





このページの先頭へ