OpenSolaris自作ストレージサーバでシン・プロビジョニングを試す

OpenSolarisiSCSIストレージの自作にあたって、シン・プロビジョニングについて調べてみました。今回の社内案件ではシン・プロビジョニングの必要がない案件ではあるんですが、将来的にサーバのストレージで使う上で必要になります。
というか現在のエンタープライズ向けの仮想化のiSCSIストレージなら当たり前にもっている機能です。

シン・プロビジョニング(Thin Provisioning)については以下の記事がわかりやすいと思います。

というわけで実際に試してみたのでその記録です。iSCSIで検証しています。

ついでにファイルでプールを作ってみる

HDDで作ることもできる環境ですが、手軽にZFSを試す例も兼ねてファイルを使ったプールで実験してみます。
100MBのサイズのファイルを作成します。

# mkfile 100m /tmp/01
# mkfile 100m /tmp/02
# mkfile 100m /tmp/03

次にこれを使ってプールを作ります。

# zpool create osol raidz2 /tmp/01 /tmp/02 /tmp/03
# zpool status osol
  pool: osol
 state: ONLINE
 scrub: none requested
config:

        NAME         STATE     READ WRITE CKSUM
        osol         ONLINE       0     0     0
          raidz2     ONLINE       0     0     0
            /tmp/01  ONLINE       0     0     0
            /tmp/02  ONLINE       0     0     0
            /tmp/03  ONLINE       0     0     0

errors: No known data errors
# zfs list osol
NAME   USED  AVAIL  REFER  MOUNTPOINT
osol  69.7K  62.9M  18.9K  /osol

これでプールができました。
このストレージプールでは実際に使える容量が62.9Mしかありません(ここ重要)。要件として1Gの容量が必要なものとします。
ではこのストレージプールを使って以下の検証を進めていきます。

・・・のまえに環境の準備も一応書いておく

OpenSolarisiSCSIを使う環境を一応書いておきます。

  • shareiscsiプロパティで設定する場合
# pkg install SUNWiscsitgt
  • COMSTARで設定する場合。
# pfexec pkg install storage-server SUNWiscsit

stmfを起動するには一度OSを再起動する必要があるので注意。
詳細は以前のエントリを参照してください。
OpenSolaris 2009.06でCOMSTARを試す

ZFSのshareiscsiプロパティを使用したiSCSIの場合

ボリュームの作成

試しにまず普通に容量を割り当ててボリュームを作成します。

# zfs create -V 50m osol/test
# zfs list
NAME                               USED  AVAIL  REFER  MOUNTPOINT
osol                              50.1M  12.9M  18.9K  /osol
osol/test                           50M  62.9M  15.9K  -

osol/testのUSEDが割り当てた50Mになり、osolのAVAILが12.9Mになっています。
プロパティも確認。

# zfs get all osol/test
NAME       PROPERTY              VALUE                    SOURCE
osol/test  type                  volume                   -
osol/test  creation              金  1月  8 21:45 2010  -
osol/test  used                  50M                      -
osol/test  available             62.9M                    -
osol/test  referenced            15.9K                    -
osol/test  compressratio         1.00x                    -
osol/test  reservation           none                     default
osol/test  volsize               50M                      -
osol/test  volblocksize          8K                       -
osol/test  checksum              on                       default
osol/test  compression           off                      default
osol/test  readonly              off                      default
osol/test  shareiscsi            off                      default
osol/test  copies                1                        default
osol/test  refreservation        50M                      local
osol/test  primarycache          all                      default
osol/test  secondarycache        all                      default
osol/test  usedbysnapshots       0                        -
osol/test  usedbydataset         15.9K                    -
osol/test  usedbychildren        0                        -
osol/test  usedbyrefreservation  50.0M                    -

ボリュームサイズ(volsize)を見ると50Mになってます。
普通の状況が確認できたところで破棄。

# zfs destroy osol/test

では本題のiSCSI用のボリュームを作成に。1Gが要件なので1Gで作成します。

# zfs create -V 1g osol/shareiscsi
cannot create 'osol/shareiscsi': out of space

