SVM管理者に契約以上のVolumeサイズを作成させたくない！【SVM Capacity Limits】

# はじめに
ONTAPでは、仮想ストレージ(SVM)を作成後に、各SVMにVolumeを作成し、プロトコルの設定を行う事でデータにアクセスができるようになります。また、このSVMに対して管理ユーザを作成し権限の委譲をすることで指定した操作を許可することができます。

但し、従来のONTAPでは作成したSVM内における操作においてVolumeやClone作成の権限を許可すると、SVMに割り当てているAggregateのサイズを全て使う事ができてしまうという問題がありました。
(制限する為には、小サイズのAggregate作成し、SVMのaggr-listに設定)

<font color="Red">**ONTAP 9.13.1以降では**</font>、この問題に対処する為の **「SVM Capacity Limits」という機能が実装**されており、**この機能を使用することで、各SVMで利用できる容量を制限することができます。**
<img width="700" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9385f206-08ef-0e1c-47c2-25d536ca45f8.png>


## 何をしたい？できる？
- SVM capacity limitsの挙動を確認してみる
- CloneやLUN作成時の挙動を確認してみる
- 重複排除時の論理容量は関係しない事の確認

## SVM Capacity Limitsについて

SVMへの容量制限の割り当ては以下のような計算方法が適用されます。

- SVM上の容量制限は、FlexVol、FlexGroup 、FlexClone、FlexCache の合計値
- 削除後にVolumeが制限状態、オフライン状態、リカバリキュー内にある場合でも、容量計算に影響
- Volume自動拡張が設定されている場合は、拡張の最大値が計算に影響
- 自動拡張を設定しない場合は、Volumeのサイズのみの計算


## 記事における環境情報
本記事では、以下の環境で実施した内容となります。
- ONTAP9.13.1


## 実施手順

### 1. SVM capacity limitsの設定
手順例では既存SVMに対しての設定を例にして記載します。
**容量制限は1GBで設定します。**
```bash:
# 容量制限の設定値の確認
> vserver show -vserver svm100 -fields storage-limit
vserver storage-limit
------- -------------
svm100  -


#　容量制限を1GBで設定
> vserver modify -vserver svm100 -storage-limit 1g


# 設定値の確認
> vserver show -vserver svm100 -fields storage-limit
vserver storage-limit
------- -------------
svm100  1GB
```

### 2. ユーザ用の1GB Volume作成
**SVM内のVolumeサイズの合計が計算対象の為、シンプロ構成でも1GBのVolume作成が失敗することを確認します。**
<font color="Red">**以下の例ではSVMのroot Volumeのサイズを加味してないので、失敗が確認できます。**</font>

```bash:
> vol create -vserver svm100 -volume vol100 -state online -size 1g -space-guarantee none -junction-path /vol100 -security-style ntfs -aggregate cluster1_01_SSD_1

Error: command failed: Request to perform volume operation failed because there is insufficient storage available in
       the Vserver "svm100". To increase the available storage in the Vserver, you can, for example, delete volumes,
       Snapshot copies, or files. Other options include raising the storage limit.

```

この環境ではSVMのroot volumeが20MBなので、900MBのVolumeサイズでは成功する事を確認します。
(容量制限の合計値1GBを超えない形)
```bash:
> vol create -vserver svm100 -volume vol100 -state online -size 900m -space-guarantee none -junction-path /vol100 -security-style ntfs -aggregate cluster1_01_SSD_1
[Job 91] Job succeeded: Successful


> vol show -vserver svm100
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
svm100    svm100_root  cluster1_01_SSD_1
                                    online     RW         20MB    17.83MB    6%
svm100    vol100       cluster1_01_SSD_1
                                    online     RW        900MB    854.6MB    0%
2 entries were displayed.
```

次に、ユーザへの払い出しをTB単位で実施するような環境を例にします。

**SVMのroot Volumeのサイズが1GBの環境の場合、storage-limitをGB指定でroot Volume分の１GB分だけ増やす事で、ユーザ用VolumeをTB単位で作成やサイズ変更ができるようになります。**
(1TB=1024GBなので、1GB分だけ加算するとユーザが1TBのVolumeを作成できる)

