서버의 수가 많아지고 여러 서버에서 공통으로 사용해야하는 파일이 있는 경우, 공유 스토리지가 없다면 각 서버마다 파일을 업로드 해줘야한다. 추가로 서비스 운영 간 사용되는 동적파일의 생성 및 수정이 이루어진다면 필요한 모든 서버로 TCP, SFTP 연결이 이루어져야하는데 이건 꽤나 불필요하고 번거로운 과정이다.
실제로 nfs로 공유 스토리지를 설정해주는 프로젝트 사이트가 있고, 그렇지 않은 사이트가 있는데 인프라 구성을 배제하고 단순 작업 효율성만 보았을 때는 nfs 설정된 곳이 좋았다.
하지만 나는 nfs를 구성하는 방법을 잘 모른다.
그래서 Hyper-V를 사용해 두 서버 간 공유되는 스토리지를 만드는 방법을 알아보고자 한다.
nfs1 ip : 172.25.67.23 # Client 서버
nfs2 ip : 172.25.71.183 # Export 서버
OS : Rocky Linux 9.6
권한 : root
우선 nfs를 사용하기 위해서 nfs-utils를 설치해야한다. 네트워크가 되는 환경에서는 yum을 사용하여 설치하면 되지만 종속된 꾸러미가 많아서 폐쇄환경에서 직접설치하기에는 번거로워 보인다.
# Export서버, Client서버에 모두 설치
yum install nfs-utils
nfs-utils를 설치 후 Export 서버의 /etc/exports 파일에 아래와 같이 작성한다.
# Export 서버만 실행
vi /etc/exports
# 입력: `공유 디렉토리명` `접근 가능한 클라이언트 주소`(공유 옵션)
/home/oomuiw/share 172.25.67.23/20(rw,sync)
ro : 읽기 권한만 부여 (default)rw : 읽기 쓰기 권한 부여ecure : 클라이언트 마운트 요청 시 포트를 1024 이하로 설정noaccess : 액세스 거부root_squach : 클라이언트 root로 접근 시 anonymous uid/gid로 변경 (default)no_root_squash: 클라이언트의 root 접근을 허용sync : 파일시스템이 변경되면 즉시 동기화이후 클라이언트를 추가로 등록해주는 경우, 등록 후 exportfs -r명령을 실행하면 NFS 서버를 재실행하지 않고 추가된 클라이언트를 적용할 수 있다.
단순 테스트 및 설정만 해보고자 한다면 firewalld와 같은 서비스를 중지 후 사용하면 될테지만, 서비스 운영을 하고자 한다면 방화벽이 있는 상태여야 한다. firewalld에 다음과 같이 설정하지 않으면 이후 클라이언트 측에서 showmount -e {nfs1서버}로 조회하더라도 마운트 내용을 가져오지 못한다.
# Export 서버만 실행
# 서비스를 firewalld에서 영구적으로 허용
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-serivce=mountd
3가지 서비스를 모두 등록해야 nfs 디렉토리를 공유할 수 있다.
# Export 서버만 실행
systemctl start nfs-server
참조한 블로그에는
rpcbind와nfs,chkconfig를 동작하라고 되어있는데, 이는nfsv3이하에서는 NFS 서비스를 사용할 때 포트가 동적으로 할당되기 때문에 클라이언트가 정확한 포트를 알지 못한다. 이를 해결하기 위해rpcbind사용했지만nfsv4이상 부터는port 2049를 사용하기 때문에 사용하지 않아도 된다.
rpcinfo -p localhost
program vers proto port service
...
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
...
rpcinfo -p를 확인 했을 때, 3,4버전의 nfs를 모두 지원하는 것을 확인할 수 있다.
클라이언트 측에서 nfsv4이상을 사용하면 rpcbind와 chkconfig를 사용하지 않아도 된다.
nfsstat -m
/mnt/share from 172.25.71.183:/home/oomuiw/share
Flags: rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.25.67.23,local_lock=none,addr=172.25.71.183
rpcbind와 chkconfig를 사용하지 않아도 됨.# showmount -e 공유서버명
showmount -e 172.25.71.183
Export list for 172.25.71.183:
/home/oomuiw/share 172.25.67.23/20
설정을 올바르게 했다는 전제하에 마운팅 포인트가 조회되지 않는다면 방화벽이나 네트워크 통신여부를 의심해야한다.
# Export 서버(172.25.71.183)의 /home/oomuiw/share와 연결할 디렉토리 생성
mkdir /mnt/share
# 마운트
# mount -t nfs `공유서버명:공유디렉토리명` `연결디렉토리`
mount -t nfs 172.25.71.183:/home/oomuiw/share /mnt/share
# 연결 확인
df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 854M 0 854M 0% /dev/shm
tmpfs 342M 4.9M 337M 2% /run
/dev/mapper/rl-root 70G 3.0G 68G 5% /
/dev/sda1 960M 330M 631M 35% /boot
/dev/mapper/rl-home 125G 925M 125G 1% /home
tmpfs 171M 0 171M 0% /run/user/0
172.25.71.183:/home/share 125G 925M 125G 1% /mnt/share
tmpfs 171M 0 171M 0% /run/user/1000
# fstab에 등록하여 재부팅 시 자동 마운트
vi /etc/fstab
# `공유서버명:공유디렉토리명` `연결 디렉토리` nfs default 0 0
172.25.71.183:/home/oomuiw/share /mnt/share nfs defaults 0 0
이렇게 연결까지 끝나면 nfs1에서 생성한 파일이 nfs2연결디렉토리에서 조회되는 것을 확인할 수 있다.
# nfs1 서버에서 파일 생성
[root@nfs1 /mnt/share]# touch test3
[root@nfs1 /mnt/share]# ll
합계 0
-rw-r--r--. 1 oomuiw oomuiw 0 7월 21 10:34 test1
-rw-r--r--. 1 test test 0 7월 21 10:34 test2
-rw-r--r--. 1 nobody nobody 0 7월 21 14:32 test3
# nfs2 서버에서 디렉토리 조회
[root@nfs2 /home/oomuiw/share]# ll
합계 0
-rw-r--r--. 1 oomuiw oomuiw 0 7월 21 10:34 test1
-rw-r--r--. 1 1001 1001 0 7월 21 10:34 test2
-rw-r--r--. 1 nobody nobody 0 7월 21 14:32 test3
마운트 된 서버는 따로 /etc/exports에 설정하지 않으면 ro, root_squach를 기본 설정으로 가지게 된다. 위의 파일 생성 및 조회 결과를 보면 nfs1서버와 nfs2서버에서 확인되는 권한이 다르다.
root_squach로 인해 root접근을 허용하지 않게되므로 anonymous uid/gid인 nobody로 바뀌게 된다.
사용자 권한의 경우 2가지 경우로 나뉘게 된다.
nfs1, nfs2서버 모두 있는 사용자인 경우 ex) oomuiw두 서버 모두 존재하는 사용자이므로 소유권이 그대로
oomuiw로 이루어지게 된다.
nfs1서버에는 있지만 nfs2서버에는 없는 사용자인 경우 ex) test
nfs1에만 사용자가 있는 2의 경우에는nfs2서버에서는 알지 못하기 때문에nfs1서버에서id값으로 할당된1001으로 조회된다.