当然怒られます。実際の容量を遥かにオーバしています。そこでシン・プロビジョニングです。-sを付加します。

# zfs create -V 1g -s osol/shareiscsi

コマンドが通りました。確認します。

# zfs list
NAME                               USED  AVAIL  REFER  MOUNTPOINT
osol                              99.1K  62.9M  18.9K  /osol
osol/shareiscsi                   15.9K  62.9M  15.9K  -

さっきと違ってosolのAVAILが62.9Mのままです。osol/shareiscsiのUSEDも15.9kとなっています。
プロパティを見てみます。

# zfs get all osol/shareiscsi
NAME             PROPERTY              VALUE                    SOURCE
osol/shareiscsi  type                  volume                   -
osol/shareiscsi  creation              金  1月  8 21:46 2010  -
osol/shareiscsi  used                  15.9K                    -
osol/shareiscsi  available             62.9M                    -
osol/shareiscsi  referenced            15.9K                    -
osol/shareiscsi  compressratio         1.00x                    -
osol/shareiscsi  reservation           none                     default
osol/shareiscsi  volsize               1G                       -
osol/shareiscsi  volblocksize          8K                       -
osol/shareiscsi  checksum              on                       default
osol/shareiscsi  compression           off                      default
osol/shareiscsi  readonly              off                      default
osol/shareiscsi  shareiscsi            off                      default
osol/shareiscsi  copies                1                        default
osol/shareiscsi  refreservation        none                     default
osol/shareiscsi  primarycache          all                      default
osol/shareiscsi  secondarycache        all                      default
osol/shareiscsi  usedbysnapshots       0                        -
osol/shareiscsi  usedbydataset         15.9K                    -
osol/shareiscsi  usedbychildren        0                        -
osol/shareiscsi  usedbyrefreservation  0                        -

ボリュームサイズ(volsize)を見るとちゃんと1Gになっています。ではこれをiSCSIとして使えるようにします。
まずサービスの起動してからプロパティを設定します。

# svcadm enable iscsitgt
# zfs set shareiscsi=on osol/shareiscsi

これだけでボリュームの公開が可能になります。確認します。

# iscsitadm list target -v
Target: osol/shareiscsi
    iSCSI Name: iqn.1986-03.com.sun:02:a16b1b66-94b2-e755-9760-b8512d7d4e25
    Alias: osol/shareiscsi
    Connections: 0
    ACL list:
    TPGT list:
    LUN information:
        LUN: 0
            GUID: 0
            VID: SUN
            PID: SOLARIS
            Type: disk
            Size: 1.0G
            Backing store: /dev/zvol/rdsk/osol/shareiscsi
            Status: online
Windows XPから接続

WindowsでのiSCSIのイニシエータは先述の過去のCOMSTARの記事を参照。
接続結果は以下の画像で。

どうでしょう。1Gのボリュームが見えています。
実際のストレージ側では使用可能領域が62.9Mなのに接続する側にはちゃんと1Gで見えちゃってます。
しかし、実際には1Gの容量は使えないので試しに大きなサイズのファイルを書き込もうとするとエラーになります。
実際はそんなに容量がないから当たり前です。これぞこれぞシン・プロビジョニング!

おまけ

ちなみにzfsのプロパティrefreservationを比較すると、普通の場合とシン・プロビジョニングの場合では値が違います。普通に割り当てるとそのボリュームサイズがそのままここの値になってますが、シン・プロビジョニングの場合はnoneになってます。
なのでこのプロパティの設定を変えることでシン・プロビジョニングの状態から普通の状態に変えられるです。

軽く試した感じだとシン・プロビジョニングのボリュームを普通のサイズを持ったボリュームにすることができました。
ただここは突っ込んで調べてないので自分の推測の範疇です。
そのうち調べます。

COMSTARの場合

ボリュームの作成

では次にCOMSTARでシン・プロビジョニングを試してみます。
まずサービスとしてshareiscsiプロパティのiSCSIとは共存できないので無効にしてからCOMSTAR用のサービスを立ち上げます。

