やっぱり Sun がスキ! : Weblog やっぱり Sun がスキ!

やっぱり Sun がスキ!

http://blogs.sun.com/yappri/date/20070130 2007年 1月 30日 火曜日

Sunグッズ紹介(8)

Sun のロゴ入りグッズ紹介の第八弾です。


・Sun ロゴ入りフォトスタンド
 ガラス製のフォトスタント。透明なフレームなので机の上に置いても邪魔になりません。
 お気に入りの写真を入れればリラックスして仕事に向き合えます。






・Sun ロゴ入りシューホーン(靴べら)
 Sun ロゴ入りの革小物。折りたたみタイプでコンパクトに収まり持ち運びにも便利。
 落ち着きのあるシンプルなデザインなのでビジネスシューズにもピッタリですね。






・Sun ロゴ入りペンケース
 Sun ロゴ入りの革小物。ペンを一本収納するシンプルなペンケース。
 鞄に忍ばせておいてもかさばらないのが良いところです!






・Sun ロゴ入りボールペン
 新しい Sun 製品に採用されているシルバーデザインに合わせたスタイルで
 仕上げたボールペン。金属の質感と重量感がとても良い感じです。
 Sunグッズ紹介(1)にてご紹介したボールペンと同じモデルです。質の良さをお伝えする為に撮り直しました♪





http://blogs.sun.com/yappri/date/20070126 2007年 1月 26日 金曜日

Solaris iSCSI Target/Initiator

Solaris でも iSCSI Target/Initiator が構築できることをご存知ですか?

実は、Nevada build 7 (Nevada は、次期 Solaris の開発コードネームです)では、Solaris iSCSI Initiator が実装され Solaris 10 3/05 HW2 リリースから、Solaris iSCSI Initiator が一般にリリースされました。
しかし、iSCSI を堪能するには、iSCSI Target が必要となります。

Solaris iSCSI Initiator が実装された当時は、iSCSI Target を手軽に構築しようにも、なかなかできることではありませんでした。
しかし、昨年の夏、ついにソフトウェアによる iSCSI Target が Nevada build 44 にて実装されました!
さらに改良は続けられており、Nevada build 54 では、ZFS ファイルシステムとの連携が可能となりました。

この機会を逃すわけにはいきませんので、iSCSI Target となる Solaris 上に、zfs volume を作成し、その領域を iSCSI Initiator で mount してみるのが、今回の目的となります。

iSCSI の概要については、下記 URL に書かれているものが、良くまとまっているかと思いますので、 参考になるかと思います。

    最新IPストレージ技術「iSCSI」
    http://www.atmarkit.co.jp/fnetwork/tokusyuu/16iscsi/iscsi01.html

ZFS 連携では、ZFS の emulated volume 機能 ( zfs create -V) を利用します。
Nevada b54 では、ZFS 領域を iSCSI target として利用できる shareiscsi オプション が実装されました。

  • 必要なもの

  これだけです。
  ZFS 同様、特定のハードウェアなどは、必要ありません。
 
  • iSCSI Target の構築
まずは、iscsi target である、iscsitadm が起動しているか確認します。

# svcs -a | grep iscsi
disabled       21:20:36 svc:/network/iscsi_initiator:default
disabled       21:20:48 svc:/system/iscsitgt:default

default では、disable となっているので、これを enable にしてあげます。

# svcadm enable iscsitgt
# svcs -a | grep iscsi
disabled       21:20:36 svc:/network/iscsi_initiator:default
online         21:49:29 svc:/system/iscsitgt:default


次に、iSCSI Initiator が利用するストレージを作成します。

これは、ZFS で pool を作成、ZFS emulated volume で、適当な容量を切り出します。
ZFS 用にディスクが用意出来ない事態も考慮して、ここでは 2G バイトのファイル を利用して pool を作成してみることにします。

  • 1. 2G バイトのファイルを作成し、zfs 領域を作成


    # mkfile 2g /usr/tmp/iscsitest.2g
    # zpool create test /usr/tmp/iscsitest.2g
    # zpool list
    NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
    test                       1.98G      88K    1.98G      0%  ONLINE              -

  • 2. 作成した test pool から、1G バイトの emulated volume である test/vol を作成します。

    # zfs create -V 1gb test/vol                                                
    # zfs list
    NAME       USED  AVAIL  REFER  MOUNTPOINT
    test          1.00G   976M   24.5K  /test
    test/vol     22.5K  1.95G    22.5K  -

  • 3. 利用する ZFS 領域を確保できたら、iSCSI Target で利用する backing storeディレクトリを指定します。
ここから、iSCSI を構築するためのコマンドが登場します。

    ・iscsitadm  (iSCSI Target 管理コマンド )
    ・iscsiadm   (iSCSI Initator 管理コマンド )
 
backing store ディレクトリは、iSCSI Target が Initiator に提供する領域 に使われる場所となるので、ここでは、emulated vlume を作成した /test (ZFS pool) を指定します。

