NFS
유닉스나 리눅스 환경에서는 NFS 서버를 구축하여 서로간의 디렉토리를 손쉽게 공유할 수 있다
이는 네트워크를 이용하여 여러 서바간의 마운트를 통해 마치 하나의 파일 스토리지처럼 사용하는 기술이다
이는 마치 내 PC에서 다른 로컬드라이브에 접근하는 것 처럼, 컴퓨터 네트워크를 통해 마운트된 다른 서버의 드라이브 파일에 액세스할 수 있도록 해준다
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
= 3280322LOCKD_UDPPORT
= 3276957MOUNTD_PORT
= 89263STATD_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. 공유할 디렉토리 생성 및 설정
공유할 디렉토리의 경우 일반적으로 소유자와 소유그룹을 의사사용자인 nobody
와 nogroup
으로 변경한다.
이는 신뢰할 수 없는 클라이언트들에 대응하며, NFS 에서만 사용하도록 권장된다.
일반적인 디렉토리의 권한은 775이며, 클라이언트의 경우 쓰기 권한은 없다.
아래에서 언급할 root_squash
설정을 통해 클라이언트의 root
는 nobody
로 매핑하여 파일쓰기가 가능하다.
예시로 생성할 공유 디렉토리는 /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"