✔️ NFS(Network File System)란 ?
NFS란 스토리지 서버와 일반(Web, DB) 서버들이 네트워크를 통해 저장 공간을 공유하는 프로세스이다.
네트워크에 연결된 다른 컴퓨터의 하드 디스크를 내 컴퓨터의 하드처럼 사용한다.
공통으로 사용되는 파일이 있으면 각 컴퓨터에 파일을 저장하지 않고 서버 1개에 저장해 효율적으로 사용한다.
즉, 컴퓨터 사용자가 원격 컴퓨터에 있는 파일을 마치 자신의 컴퓨터에 있는 것처럼 검색, 저장, 수정하도록 해주는 클라이언트/서버형 응용 프로그램이다.
✔️ NFS 특징
- 다른 서버에 있는 디렉토리를 나의 것처럼 사용하는 것이기 때문에 보안에 취약하다. (회사에서는 잘 사용하지 않음)
- 네트워크를 이용하므로 내장 하드보다 속도가 느리다.
- NFS를 사용하려면 서버나 클라이언트 모두 커널에서 NFS를 지원할 수 있어야 제대로 사용 가능
- 저장 공간을 공유할 수 있는 서비스이다.
✔️ NFS와 서버의 동작 구조
NFS 클라이언트는 RPC(Rmote Procedure Calls)를 통해 접속해 NFS 서버에서 전달받게 된다.
RPC(Rmote Procedure Calls) - 원격 프로시저 절차 호출
네트워크 상의 다른 컴퓨터에 위치하고 있는 프로그램에 서비스를 요청하는데 사용되는 프로토콜
리눅스와 리눅스, 리눅스와 유닉스 간에 파일 공유 서비스를 제공하는 프로토콜 이었으나 현재는 이러한 구분 없이 NFS 서버에서 설정한 파일 공유 서비스를 리눅스 시스템은 물론 윈도우 시스템에서도 사용할 수 있다.
대형 서비스 환경 구축 시 공유 파일 서버를 사용해 데이터의 일관성을 유지하기 위해 사용된다.
그리고 NFS 서버는 요청한 NFS 클라이언트를 확인하고 /etc/exports 파일을 참조해 디렉토리 속성, 권한을 지정한다.
✔️ NFS 설정 파일
/etc/export
NFS 서버 설정 파일이며, NFS 서버에서 파일 공유를 위해 사용되는 모든 파일과 디렉토리를 정의하기 위해 사용
/etc/fstab
NFS 서버에서 설정한 공유 디렉토리를 NFS 클라이언트에서 사용하기 위해 사용되는 파일이며, 설정 후 부팅하면 자동으로 클라이언트 시스템에 마운트된다.
/etc/sysconfig/nfs
NFS 서버에서 제공하는 NFS 서비스를 위해 사용되는 모든 포트에 대한 정보를 설정하는 파일이다.
/var/server_share/100.100.100.0/24(rw, sync, no_root_squash, no_all_squash)
/var/server_share/ : 클라이언트에게 공유를 허용할 디렉토리 이름을 의미한다.
100.100.100.0/24 : 공유된 디렉토리에 접근 가능한 클라이언트 IP 범위이며, 도메인 설정도 가능하다.
옵션 | 기능 |
rw | NFS 서버 디렉토리에 읽기, 쓰기를 모두 허용 |
ro | NFS 서버 디렉토리에 읽기만 허용한다 (기본값) |
sync/async | sync : 클라이언트가 NFS 서버에 쓰기 작업을 하면 바로 반영(기본 값) async : 클라이언트가 NFS 서버에 쓰기 작업을 바로 반영하지 않는다. 서버에 문제가 발생했을 때 데이터 불일치가 발생할 수 있다. |
root_squash no_root_squash |
root_squash : 클라이언트가 uid/gid 0 (root 계정)으로 접속해도 서버에서는 이를 anonymous uid/gid로 취급한다. 클라이언트의 사용자 root 서버에서 nfsnobody로 매핑되어 인식하게 된다. (보안을 위해 사용) no_root_squash : root squash를 정지한다. 클라이언트의 root가 서버에서도 root 권한을 사용할 수 있다. |
anonuid anongid |
anonymous 계정의 uid와 gid를 명시적으로 설정한다. |
✔️ NFS 구축
✔️ 구현 순서
① NFS 서버에 nfs-utils 패키지 설치 유무 확인
② NFS 서버의 /etc/exports에 공유할 디렉토리와 접근을 허가할 컴퓨터 및 접근 권한을 지정한다.
③ NFS 서비스를 실행한다.
④ NFS 클라이언트에 nfs-utils 패키지가 설치되었는지 확인한다.
⑤ NFS 클라이언트에서 showmount 명령을 실행해 NFS 서버에 공유된 디렉터리가 있는지 확인한다.
⑥ NFS 클라이언트에서 mount 명령을 실행해 NFS 서버에 공유된 디렉토리를 마운트한다.
① NFS 서버에 nfs-utils 패키지 설치 유무 확인
[root@localhost ~]# rpm -qa nfs-utils
nfs-utils-1.3.0-0.54.el7.x86_64
[root@localhost ~]# yum -y install nfs-utils
NFS 서버와 관련된 'nfs-utils' 패키지가 설치되었는지 확인하고 만약 설치되지 않았다면 설치한다.
② NFS 서버의 /etc/exports에 공유할 디렉토리와 접근을 허가할 컴퓨터 및 접근 권한을 지정한다.
[root@localhost ~]# vi /etc/exports
vi나 gedit으로 /etc/exports 파일을 열고 다음 내용을 넣어서 공유할 디렉토리를 추가한 후 저장한다.
참고로 /etc/exports 에서 IP후 띄어쓰기 없이 (rw) 설정을 해야하고, 만약 띄어쓰기를 사용하면 설정이 재대로 되지 않아 Read-only 설정으로 되서 에러가 발생할 수 있다.
참고로 해당 내용은 /share 디렉토리에 해당 IP 주소 컴퓨터가 접근할 수 있도록 하고, 접근 권한은 R/W 모두를 할 수 있게 하라는 뜻이다. 마지막의 sync는 NFS가 쓰기 작업을 완료할 때마다 디스크를 동기화한다.
/share 디렉토리를 설정하고 chmod 명령으로 /share 디렉토리의 접근 권한을 707로 한다.
적당한 파일을 /share 디렉토리에 미리 몇개 복사하자
③ NFS 서비스를 실행한다.
[root@localhost ~]# systemctl restart nfs-server
[root@localhost ~]# systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
nfs-server 서비스를 시작 및 상시 가동되도록 한다.
exportfs -v
서비스가 가동하는지 확인한다.
[root@localhost ~]# firewall-cmd --permanent --add-service=nfs
[root@localhost ~]# firewall-cmd --permanent --add-port=111/udp
[root@localhost ~]# firewall-cmd --permanent --add-port=20048/udp
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3 enp0s8
sources:
services: ssh dhcpv6-client nfs
ports: 111/udp 20048/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
nft 서비스에 udp 포트만 추가적으로 열어준다.
④ NFS 클라이언트에 nfs-utils 패키지가 설치되었는지 확인한다.
⑤ NFS 클라이언트에서 showmount 명령을 실행해 NFS 서버에 공유된 디렉터리가 있는지 확인한다.
[root@web ~]# rpm -qa nfs-utils
nfs-utils-1.3.0-0.68.el7.2.x86_64
[root@web ~]# showmount -e 192.168.56.101
Export list for 192.168.56.101:
/share 192.168.56.*
showmount -e [NFS 서버 IP 주소] 명령으로 NFS 서버에 공유된 디렉토리를 확인해보자
⑥ NFS 클라이언트에서 mount 명령을 실행해 NFS 서버에 공유된 디렉토리를 마운트한다.
[root@web ~]# mkdir myShare
[root@web ~]# su -c 'mount -t nfs 192.168.56.101:/share myShare'
[root@web ~]# ls -l myShare
합계 12160
-rwxr-xr-x. 1 root root 6224704 3월 20 2022 vmlinuz-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145
-rwxr-xr-x. 1 root root 6224704 3월 20 2022 vmlinuz-3.10.0-862.el7.x86_64
NFS 서버의 /share 디렉토리에 마운트 할 디렉토리 /myShare를 만들고 마운트한다.
[root@web testfolder]# ls
test
[root@web testfolder]# cat test
test file
[root@web testfolder]# cp /root/testfolder/test ~/myShare
이제 ~/myShare 디렉토리를 사용한다는 의미는 NFS 서버의 /share 디렉토리를 사용한다는 것과 같다.
/share 디렉토리를 읽기 및 쓰기로 공유했으므로 적당한 파일을 복사해보자
NFS 클라이언트의 /testfolder/test 파일을 NFS 서버의 share에 복사한다.
[root@localhost ~]# cd /share
[root@localhost share]# ls
test
vmlinuz-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145
vmlinuz-3.10.0-1160.59.1.el7.x86_64
vmlinuz-3.10.0-862.el7.x86_64
[root@localhost share]# cat test
test file
NFS 서버를 확인해보면 /share 디렉토리에 test 파일이 복사된 것을 확인할 수 있다.
NFS 클라이언트 부팅될 때마다 NFS 서버의 디렉토리에 자동으로 마운트되도록 하자.
[root@web ~]# vi /etc/fstab
[root@web ~]# reboot
[root@web ~]# ls -l myShare
합계 18784
-rw-r--r--. 1 nfsnobody nfsnobody 10 3월 20 23:33 test
-rwxr-xr-x. 1 root root 6224704 3월 20 22:39 vmlinuz-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145
-rwxr-xr-x. 1 nfsnobody nfsnobody 6777448 3월 20 23:22 vmlinuz-3.10.0-1160.59.1.el7.x86_64
-rwxr-xr-x. 1 root root 6224704 3월 20 22:39 vmlinuz-3.10.0-862.el7.x86_64
[root@web ~]# touch myShare/newfile
[root@web ~]# ls -l myShare
합계 18784
-rw-r--r--. 1 nfsnobody nfsnobody 0 3월 21 00:35 newfile
-rw-r--r--. 1 nfsnobody nfsnobody 10 3월 20 23:33 test
-rwxr-xr-x. 1 root root 6224704 3월 20 22:39 vmlinuz-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145
-rwxr-xr-x. 1 nfsnobody nfsnobody 6777448 3월 20 23:22 vmlinuz-3.10.0-1160.59.1.el7.x86_64
-rwxr-xr-x. 1 root root 6224704 3월 20 22:39 vmlinuz-3.10.0-862.el7.x86_64
Client를 재부팅한 후 ls -l /myShare 명령으로 자동 마운트되었는지 확인한다.
그리고 touch /myShare/newFile 명령으로 읽기/쓰기 작업이 되는지 확인하자.
NFS 클라이언트에서 만든 newfile이 NFS 서버의 share 디렉토리에 정상적으로 생성된 것을 확인할 수 있다.
🔗참고
'Linux' 카테고리의 다른 글
[Linux] Proxy 서버 (0) | 2022.03.21 |
---|---|
[Linux] Samba 서버 (Samba 서버 구축해보기) (0) | 2022.03.21 |
[Linux] SELinux (Security Enhanced Linux) (0) | 2022.03.20 |
[Linux] ELF(Executable and Linkable Format) 파일 형식 (0) | 2022.03.12 |
[Linux] DataBase (MariaDB) 설치 및 설정 (0) | 2022.03.11 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!