# iscsitadm modify admin -d /test
# iscsitadm show admin  
iscsitadm:
    Base Directory: /test
    CHAP Name: Not set
    RADIUS Access: Not set
    RADIUS Server: Not set
    iSNS Access: Not set
    Fast Write ACK: Not set

  • 4. 作成した test/vol に shareiscsi オプションをセットします。

    これで、iSCSI Target としての情報が登録されます。
     # zfs set shareiscsi=on test/vol

  • 5. iSCSI Target 情報を見る
iSCSI では、iSCSI Qualified Name と呼ばれるユニークな ID で、ノード管理をおこないます。
Solaris iSCSI Target/Initiator では、iqn. で始まる識別子を利用しており、iSCSI Target となる、Nevada b54 マシンは、
  
    「iqn.1986-03.com.sun:02:882dc508-86d5-47be-a7cc-92c931245fea」

という、iSCSI ネームで識別されることがわかります。

# iscsitadm list target -v
Target: test/vol
    iSCSI Name: iqn.1986-03.com.sun:02:882dc508-86d5-47be-a7cc-92c931245fea
    Alias: test/vol
    Connections: 0
    ACL list:
    TPGT list:
    LUN information:
        LUN: 0
            GUID: 0x0
            VID: SUN
            PID: SOLARIS
            Type: disk
            Size: 1.0G
            Backing store: /dev/zvol/rdsk/test/vol
            Status: online


さらに、LUN 情報からは、VID(Vendor ID) や、容量(Size)、どのような領域を利用しているか (backing store) などがわかります。

以上で、iSCSI Target の構築は完了です。
本当ならば、接続認証などの設定もおこなうべきですが、まずは接続してみることを目的としていますので、省略します。
ちなみに、次期アップデートリリースとなる、Solaris 10 Update 4 では、iSCSI Target が提供される予定です。

それでは、上記で構築した iSCSI Target が提供する、1GB の領域を利用するために
iSCSI Initiator の設定をおこなってみましょう。


  • iSCSI Initiator の構築
引き続き、Solaris 10 11/06 のマシンで iSCSI Initiator を構築します。

まずは、iSCSI Initiator のサービス (iscsid) が有効になっているか確認します。

# svcs -a | grep iscsi
disabled       21:20:36 svc:/network/iscsi_initiator:default

default では、disable となっているので、これを enable にしてあげます。

# svcadm enable iscsi_initiator
# svcs -a | grep iscsi
enable       21:20:36 svc:/network/iscsi_initiator:default


  • 1. iSCSI Initiator の情報を確認

    iSCSI Target の時と同様、iSCSI Initiator 側の情報も確認してみましょう。
    iSCSI Initiator となる、Solaris 10 11/06 のマシンには、以下の iSCSI ネームが割り当てられていることがわかります。
          iqn.1986-03.com.sun:01:e0000000783b.45b5b9dc
 
# iscsiadm list initiator-node               
Initiator node name: iqn.1986-03.com.sun:01:e0000000783b.45b5b9dc
Initiator node alias: -
        Login Parameters (Default/Configured):
                Header Digest: NONE/-
                Data Digest: NONE/-
        Authentication Type: NONE
        RADIUS Server: NONE
        RADIUS access: unknown
        Configured Sessions: 1

  • 2. iSCSI Target の IP アドレスを設定します。
iSCSI Target に接続するために、iSCSI Target となるマシンの IP アドレス (ここでは、129.158.56.74)を discovery-address に指定します。

 # iscsiadm add discovery-address 129.158.56.74


  • 3. iSCSI Target への接続を有効にします。
このコマンドを実行することで、すぐに接続が開始されます。

# iscsiadm modify discovery -t enable

  • 4. デバイスを確認します。
それでは、デバイスが認識されているか確認しましょう。
てっとりばやく、iostat コマンドで。

# iostat -En
c0t010000D7E29A7AC700002A0045B5A7EDd0 Soft Errors: 2 Hard Errors: 0 Transport Errors: 0
Vendor: SUN      Product: SOLARIS          Revision: 1   Serial No: 
Size: 1.07GB <1073741312 bytes>
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0
Illegal Request: 2 Predictive Failure Analysis: 0


お?何か、みたことのないデバイスが表示されていますよ?
実は、これが、iSCSI ディスクとなります。
もし、何も表示されない場合は、以下のコマンドを実行してください

 # devfsadm -c iscsi

一見、わけのわからない文字列ですが、Solaris のデバイス命名規則に従っていることがわかります
 
        コントローラ: c0
      SCSI ターゲット: t010000D7E29A7AC700002A0045B5A7ED
            SCSI LUN: d0
 
偉いですね。
続いて、format コマンドでみてみましょう。

# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c0t010000D7E29A7AC700002A0045B5A7EDd0 <DEFAULT cyl 1021 alt 2 hd 64 sec 32>
          /scsi_vhci/disk@g010000d7e29a7ac700002a0045b5a7ed
       1. c1d0 <DEFAULT cyl 1336 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
