안녕하세요. 썬구루입니다. 이 게시물에서는 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