# svcadm disable iscsitgt
# svcadm enable stmf
# svcadm enable target

前回のボリュームを削除して追加してみます。

# zfs destroy osol/shareiscsi
# zfs create -V 1g -s osol/comstar

確認

# zfs list
NAME                               USED  AVAIL  REFER  MOUNTPOINT
osol                               295K  62.7M  18.9K  /osol
osol/comstar                      15.9K  62.7M  15.9K  -

# zfs get all osol/comstar
NAME          PROPERTY              VALUE                    SOURCE
osol/comstar  type                  volume                   -
osol/comstar  creation              金  1月  8 22:26 2010  -
osol/comstar  used                  15.9K                    -
osol/comstar  available             62.7M                    -
osol/comstar  referenced            15.9K                    -
osol/comstar  compressratio         1.00x                    -
osol/comstar  reservation           none                     default
osol/comstar  volsize               1G                       -
osol/comstar  volblocksize          8K                       -
osol/comstar  checksum              on                       default
osol/comstar  compression           off                      default
osol/comstar  readonly              off                      default
osol/comstar  shareiscsi            off                      default
osol/comstar  copies                1                        default
osol/comstar  refreservation        none                     default
osol/comstar  primarycache          all                      default
osol/comstar  secondarycache        all                      default
osol/comstar  usedbysnapshots       0                        -
osol/comstar  usedbydataset         15.9K                    -
osol/comstar  usedbychildren        0                        -
osol/comstar  usedbyrefreservation  0                        -

引き続き設定

# sbdadm create-lu /dev/zvol/rdsk/osol/comstar 

Created the following LU:

              GUID                    DATA SIZE           SOURCE
 --------------------------------  -------------------  ----------------
600144f0b8eb0a0000004b47330b0009      1073676288       /dev/zvol/rdsk/osol/comstar

# stmfadm add-view 600144f0b8eb0a0000004b47330b0009
# stmfadm list-view -l 600144f0b8eb0a0000004b47330b0009
View Entry: 0
    Host group   : All
    Target group : All
    LUN          : 0

iSCSIターゲットがない場合はターゲットも作成します。

# itadm create-target
Target iqn.1986-03.com.sun:02:f5ea47bd-6042-cc32-a674-abbbc4c7b057 successfully created

これで設定は完了です。

Windows XPから接続


shareiscsiプロパティの場合と同じように1Gの領域が見えています。

おまけ

COMSTARの場合、sbdadmで論理ユニットを作るわけですがこれのサイズを変更できることをこの検証中に気づいた。
今回の例だとsbdadmでLUを作った際の出力でDATA SIZEの項目の1073676288がサイズになるんですが、ここのサイズもzfsのボリュームとは違った値を設定できます。

なので、疎ボリュ-ムを作らずに普通にこのLUのサイズだけ変更すればシン・プロビジョニングできるんじゃ?とか思っちゃったわけですがこれはできない。

具体的に言うと、普通に50Mのボリュームを作ってLUのサイズだけ1Gにしてみるということ。以下の感じです。

# zfs create -V 50m osol/comstar
# sbdadm create-lu -s 1073676288 /dev/zvol/rdsk/osol/comstar 

Created the following LU:

              GUID                    DATA SIZE           SOURCE
 --------------------------------  -------------------  ----------------
600144f0b8eb0a0000004b473845000a      1073676288       /dev/zvol/rdsk/osol/comstar
# stmfadm add-view 600144f0b8eb0a0000004b473845000a

とかで公開すると、確かに接続した段階では1Gに見えます。で、ディスクの初期化をしてフォーマットしようとするんですが、そこで失敗します。
なのでこの方法ではできないようです。まあ当たり前なのかな・・・。

まとめ

こんな感じOpenSolarisZFSでもシン・プロビジョニング機能が使えます。zfsコマンドのマニュアルを見ると-sでのシン・プロビジョニングは推奨されていませんみたいなことが書かれていますけど・・・。

これは実戦で使える機能なので、実際に投入して運用テストなどもしていきたいと思います。

OpenSolarisやっぱいい!