Specify disk (enter its number): 0
selecting c0t010000D7E29A7AC700002A0045B5A7EDd0
[disk formatted]

こちらも、ローカルに接続されたディスクとして見えていますね。
すばらしい。

この状態のまま、iSCSI Target 側で target 情報をみてましょう。

Initiator の項目が増え、iSCSI ネームが表示されています。
これは、iSCSI Initiator となる Solaris 10 11/06 のものであることが わかり、接続されていることがわかります。
 
# iscsitadm list target -v                                                  
Target: test/vol
    iSCSI Name: iqn.1986-03.com.sun:02:882dc508-86d5-47be-a7cc-92c931245fea
    Alias: test/vol
    Connections: 1
        Initiator:
            iSCSI Name: iqn.1986-03.com.sun:01:e0000000783b.45b5b9dc
            Alias: unknown

    ACL list:
    TPGT list:
    LUN information:
        LUN: 0
            GUID: 010000d7e29a7ac700002a0045b5a7ed
            VID: SUN
            PID: SOLARIS
            Type: disk
            Size: 1.0G
            Backing store: /dev/zvol/rdsk/test/vol
            Status: online


ここまでできれば、あとは煮るやり焼くなり、お好きなように。
NFS などの、ネットワーク・ファイルシステムと違い、Solaris 上からはローカルな デバイスとして扱うことができるため、ファイルシステムを作成できます。
では、ちょっと実験してみましょう。


  • 5. iSCSI ディスクを使って、ZFS プールを作成

    わくわくする瞬間です。認識できた iSCSI ディスクに ZFS ファイルシステムを構築してみましょう。
    デバイス名は、すでにわかっているので、下記のコマンドを実行します。

    # zpool create test c0t010000D7E29A7AC700002A0045B5A7EDd0
    # zpool list
    NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
    test                    1008M    134K   1008M     0%    ONLINE     -

    # zfs create test/iscsi
    # zfs list
    NAME                   USED  AVAIL  REFER  MOUNTPOINT
    test                       132K   976M   26.5K  /test
    test/iscsi               24.5K   976M   24.5K  /test/iscsi

    # zpool status -v
      プール: test
     状態: ONLINE
     スクラブ: 何も要求されませんでした
    構成:

            NAME                                     STATE     READ WRITE CKSUM
            test                                     ONLINE       0     0     0
              c0t010000D7E29A7AC700002A0045B5A7EDd0  ONLINE       0     0     0

    エラー: 既知のデータエラーはありません

    # kazus 


         できちゃいました。

ちょっと感動しました。

性能は、iSCSI Target となるマシンや、ネットワークに依存しますので、なんとも言えません。
が、Sun Fire X4500 を使って dladm で trunking、そんな環境で実験してみたくなったのでした。
これからの Solaris にも、どうぞご期待ください。


http://blogs.sun.com/yappri/date/20070125 2007年 1月 25日 木曜日

システム監視ツール fsstat の紹介

皆さん fsstat って知っていますか?
fsstat は Solaris 10 の 3番目のアップデートリリースとなる、Solaris 10 11/06 で組み込まれた新機能の 1つです。
この機能は iostat や vmstat のようなカーネル統計情報を取得するための機能です。


基本的な機能の特徴は以下となります。

・カーネルによるファイルオペレーション動作をレポートします
・監視対象としてはマウントポイント単位、ファイルシステムタイプ単位となります
  (※ 統計情報は Gバイト、Kバイト、Mバイトなど見やすい形式に自動的に単位が
      設定されます)

使用方法は、全てのファイルシステムの統計情報を表示するために -F オプションを指定 するか、その他のオプション(-a | f | i | n | v )と一緒に 「ファイルシステム」 か 「マウントポイント」 を指定します。
連続して監視を行う場合は interval と count を指定することもできます。

(※)オプションの種類や表示項目の詳細についてはマニュアルをご参照ください。


実際にどのようなことができるか確認してみましょう。


まずは -F オプションを使用します。

bash-3.00# fsstat -F
 new  name   name  attr  attr lookup rddir  read read  write write
 file remov  chng   get   set    ops   ops   ops bytes   ops bytes
  276    47    11 41.0K   119   266K 1.03K 47.6K 81.6M 3.68K 3.95M ufs
    0     0     0   295     0    456   178   111 34.6K     0     0 proc
    0     0     0     0     0      0     0     0     0     0     0 nfs
    0     0     0     0     0      0     0     0     0     0     0 zfs
    0     0     0 1.76K     0      0     0     0     0     0     0 lofs
2.75K 2.38K   178 17.0K    28  3.38K     4 34.5K 34.5M 36.6K 31.6M tmpfs
    0     0     0    62     0      0     0    32 5.07K     0     0 mntfs
    0     0     0     0     0      0     0     0     0     0     0 nfs3
    0     0     0     0     0      0     0     0     0     0     0 nfs4
    0     0     0     0     0      0     0     0     0     0     0 autofs
bash-3.00#

