▶︎ 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