Profile picture

NFS 서버 설치하기

JaehyoJJAng2023년 06월 09일

NFS

유닉스나 리눅스 환경에서는 NFS 서버를 구축하여 서로간의 디렉토리를 손쉽게 공유할 수 있다

이는 네트워크를 이용하여 여러 서바간의 마운트를 통해 마치 하나의 파일 스토리지처럼 사용하는 기술이다

이는 마치 내 PC에서 다른 로컬드라이브에 접근하는 것 처럼, 컴퓨터 네트워크를 통해 마운트된 다른 서버의 드라이브 파일에 액세스할 수 있도록 해준다
image


NFS 특징

  • NFS로 공유한 파일은 일반적인 소유권과 접근 권한이 그대로 적용됨
  • 원격으로 접속한 유저가 파일 소유 권한이 있다면, UID를 이용해 파일 조작이 가능
  • 루트의 권한을 갖는 사용자가 해당 공유 디렉토리에서 모두 조작 가능함

NFS 구축하기

CentOS, Ubuntu 각 배포판별로 NFS 서버를 구축하는 방법에 대해서 알아보자.


서버(Server) 측 설정

CentOS

1. nfs 설치

# nfs-utils 패키지 있는지 확인
rpm -qa nfs-utils

# nfs-utils 설치
yum install -y nfs-utils

2. NFS 서비스에 이용될 공유 디렉토리 생성

mkdir -p /mnt/nfs-server/data

3. 공유 디렉토리에 권한 설정

chmod 707 -R /mnt/nfs-server

4. /etc/exports 을 아래와 같이 설정

$ vim /etc/exports

# ----- /etc/exports -----
/mnt/nfs-server/data  192.168.121.0/24(rw,sync)

/mnt/nfs-server/data 디렉토리에 대한 접근 권한을 192.168.121.0/24 네트워크 대역에 대해 읽기/쓰기 권한을 줌.


5. nfs 설정 파일 편집 (/etc/sysconfig/nfs)
아래 서비스들 주석 해제

  • LOCKD_TCPPORT = 3280322
  • LOCKD_UDPPORT = 3276957
  • MOUNTD_PORT = 89263
  • STATD_PORT = 662
sed -i '/^#LOCKD_TCPPORT/s/^#//' /etc/sysconfig/nfs
sed -i '/^#LOCKD_UDPPORT/s/^#//' /etc/sysconfig/nfs
sed -i '/^#MOUNTD_PORT/s/^#//' /etc/sysconfig/nfs
sed -i '/^#STATD_PORT/s/^#//' /etc/sysconfig/nfs

6. exports의 수정 내용 반영

exportfs -r # 수정 내용 반영
exportfs -v # NFS 설정 확인
rpcinfo -p  # rpcbind가 사용중인 포트 출력

7. 서비스 가동

systemctl enable --now nfs-server
systemctl enable --now rpcbind

# 서비스 가동 상태 확인
sudo systemctl list-unit-files --type service --state=enabled | grep "nfs"
nfs-server.service                         enabled
nfs.service                                enabled

8. 방화벽 오픈

# TCP: 111,892,2049,32803
firewall-cmd --permanent --zone=public --add-port=111/tcp
firewall-cmd --permanent --zone=public --add-port=892/tcp
firewall-cmd --permanent --zone=public --add-port=2049/tcp
firewall-cmd --permanent --zone=public --add-port=32803/tcp

# UDP: 111,892,2049,32769
firewall-cmd --permanent --zone=public --add-port=111/udp
firewall-cmd --permanent --zone=public --add-port=892/udp
firewall-cmd --permanent --zone=public --add-port=2049/udp
firewall-cmd --permanent --zone=public --add-port=32803/udp

# 방화벽 재시작
firewall-cmd --reload

8. 마운트가 잘 되었는지 테스트

$ showmount -e
Export list for nfs-server:
/mnt/nfs-server/data 192.168.121.*

$ exportfs -v
/mnt/nfs-server/data
		192.168.121.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

Ubuntu

1. 패키지 설치

sudo apt-get update -y
sudo apt-get install -y nfs-kernel-server

2. 공유할 디렉토리 생성 및 설정

공유할 디렉토리의 경우 일반적으로 소유자와 소유그룹을 의사사용자인 nobodynogroup으로 변경한다.

이는 신뢰할 수 없는 클라이언트들에 대응하며, NFS 에서만 사용하도록 권장된다.