上から 2行目までがファイルオペレーションの種類となります。
右側に全てのファイルシステム一覧が表示されます。
上記はシステム起動直後の状態ですが、すでに ufs や tmpfs 等が頻繁に使用されて いるのがわかります。


次に直接 ufs(ファイルシステム) を指定します。
(※)この場合はファイルシステム、またはマウントポイントのどちらか(または両方)を指定することができます。

bash-3.00# fsstat zfs
 new  name   name  attr  attr lookup rddir  read read  write write
 file remov  chng   get   set    ops   ops   ops bytes   ops bytes
  276    47    11 41.0K   119   266K 1.03K 47.6K 81.6M 3.68K 3.95M ufs
bash-3.00# 

今度は詳細情報を表示する -f オプションを使用してみます。
(※)この場合もファイルシステム、またはマウントポイントのどちらか(または両方) を指定することができます。
今回はとりあえずルート(/:マウントポイント)を指定します。

bash-3.00# fsstat -f /
/
 operation  #ops  bytes
      open 8.32K
     close  9.5K
      read 49.4K  81.7M
     write 5.31K  4.05M
     ioctl 10.0K
     setfl    35
   getattr 33.9K
   setattr    94
    access 12.0K
    lookup  304K
    create   257
    remove    45
      link     0
    rename     7
     mkdir    18
     rmdir     2
   readdir 1.37K   553K
   symlink     4
  readlink 6.64K
     fsync    60
  inactive 1.16K
       fid     0
    rwlock 56.1K
  rwunlock 56.1K
      seek 30.4K
       cmp 58.1K
    frlock 4.80K
     space     6
    realvp 2.19K
   getpage 93.5K
   putpage   559
       map 15.3K
    addmap 28.2K
    delmap 26.4K
      poll 26.1K
      dump     0
  pathconf    88
    pageio     2
   dumpctl     0
   dispose 27.1K
getsecattr   404
setsecattr    19
   shrlock     0
   vnevent     0

このオプションは他のオプションとは表示形式が異なり左側にファイルシステムのオペレーションの種類、右側にはオペレーション数が表示されます。
上の例は、システムが起動してから現在までのルート(/)で行われたオペレーション情報が全て表示されています。



コマンドの説明はこれくらいにして、zfs ファイルシステムを作成して fsstat でその様子を確認してみましょう。

pool(pooltest1) を作成してみます。

bash-3.00# zpool create -f pooltest1 raidz c1t2d0s0 c1t2d0s1 c1t2d0s3
bash-3.00# fsstat zfs /pooltest1
 new  name   name  attr  attr lookup rddir  read read  write write
 file remov  chng   get   set    ops   ops   ops bytes   ops bytes
    0     0     0     1     0      0     0     0     0     0     0 zfs
    0     0     0     1     0      0     0     0     0     0     0 /pooltest1

pool を作成したときにはattr getの値が増えています。


作成した pool に対してアクセスしてみましょう。

bash-3.00# ls -la /pooltest1/
合計 6
drwxr-xr-x   2 root     sys            2  1月 22日  11:43 .
drwxr-xr-x  33 root     root        1024  1月 22日  11:43 ..
bash-3.00#
bash-3.00# fsstat zfs /pooltest1
 new  name   name  attr  attr lookup rddir  read read  write write
 file remov  chng   get   set    ops   ops   ops bytes   ops bytes
    0     0     0    13     0      5     2     0     0     0     0 zfs
    0     0     0    13     0      5     2     0     0     0     0 /pooltest1

今度は attr get, lookup ops, rddir ops の値が増えているのがわかります。

システムが起動されて初めて pool を作成したのでファイルシステム(zfs)もマウントポイント(pooltest1)もオペレーション数は同じになっています。 以降はシステムを再起動しない限りファイルシステム(zfs)の情報は蓄積されていきます。 もちろんマウントポイント(pooltest1)に対してのアクセスがあった場合にはマウント ポイント(pooltest1)の情報も蓄積されますが、そのときはファイルシステム(zfs)も 情報が蓄積されます。


もうひとつ pool(pootest2) を作成してみて、どんな情報が得られるか確認してみます。

bash-3.00# zpool create -f pooltest2 c1t2d0s4
bash-3.00# ls -la /pooltest2
合計 5
drwxr-xr-x   2 root     sys            2  1月 22日  13:16 .
drwxr-xr-x  34 root     root        1024  1月 22日  13:16 ..
bash-3.00#
bash-3.00# fsstat zfs /pooltest1 /pooltest2
 new  name   name  attr  attr  lookup rddir  read read  write write
 file remov  chng   get   set     ops   ops   ops bytes   ops bytes
    0     0     0    23     0     10     4     0     0     0     0 zfs
    0     0     0    13     0      5     2     0     0     0     0 /pooltest1
    0     0     0    10     0      5     2     0     0     0     0 /pooltest2

pooltest2 が作成されたことによってファイルシステム(zfs)の値も増えているのがわかります。
(pooltest1 + pooltest2 = zfs)


