【今から覚えるONTAPの操作】NFS用のSVMを作成する

## はじめに
本記事では、NetApp社の提供するStorageであるONTAPにおいて、**オンプレミス環境でNFS用仮想ストレージ（SVM）を作成する手順について説明**します。

具体的なワークロードのチューニングやCLIコマンドの使用方法やパラメータの解説には触れませんが、環境構築の流れを説明することで、Ansibleを使用した自動化によるNFS用SVM環境の構築に必要な項目を把握することに繋がるかと思います。

なお、NFSを利用する際のベストプラクティスについては[NFS in NetApp ONTAP Best practice and implementation guide](https://www.netapp.com/ja/pdf.html?item=/ja/media/10720-tr-4067.pdf)を参照下さい。

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/9b5fb5bb-65c9-b0e6-730d-3345806d7e50.png>


## 何をしたい？できる？
- ONTAPにNFS用SVMMの作成をCLIで実行
- LinuxからのNFS mount

## NFS用の仮想ストレージ（SVM）作成の流れ
基本的な設定作業の流れは下図の通りになります。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/bc336cbb-a5b7-61bf-a1e2-77abb2bda888.png)

本記事では手順1の**ラッキングや初期設定が完了してリモートからONTAPにSSHアクセスできるような状態となっていることを想定しての記載**です。


## 記事における環境情報
本記事では、以下の環境で実施した内容となります。
- Rocky Linux : 9.2
- 機種: FAS8200＋SATA Disk
- ONTAP  : 9.13.1

環境のイメージとしては以下の通りです。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/ede40774-79b3-a901-85d3-1ddf2947b5cb.png>


## 実施手順
**既存環境へNFS用SVM追加ということであれば、仮想ストレージ作成からの実施**となりますが、本記事ではAggregate作成からの記載を行います。

### 1. Aggregateの作成

データアクセス用Aggregateを作成します。
手順例ではSATA Diskの環境で名前やDisk数以外はデフォルト値で作成する為、RAID DPで最大14個でRAID Groupを組む構成で作成されます。

<img width="350" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/5b1cabcc-3d6e-4d73-9b6c-5507d44173c2.png>

:::note info
既にデータ用Aggregate作成済の場合は、本手順は割愛して下さい。
:::

```bash:
> storage aggregate create -aggregate aggr1_node01 -diskcount 7 -node PS-8200cl-01

> storage aggregate show -aggregate aggr1_node01 -fields size,raidtype,maxraidsize
aggregate    maxraidsize raidtype size
------------ ----------- -------- -------
aggr1_node01 14          raid_dp  16.34TB
```


### 2. Network構成の設定
#### 2-1. InterfaceGroupの作成
NFSデータの通る物理NICのPortに対して、InterfaceGroupという機能を使い論理的な1つの仮想ポートを作成します。

InterfaceGroupの作成にあたっては、後述する何かしらのBroadcast Domainに所属していると作成時にエラーが出るため、事前にBroadcast DomainからInterfaceGroupで利用予定のPortを外します。

本記事ではIEEE802.3ad(dynamic)に準拠したLACPを利用し、各コントローラに対して作成を実行します。

<img width="600" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/1e3d8548-ef36-f0f5-3470-a000fbd84d2d.png>

:::note info
既にInterfaceGroup作成済の場合は、本手順は割愛して下さい。
:::

```bash:
# InterfaceGroupに利用するPortをBroadcast Domainから除外
> broadcast-domain remove-ports -broadcast-domain Default -ports PS-8200cl-01:e0e
> broadcast-domain remove-ports -broadcast-domain Default -ports PS-8200cl-01:e0f

# InterfaceGroup作成
> network port ifgrp create -node PS-8200cl-01 -ifgrp a0a -distr-func ip -mode multimode_lacp

# InterfaceGroupに物理NICのPortを追加
> network port ifgrp add-port -node PS-8200cl-01 -ifgrp a0a -port e0e
> network port ifgrp add-port -node PS-8200cl-01 -ifgrp a0a -port e0f

> network port ifgrp show -instance -node PS-8200cl-01 -ifgrp a0a

                 Node: PS-8200cl-01
 Interface Group Name: a0a
Distribution Function: ip
        Create Policy: multimode_lacp
          MAC Address: 02:a0:98:af:de:57
   Port Participation: full
        Network Ports: e0e, e0f
             Up Ports: e0e, e0f
           Down Ports: -

#他のコントローラに対しても同様にifgrpの作成を実行
```
#### 2-2. VLANインターフェースの作成
次に作成したifgrpからVLAN インターフェースを切り出します。
<img width="300" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/a19bbb99-441d-fb93-29f0-c582426ac68c.png>

