Monday, March 26, 2018

CentOS 6.6 리눅스 네트워크 ] 7. NFS 서버/클라이언트


안녕하세요. 썬구루입니다. 이 게시물에서는 CentOS 리눅스 기반에 NFS 서버/클라이언트를 구성하는 방법에 대해 알아보도록 하겠습니다.

윈도우 운영체제 환경에서 네트워크를 통해 파일을 공유하기 위해 폴더 공유라는 기술을 사용합니다. 이를 통해 윈도우 환경 하에 있는  파일들을 쉽게 공유할 수 있습니다.

리눅스/유닉스 운영체제 환경에서 네트워크를 통해 파일을 공유하기 위해 NFS라는 기술을 사용합니다. Network File System의 약자이고 분산 파일시스템 프로토콜이며 1984년 썬마이크로시스템즈(Sun Microsystems)에 의해 개발되어 만들어졌습니다.

네트워크 상에 존재하는 유닉스, 리눅스 시스템 간 데이터에 대한 자원을 공유하기 위해 사용합니다. 다시 말해 시스템 간 파일을 공유하기 위해 사용됩니다. 이는 Server-Client 모델 서비스이며 원격시스템상에 존재하는 파일에 대해 보기, 갱신, 저장, 삭제에 대한 기능을 제공합니다.


■ NFS 이점

NFS는 다음과 같은 이점을 제공합니다.

  ° 여러 시스템이 같은 파일, 같은 데이터에 접근할 수 있도록 기능을 제공하여 파일 접근의 일관성을 제공한다.
  ° 중앙 집중식 파일 관리 서비스를 제공함으로써 저장 공간에 대한 비용을 줄일 수 있다.
  ° 이기종에 대해서도 서비스 지원이 가능하다. (Unix, Linux)
  ° WEB, WAS 클러스터 환경에서 CFS 또는 NFS가 사용된다.

저가 WEB과 WAS 이중화를 구성하기 위해 중저가형 NAS 스토리지를 고객사에 납품 후 기존 Cluster File System을 삭제하고 NAS 스토리지로 NFS를 구성, 특정 디렉터리를 공유하여 사용할 수 있도록 구성을 한 적 있습니다. 이전에 누가 구성을 했는지는 모르겠지만 Cluster File System(CFS)에 문제가 많아 고객 담당자분께서 여간 고생한 것이 아니었습니다. 차라리 VxFS로 구성했었다면 문제가 없었을 텐데 VxFS(Veritas Cluster File system) 가 가격이 만만치 않아서..

NFS로 구성한 후 CFS 구성 시 발생했었던 문제(정말 한 달에 두세 번씩 서비스가 뻗었었음)는 말끔히 사라졌었습니다. 그때 사용했던 중저가형 NAS 스토리지가 QNAP TS-EC1279 모델이었으며 디스크 장애 나면 시중 일반 디스크로 교체하면 그만이라 유지 비용도 저렴했었고 성능은 80Mbytes/Sec 나왔었습니다. 이 정도면 700Mbps 나오는 것임.. ㅋ.. 재구성 후 서비스 체감 속도는 2배 정도 성능 향상이 있었습니다. 그런데 QNAP에 탑재되는 OS가 리눅스입니다.

■ NFS 서버

파일시스템에 있는 디렉터리를 네트워크를 통해 공유 서비스를 제공하는 시스템을 말합니다. NFS 파일 공유를 제공하기 위해 CentOS는 커널 레벨 지원과 데몬 프로세스들의 조합을 사용합니다. NFS 서버 서비스를 위해서는 다음과 같은 패키지가 설치되어 있어야 합니다.

[root@nfs01 nfsd]# rpm -qa | grep "^nfs"

nfs-utils-lib-1.1.5-9.el6.x86_64
nfs-utils-1.2.3-54.el6.x86_64
nfs4-acl-tools-0.3.3-6.el6.x86_64

[root@nfs01 nfsd]# 

1). 필수 서비스

