Windows Server 는 Server for NFS 역할 서비스를 통해 리눅스·유닉스 클라이언트에게 NFS 공유를 내줄 수 있다. Standard 와 Datacenter 모두 포함하는 기능이다. 반대로 Windows 가 리눅스의 NFS 를 마운트하는 쪽은 Client for NFS 이며 별개 기능이다.
SMB 로 해결되는 상황이면 SMB 를 쓰는 편이 낫다. NFS 를 쓰는 이유는 대체로 클라이언트가 리눅스이고 POSIX 권한 모델을 그대로 써야 할 때다.
서버 관리자에서 역할 및 기능 추가 → 파일 및 저장소 서비스 → 파일 및 iSCSI 서비스 → NFS 서버 를 고른다. PowerShell 로는 다음과 같다.
Install-WindowsFeature -Name FS-NFS-Service -IncludeManagementTools
폴더를 만든 뒤 속성 → NFS 공유 탭에서 공유로 지정한다. PowerShell 로 하려면 다음과 같다.
New-NfsShare -Name "nfs_share" -Path "D:\nfs_share" -Permission ReadWrite -AllowRootAccess $true
Get-NfsShare
NFS 공유 권한과 NTFS 권한이 둘 다 통과해야 접근이 된다. 한쪽만 열어 두면 클라이언트에서 권한 오류가 난다.
| 층 | 설정 위치 | 대상 |
|---|---|---|
| NFS 공유 권한 | 속성 → NFS 공유 → 권한 | 클라이언트 호스트·서브넷 단위. 읽기 전용 / 읽기·쓰기 / 루트 접근 허용 |
| NTFS 권한 | 속성 → 보안 | Windows 계정 단위 |
Grant-NfsSharePermission -Name "nfs_share" -ClientName "192.168.0.0" -ClientType "host" -Permission "readwrite" -AllowRootAccess $true
Windows 는 SID 로, NFS 는 UID/GID 로 주체를 식별한다. 매핑이 없으면 리눅스 클라이언트에서 파일 소유자가 nobody 로 보인다. 처리 방법은 세 가지다.
mount -t nfs -o vers=3,uid=1000,gid=1000 <windows-server-ip>:/nfs_share /mnt/nfs
NFSv4 를 쓰면 이름 기반 매핑이 되므로 idmapd 설정과 도메인 이름이 양쪽에서 맞아야 한다.
mount -t nfs <windows-server-ip>:/nfs_share /mnt/nfs
mount -t nfs -o vers=3,rw <windows-server-ip>:/nfs_share /mnt/nfs
공유 경로는 슬래시로 시작하는 공유 이름을 쓴다. 윈도우의 실제 경로(D:\nfs_share) 가 아니다.
New-NetFirewallRule -DisplayName "NFS 2049/TCP" -Direction Inbound -Protocol TCP -LocalPort 2049 -Action Allow
New-NetFirewallRule -DisplayName "RPC 111/TCP" -Direction Inbound -Protocol TCP -LocalPort 111 -Action Allow
New-NetFirewallRule -DisplayName "NFS 2049/UDP" -Direction Inbound -Protocol UDP -LocalPort 2049 -Action Allow
New-NetFirewallRule -DisplayName "RPC 111/UDP" -Direction Inbound -Protocol UDP -LocalPort 111 -Action Allow
NFSv3 는 mountd·statd 등이 동적 포트를 쓰므로 방화벽을 좁게 잡으려면 nfsadmin 으로 포트를 고정한다. NFSv4 만 쓰면 2049 하나로 충분하다.
showmount -e <windows-server-ip>
rpcinfo -p <windows-server-ip>
Get-NfsClientLock
Get-NfsSession