NFS
Jump to navigation
Jump to search
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
- https://en.wikipedia.org/wiki/Network_File_System
- https://nfs.sourceforge.net/nfs-howto/ar01s05.html
- https://www.admin-magazine.com/HPC/Articles/Useful-NFS-Options-for-Tuning-and-Management
- https://ubuntu.com/server/docs/service-nfs
Related Pages
Knowledge Graph
Related
→ Network → NFSv4 ACLs → Storage