티스토리 뷰

CentOS 강좌 PART 2. 7  NFS 서버 구축과 운영

NFS(Network File System)은 용어 그대로 네트워크 기반의 파일시스템을 의미한다. 공유된 원격의 호스트 파일을 다른 리눅스 시스템이 로컬에서 사용할 수 있도록 구현한 방식이다. NFS v2 부터 현재 v4에 이르기 까지 널리 사용되어 왔으며, 손쉽게 원격의 파일 시스템을 공유할 수 있다는 점에서 편의성이 매우 높다.
하지만 편의성이 높은 만큼 보안에 대한 취약점도 고려해야 하기 때문에 전용 NFS 스토리지가 아니라면, Read Only 정도로 공유하며 사용하는 것이 좋다.
NFS를 사용하게 되면 Linux Server가 네트워크를 통해 다른 리눅스/운영체제 클라이언트와 디렉토리를 공유할 수 있다. NFS 서버는 해당 디렉토리를 외부로 보내고, NFS 클라이언트는 해당 디렉토리를 마운트 하는 형태이다. NFS는 현재 주로 v3,v4를 사용한다.

NFS v3 (1995년)
  • NFS version3는 Async방식의 Writed 모드를 지원
  • 64bit File Size의 Offset을 지원하므로 2GB 이상의 파일 액세스 가능
  • TCP/UDP Port 2049를 지원하지만 실제 IP Network에서 UDP 기반 Stateless 방식으로 연결됨
  • UDP 방식 전송으로 인해 신뢰성에 이슈가 있을 수 있음.
NFS v4 (2003년)
  • NFS version4는 rpcbind서비스가 필요없고 ACL 을 지원하며 Statuful 방식 운영이 가능함.
  • RHEL/CentOS 6 이상에서는 모두 지원하며, 기본 mounting 될 때 NFS v4가 기본으로 구성됨.
  • TCP 를 사용하기 때문에 신뢰성을 보장 받을 수 있음. 
  • TCP Port 2049를 지원
  • 2010년 NFS v4.1 발표, 현재 NFS v4.2가 최신

NFS RPC 프로세스 및 주요서비스
  • rpc.statd : NFS 클라이언트와 서버간의 모니터링 프로토콜
  • rpc.mountd : NFS v3클라이언트의 마운트 요청을 서버 측에서 구현하는 NFS mount 데몬
  • rpc.idmapd : NFSv4 이름과 로컬 UID 및 GID 매핑 
  • rpc.rquotad: 원격 사용자에 대한 사용자 할당량 정보 제공
  • rpcbind : RPC 프로그램 번호를 범용 주소를 변환
  • nfs-lock / rpc-statd : NFS 파일 Lock

NFS 주요 구성 파일
  • /etc/exports : 기본 구성 파일이며, 원격 호스트로 내보낼 파일 시스템을 제어하고 옵션을 지정
  • /etc/fstab : 시스템이 부팅될 때 NFS 디렉토리를 포함하여, 어떤 파일 시스템이 마운트 되지는 제어하는 데 사용
  • /etc/sysconfig/nfs : 필요한 RPC 서비스가 실행되는 포트를 제어하는 데 사용
  • /etc/hosts.allow, /etc/host.deny : TCP wrapper 기반으로 NFS 서버 접근 제어로 사용.



1.NFS 서버 구성

먼저 NFS 패키지를 설치 구성한다.

1
2
[root@centrepo whchoi]# rpm -qa | grep nft-util
[root@centrepo whchoi]# yum -y install nfs-utils rpcbind
cs

설치가 완료되면 NFS를 활성화하고, 재구동시에서 사용가능하도록 등록한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@centrepo whchoi]# systemctl start rpcbind
[root@centrepo whchoi]# systemctl start nfs-server
[root@centrepo whchoi]# systemctl start rpc-statd
[root@centrepo whchoi]# systemctl enable rpcbind
[root@centrepo whchoi]# systemctl enable nfs-server
 
[root@centrepo whchoi]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
   Active: active (exited) since 화 2019-04-02 02:42:17 KST; 1min 13s ago
 Main PID: 24116 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service
 
 4월 02 02:42:17 centrepo systemd[1]: Starting NFS server and services...
 4월 02 02:42:17 centrepo systemd[1]: Started NFS server and services.
 
# nfs-server와 rpcbind를 활성화 하고, 재구동시에도 동작할 수 있도록 환경설정을 한다.
# 정상적으로 구동되었는지 확인한다.
cs


2. NFS 공유 구성

클라이언트와 공유할 디렉토리를 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@centrepo whchoi]# mkdir /nfs
[root@centrepo whchoi]# chmod 777 /nfs/
[root@centrepo whchoi]# vi /etc/exports
 