マウントポイント(/pooltest1/test1)に対して直接ファイルやディレクトリ作成したり、内容を確認したりしても情報が蓄積されます。

現状の状態を確認

bash-3.00# fsstat zfs /pooltest1 /pooltest1/test1
 new  name   name  attr  attr lookup rddir  read read  write write
 file remov  chng   get   set    ops   ops   ops bytes   ops bytes
    1     0     0    33     0     24    10     0     0     0     0 zfs
    1     0     0    22     0     19     8     0     0     0     0 /pooltest1
    0     0     0     1     0      0     0     0     0     0     0 /pooltest1/test1

ディレクトリ、ファイルを作成

bash-3.00# mkdir aaa
bash-3.00# mkfile 100m bbb
bash-3.00# fsstat zfs /pooltest1 /pooltest1/test1
 new  name   name  attr  attr lookup rddir  read read  write write
 file remov  chng   get   set    ops   ops   ops bytes   ops bytes
    3     0     0    49     1     48    14     0     0 12.5K  100M zfs
    1     0     0    27     0     37    10     0     0     0     0 /pooltest1
    2     0     0    12     1      6     2     0     0 12.5K  100M /pooltest1/test1

ディレクトリ、ファイルを作成したことによりnew file, attr get, attr set, write ops, write bytes 等の値が増えています。


ディレクトリ名変更/削除、及びファイル名変更/削除

bash-3.00# mv aaa ccc
bash-3.00# rmdir ccc
bash-3.00# mv bbb aaa
bash-3.00# rm aaa
bash-3.00# fsstat zfs /pooltest1 /pooltest1/test1
 new  name   name  attr  attr lookup rddir  read read  write write
 file remov  chng   get   set    ops   ops   ops bytes   ops bytes
    3     2     2    89     1    133    16     0     0 12.5K  100M zfs
    1     0     0    33     0     59    10     0     0     0     0 /pooltest1
    2     2     2    46     1     69     4     0     0 12.5K  100M /pooltest1/test1

ディレクトリやファイル名前の変更/削除を行った結果、name remov, name chng等の値が増えています。


このように fsstat は ファイルシステムやマウントポイントに対して行われた情報を リアルタイムに取得することも可能ですし、システムが起動してから現在までの全情報 を取得することも可能となっています。

fsstat はデバイス単位でなく、ファイルシステムやマウントポイント単位で統計情報 が取れるってすごくないですか。皆さんもこの新機能を使ってファイルシステムの健全性のチェックに役立ててください。

http://blogs.sun.com/yappri/date/20070124 2007年 1月 24日 水曜日

ZFS でホットスペア!

Solaris 10 11/06 から ホットスペア の機能が 実装された事を以前ご紹介致しました。
そこで、今回は実際に X4500 を使用して、ZFS Hotspare の作成方法と 障害時の Status の変化についてご紹介したいと思います。

まずホットスペアの設定方法ですが、ZFS Pool の構築時に、下記のように spare オプションを使用すれば構築することができます。

例 ) ZFS Pool 構築時
# zpool create zfs_pool_test raidz c5t1d0 c4t1d0 c7t1d0 spare c4t0d0 c7t0d0 c6t0d0

もし既存の Pool に対してホットスペアを設定する場合には、 add オプションで既存の pool に対して追加します。

例 ) HotSpare 追加時
# zpool add pool_test spare c4t0d0 c7t0d0 c6t0d0

又、他のプールでホットスペアとして指定したデバイスは、複数のプールで共有することも可能です。 ( Global hotspare の様な動きになります。)

例 ) Global HotSpare 設定時
# zpool create -f pool1 raidz c5t1d0 c4t1d0 c7t1d0 spare c4t0d0 c7t0d0 c6t0d0
# zpool create -f pool2 raidz2 c5t2d0 c4t2d0 c7t2d0 spare c4t0d0 c7t0d0 c6t0d0
# zpool create -f pool3 mirror c5t3d0 c4t3d0 spare c4t0d0 c7t0d0 c6t0d0
           ※ 上記の例ではpool1, 2, 3 で同じ Spare Disk を指定します。

以上でホットスペアとしての設定は完了です。