NFS 서비스를 제공하기 위해 아래와 같은 서비스가 사용됩니다.

필수 서비스
내 용
nfs
 service nfs start 명령을 실행하면 NFS 서버 서비스가 시작된다. 공유된 NFS 파일시스템에 대한  서비스 요청을 처리한다.
nfslock
 NFS 클라이언트가 서버에 있는 파일들을 잠그기 위해  RPC 프로세스를 시작한다 옵션 서비스.
rpcbind
 RPC 서비스를 관리하기 위해 사용한다. NFSv4에서는 사용되지 않는다.
rpc.mount
 NFSv2 또는 NFSv3를 사용하는 클라이언트의 mount 요청을 처리하기 위해 사용한다.
rpc.nfsd
 클라이언트의 NFS 요청을 처리한다.
rpc.statd
 nfslockd 데몬과 같이 동작하며 crash recovery에 대한 기능을 제공한다. 클라이언트의 비정상적인 종료로 인하여 끊어진 NFS 서비스를 복구한다.
rpc.rquotad
 원격 사용자들을 대한 사용자 quota 정보를 제공하기 위해 사용된다.
rpc.idmapd
 NFSv4에서 사용되며 user@domain 형식의 이름을 사용할 수 있는 기능을 제공한다.
lockd
 NFS 서버/클라이언트에 동작하는 커널 스레드이다. NFSv2, NFSv3 클라이언트들이 서버에 있는 파일들을 잠금(Lock)을 할 수 있도록 Network Lock Manager(NLM) 프로토콜을 수행한다.


2). 관련 파일

공유 디렉터리에 대한 정보와 NFS 서비스에 의해 업데이트되는 파일은 아래와 같습니다.

관련 파일
내 용
/etc/exports
 NFS 디렉터리 공유에 대한 리스트를 보관하는 파일이다. 관리자에 의해 관리
/var/lib/nfs/etab
 현재 NFS 서버 서비스에 의해 공유된 자원 리스트를 보관하는 파일이다. 시스템에 의해 관리
/var/lib/nfs/rmtab
 원격지 클라이언트에 의해 마운트된 NFS 파일시스템 정보를 보관하는 파일이다. 시스템에 의해 관리

3). /etc/exports 파일

NFS 디렉터리 공유에 대한 리스트를 보관하는 파일이다. 한 줄당 하나의 공유 디렉터리에 대한 정보가 저장된다. 형식은 아래와 같습니다.

 공유디렉터리   클라이언트 IP또는 호스트 이름(공유 옵션)

예는 다음과 같습니다.

 /data01     192.168.80.21(rw,sync,no_root_squash)   # 192.168.80.21 IP를 가지는 시스템에 대해서만 공유를 허용한다.
 /data02     192.168.80.2[2-5](rw,sync)                    # 192.168.80.22,192.168.80.22,192.168.80.22,192.168.80.22 에 대해서만 공유 허용
 /data03     192.168.70.*(rw,sync)                           # 192.168.70. 대역을 사용하는 시스템에 대해 공유를 허용한다.

공유 옵션은 아래와 같습니다.

공유 옵션
내 용
rw
 공유 디렉터리에 대한 클라이언트 요청에 대해 읽기/쓰기를 가능하도록 함
ro
 공유 디렉터리에 대한 클라이언트 요청에 대해 읽기만 가능하도록 함
sync
 변경에 대해 안정적인 저장 후 요청에 대해 응답함
no_root_squash
 원격지 root 사용자가 공유 디렉터리에 접근 시 root 계정으로 접근하게 함
root_squash
 원격지 root 사용자가 공유 디렉터리에 접근 시 nfsnobody 계정으로 접근하게 함

4). NFS 서비스 시작/종료

 [root@nfs01 nfsd]# service nfs [ start | stop ]

5). exportfs 명령

디렉터리를 공유하기 위해 또는 공유된 디렉터리 정보를 확인하기 위해 사용되는 명령입니다.

▶ 명령형식

exportfs [옵션]  IP주소:공유할 디렉터리 경로

