NFSの設定方法（Ubuntu22.04、CentOS Stream9）

# Ubuntu22.04の場合(NFSv4に限定)

詳しくはこちらを参照  

https://ubuntu.com/server/docs/service-nfs


## サーバー側

### インストールとサービス起動

```bash
sudo apt install nfs-kernel-server
sudo systemctl start nfs-kernel-server.service
```

### `/etc/exports`に設定を記載

```:/etc/exports
# directory_to_share    host(share_option1,...,share_optionN)
/test              192.168.0.0/28(rw,sync,no_root_squash,no_subtree_check)
```

hostについて
single host: 例 example.hostname.com,192.168.0.1
wildcards: 例 *.hostname.com(IPアドレスには使用不可)
IPnetworks: 例　192.168.0.0/24

share_optionについて
|option|説明|
|------|---|
|ro|読み取りのみ|
|rw|読み取りと書き込み可能|
|sync|同期|
|async|非同期|
|no_root_squash|クライアントがrootの時にroot権限でファイルを編集できないようにする|
|no_subtree_check|サブツリーのチェックを無効|

### 設定を反映

```bash
sudo exportfs -ar
```

### ポート開放

ポート2049/tcpを使用するのでufwを起動している場合はポートを開く

```bash
sudo ufw status # ステータス確認
sudo ufw allow nfs
sudo ufw allow from 192.168.0.0/24 to any port nfs #ipアドレスでも制限する
```

https://qiita.com/IndoorPond/items/4bda148a91b123f7e7e4


## クライアント側

### インストール

```bash
sudo apt install nfs-common
```

### 手動マウント

```bash
sudo mkdir /opt/example
sudo mount example.hostname.com:/srv /opt/example
```

※マウントするディレクトリがあること、そのディレクトリにはファイル、ディレクトリを入れないこと。

### 設定ファイル`/etc/fstab`に記入してマウント

```:/etc/fstab
# host:dir  mountPoint  FileSystemName mountOption dumpフラグ ブート時にfsckがチェックする順序
example.hostname.com:/test /opt/example nfs rw,soft,intr 0 0
```

- host: マウントしたいサーバー
- dir:　サーバーが提供しているディレクトリ
- mountPoint: クライアント側でマウントしたい位置を指定。上記の例ではtestディレクトリとexampleディレクトリが対応する。  
- FileSystemName: nfsと記入
- mountOption: 
    - rsize=n: NFS サーバからファイルを読み込む際に、 NFS が用いるバッファのバイト数 を指定する。(1024)
    - wsize=n: NFS サーバにファイルを書き込む際に、 NFS が用いるバッファのバイト数を 指定する。(1024)
    - timeo=n: タイムアウト後の再送をおこなうまでの時間
    - rw=read-wirte
    - ro=read-only
    - soft=NFS へのファイル操作がメジャータイムアウトとなった場合、呼び出したプロ グラムに対し I/O エラーを返す。  
    - hard=NFS へのファイル操作がメジャータイムアウトとなった場合、コンソールに "server not responding"と表示し、ファイル操作を無期限に再試行し続ける。(defalt)
    - intr=timeout時にファイル操作の中断を許可する。  
    - 詳しくは`man mount`と`man nfs`
- dumpフラグ: dumpコマンドでバックアップする=1,しない=0。(nfsはサーバ側で行うので0)
- ブート時にfsckがチェックする順序: 0の場合はチェックしない。(nfsでは必要ないので0)  

### autofsで自動マウント

#### autofsをインストール

```bash
sudo apt install autofs
```

#### autofsの設定ファイル

```:/etc/auto.master
+auto.master #マウントポイントの内容をautofsサービス以外で変更不可にする。
```

※デフォルトのまま

```:/etc/auto.master.d/XXXX.autofs
/- /etc/auto.master.d/auto.XXXX
```

`/`でマウントポイント設定し、auto.XXXXでそこからの相対パスを設定。

※XXXXはわかりやすいの文字列

```:/etc/auto.master.d/auto.XXXX
/opt/example -rw,soft,intr "host":/test
```

#### サービス起動