それでは実際に X4500 を使用して ZFS Hotspare の設定と、 擬似障害としてディスク c5t1d0 を引き抜き・交換を 行ってみたいと思います。

  1. pool の作成
    まず zpool コマンドを使用して pool を作成します。
    今回は全ての pool で c4t0d0 c7t0d0 c6t0d0 の 3本のディスクを Global Spare disk として指定しています。
    # zpool status
    no pools available
    #
    # zpool create -f pool1 raidz c5t1d0 c4t1d0 c7t1d0 spare c4t0d0 c7t0d0 c6t0d0
    # zpool create -f pool2 raidz2 c5t2d0 c4t2d0 c7t2d0 spare c4t0d0 c7t0d0 c6t0d0
    #
    # zpool status
      pool: pool1
     state: ONLINE
     scrub: none requested
    config:
    
    	NAME        STATE     READ WRITE CKSUM
    	pool1       ONLINE       0     0     0
    	  raidz1    ONLINE       0     0     0
    	    c5t1d0  ONLINE       0     0     0
    	    c4t1d0  ONLINE       0     0     0
    	    c7t1d0  ONLINE       0     0     0
    	spares
    	  c4t0d0    AVAIL ★←ここに表示されているディスクが
    	  c7t0d0    AVAIL   対象のプールに設定されている
    	  c6t0d0    AVAIL   ホットスペアです。
    
    errors: No known data errors
    
      pool: pool2
     state: ONLINE
     scrub: none requested
    config:
    
    	NAME        STATE     READ WRITE CKSUM
    	pool2       ONLINE       0     0     0
    	  raidz2    ONLINE       0     0     0
    	    c5t2d0  ONLINE       0     0     0
    	    c4t2d0  ONLINE       0     0     0
    	    c7t2d0  ONLINE       0     0     0
    	spares
    	  c4t0d0    AVAIL ★← pool1 と同じホットスペアです。
    	  c7t0d0    AVAIL
    	  c6t0d0    AVAIL
    
    errors: No known data errors
    #

  2. ZFS File System の作成
    次に zfs コマンドを使用して、先程作成した pool に ZFS File system を作成します。
    # zfs create pool1/raidz
    # zfs create pool2/raidz2
    #
    # zfs list
    NAME                   USED  AVAIL  REFER  MOUNTPOINT
    pool1                  156K  1.11T  42.3K  /pool1
    pool1/raidz           40.7K  1.11T  40.7K  /pool1/raidz
    pool2                  180K   913G  51.0K  /pool2
    pool2/raidz2          49.0K   913G  49.0K  /pool2/raidz2
    #
    
    以上で ZFS の構築は終了です。

  3. c5t1d0 の強制引き抜き
    それでは擬似障害として物理的に pool1 の c5t1d0 を強制的に引き抜きます。

  4. 障害時のステータス確認
    以下が c5t1d0 を強制的に引き抜いた後の zpool, cfgadm コマンドの Status です。

    c5t1d0 の Disk が UNAVAIL Status に変化し、
    c4t0d0 の Sapre Disk が使用されているのが確認できます。
    # zpool status
      pool: pool1
     state: DEGRADED
    status: One or more devices could not be opened.  Sufficient replicas exist for
    	the pool to continue functioning in a degraded state.
    action: Attach the missing device and online it using 'zpool online'.
       see: http://www.sun.com/msg/ZFS-8000-D3
     scrub: resilver completed with 0 errors on Sat Dec 24 00:49:06 2005
    config:
    
    	NAME          STATE     READ WRITE CKSUM
    	pool1         DEGRADED     0     0     0
    	  raidz1      DEGRADED     0     0     0
    	    spare     DEGRADED     0     0     0
    	      c5t1d0  UNAVAIL      0    64     0  cannot open ★強制引き抜き
    	      c4t0d0  ONLINE       0     0     0       ★ホットスペア
    	    c4t1d0    ONLINE       0     0     0
    	    c7t1d0    ONLINE       0     0     0
    	spares
    	  c4t0d0      INUSE     currently in use 
    	  c7t0d0      AVAIL
    	  c6t0d0      AVAIL
    
    errors: No known data errors
    
      pool: pool2
     state: ONLINE
     scrub: none requested
    config:
    
    	NAME        STATE     READ WRITE CKSUM
    	pool2       ONLINE       0     0     0
    	  raidz2    ONLINE       0     0     0
    	    c5t2d0  ONLINE       0     0     0
    	    c4t2d0  ONLINE       0     0     0
    	    c7t2d0  ONLINE       0     0     0
    	spares
    	  c4t0d0    INUSE   in use by pool 'pool1'
    	  c7t0d0    AVAIL   ★↑pool1 で c4t0d0 が使用
    	  c6t0d0    AVAIL     されている事を示しています。
    
    errors: No known data errors
    #
    # cfgadm -al
    Ap_Id                          Type         Receptacle   Occupant     Condition
    sata0/0::dsk/c0t0d0            disk         connected    configured   ok
    sata0/1::dsk/c0t1d0            disk         connected    configured   ok
    sata0/2::dsk/c0t2d0            disk         connected    configured   ok
    			: 省略
    sata2/6::dsk/c4t6d0            disk         connected    configured   ok
    sata2/7::dsk/c4t7d0            disk         connected    configured   ok
    sata3/0::dsk/c5t0d0            disk         connected    configured   ok
    sata3/1                        sata-port    empty        unconfigured ok ★
    sata3/2::dsk/c5t2d0            disk         connected    configured   ok
    sata3/3::dsk/c5t3d0            disk         connected    configured   ok
    			: 省略
    usb4/5.2                       unknown      empty        unconfigured ok
    usb4/5.3                       unknown      empty        unconfigured ok
    usb4/5.4                       unknown      empty        unconfigured ok
    #

  5. c5t1d0 の挿入を実施
    次にディスクの交換を行ったと仮定して、先程引き抜いた c5t1d0 のディスクを再度挿入します。
    # date; cfgadm -al
    Sat Dec 24 01:06:46 JST 2005
    Ap_Id                          Type         Receptacle   Occupant     Condition
    sata0/0::dsk/c0t0d0            disk         connected    configured   ok
    sata0/1::dsk/c0t1d0            disk         connected    configured   ok
    			: 省略
    sata2/7::dsk/c4t7d0            disk         connected    configured   ok
    sata3/0::dsk/c5t0d0            disk         connected    configured   ok
    sata3/1                        disk         connected    unconfigured unknown ★
    sata3/2::dsk/c5t2d0            disk         connected    configured   ok
    sata3/3::dsk/c5t3d0            disk         connected    configured   ok
    			: 省略
    usb4/5.3                       unknown      empty        unconfigured ok
    usb4/5.4                       unknown      empty        unconfigured ok
    #

  6. c5t1d0 の再認識を実施
    挿入した c5t1d0 のディスクを OS 上で認識させます。
    # cfgadm -c configure sata3/1::dsk/c5t1d0
    #
    # cfgadm -al
    Ap_Id                          Type         Receptacle   Occupant     Condition
    sata0/0::dsk/c0t0d0            disk         connected    configured   ok
    sata0/1::dsk/c0t1d0            disk         connected    configured   ok
    			: 省略
    sata2/7::dsk/c4t7d0            disk         connected    configured   ok
    sata3/0::dsk/c5t0d0            disk         connected    configured   ok
    sata3/1::dsk/c5t1d0            disk         connected    configured   ok ★
    sata3/2::dsk/c5t2d0            disk         connected    configured   ok
    sata3/3::dsk/c5t3d0            disk         connected    configured   ok
    			: 省略
    usb4/5.3                       unknown      empty        unconfigured ok
    usb4/5.4                       unknown      empty        unconfigured ok
    #

  7. ZFS 上の Status の確認
    OS から c5t1d0 を認識した状態で pool1 に対してファイルの 読み込みや書き込みを行うと、自動的に ONLINE Status に戻ります。
    # zpool status
      pool: pool1
     state: ONLINE
     scrub: resilver completed with 0 errors on Sat Dec 24 00:49:06 2005
    config:
    
    	NAME          STATE     READ WRITE CKSUM
    	pool1         ONLINE       0     0     0
    	  raidz1      ONLINE       0     0     0
    	    spare     ONLINE       0     0     0
    	      c5t1d0  ONLINE       0     0     0 ★Online に変化!
    	      c4t0d0  ONLINE       0     0     0
    	    c4t1d0    ONLINE       0     0     0
    	    c7t1d0    ONLINE       0     0     0
    	spares
    	  c4t0d0      INUSE     currently in use
    	  c7t0d0      AVAIL
    	  c6t0d0      AVAIL
    
    errors: No known data errors
    
      pool: pool2
     state: ONLINE
     scrub: none requested
    config:
    
    	NAME        STATE     READ WRITE CKSUM
    	pool2       ONLINE       0     0     0
    	  raidz2    ONLINE       0     0     0
    	    c5t2d0  ONLINE       0     0     0
    	    c4t2d0  ONLINE       0     0     0
    	    c7t2d0  ONLINE       0     0     0
    	spares
    	  c4t0d0    INUSE     in use by pool 'pool1'
    	  c7t0d0    AVAIL
    	  c6t0d0    AVAIL
    
    errors: No known data errors
    #
    もし暫く経っても Online Status に変わらない場合には、 下記のコマンドを実施します。
    # zpool clear pool1 c5t1d0
    # zpool online pool1 c5t1d0

  8. ZFS の Spare を戻す
    最後に c4t0d0 を Spare Disk として元に戻します。
    ( 現在はまだ c5t1d0, c4t0d0 の両方のディスクに対して読み書きしています )
    # zpool detach pool1 c4t0d0
    
    これで Status が正常に戻りました。
    # date; zpool status
    Sat Dec 24 01:12:21 JST 2005
      pool: pool1
     state: ONLINE
     scrub: resilver completed with 0 errors on Sat Dec 24 00:49:06 2005
    config:
    
    	NAME        STATE     READ WRITE CKSUM
    	pool1       ONLINE       0     0     0
    	  raidz1    ONLINE       0     0     0
    	    c5t1d0  ONLINE       0     0     0
    	    c4t1d0  ONLINE       0     0     0
    	    c7t1d0  ONLINE       0     0     0
    	spares
    	  c4t0d0    AVAIL
    	  c7t0d0    AVAIL
    	  c6t0d0    AVAIL
    
    errors: No known data errors
    
      pool: pool2
     state: ONLINE
     scrub: none requested
    config:
    
    	NAME        STATE     READ WRITE CKSUM
    	pool2       ONLINE       0     0     0
    	  raidz2    ONLINE       0     0     0
    	    c5t2d0  ONLINE       0     0     0
    	    c4t2d0  ONLINE       0     0     0
    	    c7t2d0  ONLINE       0     0     0
    	spares
    	  c4t0d0    AVAIL
    	  c7t0d0    AVAIL
    	  c6t0d0    AVAIL
    
    errors: No known data errors
    #
    