# nfs용 디렉토리를 생성하고, 클라이언트들이 연결하여 사용할 수 있도록 권한을 제공
# /etc/exports를 생성해서 클라이언트의 범위와 권한을 설정한다.
 
[root@centrepo whchoi]# cat /etc/exports
/nfs 10.72.86.0/24 (rw,sync,no_root_squash)
/nfs 10.72.78.128/25 (rw,sync,no_root_squash)
 
# /etc/exports 에는 공유할 디렉토리, 공유 허가된 클라이언트 주소, (권한)을 명시한다.
# rw - 공유 디렉토리 폴더에 읽기와 쓰기 권한
# sync - 해당 파일시스템에 모든 변경내용이 즉시 디스크로 플러시 시킴. 각각의 기록 동작들이 대기
# no_root_squash - 루트 스쿼시를 비활성화.
 
[root@centrepo whchoi]# exportfs -r
 
# exportfs -r 옵션을 통해 /etc/exports 항목을 /var/lib/nfs/etab과 동기화 한다.
# -r : /etc/exports 와 /var/lib/nfs/etab 동기화
# -a : /etc/eprorts 항목은 내보내지만, 동기화 하지 않음.
 
[root@centrepo whchoi]# systemctl restart nfs-server
 
# 설정을 완료하고 nfs 데몬을 재구동한다.
cs


3. NFS를 위한 보안 설정

NFS 서버가 NFS  서비스를 제공하기 위해 NFS 서버의 보안정책을 허가해 준다.

1
2
3
4
5
6
7
8
9
10
[root@centrepo whchoi]# firewall-cmd --permanent --zone public --add-service mountd
success
[root@centrepo whchoi]# firewall-cmd --permanent --zone public --add-service rpc-bind
success
[root@centrepo whchoi]# firewall-cmd --permanent --zone public --add-service nfs
success
[root@centrepo whchoi]# firewall-cmd --reload
success
 
# NFS 서비스를 위해 방화벽 정책을 설정한다.
cs



4. NFS 클라이언트 설정과 확인 - 리눅스 클라이언트

NFS 클라이언트가 NFS 서버와 정상적으로 연결할 수 있도록 Client Side에서 NFS 패키지를 설치한다.
설치 이후 정상적으로 export list가 보이는 지 확인한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@ns1 whchoi]# yum -y install nfs-utils libnfsidmap
 
# nfs 연결을 위해 Client side에서 nfs-utils 패키지와 libnfsidmap 패키지를 설치한다.
 
[root@ns1 whchoi]# systemctl enable rpcbind
[root@ns1 whchoi]# systemctl start rpcbind
 
# rpcbind를 활성화 하고, 재구동시 동작하도록 설정한다.
 
[root@ns1 whchoi]# showmount -e 10.72.78.253
Export list for 10.72.78.253:
/nfs (everyone)
 
# showmount 명령을 통해 NFS 서버와 접속이 정상적으로 이뤄지는 지 확인한다.
cs

정상적으로 export 가 확인되면 mount 할 디렉토리를 생성하고, NFS 서버에 마운트 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@ns1 whchoi]# mkdir /mnt/nfs
[root@ns1 whchoi]# mount 10.72.78.253:/nfs /mnt/nfs/
[root@ns1 whchoi]# mount | grep nfs
10.72.78.253:/nfs on /mnt/nfs type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.72.86.7,local_lock=none,addr=10.72.78.253)
 
# mount할 디렉토리를 생성한다.
# 생성한 mount target에 NFS를 마운트한다.
# 정상적으로 마운트 되었는지 확인한다.
 
[root@ns1 whchoi]# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        50G  1.7G   49G   4% /
devtmpfs                devtmpfs  3.9G     0  3.9G   0% /dev
tmpfs                   tmpfs     3.9G     0  3.9G   0% /dev/shm
tmpfs                   tmpfs     3.9G   17M  3.9G   1% /run
tmpfs                   tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  189M  826M  19% /boot
/dev/mapper/centos-home xfs        42G   33M   42G   1% /home
tmpfs                   tmpfs     783M     0  783M   0% /run/user/0
tmpfs                   tmpfs     783M     0  783M   0% /run/user/1000
10.72.78.253:/nfs       nfs4      450G   15G  436G   4% /mnt/nfs
 
# 실제 df로 확인해 보면 nfs가 정상적으로 마운트 된 것을 확인할 수 있다.
cs

파일이 정상적으로 Read/Write되는지를 확인한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ns1 whchoi]# touch /mnt/nfs/testfile
[root@web whchoi]# touch /mnt/nfs/web_test
# 2개의 Client에서 파일을 생성한다.
 
[root@centrepo whchoi]# ls -al /nfs/
합계 0
drwxrwxrwx.  2 root root  54  4월  2 10:25 .
dr-xr-xr-x. 18 root root 235  4월  2 02:46 ..
-rw-r--r--.  1 root root   0  4월  2 10:13 test.txt
-rw-r--r--.  1 root root   0  4월  2 10:20 testfile
-rw-r--r--.  1 root root   0  4월  2 10:25 web_test
 