일반적인 디렉토리의 권한은 775이며, 클라이언트의 경우 쓰기 권한은 없다.

아래에서 언급할 root_squash 설정을 통해 클라이언트의 rootnobody로 매핑하여 파일쓰기가 가능하다.

예시로 생성할 공유 디렉토리는 /home/dev/myNFS 디렉토리이다.

mkdir -p ~/myNFS
sudo chown -R nobody:nogroup ~/myNFS

3. 권한 설정 후 배포

배포할 디렉토리에 대한 권한 및 설정을 작성하자.

/etc/exports 파일을 수정할건데, 해당 파일은 서버가 클라이언트에 노출하는 모든 디렉토리에 대한 정보를 담는다.

예시에서는 클라이언트 접속 IP 허용 범위를 192.168.219.0/24 대역으로 설정한다.

cat << EOF | sudo tee -a /etc/exports
/home/dev/myNFS 192.168.219.0/24(rw, sync, no_subtress_check)
EOF
옵션 설명
rw, ro 읽기/쓰기, 읽기 전용
sync 변경사항 발생 시 동기적 저장 및 처리
async 데이터의 변경에 대해 비동기적 처리
root_squash 클라이언트의 root 사용자를 root가 아닌 서버의 nobody 유저의 권한으로 처리.
쓰기 작업 시 클라이언트 root로 작업해도 nobody로 작업됨.
no_root_squash 클라이언트의 root 사용자를 root 그대로의 권한 인정. 클라이언트가 생성한 파일의 소유자가 root로 작성됨. (보안에 민감)
all_squash 모든 클라이언트 사용자를 nobody 유저로 매핑시킨다. 클라이언트는 root 권한이 없이 작업하고 이는 nobody 유저의 작업으로 된다.
no_all_squash 공유된 디렉토리의 사용자(서버)와 클라이언트의 사용자가 일치해야한다. uid와 gid가 일치하면 쓰기작업을 할 수 있다.
no_subtree_check 클라이언트가 작업한 내용에 대해 무결성 검사를 하는 하위 트리 검사를 수행하지 않는다.

4. 수정한 권한 및 설정 적용

sudo exportfs -a
sudo systemctl restart nfs-kernel-server

Client 측 설정

CentOS

1. nfs 설치

# nfs-utils 패키지 있는지 확인
rpm -qa nfs-utils

# nfs-utils 설치
yum install -y nfs-utils

2. NFS 서버에 어떤게 마운트 되어있나 확인

showmount -e [NFS 서버의 IP 주소]
showmount -e 192.168.121.130

Export list for 192.168.121.130:
/mnt/nfs-server/data 192.168.121.*

3. 클라이언트에서 해당 서버 디렉토리와 함께 마운트할 디렉토리를 생성

mkdir /home/nfs-client/data

4. 마운트 시키기

# mount -t nfs NFS서버주소:마운트경로 마운트할디렉토리
sudo mount -t nfs 192.168.121.130:/mnt/nfs-server/data /home/nfs-client/data

d

5. 마운트 잘 되었는지 테스트

$ mount | tail -n 1
192.168.121.130:/mnt/nfs-server/data on /home/nfs-client/data type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.121.136,local_lock=none,addr=192.168.121.130)

$ df -h | grep "/home/nfs-client/data"
192.168.121.130:/mnt/nfs-server/data   24G  1.6G   23G   7% /home/nfs-client/data

6. /etc/fstab에 등록

vim /etc/fstab

# --- /etc/fstab ---
192.168.121.130:/home/nfs-server/data /mnt/nfs-client/data nfs sync  0 0

Ubuntu

1. 공유 된 NFS 디렉토리를 마운트하기 위해 패키지를 설치한다.

sudo apt-get update -y
sudo apt install -y nfs-common

2. 공유 디렉토리 테스트

showmount -e 192.168.219.179 # NFS 서버 IP

# output
Export list for 192.168.219.179:
/home/dev/myNFS 192.168.219.0/24

3. 마운트

임시로 디렉토리를 만들어 NFS 디렉토리를 마운트

mkdir ~/myNFSClient
sudo mount 192.168.219.179:/home/dev/myNFS /home/client/myNFSClient

Macbook