▶ 옵션

옵 션
내 용
-o rw
 공유 디렉터리에 대한 클라이언트 요청에 대해 읽기/쓰기를 가능하도록 함
-o ro
 공유 디렉터리에 대한 클라이언트 요청에 대해 읽기만 가능하도록 함
-o sync
 변경에 대해 안정적인 저장 후 요청에 대해 응답함
-o no_root_squash
 원격지 root 사용자가 공유 디렉터리에 접근 시 root 계정으로 접근하게 함
-o root_squash
 원격지 root 사용자가 공유 디렉터리에 접근 시 nfsnobody 계정으로 접근하게 함
-v
 공유된 디렉터리 정보를 확인할 때 사용된다.

6). NFS 서버 구성

원활한 서비스 테스트를 위해 iptables 서비스를 잠깐 내립니다.

[root@nfs01 ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:47:40:D8
          inet addr:192.168.80.12  Bcast:192.168.80.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe47:40d8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:498 (498.0 b)  TX bytes:1154 (1.1 KiB)
[root@nfs01 ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[root@nfs01 ~]#
[root@nfs01 ~]# mkdir /data01
[root@nfs01 ~]#
[root@nfs01 ~]# echo "/data01     192.168.80.2[12](rw,sync,no_root_squash)" > /etc/exports
[root@nfs01 ~]# more /etc/exports
/data01     192.168.80.2[12](rw,sync,no_root_squash)
[root@nfs01 ~]#
[root@nfs01 ~]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
[root@nfs01 ~]#
[root@nfs01 ~]# exportfs -v
/data01        192.168.80.2[12](rw,wdelay,no_root_squash,no_subtree_check)
[root@nfs01 ~]#
[root@nfs01 ~]# mkdir /data02
[root@nfs01 ~]#
[root@nfs01 ~]# exportfs -o rw,sync 192.168.80.3[1-5]:/data02
[root@nfs01 ~]#
[root@nfs01 ~]# mkdir /data03
[root@nfs01 ~]#
[root@nfs01 ~]# exportfs -o rw,sync 192.168.70.*:/data03
[root@nfs01 ~]#
[root@nfs01 ~]# more /etc/exports
/data01     192.168.80.2[12](rw,sync,no_root_squash)
[root@nfs01 ~]#
[root@nfs01 ~]# exportfs -v
/data01        192.168.80.2[12](rw,wdelay,no_root_squash,no_subtree_check)
/data03        192.168.70.*(rw,wdelay,root_squash,no_subtree_check)
/data02        192.168.80.3[1-5](rw,wdelay,root_squash,no_subtree_check)
[root@nfs01 ~]# 



■ NFS 클라이언트

1). 필수 서비스

NFS 서비스를 제공하기 위해 아래와 같은 서비스가 사용됩니다.

필수 서비스
내 용
rpc.statd
 nfslockd 데몬과 같이 동작하며 crash recovery에 대한 기능을 제공한다. 클라이언트의 비정상적인 종료로 인하여 끊어진 NFS 서비스를 복구한다.
lockd
 NFS 서버/클라이언트에 동작하는 커널 스레드이다. NFSv2, NFSv3 클라이언트들이 서버에 있는 파일들을 잠금(Lock)을 할 수 있도록 Network Lock Manager(NLM) 프로토콜을 수행한다.

2). 관련 파일

관련 파일
내 용
/etc/fstab
 시스템 부팅 시 마운트 할 파일시스템에 대한 정보를 가지고 있는 파일이다.
/etc/mtab
 마운트 된 파일시스템에 대한 정보를 가지고 있는 파일이며 시스템에 의해 관리된다.

3). 관련 명령

관련 명령
내 용
mount
 파일시스템을 마운트하기 위해 사용되는 명령이다. NFS 경우 -t nfs 옵션을 사용하면 된다.
showmount
 NFS 서버의 공유 디렉터리를 확인하기 위해 사용하는 명령이다.

4). NFS 클라이언트 구성

원활한 서비스 테스트를 위해 iptables 서비스를 잠깐 내립니다.