# NFS Server Side에서 정상적으로 생성된 것을 확인할 수 있다.
cs



5. NFS 클라이언트 설정과 확인 - VMware ESX host

NFS를 지원하는 다른 운영체제에서도 정상적으로 마운트 되는지 확인해 보자.
VMware ESX에서 먼저 Host를 선택하고, Storage를 추가한다.


신규 데이터스토어 추가시 NFS를 추가한다.


NFS Version Type을 4.1 또는 3 으로 선택한다.

“1 “ 에서 NFS 데이터스토어 이름을 신규 설정하고, “2”에서 NFS Server 디렉토리를 선언한다.
“3” 에서 NFS 서버 주소를 넣어 준다.
VMWare DataStore에서는 NFS 서버 설정과 무관하게 NFS access mode를 Read Only 모드로 설정할 수 있다.
Read Only 모드로 설정해 놓고, ISO Mount해서 사용할 때 유용하게 사용할 수 있다.


Kerberos를 사용하지 않기 때문에 사용하지 않는 것으로 한다.

정상적으로 완료 되면 아래와 같이 구성한 내용을 요약해서 확인한다.
마운트가 완료되면 해당 ESX Host에 아래와 같이 정상적으로 DataStore가 추가된다.




6.NFS 클라이언트 설정과 확인 - 맥에서 NFS 마운트하기

파일이 정상적으로 Read/Write되는지를 확인한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
~ $ showmount -e 10.72.78.253
Exports list on 10.72.78.253:
 
# nfs 서버 연결이 가능한지 확인한다.
 
~ $ sudo mount -t nfs -o resvport 10.72.78.253:/nfs /Users/woohyungchoi/nfs
 
# nfs 서버를 로컬 디렉토리로 마운트한다.
 
~ $ df -h
Filesystem                   Size   Used  Avail Capacity iused               ifree %iused  Mounted on
/dev/disk1s1                466Gi  174Gi  284Gi    39% 2019196 9223372036852756611    0%   /
devfs                       336Ki  336Ki    0Bi   100%    1162                   0  100%   /dev
/dev/disk1s4                466Gi  6.9Gi  284Gi     3%       5 9223372036854775802    0%   /private/var/vm
map -hosts                    0Bi    0Bi    0Bi   100%       0                   0  100%   /net
map auto_home                 0Bi    0Bi    0Bi   100%       0                   0  100%   /home
/dev/disk0s1                299Mi   15Mi  284Mi     6%       0                   0  100%   
/dev/disk1s2                466Gi   50Mi  284Gi     1%     100 9223372036854775707    0%   /Volumes/Preboot
/dev/disk1s3                466Gi  499Mi  284Gi     1%      30 9223372036854775777    0%   /Volumes/Recovery
10.72.78.253:/nfs           450Gi   14Gi  436Gi     4%   53810           235875790    0%   /Users/woohyungchoi/nfs
 
# 정상적으로 NFS 마운트가 되었는지 확인한다.
cs

Finder에서 확인해 보면 정상적으로 NFS 서버의 공유된 파일이 보여진다.


7.NFS Client에서 부팅시 NFS 마운트 시키기.


NFS를 필요에 따라 마운팅 시키지 않고, 부팅할 때 자동으로 마운팅 할 수 있다.
/etc/fstab을 수정을 통해서 부팅시 자동 마운트 시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@web whchoi]# cat /etc/fstab
# /etc/fstab
# Created by anaconda on Tue Mar 12 01:10:26 2019
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
 
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d935273d-4df1-42b6-a9df-2f30f35f1440 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
10.72.78.253:/nfs/ /mnt/nfs nfs rw,sync,hard,intr 0 0
 
 
# NFS 서버 마운트 포인트를 입력하고 rw권한과 기존 등록된 디스크와 동일하거나 또는 신규 UID를 넣어주고 시스템을 재구동하면 완료된다.
 
[root@web whchoi]# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        50G  2.0G   49G   4% /
devtmpfs                devtmpfs  3.9G     0  3.9G   0% /dev
tmpfs                   tmpfs     3.9G     0  3.9G   0% /dev/shm
tmpfs                   tmpfs     3.9G  8.9M  3.9G   1% /run
tmpfs                   tmpfs     3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/centos-home xfs        42G   33M   42G   1% /home
/dev/sda1               xfs      1014M  189M  826M  19% /boot
10.72.78.253:/nfs       nfs4      450G   15G  436G   4% /mnt/nfs
tmpfs                   tmpfs     783M     0  783M   0% /run/user/1000
 
# 시스템 리부팅 후에도 자동으로 NFS가 마운트되는 것을 확인할 수 있다.
cs



공지사항