以上で ZFS ホットスペアの構築と、ディスクの交換が完了しました。

皆様もご覧頂けたと思いますが、ホットスペアの設定自体は zpool コマンドに spare オプションを加えるだけの為、管理が非常に簡単です。
(「操作が簡単」は ZFS のコンセプトでもあります )

又、ホットスペアの他にも Solaris 10 11/06 から加えられた機能の中に、 RAID-Z2 ( ダブルパリティによる RAID-6 相当の機能 ) がありますが、 ホットスペアと RAID-Z2 を組み合わせることにより、さらにシステムの冗長性を 高める事が可能になります。

まだ OS 領域に ZFS を利用できませんが、近い将来利用できるようになると思いますので、 是非、今のうちから ZFS を体験頂ければと思います。

http://blogs.sun.com/yappri/date/20070123 2007年 1月 23日 火曜日

DTraceで遊ぶ

今回は、DTrace を使って uname の出力結果を(あくまでお遊びで)強制的に 変更する例を紹介します。
実際に Nevada の環境に Solaris 10 のパッケージをインストールしたいんだけど、 インストールパッケージの中で OS のバージョンチェック が入り、 pkgadd がはじかれてしまう時がありますよね。
こんな時、 DTrace を使って uname の表示を Solaris 10 用に変更する事で、 Nevada に Solaris 10 対応のパッケージをインストールできる場合があります。

