IT/리눅스마스터1급

NFS란

알콩달콩아빠 2018. 2. 11. 22:50
728x90
반응형

안녕하세요


뚱보 프로그래머 입니다.


NFS 네트워크 파일 시스템에 대해 알아봅니다.



NFS

1. NFS 개요

1) 리눅스 파일 공유

일반적으로 리눅스 분산 파일 시스템은 디스크의 집중적인 관리나 네트워크를 통한 파일 공유를 위해 사용된다. 이를 위해 리눅스 시스템은 NFS Samba를 사용한다. 리눅스 분산 파일 시스템(Distributed File System) 패키지는 보통 다음의 클라이언트와 서버의 구성 요소로 이루어지는데, 먼저 DFS 서버는 로컬 파일을 네트워크에 공유하고 DFS 클라이언트는 공유 파일들을 로컬로 마운트하는데, 리눅스 시스템은 사용하는 명령어의 형식에 따라 개별적으로 클라이언트나 서버가 될 수 있으며 또는 동시에 클라이언트와 서버로서의 기능을 할 수도 있다.

 

2) NFS 시스템 구성 및 역사

기본적으로 TCP(Transmission Control Protocol)이 아닌 UDP(User Datagram Protocol)을 사용하기 때문에 네트워크 트래픽을 약간이라도 줄이는 효과가 있지만 데이터 전달에 있어 프로토콜 자체에서 오류에 대한 정정 코드를 제공해주지 않기 때문에 응용 프로그램에서 이 기능을 제공해야 한다는 부담이 존재한다. 하지만 최근에는 커널에서 NIC(Network Interface Card)의 버퍼로 바로 데이터를 전달하는 등 속도가 향상되었기에 큰 부담은 없다.

그리고 네트워크를 이용하는 모든 프로그램이 그렇지만, 특히 NFS의 경우 네트워크의 상태가 안정적이어야 한다. 안정성을 보장하기 위한 가자 쉬운 방법은 /etc/hosts 파일에 서버와 클라이언트로 사용될 호스트를 등록해두는 것이다. 그리고 NFS도 서비스를 제공해주는(하드 디스크의 영역을 다른 호스트에서 사용할 수 있도록 제공해주는) 서버가 있고, 서버가 제공하는 서비스를 사용하는(서버의 하드 디스크을 사용하는) 클라이언트로 구성되어 있다.

NFS를 사용하기 위해서는 서버나 클라이언트 모두 커널에서 NFS를 지원할 수 있어야 한다. 만약 커널에서 NFS를 지원하지 않는다면 성능이 너무 떨어지기 때문에 꼭 커널 내에 NFS 모듈이 적재되어 있어야 한다. 현재 사용하고 있는 커널이 NFS를 지원하고 있는지는 /proc/filesystems 파일을 확인하면 된다.

 

3) NFS 제한

Sun Microsystems 1984년에 개발한 NFS는 운영체제나 네트워크 그리고 전송 프로토콜에 독립적이다. 현재 NFS DOS, OS/2, MVS, VMS, Unix/Linux 등의 운영체제에서 사용이 가능하다.

 

다음은 NFS에 대한 약간의 제한이다.

1) 오픈 아키텍쳐에 대한 지배력이 없다.

2) 리눅스 파일 시스템 특징이 보장되지 않는다.

3) 특별한 파일(디바이스 파일)에는 원격 접속이 이루어지지 않는다.

4) 다른 운영체제에 대해 다른 버전간에 완벽한 호환이 되지 않는 경우가 있다.

NFS의 개방성으로 리눅스 파일 시스템의 의미는 약간 퇴색하게 되었다. 다른 시스템의 예를 들면 VMS DOS는 쉽게 NFS를 통해 접근이 가능하지만 리눅스의 symbolic link같은 동작은 원격 시스템이 지원하지 않으면 사용할 수 없다. 그리고 만일 열려 있는 파일을 지우고자 할 경우 리눅스 시스템은 임시 파일을 만들어서 이 기능을 수행한다. , 파일은 열려 있지만 지워져 있어서 프로그램이 접근은 가능하지만 파일 시스템에 이름을 가지고 있지는 않다. 파일이 완전히 닫혀질 때까지 리눅스는 디스크 블록을 자유로운 상태로 두지 않는다. 리눅스에서 특별한 파일이란 디바이스를 의미한다. NFS는 네트워크에서 이를 지원하지 않는다. 그리고 파일 잠금은 네트워크 환경에서는 어려운 일이다. 파일 locking은 별도로 분리된 lock manager 데몬인 nfslock이 파일 잠금을 다룬다. 파일 locking은 현재 사용중인 파일을 잠궈 다른 사용자가 파일을 사용하지 못하도록 한다.

 