```bash:
# 容量制限を1025GB(1024GB + 1GB)に変更
> vserver modify -vserver svm100 -storage-limit 1025g


> vol size -vserver svm100 -volume vol100  -new-size 1T
vol size: Volume "svm100:vol100" size set to 1t.


> vol show -vserver svm100
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
svm100    svm100_root  cluster1_01_SSD_1
                                    online     RW          1GB    971.1MB    0%
svm100    vol100       cluster1_01_SSD_1
                                    online     RW          1TB    280.2GB    0%
2 entries were displayed.


```



### 3. 容量制限を超えなければ、Volumeを複数作成できる事を確認

```bash:
# 容量制限を3GBに変更
> vserver modify -vserver svm100 -storage-limit 3g

# 新規の別Volume作成
> vol create -vserver svm100 -volume vol200 -state online -size 1g -aggregate　cluster1_01_SSD_1 -junction-path /vol200
[Job 98] Job succeeded: Successful


> vol show -vserver svm100
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
svm100    svm100_root  cluster1_01_SSD_1
                                    online     RW          1GB    972.4MB    0%
svm100    vol100       cluster1_01_SSD_1
                                    online     RW          1GB    972.4MB    0%
svm100    vol200       cluster1_01_SSD_1
                                    online     RW          1GB    972.5MB    0%
3 entries were displayed.
```

### 4. Clone Volumeも計算対象になる事の確認
上記のvol200を削除後に、cloneも計算対象になる事を確認します。

```bash:
# 容量制限を10GBに変更
> vserver show -vserver svm100 -fields storage-limit
vserver storage-limit
------- -------------
svm100  10GB


# Volumeサイズを9GBに変更
> vol size -vserver svm100 -volume vol100 -new-size 9g
vol size: Volume "svm100:vol100" size set to 9g.


# 容量制限に達しているのでClone作成失敗
> vol clone create -vserver svm100 -flexclone clone01 -type RW -parent-vserver svm100 -parent-volume vol100

Error: command failed: Request to perform volume operation failed because there is insufficient storage available in
       the Vserver "svm100". To increase the available storage in the Vserver, you can, for example, delete volumes,
       Snapshot copies, or files. Other options include raising the storage limit.


#ユーザ用Volumeのサイズを縮小してからClone作成
> vol size -vserver svm100 -volume vol100 -new-size 4g
vol size: Volume "svm100:vol100" size set to 4g.

> vol clone create -vserver svm100 -flexclone clone01 -type RW -parent-vserver svm100 -parent-volume vol100
[Job 93] Job succeeded: Successful


# 合計値がCloneを含め容量制限の10GB以内である事の確認
> vol show -vserver svm100
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
svm100    clone01      cluster1_01_SSD_1
                                    online     RW          4GB     3.80GB    0%
svm100    svm100_root  cluster1_01_SSD_1
                                    online     RW          1GB    972.4MB    0%
svm100    vol100       cluster1_01_SSD_1
                                    online     RW          4GB     3.80GB    0%
3 entries were displayed.

```


### 5. LUNのシンプロ構成であれば作成に影響が無い事の確認
LimitがはVolume内に作成されるファイルサイズ(LUN)には影響しない事の確認を実施します。
**設定例として5GBのVolumeに10GBのシンプロ設定されたLUNを作成します。**
<img width="700" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ae9432f5-45f0-2cfd-8b8c-150b01c669f5.png>


```bash:
# 容量制限は10GB設定
> vserver modify -vserver svm100 -storage-limit 10g


# Volumeを5GBにサイズ変更
> vol size -vserver svm100 -volume vol100 -new-size 5g
vol size: Volume "svm100:vol100" size set to 5g.


# 10GBのLUNをシンプロ設定で作成
> lun create -vserver svm100 -path /vol/vol100/lun01 -size 10g -ostype windows_gpt -space-reserve disabled
Created a LUN of size 10g (10737418240)


# LUN作成の確認
> lun show
Vserver   Path                            State   Mapped   Type        Size
--------- ------------------------------- ------- -------- -------- --------
svm100    /vol/vol100/lun01               online  unmapped windows_gpt  10GB


# Volumeの状態を確認
> vol show -vserver svm100
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
svm100    svm100_root  cluster1_01_SSD_1
                                    online     RW          1GB    971.1MB    0%
svm100    vol100       cluster1_01_SSD_1
                                    online     RW          5GB     4.72GB    0%
2 entries were displayed.
```