```bash:
> network port vlan create -node PS-8200cl-01 -vlan-name a0a-10

> network port vlan show -node PS-8200cl-01
                 Network Network
Node   VLAN Name Port    VLAN ID  MAC Address
------ --------- ------- -------- -----------------
PS-8200cl-01
       a0a-10    a0a     10       02:a0:98:af:de:57
```

#### 2-3. Broadcast Domainの作成
作成したVLAN インターフェースをBroadcast Domainに含めます。
Network障害時におけるPortの切り替え範囲は、Broadcast Domainに登録しているインターフェース間で実施されます。

:::note info
既にVLAN インターフェース作成済の場合は、本手順は割愛して下さい。
:::

<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/b664623e-cdeb-462a-0ead-63b0884cee51.png>


```bash:
> network port broadcast-domain create -broadcast-domain data_vlan10 -mtu 1500 -ports PS-8200cl-01:a0a-10, PS-8200cl-02:a0a-10

> broadcast-domain show -broadcast-domain data_vlan10
  (network port broadcast-domain show)
IPspace Broadcast                                         Update
Name    Domain Name    MTU  Port List                     Status Details
------- ----------- ------  ----------------------------- --------------
Default data_vlan10   1500
                            PS-8200cl-01:a0a-10           complete
                            PS-8200cl-02:a0a-10           complete
```


### 3. 仮想ストレージの作成

#### 3-1. 仮想ストレージの作成
仮想ストレージ(SVM)の作成を実行します。
指定された内容は、Volume作成時のDefault値になります。(languageやsecurity等) 

<img width="400" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/319948dd-1069-916a-2163-6f7713469d46.png>

```bash:
> vserver create -vserver nfs100 -rootvolume nfs100_root -aggregate aggr1_node01 -language C.UTF-8 -rootvolume-security unix -snapshot-policy default

# NASでのみ利用できる仮想ストレージ設定へ変更(必須では無い)
> vserver remove-protocols -vserver nfs100 -protocols fcp,iscsi,ndmp
```

#### 3-2. LIFの作成
VLANインターフェースからIPを付与する為にLIFの作成を実施します。
LIFの作成時には、IPの他に普段の通信経路となるコントローラとPortを指定を行い、**NAS利用時はservice-policyをdefault-data-filesに指定**します。

また、Network障害時には作成しておいた**Broadcast Domainに追加したインターフェース間で切り替えを実施できるように、failover-policyを broadcast-domain-wideに指定**します。

<img width="400" altt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/12d2ed21-0242-9657-13ed-cba954221143.png>


```bash:
> network interface create -vserver nfs100 -lif lif001 -service-policy default-data-files -home-node  PS-8200cl-01 -home-port a0a-10  -address 172.16.10.240 -netmask 255.255.255.0 -failover-policy broadcast-domain-wide

>  network interface create -vserver nfs100 -lif lif002 -service-policy default-data-files -home-node  PS-8200cl-02 -home-port a0a-10  -address 172.16.10.241 -netmask 255.255.255.0 -failover-policy broadcast-domain-wide


> network interface show -vserver nfs100
            Logical    Status     Network            Current       Current Is
Vserver     Interface  Admin/Oper Address/Mask       Node          Port    Home
----------- ---------- ---------- ------------------ ------------- ------- ----
nfs100
            lif001       up/up    172.16.10.240/24   PS-8200cl-01  a0a-10  true
            lif002       up/up    172.16.10.241/24   PS-8200cl-02  a0a-10  true
```

### 4. Volumeの作成
NFSアクセス先のデータ置き場であるVolumeの作成を実施します。
**この例では、シンプロビジョニング構成の10GBのVolumeを作成し、Snapshot領域はサイズを5%を確保し、NFSアクセス許可の設定であるExport policyはDefaultのまま**で設定します。
(Export policyの中の設定は後で実施)

<img width="500" altt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/3f652efc-0fde-ea03-3f3c-df828cb60212.png>

