カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

LinuxのNFSディレクトリをWindows Serverからマウントしユーザマッピングする

Linuxでファイル共有のためにNFSサーバをたててディレクトリを公開することはよくあるが、
今回Windows Serverからも同じフォルダにアクセスするためにLinuxのNFSディレクトリをドライブにマウントする手順を検証した。
また、その際に簡易な方法でWindowsユーザとLinuxユーザのマッピングもしてみる。

環境はLinuxもWindowsもAWS上のEC2インスタンス上に構築しており、それぞれのバージョンは以下の通り。

  • Red Hat Enterprise Linux Server release 7.3 (Maipo)
  • Windows Server 2012 R2 Standard

LinuxでNFSセットアップ

まずはLinux上にNFSサーバを構築し、共有ディレクトリの公開設定を行う。
作業はec2-userで行う。

まずNFSをインストールする。

$ sudo yum -y install nfs-utils

/shareディレクトリを公開する。またパーミッションは今回は777にしておく。

$ sudo mkdir /share
$ sudo chmod 777 /share/

以下の1行を記載。win2012の部分はNFSクライアントであるWindows ServerのホストまたはIPアドレスを指定する。

$ sudo vi /etc/exports
/share win2012(rw)

NFSサーバを起動する。

$ sudo systemctl start nfs-server
$ sudo systemctl status nfs-server
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Fri 2017-07-28 04:54:59 EDT; 3s ago
  Process: 9572 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 9571 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 9572 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Jul 28 04:54:59 ip-172-31-17-13.ap-northeast-1.compute.internal systemd[1]: Starting NFS server and services...
Jul 28 04:54:59 ip-172-31-17-13.ap-northeast-1.compute.internal systemd[1]: Started NFS server and services.

正常にNFSサーバが起動したことを確認。
またLinuxのファイアウォール(AWSのセキュリティグループも)でWindows ServerからのNFSポート(デフォルトは2049)を開けておくこと。

ここまででNFS公開ディレクトリの準備はできたので、Windowsからアクセスした際のテスト用のファイルを出力しておく。

$ sudo echo hello > /share/test.txt

Windows ServerからNFSマウント

続いて、Windows Server側にNFSクライアントツールを導入し、LinuxのNFSディレクトリをマウントする。
まず、NFSクライアントをインストールする。

サーバーマネージャーを起動し、「役割と機能の追加」を選択する。
f:id:osn_th:20170730110838p:plain
しばらくはデフォルトのまま「次へ」で進み、
「機能の選択」のところで、「Client for NFS」にチェックを入れ、「次へ」を選択する。
f:id:osn_th:20170730110843p:plain
「インストール」を選択する。
すぐに再起動する場合は「必要に応じて対象サーバーを自動的に再起動する」にチェックを入れる。
チェックを入れなかった場合は再起動をあとで行う。
f:id:osn_th:20170730110848p:plain

続いて、NFSクライアント(mountコマンド)を使って、NFSディレクトリにアクセスする。
まずコマンドプロンプトを起動し、mountコマンドが実行できるようになったことを確認する。
f:id:osn_th:20170730110853p:plain
問題なければ以下のコマンドでLinuxのNFSサーバにアクセスし、ドライブにマウントする。

> mount <NFSサーバホスト>:/<NFS公開パス> <マウント先ドライブ>

今回は以下のように実行し、Yドライブに割り当てた。172.31.17.13はLinuxサーバのIPアドレスを指定する。

> mount 172.31.17.13:/share Y:

f:id:osn_th:20170730110857p:plain
コマンドが正常に実行できると、コンピュータからYドライブに割り当てが追加されており、エクスプローラからアクセスできることが確認できる。
f:id:osn_th:20170730110901p:plain

LinuxとWindows Server間のユーザマッピングをする

さて、ここまでの手順でLinux上で作ったファイルをWindows Serverから正しく見れることを確認した。
一方で、Windows Server上からファイルを作成した場合の動きを見てみる。

Windows Server側からファイルを新規作成する。
f:id:osn_th:20170730110908p:plain
Linux上でls -lしてみる。
ファイルの所有者やグループを見てみる。

$ ls -l /share/
total 8
-rwxr-xr-x. 1 4294967294 4294967294 11 Jul 28 05:20 test2.txt
-rw-rw-r--. 1 ec2-user   ec2-user    6 Jul 28 05:18 test.txt

Windowsで作ったtest2.txtファイルの所有者、グループのuid,gidがLinux側に存在しないため、番号がそのまま表示されている。
これは不便なので、Windows Serverから書き込んだ場合にLinuxのec2-userが所有者、グループになるようにユーザマッピング設定を行う。

まずLinuxの/etc/passwd/etc/groupからec2-userユーザエントリとグループエントリを確認する。

$ grep ec2-user: /etc/passwd
ec2-user:x:1000:1000:Cloud User:/home/ec2-user:/bin/bash
$ grep ec2-user: /etc/group
ec2-user:x:1000:

どちらも1000番であることが確認できる。つまり、Windowsでアクセスするユーザでマウントする際に1000番であることを明示できればよい。
Windows Serverの2012から、C:\Windows\System32\drivers\etcフォルダにLinuxのものと同じようなpasswdファイルとgroupファイルを配置することで、このことが実現できる。

現在ログインしているWindowsユーザXXXUSERとLinuxのec2-userをマッピングするには、以下のようなpasswdgroupファイルを作成すればよい。

passwdファイルにはLinuxで確認した/etc/passwdのec2-userのユーザエントリのユーザ名の部分をXXXUSERに置き換えて記載する。

XXXUSER:x:1000:1000:Cloud User:/home/ec2-user:/bin/bash

同様にgroupファイルにも同様に、Linuxで確認した/etc/groupのec2-userのグループエントリのグループ名の部分をWindowsユーザグループ名に置き換えて記載する。
例えばAdministratorsグループに所属するユーザの場合はBUILTIN¥を頭に付けて以下のように記載する。

BUILTIN\Administrators:x:1000:

これでユーザマッピングの設定が整ったので、再マウントを行う。
まずアンマウントするため、Windows Serverのコマンドプロンプトを開き、以下のコマンドを実行する。

> umount Y:

次に再マウントを行うが、今度はWindowsユーザとそのログインパスワードをオプションで明示して実行する。

> mount <NFSサーバホスト>:/<NFS公開パス> -u:<Windowsユーザ名> -p:<ログインパスワード> <マウント先ドライブ>

コマンドプロンプトで以下のように実行する。

> mount 172.31.17.13:/share -u:XXXUSER -p:password Y:

f:id:osn_th:20170730110957p:plain

この状態で先ほどと同じように、Windows Server側からマウント先に新規ファイルを作成する。
f:id:osn_th:20170730111001p:plain
それをLinuxから見ると、今度は正しく所有者とグループがec2-userのものとして作成されている!

$ ls -l /share/
total 12
-rwxr-xr-x. 1 4294967294 4294967294 11 Jul 28 05:20 test2.txt
-rwxr-xr-x. 1 ec2-user   ec2-user    9 Jul 28 05:30 test3.txt ★
-rw-rw-r--. 1 ec2-user   ec2-user    6 Jul 28 05:18 test.txt

まとめ

LinuxのNFSディレクトリにWindows ServerからNFSクライアントでドライブにマウントする方法を見た。
その際に、適切にユーザマッピングを設定しておくことで、パーミッション等の設定もしやすくなる。
Linux同士であれば同じuidのユーザを作っておく等の注意でよいが、Windows Serverのユーザの場合はこのようにマッピングファイルを作っておくことで、同じように同じ所有者のファイルとして作成したりできる。

以上