### 重複排除が有効な利用環境について(SVM Capacity Limitsとは別要素)

LUNで確認したときのように、SVM Capacity Limitsは、Volumeの器のサイズのみ計算に組み入れられるので、**以下のような事を実現したい場合には、別の考慮が必要となります。**

- **SVM提供側としては、GB単価を安くするために、重複排除や圧縮機能は無効にしたくない**
- **SVMの利用ユーザには、実際に書かれた重複排除前のサイズ分だけ利用させたい**
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/8a52f90d-2db9-75ac-d825-f468f2bcc066.png)


具体的には、以下の図の右側ように、**同一Volumeに同じファイルをコピーした際に、ONTAP上では重複排除しても、アクセスするユーザには重複排除効果を見せなくない場合**にどうするかといった内容です。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/eda83485-8b85-7e09-9095-a2812e92ddae.png)

こちらは、Volumeへis-space-reporting-logicalと、is-space-enforcement-logicalを有効にすることで実現できます。
SVM自体への同様の設定が可能となりますが、この場合はSVM設定後に新規作成されるVolumeに対して有効になります。(SVMに作成されるVolumeへのDefault値になる)


```bash:
> vol modify -vserver svm100 -volume vol100 -is-space-enforcement-logical true  -is-space-reporting-logical true
Volume modify successful on volume vol100 of Vserver svm100.
```

volumeのmodifyの実行をSVM管理者に許容すると、Volumeへis-space-reporting-logicalと、is-space-enforcement-logicalを無効にされてしまうので、特定の操作のみ許可するRoleの作成を実施します。

以下の例では、**特定のvolume操作しか実施できない管理ユーザを作成した例**です。
(本来であれば、共有やexports設定もできるようにする形になるかと)

- **volumeのcreateとmodifyは連動している為、readonlyにして設定できないようにする**
- **Clone作成や削除、用意されたVolumeのサイズ変更は許可**

```bash:
> security login role show -vserver svm100 -role voladmin
           Role          Command/                                      Access
Vserver    Name          Directory                               Query Level
---------- ------------- --------- ----------------------------------- --------
svm100     voladmin      DEFAULT                                       none
                         volume                                        readonly
                         volume clone                                  all
                         volume clone create                           all
                         volume clone show                             all
                         volume create                                 readonly
                         volume delete                                 all
                         volume modify                                 readonly
                         volume offline                                all
                         volume show                                   readonly
                         volume size                                   all
                         volume snapshot                               all
12 entries were displayed.


> security login show -vserver svm100 -user-or-group-name voladmin
Vserver: svm100
                                                                 Second
User/Group                 Authentication                 Acct   Authentication
Name           Application Method        Role Name        Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
voladmin       http        password      voladmin         no     none
voladmin       ontapi      password      voladmin         no     none
voladmin       ssh         password      voladmin         no     none
3 entries were displayed.

```

論理的な設定だけでは実施したいことが実現できない場合は、FabricPool/Cloud Tieringの利用でユーザVolumeからは分からないように、Aggregateデータの階層化を実施であったり、AFF Cシリーズを利用してそもそものSSD単価を下げるといった事が考えられます。


## 参考及びリンク
[SVMの容量制限を管理](https://docs.netapp.com/ja-jp/ontap/volumes/manage-svm-capacity.html#%E5%AE%B9%E9%87%8F%E3%81%B8%E3%81%AE%E5%BD%B1%E9%9F%BF)
[ボリュームの論理スペースのレポートと適用の概要](https://docs.netapp.com/ja-jp/ontap/volumes/logical-space-reporting-enforcement-concept.html)
[カスタムロールを定義する](https://docs.netapp.com/ja-jp/ontap/authentication/define-custom-roles-task.html)