下記の Dスクリプト(port2.d)は、Nevada で実行した uname -a の結果を Solaris 10 で実行した出力結果に置き換えてしまいます。
このスクリプトは、 Peter Karlsson の DTrace Code Camp 資料 Page 97 で紹介されている port.d スクリプトからヒントを得ました。

【port2.d スクリプト】

#!/usr/sbin/dtrace -Cs
#include

#pragma D option destructive

syscall::uname:entry
{
   self->addr = arg0;
}

syscall::uname:return
{
    copyoutstr("SunOS", self->addr,257);
    copyoutstr("pana", self->addr+257,257);
    copyoutstr("5.10", self->addr+(257*2),257);
    copyoutstr("Generic_118855-33", self->addr+(257*3),257);
    copyoutstr("i86pc", self->addr+(257*4),257);
}

では早速実行してみましょう。
ホスト名 pana にインストールされている Nevada_43 で試してみました。

<テストログ>
pana# uname -a
SunOS pana 5.11 snv_43 i86pc i386 i86pc
使用しているOS が 5.11 snv_43 と表示されます。
ここでuname 出力変更プログラムを実行
pana# ./port2.d &
dtrace: script './port2.d' matched 2 probes
dtrace: allowing destructive actions
もう一度 uname -a を実行
pana# uname -a
SunOS pana 5.10 Generic_118855-33 i86pc i386 i86pc
はい、uname の出力が Solaris 10 11/06 に変更できました!!


<実践編>
 それでは、実際に N1 Service Provisioning System のパッケージで試してみましょう。

<dtraceで OS 情報変更前>
pana# ./cr_cli_solaris_x86_pkg_5.0.sh

N1 Grid Service Provisioning System (N1 Grid SPS) Installation Setup
A log of events during this installation is being generated in
/tmp/N1GridSPSInstaller.log.1552.

Hit enter to accept the (default values) or enter a valid value from the
list provided: [valid values]


        ERROR! Unable to continue with N1 Grid SPS CLI Client installation.
        The highest OS version is 5.10, and this machine is running 5.11.


        For information on how to continue the installation on an unsupported
        platform, see the N1 Grid Service Provisioning System 5.0 Installation
        Guide.
このパッケージは、使用している OS が 5.11 (サポート対象外)を使用して いる事をチェックしており、インストールがはじかれてしまいます。

<dtraceで OS 情報を変更し、インストールを実行>
pana# ./port2.d &
dtrace: script './port2.d' matched 2 probes
dtrace: allowing destructive actions
pana# ./cr_cli_solaris_x86_pkg_5.0.sh

N1 Grid Service Provisioning System (N1 Grid SPS) Installation Setup
A log of events during this installation is being generated in
/tmp/N1GridSPSInstaller.log.1591.

Hit enter to accept the (default values) or enter a valid value from the
list provided: [valid values]

        Checking for required and recommended Solaris 5.10 patches.
        Done checking for required and recommended Solaris 5.10 patches.

        Checking the integrity of the package.
        Package is intact.

....
....
今度は、インストール処理で uname のチェックではじかれていたパスがスルーされました。

今回はお遊びで OS 情報の変更を試しましたが、 DTrace の copyoutstr() は、コマンドや関数のに対して、 リコンパイルせずにダイナミックに任意の 引数を渡す事ができますので、デバッグ時に活躍すると思います。