2. 기본 설정

1) NFS 서버 설정

NFS는 로컬 네트워크에서 대용량의 파일 시스템을 고속 네트워크로 연결하여 사용할 때 유용하다. 심지어는 디스크가 없는 리눅스 클라이언트가 NFS를 통해서 모든 파일 시스템 지원을 NFS 서버에 의지하여 사용할 수도 있다.

NFS를 사용하기 위해서는 서버와 클라이언트를 구분해야 한다. 다른 응용 프로그램들과 마찬가지로 서버가 갖추어야 할 내용과 클라이언트가 갖추어야 할 내용이 전혀 다르기 때문이다. 서버의 경우에는 rcp.mountd, rpc,nfsd라는 두 가지 데몬으로 구성되어 있고, 이와 관련된 유일한 설정 파일은 /etc/exports 파일이다.

그리고 NFS 서비스와 해당 포트를 매핑시키기 위해 portmapper라는 portmap 데몬을 띄운다. 반드시 portmap 데몬을 실행한 후에 nfs 데몬을 실행해야 한다

다음은 기본적인 NFS 서버 설정이다.

[root @edu00 /home]#useradd nfstest

[root @edu00 /home]#passwd nfstest

[root @edu00 /home]#chmod 777 nfstest

[root @edu00 /home]#cd /home/nfstest

[root @edu00 /nfstest]#touch aa

[root @edu00 nfstest]#vi /etc/exports

/home/nfstest    211.170.43.0/255.255.255.0(rw) 192.168.1.0/24(ro)

/home/linux        211.170.43.*(ro) 192.168.1.0/255.255.255.0(rw)

/                         211.170.43.119(rw,no_root_squash)

/var/spool/mail   211.170.43.124(rw) 211.170.43.123(rw)

/home/data         li*.localhost.localdomain(rw)

/home/pub         *(ro,insecure,all_squash)     

[root @edu00 nfstest]#exportfs -r

파일 변경 후 설정을 적용한다.

[root @edu00 nfstest]#exportfs –v

공유 디렉토리를 list한다.

[root @edu00 nfstest]#exportfs –a

공유 디렉토리를 모두 list한다.

[root @edu00 nfstest]#/etc/rc.d/init.d/portmap start

[root @edu00 nfstest]#/etc/rc.d/init.d/nfs start

[root @edu00 nfstest]#/etc/rc.d/init.d/nfslock start

[root @edu00 nfstest]#showmount -a

[root @edu00 nfstest]#showmount -e edu00.net

 

2) NFS 클라이언트 설정

NFS 클라이언트는 네트워크의 공유 디렉토리를 mount 명령으로 접근한다.

[root @edu00 nfstest]#cd /mnt

[root @edu00 /mnt]#mkdir nfs

[root @edu00 /mnt]#mount -t nfs 211.170.43.상대IP:/home/nfstest  /mnt/nfs

remote filesystem mount하여 로컬 파일시스템처럼 사용한다.

[root @edu00 /mnt]#cd /mnt/nfs

[root @edu00 nfs]#ls

aa

[root @edu00 nfs]#cd

[root @edu00 /root]#umount /mnt/nfs

remote filesystem unmount한다.

[root @edu00 root]#cd /mnt/nfs

[root @edu00 nfs]#ls

 

3. NFS 서비스 구성

1) NFS 서버 구성

1] /etc/hosts

서버와 클라이언트로 사용될 호스트를 등록한다.

 

2] 지원하는 파일 시스템

[root @edu00 linux]#cat /proc/filesystems

          ext2

nodev    proc

          iso9660

nodev    devpts

nodev    usbdevfs

nodev    nfs

 

3] 서버는 rpc.mountd, rpc.nfsd로 구성

nfs 서비스는 RPC(Remote Procedure Call)를 이용한다. RPC 프로토콜을 위한 portmap 데몬이 필요하다.

 

4] /etc/exports 파일 구성

<공유할 디렉토리>     <허가할 클라이언트>(options)

 

(1) <허가할 클라이언트의 이름>

