nfsストレージを作り Windows 10でアクセスする


在宅勤務が強制され、家で自宅サーバーへアクセスできる時間が増えるかと思いきや、逆に仕事が増えてしまい、仕事に関係ない本を読む時間すら減ってしまった。
ヒマだからいろいろバカな事をやってみた系の動画を最近よく見聞きするが、何割くらいの人が仕事なしで家にこもってるんだろう。

さて自宅サーバーの話。

oVirtが必要としているので、Linuxサーバーのnfsを有効化する。さらに、日常使っているWindowsからもファイルを置いたりできるようにする。

CentOS 8のインストール時に、仮想化ホストとしてインストールしたら、nfsは最初から有効化されていた。しかし、ファイアウォールも有効化されているし、nfsシェアも作成されていない（当り前だ）。なので、その辺の設定をする。

#ファイアウォールの無効化

```
# systemctl stop firewalld
```
自宅サーバーはWifiルーターのNAT経由で外部アクセスしているので、ファイアウォールは切っても大丈夫。外部公開する考えもないし。

#nfs共有ディレクトリの作成
mkdirして、権限をそれなりに設定する。仮想マシンホストとしてインストールしたCentOS 8では、oVirtで使用する仮想マシン管理用ユーザーはuid, gid=36、nobodyユーザーはuid, gid=65534で作られるようだ。

```
#　grep kvm /etc/group
kvm:x:36:qemu
# grep 36 /etc/passwd
vdsm:x:36:36::/home/vdsm:/bin/bash
# grep nobody /etc/group
nobody:x:65534:
# grep nobody /etc/passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

# mkdir -p /var/nfs/exports/public
# mkdir -p /var/nfs/exports/ovirt/iso
# mkdir -p /var/nfs/exports/ovirt/export

# chown 65534:65534 /var/nfs/exports/public
# chown 36:36 /var/nfs/exports/ovirt/iso
# chown 36:36 /var/nfs/exports/ovirt/export
# chmod 777 /var/nfs/exports/public
```

ディレクトリを共有対象として/etc/exportsに記述する。

```
# cat /etc/exports
/var/nfs/exports/public 192.168.1.0/255.255.255.0(rw,sync)
/var/nfs/exports/ovirt/iso      192.168.1.0/255.255.255.0(rw,sync)
/var/nfs/exports/ovirt/export   192.168.1.0/255.255.255.0(rw,sync)
/data   192.168.1.0/255.255.255.0(rw,sync)
```
iso, export, dataディレクトリについては、oVirtの為に使う予定のエクスポート。Windowsからもアクセスしてファイルを読み書きしたい場所は、publicと命名。
data以外はディレクトリが多少深いところにある。中速のSATA SSDを/varとして接続しているからで、OSやVMディスク用のディスクをそれ以外（/）としているからだが。
マウントする際にパス名が長いと面倒かもしれないが、頻繁にマウントコマンドを打つ事もないと思うので、まぁいいか。

#nfsサービスの再起動
再起動し、自環境でマウント、ファイル作成できる事を確認する。
上記のような/etc/exportsファイルの書き方だと、横着してlocalhostのエクスポートをマウントしようとしてもエラーになる。必要なら192.168.... の後に、localhostに対する設定も書き加える。（普通は必要ないだろうが．．．）

```
# systemctl restart nfs-server

# mkdir /tmp/testnfs
# mount -t nfs localhost:/var/nfs/exports/public /tmp/testnfs
mount.nfs: access denied by server while mounting localhost:/var/nfs/exports/public
# mount -t nfs 192.168.1.3:/var/nfs/exports/public /tmp/testnfs
# cd /tmp/testnfs
# echo "hi" >hi.txt
# ls -ld *
-rw-r--r--. 1 nobody     nobody       3 May  4 18:53 hi.txt
```

デフォルトでは、rootでのファイル操作はnobodyの扱いになるようだ。

# Windowsからの接続
Windowsは、デフォルトではnfs接続できるようになっていないので、コントロールパネルからnfsクライアント機能を有効化する。

プログラムと機能 > Windowsの機能の有効化または無効化 > NFS用サービス > NFSクライアント
にチェック。

有効化後、mountコマンドを使って接続する。

```
C:\>mount 192.168.1.3:/var/nfs/exports/public q:\

q: は 192.168.1.3:/var/nfs/exports/public に正常に接続しました

コマンドは正常に終了しました。

C:\>dir q:
ドライブ Q のボリューム ラベルがありません。
ボリューム シリアル番号は DFCF-7BDE です

Q:\ のディレクトリ

2020/04/20  22:40    <DIR>          .
2020/04/20  22:40    <DIR>          ..
               0 個のファイル                  12 バイト
               2 個のディレクトリ  1,985,235,058,688 バイトの空き領域

C:\>echo hello > q:\hello.txt

C:\>type q:\hello.txt
hello

C:\>umount q:

切断中          q:      \\192.168.1.3\var\nfs\exports\public
コマンドは正常に終了しました。
```

そのままだと、Linuxの上では変なuid, gidが設定される。（おそらく-2をunsigned longで何とかハンドリングしようとしてこんな値になっている？）

```
# ls -ld *
-rwxr-xr-x. 1 4294967294 4294967294  10 May 4 19:22 hello.txt
```

Windows 10には、nfsのユーザーマッピング機能があるので、それを使い、Linuxのuid, gidとして適切な番号をアサインする。
nfsサーバーが動くLinuxで、nobodyがuid 65534、gid 65534で作られているとして、Windowsからのセッションでそのuid, gidを使ってファイルアクセスしたい場合、下記のようにファイルを作成する。
（管理者グループに入っているhogeユーザーでWindowsを使っていると想定）
Linuxの該当ファイルと似た書き方でいける。
ファイルの場所は、\Windows\System32\drivers\etcの下。

passwdファイル：

```
hoge:x:65534:65534:nobody (nfs guest)::
```

groupファイル：

```
BUILTIN\Administrators:x:65534:
```

ユーザーマッピング有効時に同じファイル操作をすると、今度はnobodyユーザーで作られている事がわかる。

```
C:\>echo testing> q:\testing.txt
```

```
# ls -ld *
-rwxr-xr-x. 1 4294967294 4294967294  10 May  4 19:22 hello.txt
-rw-r--r--. 1 nobody     nobody       3 May  4 18:53 hi.txt
-rwxr-xr-x. 1 nobody     nobody      10 May  4 19:33 testing.txt
```