1. Finder를 이용하여 연결하는 방법

  • Finder 실행: 맥북에서 Finder를 엽니다.
  • 서버에 연결: 메뉴 막대에서 이동 (Go) > 서버에 연결… (Connect to Server…) 을 선택합니다. (단축키: Command + K)
  • 서버 주소 입력: "서버에 연결" 창이 나타나면, 서버 주소 필드에 다음과 같은 형식으로 NFS 서버 주소와 공유 폴더 경로를 입력합니다.
    • 형식: nfs://<NFS_서버_IP_주소>/<공유폴더_절대경로>
    • 예시: nfs://192.168.1.100/home/share 또는 nfs://192.168.1.100/srv/nfs/shared_folder
    • /etc/exports 파일에 명시한 공유 폴더의 절대 경로를 입력해야 합니다.
  • 연결: '+' 버튼을 눌러 즐겨찾는 서버 목록에 추가하거나, 바로 "연결 (Connect)" 버튼을 클릭합니다.
  • 마운트 확인: 연결에 성공하면 Finder의 사이드바 "위치 (Locations)" 또는 바탕화면에 공유 폴더가 나타납니다.

2. 터미널 명령어를 이용하여 연결하는 방법

1. 터미널 실행: 응용 프로그램 > 유틸리티 > 터미널 (Terminal)을 실행합니다.


2. 마운트 포인트 생성 (선택 사항): 공유 폴더를 마운트할 로컬 디렉토리를 생성합니다. 이미 있다면 생략 가능합니다.

  • 예시: sudo mkdir /Volumes/NFS_Share
  • /Volumes 디렉토리 하위에 만드는 것이 일반적입니다. NFS_Share는 원하는 이름으로 변경 가능합니다.

3. NFS 공유 마운트: mount 명령어를 사용하여 NFS 공유를 마운트합니다.

기본 형식:

sudo mount -t nfs -o <옵션> <NFS_서버_IP_주소>:/<공유폴더_절대경로> <로컬_마운트_포인트>

옵션 예시:

  • resvport: 예약 포트 사용 (일부 NFS 서버에서 요구)
  • rw: 읽기/쓰기 모드로 마운트 (서버 설정에 따라 가능)
  • ro: 읽기 전용 모드로 마운트
  • hard 또는 soft: 연결 문제 발생 시 동작 방식 (hard: 계속 시도, soft: 오류 반환)
  • intr: hard 마운트 시 인터럽트 허용
  • nolocks: 파일 잠금 사용 안 함 (성능 향상에 도움 될 수 있으나, 여러 사용자가 동시에 파일 수정 시 문제 발생 가능)
  • noresvport: macOS 기본값은 예약 포트를 사용하지 않는 것입니다. 서버가 비예약 포트를 허용한다면 이 옵션이 필요 없을 수 있습니다.
  • vers=3 또는 vers=4: NFS 프로토콜 버전 지정 (기본적으로 자동 협상 시도)

  • 명령어 예시:
    • sudo mount -t nfs -o resvport,rw 192.168.1.100:/home/share /Volumes/NFS_Share
    • 만약 /etc/exports 설정에서 insecure 옵션을 사용했다면 resvport 옵션이 필요 없을 수 있습니다. 하지만 보안상 권장되지 않습니다. 일반적으로 macOS 클라이언트는 예약된 포트(1024 미만)를 통해 연결을 시도하므로, 우분투 NFS 서버의 /etc/exports 설정에 insecure 옵션이 없다면 맥에서 resvport 옵션을 사용하는 것이 좋습니다.

마운트 확인:

  • df -h 명령어나 mount | grep nfs 명령어로 마운트 상태를 확인합니다. 또는 Finder에서 해당 마운트 포인트로 이동하여 파일이 보이는지 확인합니다.

트러블슈팅

nfs 클라이언트 연결 여부 확인하기

어떤 유저가 공유 폴더에 액세스했는지 확인하는 방법에 대해서 알아봅시다.


1. showmount -a 명령어 사용

nfs 서버에서 현재 연결된 클라이언트와 마운트된 디렉토리 정보를 보여주는 명령어.

showmount -a

All mount points on dev-ubuntu:
192.168.219.108:/nfs/opsidian
192.168.219.110:/mnt/opsidian
192.168.219.114:/nfs/share/db

2. netstat 또는 ss 명령어 사용

NFS는 기본적으로 TCP / UDP 2049번을 사용합니다.

netstat이나 최신 시스템에서는 ss 명령어를 사용하여 이 포트에 연결된 클라이언트가 누구인지 확인할 수 있어요.

# netstat
sudo netstat -anp | grep ":2049"

# ss
sudo ss -anp | grep ":2049"

Loading script...