NFS 서버와 클라이언트를 구성하는 기본 절차와, "NFS 가 풀렸나" 싶을 때 서버 역할과 클라이언트 역할을 구분해 상태를 확인하는 방법을 정리한다. NFS 서버는 df 나 mount 에 export 가 나타나지 않으므로 exportfs -v 로 봐야 한다. NFS 로 공유한 디스크는 서버 로컬에서도 그대로 쓸 수 있다.
dnf install -y nfs-utils
systemctl enable --now nfs-server
mkdir -p /srv/nfs/share
chown nobody:nobody /srv/nfs/share
chmod 755 /srv/nfs/share
/etc/exports 에 공유 경로와 허용 대상을 적는다.
/srv/nfs/share 192.168.1.0/24(rw,sync,no_subtree_check,root_squash)
/srv/nfs/data 192.168.1.10(ro,sync,no_subtree_check)
| 옵션 | 의미 |
|---|---|
rw / ro |
읽기 · 쓰기 / 읽기 전용 |
sync |
변경을 즉시 디스크에 기록. async 는 빠르지만 데이터 손실 위험 |
no_subtree_check |
서브트리 검사 비활성화(성능) |
root_squash |
클라이언트 root 를 nobody 로 매핑(기본, 권장) |
no_root_squash |
클라이언트 root 권한 유지. 워크로드가 root 쓰기를 요구할 때만 |
exportfs -ra
exportfs -v
firewall-cmd --permanent --add-service={nfs,rpc-bind,mountd}
firewall-cmd --reload
dnf install -y nfs-utils
showmount -e <서버_IP>
mkdir -p /mnt/nfs/share
mount -t nfs <서버_IP>:/srv/nfs/share /mnt/nfs/share
부팅 시 자동 마운트는 /etc/fstab 에 _netdev 를 붙여 네트워크가 준비된 뒤 마운트되게 한다.
<서버_IP>:/srv/nfs/share /mnt/nfs/share nfs defaults,_netdev,noatime 0 0
df -h | grep nfs 는 파일시스템 타입을 출력하지 않아 경로에 "nfs" 가 없으면 걸리지 않는다. 타입을 함께 본다.
df -hT | grep -iE 'nfs|nfs4'
mount | grep -iE 'nfs|nfs4'
nfsstat -m
여기서 아래 두 줄만 보이면 이 장비는 클라이언트가 아니라 NFS 서버다. 둘 다 데이터 마운트가 아니라 내부 동작용 가상 파일시스템이다.
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
서버는 export 목록으로 확인한다.
exportfs -v
showmount -e localhost
systemctl status nfs-server
df -hT /data/nfs-cai # export 원본 디렉터리가 어느 디스크에 있는지
export 가 정상이면 서버는 멀쩡한 것이고, 실제 끊김은 클라이언트 쪽(mount | grep nfs, ls <마운트포인트> 가 멈추면 hang) 에서 확인한다. hang 상태에서 unmount 가 안 되면 umount -l(lazy) 또는 umount -f 후 재마운트한다.
| 알고 싶은 것 | 명령 |
|---|---|
| 서버 nfsd 가 켜둔 버전 | cat /proc/fs/nfsd/versions (-2 +3 +4 +4.1 +4.2 처럼 + 가 활성) |
| RPC 등록 버전 | rpcinfo -p localhost \| grep nfs |
| 서버 설정값 | grep -iE 'vers' /etc/nfs.conf 의 [nfsd] 섹션 |
| 클라이언트가 실제 협상한 버전 | 클라이언트에서 nfsstat -m 의 vers=4.2 |
특정 버전을 강제하려면 mount -o vers=4.2 를 쓴다.
NFS 는 별도 파일시스템이 아니라 이미 마운트된 로컬 디렉터리를 네트워크로 내보내는 서비스다. 서버 자신도 /srv/nfs/share 를 평소처럼 읽고 쓸 수 있다. 다만 같은 파일을 서버 로컬 프로세스와 클라이언트가 동시에 쓰면 락 처리가 어긋날 수 있고, root_squash 때문에 클라이언트 root 가 만든 파일은 nobody 소유로 보인다. 클라이언트 캐시 때문에 서버에서 바꾼 내용이 몇 초 늦게 보일 수 있다.