[root@web01 /]# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:0C:29:DF:19:BB
          inet addr:192.168.80.21  Bcast:192.168.80.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fedf:19bb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13394 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21478 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3974322 (3.7 MiB)  TX bytes:3916500 (3.7 MiB)

[root@web01 /]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[root@web01 /]#
[root@web01 /]# mkdir /data01
[root@web01 /]#
[root@web01 /]# showmount -e 192.168.80.12
Export list for 192.168.80.12:
/data02 192.168.80.3[1-5]
/data03 192.168.70.*
/data01 192.168.80.2[12]
[root@web01 /]#
[root@web01 /]#
[root@web01 /]# mount -t nfs 192.168.80.12:/data01 /data01
[root@web01 /]#
[root@web01 /]# df -hF nfs
Filesystem                                Size  Used Avail Use% Mounted on
192.168.80.12:/data01                 16G  2.6G   13G  18% /data01
[root@web01 /]#
[root@web01 /]# cd /data01
[root@web01 data01]#
[root@web01 data01]# ls -l
total 0
[root@web01 data01]#
[root@web01 data01]# touch file1
[root@web01 data01]#
[root@web01 data01]# ls -l
total 0
-rw-r--r--. 1 root root 0 Jul 24  2016 file1     # NFS 서버에서 /data01 디렉토리 공유 시 no_root_squash 옵션을 사용하여 root가 소유자
[root@web01 data01]# 

NFS 클라이언트 시스템이 리부팅되더라도 공유 디렉터리를 자동으로 마운트하도록 만들기 위해 /etc/fstab 파일에 아래와 같은 내용을 추가합니다.

192.168.80.12:/data01 /data01   nfs defaults 0 0 

만약 지정되지 않은 IP 주소를 가진 시스템이 NFS 서버의 공유 디렉터리에 마운트 시도할 경우 아래와 같은 오류 메시지가 출력됩니다.

[root@was01 /]# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:0C:29:3E:63:0B
          inet addr:192.168.80.40  Bcast:192.168.80.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe3e:630b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:529 errors:0 dropped:0 overruns:0 frame:0
          TX packets:278 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:79833 (77.9 KiB)  TX bytes:40624 (39.6 KiB)

[root@was01 /]# mkdir /data01
[root@was01 /]#
[root@was01 /]# mount 192.168.80.12:/data01 /data01
mount.nfs: access denied by server while mounting 192.168.80.12:/data01
[root@was01 /]# 

만약 no_root_squash 옵션이 적용되지 않은 공유 디렉터리에 대해 root로 원격 접근하여 파일을 생성하려 하면 아래와 같은 오류 메시지가 출력됩니다.

[root@web01 /]# cd /data01
[root@web01 data01]#
[root@web01 data01]# ls -l
total 0
-rw-r--r--. 1 root root 0 Jul 24  2016 file1
[root@web01 data01]#
[root@web01 data01]# touch file2
touch: cannot touch `file2': Permission denied
[root@web01 data01]# 

만약 root_squash 옵션이 적용되어 있는 공유 디렉터리에 root 계정으로 원격 접근하여 파일을 생성한다면 root는 nfsnobody 계정으로 접근됩니다. 이는 보안상 root 계정으로 공유 디렉터리에 접근하는 것을 막기 위해 사용되는 옵션입니다.

[root@web01 data01]# ls -l
total 4
-rw-r--r--. 1 root root    0 Jul 24  2016 file1
drwxrwxrwx. 2 root root 4096 Jul 24  2016 test
[root@web01 data01]#
[root@web01 data01]# cd test
[root@web01 test]#
[root@web01 test]# touch file2
[root@web01 test]#
[root@web01 test]# ls -l
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Jul 24  2016 file2
[root@web01 test]# 

여기까지 NFS 서버/클라이언트 구성에 대해 알아보았습니다. 다음 게시물에서는 WEB & WAS에 대해 알아보도록 하겠습니다.




No comments:

Post a Comment