NFS
Overview
NFS(Network File System)는 Sun Microsystems에서 개발한 네트워크 파일 공유 시스템입니다. SMB/SMB와 함께 네트워크 상의 파일 시스템을 로컬 파일 시스템처럼 접근할 수 있게 해주는 가장 널리 사용되는 HPC 스토리지 솔루션입니다.
Summary
- 무엇인가? — 네트워크 파일 공유 프로토콜 (TCP/IP 기반)
- 왜 필요한가? — 중앙 집중식 스토리지, 다수 클라이언트 공유, 간단한 설정
- 언제 사용하는가? — HPC 클러스터, 파일 서버, 스토리지 공유
Purpose
이 문서가 존재하는 이유
- Goal: NFS 버전, 서버/클라이언트 설정, 마운트 옵션, 성능 튜닝 제공
- Scope: NFS v2~v4.2, export/mount 옵션, 성능 최적화, 서비스 의존성
- Non-goals: NFS 커널 패치 개발, NFSv4.3+ 최신 기능은 별도 문서
Key Concepts
| Concept
|
Description
|
Related
|
| NFSv4
|
상태(Stateful) 기반 NFS — 단일 포트 2049
|
NFS
|
| pNFS
|
Parallel NFS — 다수 서버 스트라이핑
|
NFS
|
| exportfs
|
NFS 공유 내보내기 명령어
|
NFS
|
| mount options
|
NFS 클라이언트 마운트 옵션
|
NFS
|
| rsize/wsize
|
읽기/쓰기 블록 크기
|
NFS
|
| nconnect
|
다중 TCP 연결 (커널 5.3+)
|
NFS
|
| FS-Cache
|
NFS 클라이언트 로컬 캐싱
|
NFS
|
| root_squash
|
원격 루트 권한 제한
|
NFS
|
Architecture
NFS는 클라이언트-서버 아키텍처로 구성됩니다:
graph TD
A[NFS Server] --> B[/etc/exports]
A --> C[nfs-server.service]
A --> D[nfs-mountd]
A --> E[nfs-idmapd]
B --> F[Shared Directory]
G[NFS Client] --> H[mount -t nfs]
G --> I[/etc/fstab]
H --> J[NFS Server:2049]
I --> J
Workflow
| Stage
|
Input
|
Output
|
| Server Setup
|
/etc/exports
|
NFS Share
|
| Client Mount
|
mount -t nfs
|
NFS Mount Point
|
| Performance Tuning
|
rsize/wsize/timeo
|
Optimized NFS
|
| Monitoring
|
nfsstat / /proc/net/rpc/nfsd
|
Performance Data
|
Detailed Explanation
NFS 버전
| Version
|
Description
|
Key Features
|
| NFSv2
|
RFC 1094 (1989)
|
UDP만 지원, 2GB 파일 제한, 8KB 쓰기 제한
|
| NFSv3
|
RFC 1813 (1995)
|
대용량 파일 지원, TCP 지원, 56KB 트랜잭션
|
| NFSv4
|
RFC 3010/3530/7530
|
상태(Stateful), 단일 포트 2049, Kerberos 보안
|
| NFSv4.1
|
RFC 5661 (2010)
|
pNFS(Parallel NFS), 블록/객체 접근, Windows Kerberos
|
| NFSv4.2
|
RFC 7862
|
향상된 성능 및 기능
|
NFS 서버 설정
/etc/exports 옵션
| Export Options
|
NFS Server
|
Default
|
| secure/insecure
|
NFSv4는 포트 2049만 사용. NFSv3는 서버 포트 사용. secure: 클라이언트 포트 < 1024. insecure: 모든 포트 허용.
|
secure
|
| rw/ro
|
rw: 읽기/쓰기. ro: 읽기 전용.
|
rw
|
| root_squash/no_root_squash
|
root_squash: 원격 루트 권한 제한. no_root_squash: 원격 루트 전체 권한 허용.
|
root_squash
|
| all_squash/no_all_squash
|
all_squash: 모든 UID/GID를 anonymous로 매핑.
|
no_all_squash
|
| sync/async
|
sync: 변경사항 저장 후 응답. async: 저장 전 응답 (성능 ↑, 데이터 손실 위험).
|
sync
|
| insecure_locks
|
파일 잠금 시 클라이언트 자격 증명 불필요 (보안 위험).
|
—
|
export 명령어
# 공유 내보내기
$ exportfs -a
# 공유 다시 내보내기
$ exportfs -r
# 공유 권한 확인
$ exportfs -v
# 현재 NFS 서비스 포트 확인
$ rpcinfo -p | grep -i nfs
export 예시
# /etc/exports
/srv/nfs4 192.168.33.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)
/srv/nfs4/backups 192.168.33.0/24(ro,sync,no_subtree_check) 192.168.33.3(rw,sync,no_subtree_check)
/srv/nfs4/www 192.168.33.20(rw,sync,no_subtree_check)
Ubuntu NFS 서비스 의존성
| Service
|
nfs-utils.service
|
nfs-server.service
|
Config File (22.04)
|
Config File (< 22.04)
|
| nfs-blkmap
|
PartOf
|
—
|
nfs.conf
|
—
|
| nfs-mountd
|
—
|
BindsTo
|
nfs.conf
|
nfs-kernel-server
|
| nfsdcld
|
—
|
—
|
—
|
—
|
| nfs-idmapd
|
—
|
BindsTo
|
nfs.conf, idmapd.conf
|
idmapd.conf
|
| rpc-gssd
|
PartOf
|
—
|
nfs.conf
|
—
|
| rpc-statd
|
PartOf
|
—
|
nfs.conf
|
nfs-common
|
| rpc-svcgssd
|
PartOf
|
BindsTo
|
nfs.conf
|
nfs-kernel-server
|
NFS 클라이언트 마운트 옵션
| Mount Options
|
NFS Client
|
Default
|
Notes
|
| nfsvers/vers=n
|
사용할 NFS 버전. 기본값 3.
|
3, 4
|
—
|
| rw/ro
|
rw: 읽기/쓰기. ro: 읽기 전용.
|
rw
|
—
|
| suid/nosuid
|
suid: setuid 프로그램 허용. nosuid: setuid 차단.
|
suid
|
—
|
| hard/soft
|
hard: 서버 다운 시 재시도 (프로세스 대기). soft: 재시도 후 에러 반환.
|
hard
|
—
|
| nconnect=value
|
다중 TCP 연결 (커널 5.3+). 최대 16.
|
16
|
성능 향상
|
| intr/nointr
|
intr: NFS 요청 중단 가능. nointr: 중단 불가.
|
intr
|
Linux 2.6.25+ deprecated
|
| fg/bg
|
fg: 부팅 필수 마운트. bg: 백그라운드 마운트.
|
fg
|
—
|
| devs/nodevs
|
devs: 장치 파일 허용. nodevs: 장치 파일 차단.
|
devs
|
—
|
| timeo=n
|
재전송 대기 시간 (0.1초 단위). 최대 30 (3초).
|
0.7
|
—
|
| retrans=n
|
재전송 횟수.
|
4
|
—
|
| retry=n
|
마운트 재시도 횟수.
|
1
|
—
|
| rsize=n
|
읽기 블록 크기.
|
8192
|
—
|
| wsize=n
|
쓰기 블록 크기.
|
8192
|
—
|
| noac
|
속성 캐싱 비활성화.
|
—
|
—
|
| actimeo=n
|
모든 캐싱 타임아웃 설정.
|
—
|
—
|
| lock/nolock
|
NLM 파일 잠금 사용 여부.
|
lock
|
—
|
| local_lock=mechanism
|
로컬 잠금 방식 (all/flock/posix/none).
|
—
|
커널 2.6.37+
|
NFS 성능 최적화
| Tuning Options
|
Target
|
Description
|
Recommendation
|
| sync/async
|
클라이언트
|
mount 또는 /etc/fstab에서 설정
|
—
|
| nfsd 수
|
서버
|
/proc/net/rpc/nfsd로 스레드 부하 확인
|
16C/128GB: 256, 8C/64GB: 64
|
| rsize/wsize
|
클라이언트
|
읽기/쓰기 블록 크기
|
/etc/fstab에서 rsize=131072, wsize=131072
|
| timeo/retrans
|
클라이언트
|
네트워크 혼잡 시 재전송 설정
|
timeo=900, retrans=5
|
| FS-Cache
|
클라이언트
|
로컬 스토리지에 NFS 읽기 캐싱 (-o fsc)
|
읽기 작업에 효과적
|
| noatime/nodiratime
|
클라이언트
|
inode 접근 시간 업데이트 방지
|
성능 향상
|
| System Memory
|
서버
|
async 모드 시 메모리 확보 필요
|
가능한 많은 메모리
|
| Network MTU
|
서버+클라이언트
|
MTU 1500 → 9000 (Jumbo Packet)
|
대역폭 33% 증가
|
| TCP tuning
|
서버
|
net.core.rmem/wmem 설정
|
262144 (256KiB)
|
| subtree_check
|
서버
|
export된 폴더 내 파일 확인
|
보안 ↑, 성능 ↓
|
| root_squash
|
서버
|
원격 루트 권한 제한
|
보안 ↑
|
NFS v4.1/v4.2 권장
# NFS v4.2 마운트
$ mount -o nfsvers=4.2 srvr:/export /mountpoint
# 또는
$ mount -o nfsvers=4,minorversion=2 srvr:/export /mountpoint
rsize/wsize 설정
# /etc/fstab
srvr1:/usr/local /usr/local nfs nfsvers=4.2,rsize=131072,wsize=131072 0 0
# systemd automount
srvr1:/usr/local /usr/local nfs noauto,x-systemd.automount,nfsvers=4.2,rsize=131072,wsize=131072 0 0
권장 마운트 옵션
| Condition
|
Recommended Options
|
| Server-Side NLM Enabled
|
mount -t nfs -o rsize=65536,wsize=65536,intr,hard,tcp,rdirplus,readahead=128 server:/path mountpath
|
| Local Locking Enforced
|
mount -t nfs -o rsize=65536,wsize=65536,intr,hard,tcp,locallocks,rdirplus,readahead=128 server:/path mountpath
|
Configuration
# NFS 서버 설정
$ sudo systemctl enable nfs-server
$ sudo systemctl start nfs-server
# /etc/exports 설정
$ echo "/srv/nfs4 192.168.1.0/24(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
$ sudo exportfs -r
# NFS 클라이언트 마운트
$ sudo mount -t nfs -o vers=4.1 192.168.1.10:/srv/nfs4 /mnt/nfs
# /etc/fstab에 추가
$ echo "192.168.1.10:/srv/nfs4 /mnt/nfs nfs nfsvers=4.1,defaults,nofail,timeo=900,retrans=5,_netdev 0 0" | sudo tee -a /etc/fstab
Examples
Example 1: NFS 서버 설정
# NFS 서버 설치
$ sudo apt-get install nfs-kernel-server
# /etc/exports 설정
$ sudo tee /etc/exports << EOF
/srv/nfs4 192.168.1.0/24(rw,sync,no_subtree_check)
EOF
# NFS 서비스 시작
$ sudo systemctl enable nfs-server
$ sudo systemctl start nfs-server
# 공유 내보내기
$ sudo exportfs -r
$ sudo exportfs -v
Example 2: NFS 클라이언트 마운트
# NFS 마운트
$ sudo mount -t nfs -o vers=4.1 192.168.1.10:/srv/nfs4 /mnt/nfs
# 마운트 옵션 확인
$ cat /proc/mounts | grep nfs
# NFS 상태 확인
$ nfsstat -m
Best Practices
- NFS v4.2 사용 (최신 버전)
- rsize/wsize=131072 설정 (대용량 전송)
- nconnect=16 사용 (다중 TCP 연결)
- MTU 9000 (Jumbo Packet) 적용
- sync 옵션 사용 (데이터 무결성)
- root_squash 활성화 (보안)
- FS-Cache 활성화 (읽기 성능)
- noatime/nodiratime 설정 (성능)
- 정기적인 nfsstat 모니터링
Limitations
- NFSv2: 2GB 파일 제한, UDP만 지원
- NFSv3: 상태(Stateless) — 서버 재시작 시 세션 손실
- NFSv4: Kerberos 설정 복잡
- 네트워크 지연에 민감
- 대용량 파일 동시 접근 시 병목
- NFS 서버 단일 장애점 (SPOF)
References
Related Pages
Knowledge Graph
Related
→ Network
→ NFSv4 ACLs
→ Storage
NFSv4.2 Features
NFSv4.2는 NFS 최신 버전. 여러 성능 개선 기능 포함.
PFCP (Parallel NFS)
- 파일 내 병렬 I/O. 큰 파일 처리 속도↑
- client-side caching. 로컬 캐시로 읽기 속도↑
# PFCP 마운트 옵션
mount -t nfs4 -o vers=4.2,cache=loose server:/share /mnt/nfs
RDMA-NFS (NFS over RDMA)
- RDMA로 NFS 트래픽 전송. CPU 부하 ↓, 레이턴시 ↓
- IPoIB (InfiniBand over IP) 또는 RoCE 사용
# RDMA-NFS 마운트
mount -t nfs -o vers=4.2,rdma server:/share /mnt/nfs
# RDMA-NFS 성능 확인
nfsstat -m
Copy Offload (COPY/DEDUP)
- 서버 사이드 복사. 네트워크 트래픽 없음
- 대용량 데이터 이동 시 효율적
# 서버 사이드 복사
cp --reflink=auto /mnt/nfs/source /mnt/nfs/dest