먼저 공유를 허용할 디렉토리의 이름을 입력하고, 다음은 마운트할 수 있는 권한을 가진 클라이언트 컴퓨터의 이름이 오는데, 보통 컴퓨터(호스트) IP 주소 또는 인터넷 주소(도메인 이름 형식)으로 적을 수 있으며,  * ? 등의 와일드 카드 문자를 사용할 수 있는데, 인터넷 주소에서 점(.)은 와일드 카드 문자에 포함되지 않는다. 뿐만 아니라 "주소/넷마스크"의 표기법을 사용할 수도 있다.

 

(2) <options>

rw

서버에서 export된 파일 시스템을 클라이언트에서 마운트하게 되면 기본적으로 읽기/쓰기(read-write) 전용이다.

 

ro

옵션을 ro(read-only)로 주게 되면 클라이언트에서 읽기 전용으로만 마운트할 수 있다.

 

rx

이 옵션은 read-execute를 의미하는 것으로 클라이언트에서 파일을 읽고 실행 파일인 경우에는 실행도 가능하도록 허용한다는 의미이다.

 

root_squash, no_root_squash

모든 호스트에는 슈퍼 유저(root)가 있다. , NFS 서버에서도 root가 있고, NFS 클라이언트에서도 root 사용자가 있다. 하지만 두 호스트의 root가 반드시 동일할 수는 없다. 그렇기 때문에 클라이언트의 root는 서버에서 root의 권한을 가질 수 없다. 따라서 root_squash는 기본값으로 클라이언트의 root NFS 파일 시스템에서는 nobody로 매핑되도록 한다. 즉 클라이언트의 root가 마운트된 디렉토리에서 마음대로 쓰고 지울 수 없도록 설정하게 된다. no_root_squash는 클라이언트의 root NFS 파일시스템 위에서도 root의 권한을 가지도록 한다.

 

all_squash, no_all_squash

기본값은 no_all_squash root를 제외한 일반 사용자 계정에 대해서 서버와 클라이언트에 존재하는 동일한 UID에 대해서는 동일한 권리를 갖게 해 준다. 이는 root에 대한 기본 처리 값과는 반대다. all_squash는 클라이언트의 모든 UID GID에 대해서 익명 사용자 ID로 매핑하여 처리한다.

 

secure

설정되는 기본값으로 1023번 이하의 포트를 통해서만 접속을 할 수 있도록 제한하는 옵션이다.

 

insecure

secure 옵션과는 반대로 1024번 이상의 포트를 사용해서 클라이언트와 연결하도록 설정하는 옵션이다.

 

link_relative

절대 경로에 해당하는 심볼릭 링크를 상대 경로로 변경하도록 설정하는 옵션으로, 서버의 전체 파일 시스템이 클라이언트에 마운트되었을 때 유용한 옵션이다. 옵션이 설정되지 않은 상태에서 클라이언트에 마운트된 파일 시스템이 링크를 가지고 있다면 링크는 전혀 엉뚱한 파일을 가리키거나 존재하지 않는 파일을 가리킬 수도 있다. 그래서 이 옵션은 기본 설정값으로 지정된다.

 

link_absolute

SUN에서 제공하는 NFS 서버를 위한 옵션으로, 모든 심볼릭 링크를 있는 그대로 아무런 조치를 취하지 않도록 하는 옵션이다.

 

map_identity

기본 설정값으로, 서버에 존재하는 UID GID가 클라이언트의 UID GID와 동일하다는 가정을 하도록 서버에 영향을 미친다.

 

map_daemon

클라이언트와 서버가 동일한 UID GID를 공유하지 못하도록 NFS 서버에 영향을 미친다. 이 옵션이 설정되면 rpc.nfsd는 클라이언트의 rpc.ugidd 데몬을 호출하여 ID에 대한 맵을 작성하게 된다.

 

map_static

UID GID에 대한 맵을 가지고 있는 파일을 지정할 때 사용하는 옵션이다. 예를 들어 map_static=/etc/nfs/edu00.map이라고 사용하면 /etc/nfs/edu00.map 파일을 UID GID에 대한 맵 파일로 가정한다.

 

map_nis 

NIS 서버를 이용해서 UID GID에 대한 맵을 사용하도록 설정한다.

anonuid, anongid

익명 계정(anonymous account) UID GID에 대해서 지정할 수 있도록 하는 옵션으로, 파일 시스템을 누구나 마운트하여 사용할 수 있도록 허용할 때 사용하는 옵션이다.

 