```bash:
> volume create -vserver nfs100 -volume nfsvol -aggregate aggr1_node01 -size 10GB -percent-snapshot-space 5 -space-guarantee none -policy default -security-style unix -junction-path /nfsvol

Warning: The export-policy "default" has no rules in it. The volume will therefore be inaccessible over NFS and CIFS
         protocol.
Do you want to continue? {y|n}: y
```

### 5. プロトコル設定
#### 5-1. NFSサービスの開始
SVMでNFSサービスを開始し、必要なオプション設定を実施します。
デフォルトでは、NFSのv3, v4, v4.1が有効な形でサービス開始になります。
この記事では、**NFSv4でmountしますが、LDAPサーバは用意しないので、ユーザ名がマッピングできない場合にはNFS v3のようにUID/GIDを利用する方法を採用(v4-numeric-idsの有効化)** します。

<img width="500" altt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/70287d51-88f9-3f59-a467-cdc870894340.png>

```bash:
> vserver nfs create -vserver nfs100 -v4-numeric-ids enabled -v4-id-domain "example.com"

> vserver nfs show

Vserver: nfs100

        General Access:  true
                    v3:  enabled
                  v4.0:  enabled
                   4.1:  enabled
                   UDP:  enabled
                   TCP:  enabled
                  RDMA:  enabled
  Default Windows User:  -
 Default Windows Group:  -
```

#### 5-2. Export Policyへのルール追加

VolumeやqtreeへのNFSアクセスを特定のパラメータが一致するクライアントだけに制限します。
<font color="Red">**SVM Root Volume(/の部分)は、配下のVolumeを使用する全クライアントからアクセス可能なように設定する必要**</font>があります。

**本記事では、作成されるVolumeはSVMのroot Volumeを含めデフォルト値のdefaultというExport Policyを利用しているので、defaultというPolicyへのルール追加をのみを実施**します。

<img width="350" altt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/6d45c593-b4c7-d877-ab9c-1583f94f9fca.png>

```bash:
> vserver export-policy rule create -vserver nfs100 -policyname default -protocol nfs4 -clientmatch 172.16.10.0/24 -rorule any -rwrule any -anon 0
```


### 6. LinuxからのNFS mount

事前にidmapd.confのDomain名をSVM側で設定したものと合わせておき、mountを実行します。

```bash:
# Domain名の確認
> cat /etc/idmapd.conf |grep Domain
Domain = example.com
# the old method (comparing the domain in the string to the Domain value,

# NFS version4.0 でMount
>  mount -o vers=4.0 172.16.10.240:/nfsvol /mnt

# mountされている事を確認し、ファイルの作成
>  df -h /mnt
ファイルシス             サイズ  使用  残り 使用% マウント位置
172.16.10.240:/nfsvol   9.5G  320K  9.5G    1% /mnt

> date >/mnt/file01
> ls -l /mnt
合計 0
-rw-r--r--. 1 root daemon 43 10月 26 18:16 file01

> cat /mnt/file01
2023年 10月 26日 木曜日 18:16:53 JST
```

## 参考及びリンク
[ローカル階層を追加（アグリゲートを作成）](https://docs.netapp.com/ja-jp/ontap/disks-aggregates/add-local-tier-overview-task.html)

[物理ポートを組み合わせてインターフェイスグループを作成する](https://docs.netapp.com/ja-jp/ontap/networking/combine_physical_ports_to_create_interface_groups.html)

[物理ポートを介して VLAN を設定します](https://docs.netapp.com/ja-jp/ontap/networking/configure_vlans_over_physical_ports.html)

[SVM を作成します](https://docs.netapp.com/ja-jp/ontap/nfs-config/create-svms-data-access-task.html)

[LIF を作成](https://docs.netapp.com/ja-jp/ontap/nfs-config/create-lif-task.html)

[ボリュームを作成します](https://docs.netapp.com/ja-jp/ontap/volumes/create-volume-task.html)

[NFS サーバを作成します](https://docs.netapp.com/ja-jp/ontap/nfs-config/create-server-task.html)

[SVM ルートボリュームのエクスポートポリシーを開きます](https://docs.netapp.com/ja-jp/ontap/nfs-config/open-export-policy-svm-root-volume-task.html)

[NFS in NetApp ONTAP Best practice and implementation guide](https://www.netapp.com/ja/pdf.html?item=/ja/media/10720-tr-4067.pdf)