```bash
sudo systemctl start autofs.service
```

# CentOS Stream9の場合(NFSv4に限定)

詳しくはこちら

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/managing_file_systems/mounting-nfs-shares_managing-file-systems

## サーバー側

### インストールとサービス起動

詳しくはこちら

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/managing_file_systems/configuring-an-nfsv4-only-server_deploying-an-nfs-server

```bash
su -
dnf install nfs-utils
systemctl start nfs-server.service
```

### `/etc/exports`に設定を記載

```:/etc/exports
# directory_to_share    host(share_option1,...,share_optionN)
/test              192.168.0.0/28(rw,sync,no_root_squash,no_subtree_check)
```

hostについて
single host: 例 example.hostname.com,192.168.0.1
wildcards: 例 *.hostname.com(IPアドレスには使用不可)
IPnetworks: 例　192.168.0.0/24

share_optionについて
|option|説明|
|------|---|
|ro|読み取りのみ|
|rw|読み取りと書き込み可能|
|sync|同期|
|async|非同期|
|no_root_squash|クライアントがrootの時にroot権限でファイルを編集できないようにする|
|no_subtree_check|サブツリーのチェックを無効|

### 設定を反映

```bash
sudo exportfs -ar
```

### ポート開放

ポート2049/tcpを使用するのでfirewalldを起動している場合はポートを開く

```bash
firewall-cmd --list-all #現在の設定を見る
firewall-cmd --permanent --add-service nfs
firewall-cmd --reload
```

## クライアント側

### インストール

```bash
dnf install nfs-utils
```

### 手動マウント

```bash
sudo mkdir /opt/example
sudo mount example.hostname.com:/srv /opt/example
```

※マウントするディレクトリがあること、そのディレクトリにはファイル、ディレクトリを入れないこと。

### 設定ファイル`/etc/fstab`に記入してマウント

```:/etc/fstab
# host:dir  mountPoint  FileSystemName mountOption dumpフラグ ブート時にfsckがチェックする順序
example.hostname.com:/test /opt/example nfs rw,soft,intr 0 0
```

- host: マウントしたいサーバー
- dir:　サーバーが提供しているディレクトリ
- mountPoint: クライアント側でマウントしたい位置を指定。上記の例ではtestディレクトリとexampleディレクトリが対応する。  
- FileSystemName: nfsと記入
- mountOption: 
    - rsize=n: NFS サーバからファイルを読み込む際に、 NFS が用いるバッファのバイト数 を指定する。(1024)
    - wsize=n: NFS サーバにファイルを書き込む際に、 NFS が用いるバッファのバイト数を 指定する。(1024)
    - timeo=n: タイムアウト後の再送をおこなうまでの時間
    - rw=read-wirte
    - ro=read-only
    - soft=NFS へのファイル操作がメジャータイムアウトとなった場合、呼び出したプロ グラムに対し I/O エラーを返す。  
    - hard=NFS へのファイル操作がメジャータイムアウトとなった場合、コンソールに "server not responding"と表示し、ファイル操作を無期限に再試行し続ける。(defalt)
    - intr=timeout時にファイル操作の中断を許可する。  
    - 詳しくは`man mount`と`man nfs`
- dumpフラグ: dumpコマンドでバックアップする=1,しない=0。(nfsはサーバ側で行うので0)
- ブート時にfsckがチェックする順序: 0の場合はチェックしない。(nfsでは必要ないので0)  

### autofsで自動マウント

#### autofsをインストール

```bash
dnf install autofs
```

#### autofsの設定ファイル

```:/etc/auto.master
+auto.master #マウントポイントの内容をautofsサービス以外で変更不可にする。
```

※デフォルトのまま

```:/etc/auto.master.d/XXXX.autofs
/- /etc/auto.master.d/auto.XXXX
```

`/`でマウントポイント設定し、auto.XXXXでそこからの相対パスを設定。

※XXXXはわかりやすいの文字列

```:/etc/auto.master.d/auto.XXXX
/opt/example -rw,soft,intr "host":/test
```

#### サービス起動

```bash
systemctl start autofs.service
```