/etc/exports 파일 설정에 오류가 있는 경우에는 rpc.nfsd rpc.mountd가 시작할 때 syslogd 데몬에게 오류를 기록하도록 하기 위해 정보를 보내도록 되어있다. 따라서 로그를 분석함으로써 설정 파일에 오류가 있는지를 확인할 수 있다.

 

5] /etc/exports 파일 예

/               test(rw) mail(rw,no_root_squash)

/pub            (ro,all_squash)

/home/edu00    *.edu00.net(rw,squash_gid=333,squash=uid=444)

/home/dabang   www.dabang*.net(ro)

위 예제의 첫줄에서 NFS 서버의 루트 파일 시스템을 동일한 도메인에 속한 test mail이라는 호스트에 제공해주고 있다. Test 호스트에서는 읽고 쓸 수 있도록 제공하는 반면, mail 호스트는 읽고 쓸 수 있을 뿐 만 아니라 mail 호스트 관리자(root) NFS 서버의 루트 파일 시스템을 지울 수도 있도록 권한을 부여하고 있기 때문에 주의할 필요가 있다.

두번째 줄에서 /pub 디렉토리를 클라이언트의 모든 사용자에게 읽기 전용으로 공유했다.

세번째 줄에서 edu00.net 도메인에 속한 모든 시스템에서 /home/edu00 디렉토리를 읽고 쓸 수 있도록 공유하고 있으며, 클라이언트에서 접근하는 모든 사용자의 UID 444, GID 333으로 매핑하게 되는 내용이다.

마지막 줄은 /home/dabang 디렉토리를 www.dabang*.net으로 설정했기 때문에 www.dabang1.net의 주소를 가진 호스트나 www.dabanghome.net 등의 호스트에서도 읽기 전용으로 접근할 수 있도록 하는 설정이다.

 

6] 서버의 마운트 정보

NFS 서버에서 파일 시스템이나 디렉토리를 공유한 후, 어떤 클라이언트에서 공유한 파일 시스템(혹은 디렉토리)를 마운트해서 사용하고 있는지를 확인하기 위해서는 NFS 서버 패키지에 포함된 showmount라는 프로그램이 있다. 이 프로그램을 이용하면 어떤 시스템에서 어느 디렉토리를 마운트해서 사용하고 있는지 확인이 가능하다.

다음은 showmount 사용 예이다.

[root @edu00 linux]#showmount -e host(edu00.net)

어느 클라이언트가 어느 디렉토리를 마운트해서 사용하고 있는지에 대한 정보를 보여준다.

[root @edu00 linux]#showmount -a

host:dir형식으로 관련 정보를 보여준다.

 

[root @edu00 linux]#showmount -d

디렉토리 이름만을 출력한다.

 

[root @edu00 linux]#showmount -e localhost

 

2) NFS 클라이언트 구성

새로운 하드 디스크를 추가하거나 플로피 디스켓 혹은 CD-ROM을 삽입하고 나면 운영체제에서 새로운 파일 시스템에 대해서 인식하고 사용할 수 있도록 마운트를 해야 한다. 마찬가지로 클라이언트에서 NFS 서버에서 공유할 수 있도록 설정해놓은 파일 시스템을 마운트해서 사용한다. 일반적으로 mount 명령은 서버의 자원을 mount한다. 클라이언트의 mount 명령은 서버의 rpcbind(portmapper)에게 마운트 데몬이 요청을 받아들이는 포트 번호를 질의한다. 포트 번호는 응용 프로그램의 주소 정도의 의미를 갖는다. 클라이언트의 mount가 서버의 mountd를 만나면 서버의 /etc/exports 파일에 지정된 권한에 근거하여 접근을 허락할지 거부할지를 판단하고 더욱 중요한 것은 디렉토리에 대한 (파일) 접근 권한이 있는지 확인한다. 마운트가 허락되면 서버는 클라이언트에게 File Handle이라는 식별자를 넘겨주는데 클라이언트는 커널에 mount table을 추가한다. mount된 구조를 참조할 때는 단순히 서버에게 File Handle을 넘겨 주어서 어느 곳에 접근하려 하는지를 알려준다.

 

1] NFS 클라이언트의 마운트

다음은 NFS 서버에 대한 자원을 사용하기 위한 클라이언트의 mount 명령 사용 형식이다.

#mount –t nfs server:/directory  /mounting_directory

 

2] 옵션

NFS 마운트 옵션은 다음과 같다.

rw/ro

