NFS
유닉스나 리눅스 환경에서는 NFS 서버를 구축하여 서로간의 디렉토리를 손쉽게 공유할 수 있다
이는 네트워크를 이용하여 여러 서바간의 마운트를 통해 마치 하나의 파일 스토리지처럼 사용하는 기술이다
이는 마치 내 PC에서 다른 로컬드라이브에 접근하는 것 처럼, 컴퓨터 네트워크를 통해 마운트된 다른 서버의 드라이브 파일에 액세스할 수 있도록 해준다
특징
- NFS로 공유한 파일은 일반적인 소유권과 접근 권한이 그대로 적용됨
- 원격으로 접속한 유저가 파일 소유 권한이 있다면, UID를 이용해 파일 조작이 가능
- 루트의 권한을 갖는 사용자가 해당 공유 디렉토리에서 모두 조작 가능함
실습 개요
네트워크 기반 스토리지를 설치하기 위해 직접 NFS 서버를 구축하여
클라이언트에서 NFS 서버가 제공하는 스토리지를 마운트해보도록 하자.
NFS 구축하기
CentOS
Server 측 설정
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)
Client 측 설정
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
Server 측 설정
- NFS 서버 설정
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 측 설정
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