읽기-쓰기(default)/읽기전용

 

hard

서버가 반응할 때까지 mount 시도

 

soft

서버에 마운트를 한번만 시도

 

retrans & timeout

soft mount에서 전송과 타임 아웃 인수

 

bg

첫번째 마운트 실패 이후 백그라운드로 시도

 

intr

signal로 인터럽트되는 것 허용

 

3] 예제

이러한 마운트 옵션을 예제를 통해 확인해본다.

[root @edu00 /root]#mount –t nfs –o bg,soft,intr edu01:/bar /home/edu01

 

[root @edu00 linux]#mount nadream:/pub /mnt/nadream_nfs/pub

[root @edu00 linux]#mount -t nfs -o timeo=20, rsize=1024, wsize=1024 nfs_server:/public  /mnt/public

2초 동안 NFS 서버에서 응답이 없으면 클라이언트의 화면에 경고 메세지

rsize wsize는 각각 1MB씩 버퍼링을 하도록 지정

 

4. 부팅시에 활성화

부팅할 때 마운트가 되도록 하려면 /etc/fstab 파일을 편집한다. 명령 프롬프트상의 마운트는 시스템이 재부팅되면 설정이 없어지게 된다. 부팅시마다 특정 디렉토리나 사용자의 홈디렉토리, 그리고  메일 디렉토리를 마운트한다.

[root @edu00 linux]#vi /etc/fstab

생략

server1:/home/nfstest                  /mnt/nfs                           nfs         defaults 0 0

192.168.1.0/24:/home/nfstest        /mnt/nfs                           nfs        defaults 0 0

NFS-server:/home                        /mnt/nfs                           nfs         defaults 1 2

NFS-server:/var/spool/mail          /mnt/nfsmail       nfs         defaults 1 2

 

5. 응용 및 보안

NFS는 네트워크를 이용한 서비스이기 때문에 보안을 염두에 두어야 하는데, 만약 외부인이 /etc/exports 파일을 보게 된 경우에는 자신의 호스트에 NFS 파일 시스템을 마운트하여 중요한 자료를 가져갈 수도 있다. 또한 악의를 가지고 대용량의 더미(dumy) 파일을 적재했다 내렸다 함으로써 네트워크에 부하를 발생시킬 수도 있다. /etc/hosts.deny 파일에 모든 호스트로부터 접근을 거부하도록 설정하고, /etc/hosts.allow 파일에만 특정 호스트로부터의 접근을 허용하도록 설정하는 것이 좋다.

NFS를 응용할 수 있는 환경을 예로 들면, 첫째는 폰트와 같이 파일 시스템 용량을 많이 차지하는 것들을 이용할 수 있다. 물론 리눅스의 X 윈도우에서 사용하는 폰트는 폰트서버를 이용해도 되지만 Tex LaTex처럼 많은 폰트를 지원하는 응용 프로그램을 위해서는 NFS를 사용하면 유용할 것이다. 먼저 Tex 응용 프로그램을 서버와 클라이언트에 각각 설치한 후에 클라이언트에서 Tex관련 디렉토리를 모두 지워버리고, 서버의 /usr/lib/tetex /var/lib/tetex NFS로 마운트하여 사용하면 된다.

둘째는 어느 호스트로 로그인을 하더라도 자신에게 도착한 메일을 확인할 수 있도록 환경을 조성하는데 NFS를 이용할 수 있다. 다른 방법으로는 PINE 등의 메일 클라이언트를 모든 호스트에 설치해두고, 자신의 계정을 모든 시스템에 설정하면 좋겠지만 여의치 않을 경우에 서버의 /var/spool 디렉토리를 NFS로 마운트하여 사용하면 어느 곳에서나 자신에게 온 메일을 확인할 수 있게 된다. 메일을 잘 사용하는 사람의 경우 자신에게 들어온 메일을 포워딩할 수 있겠지만 이 역시 제한이 있기 때문에 NFS를 사용하면 좋다.

마지막으로 공통된 파일들을 갖고 있는 /usr/local이나 X 윈도우 관련 디렉토리들을 공유해서 하드 디스크를 아끼는 것도 좋다. 

728x90
반응형

'IT > 리눅스마스터1급' 카테고리의 다른 글

메일 서비스  (0) 2018.02.13
ftp 란  (0) 2018.02.12
삼바  (0) 2018.02.02
DHCP  (0) 2018.02.01
보안...  (0) 2018.01.27