2008. 3. 17.

[Linux] nfs

리눅스 - NFS 서버

1. NFS 서버의 정의
네트워크 파일 시스템 (Network File System)의 약자로 정보 통신 네트워크에 접속 되어 있는 다른 컴퓨터의 파일 시스템을 고용하기 위한 분산 파일 공유 시스템 소프트웨어 이다. 컴퓨터의 기종이나 운영체제가 다른 환경의 컴퓨터에 분산되어 있는 파일을 공용하기 위한 것이다. 네트워크 파일 시스템이 탑재되어 있는 다른 컴퓨터상의 파일 시스템을 마치 자기의 컴퓨터에 있는 파일처럼 접근할 수 있으므로 파일 전송을 하고 나서 파일을 조작할 필요가 없다. 1985년에 미국의 썬 마이크로시스템즈 사가 개발 하였는데, 그 유용성 때문에 많은 시스템에서 이용할 수 있어 업계 표준과 같이 되었다. NFS는 개발사인 썬 마이크로시스템즈 사의 등록 상표이다.

NFS 서비스를 제공하기 위해서는 NFS 서버와 클라이언트 간의 기보적인 요소를 갖추어야 하는데, 먼저 사용자 시스템에 NFS 클라이언트가 있어야하며, 원격지 컴퓨터에는 NFS 서버가 설치되어 있어야 한다. 둘 모두 TCP/IP 프로토콜이 설치 되어 있어야 한다. 초기에는 TCP 대신 UDP를 사용하기도 하였다. NFS 서버는 컴퓨터 간의 통신 방법으로 RPC(Remote Procedure Call)를 사용한다.

NFS는 여러명이 같이 사용되는 대용량 프로그램이나 테이터들을 하나의 호스트에 넣어두고 단지 마운트를 통해서 서버의 자원을 자기 자원이양 똑같이 사용하는 것이 가능하다. 그러나 네트워크의 트래픽이 걸려 속도가 느려진다던지 혹은 보안의 허점이 생길 수도 있다는 것을 염두해 두어야 한다.

2 서버 구축에 필요한 사항
*protmap
RPC프로그램을 TCP/IP 포트에 연결해주는 역할을 한다. RPC를 이용하는 프로그램이 시작되면 그 프로그램은 자신이 제공하는 서비스와 자신이 사용하는 포트를 portmap에 등록을 한다. 클라이언트는 portmap에 문의해 원하는 서버에 접근할 수 있는 방법을 알아 낼 수가 있다.

*rpc.mountd
rpc.mountd는 NFS 마운트 프로토콜이다. 외부에서 클라이언트의 요청이 들어오게 되면 nfs서버는 자신의 한부분을 다른 host들이 사용할 수 있도록 공유를 시켜주어야 한다. BSD계열에서는 export를 기타 다른 유닉스 계열에서는 share라는 말을 사용한다. 물론 리눅스는 export 를 사용한다.
rpc.mount는 어떤 클라이언트가 요청이 들어오게 되면 /etc/export 의 설정에 따라 마운트 요청을 처리한다. 이 마운트쭻 접속유지를 하지 않는다. 접속요청이 들어오게 되면 일단 처리해주고 난 후 접속을 끊었다가 다시 연결한다.

*rpc.nfsd
일단 rpc.mountd에 의해 마운트가 되었다면 /etc/exports의 내용에 따라 클라이언트는 다양한 작업을 할 수가 있게된다. 이때 클라이언트가 작업을 수행하면서 서버쪽 파일시스템상에 무언가를 요구한다면 rpc.nfsd 데몬이 맡아서 처리 해준다.rcp.nfs는 우리가 흔히 알고 있는 fork() 함수를 만들어내어 들어오는 요청을 처리한다.

*rpc.rquotad
원격 쿼터 서버 이다. 이 쿼터 서버는 원격 NFS 서버의 파일 시스템을 마운트한 로컬 유저의 쿼터를 리턴한다.

*rpc.lockd
파일 잡금을 통해 여러 명이 동시에 한 파일을 수정하는 것을 막아준다.

*rpc.statd
rpc.lockd와 함께 사용된다. 이 데몬은 NFS서버가 크래시 되거나 리부팅 되었을 때 잠겻던 것을 다시 복구 시키는 역할을 한다. 파일 잠금 해제와 복구를 담당한다.

3.NFS 서버 설정
*exports
공유할 디렉토리에 대한 설정을 하는 주 설정 파일이 /etc/exports 파일이다.

*exports 설정
exports 파일에 어던 디렉토리를 누구한테 공유 시킬것인지 설정하면된다. 기본 설정 형식은 아래와 같다
디렉토리 머신(옵션1,옵션2) 머신(옵션1.옵션2)
예>/home/iflu wooky.iflu.net (ro) iyagi.iflu.net (rw)

디렉토리 - 자신의 공류할 디렉토리를 의미한다. 이 필드에서 하나의 파티션을 고유시키면 같은 파일 시스템 안에 있는 모든 디렉토리가 공유될 것이다.

머신(클라이언트) - 클라이언트들은 서버에서 공유한 디렉토리를 엑세스 할 수 있으므로 최대한 인증된 호스트에 대해서 구체적으로 설정해야한다. 호스트를 지정할 때는 도메인이나 ip 둘 다 가능하다.

옵션(옵션1.옵션2)
클라이언트를 지정한 수 각 클라이언트들이 공유되어 있는 디렉토리에 접근할 수 있는 권한을 설정하는 것이다.
-ro : 옵션으로 설정된 클라이언트는 단지 디렉토리 읽기만 가능하다. 쓸 수는 없다. 기본 옵션이라 할 수 있다.
-rw : 클라이언트 머신은 공유 디렉토리에 읽고 쓰고 둘다 가능하다.
-no_root_squash : 클라이언트 머신의 루트는 서버의 시스템 루트와 같은 레벨의 권한을 얻게된다.
-root_squash : 클라언트의 루트를 서버상의 nobody 사용자로 매핑
-insecure : 인증되지 않은 엑세스도 가능하도록 함
-link_relative : 절대 심볼릭 링크를 상대 심볼릭 링크로 변경시 사용

4 데몬 가동하기
#/etc/rc.d/init.d/portmap start
#/etc/rc.d/init.d/nfs start
portmap 스크립트를 실행하면 /usr/bin/portmap이 실행된다.
nfs 스크립트를 확인해보면 /etc/exports 파일의 내용이 없을 때는 exit 되고 start시키면 익스포트 리스트를 다시 읽어 들이고 rpc.rquotad, rpc.mountd, rpc.nfs가 실행된다.

*데몬 확인 - rcpinfo
RPC 정보를 리포트 해주는 프로그램이다. 서버에서 현재 가동되고 있는 rpc 서비스가 어떤 것들이 있는지 알려준다.
#rpc -p

5.NFS 클라이언트 사용하기
5.1 클라이언트 마운트
NFS서버에서 권한을 받은 클라이언트는 mount를 사용해서 디렉토리를 공유한다. 마운트 형식은 아래와 같다

#mount -t nfs <서버>:<디렉토리> <마운트위치>
예) #mount -t nfs wooky.iflu.net:/home/iflu /mnt/iflu

마운트를 해제 하려면. 다음과 같다

#umount <마운트위치>
예) #umount /mnt/iflu

-옵션 사용하기

여기에 추가적인 옵션은 일반적인 mount 옵션과 더불어 nfs에만 적용이 되는 것도 있는데 이러한 옵션은 -o의 명령행 인자 뒤에 기술하게 된다
예) #mount -t nfs wooky.iflu.net:/home/iflu /mnt/iflu -o rsize=1024, wsize=1024

rsize=n
NFS 서버로부터 읽어 들이는 바이트 수를 지정한다. 기본값은 커널에 따라 다른데 현재로서는 1024 바이트이다.

wsize=n
NFS 서버에 쓰기를 할 때 사용하는 바이트 수를 정한다. 기본 값은 커널에 따라 다른데 현재로서는 1024 바이트이다.

timeo=n
RPC 타임아웃이 발생한 이후 첫 번째 재전송 요구를 보낼 때 사용되는 시간으로서 1/10 초 단위이다. 기본 값은 7 * 1/10 초이다. 첫 번째 타임아웃이 생기고 나서 타임아웃 시간이 최대치인 60 초에 이르거나 너무 많은 재전송 요구가 벌어질 때까지 타임아웃 시간이 2 배로 변화한다. 만약 파일 시스템이 하드(hard) 옵션으로 마운트되어 있다면 각각의 타임아웃 시간은 2 배로 증가하고 재전송 시도가 일어날 때도 2 배로 증가한다.

retry=n
백그라운드에서 진행 중인 NFS 마운트 작업이 포기하기 전까지 실행할 횟수를 정한다. 기본 값은 10000 번이다.

bg
만약 첫 번째 NFS 마운트 시도가 타임아웃 걸리면 백그라운드에서 실행을 계속한다. 기본값은 백그라운드로 실행하지 않고 그냥 포기한다.

fg
첫 번째 NFS 마운트 시도에서 타임아웃이 걸리면 그 즉시 포기해 버린다. 기본 값이다.

oft
NFS 파일 작업에서 주 타임아웃이 걸리면 프로그램에게 I/O 에러를 보고한다. 기본값은 NFS 파일 작업을 무한히 재시도하는 것이다.

hard
NFS 파일 작업에서 주 타임아웃이 걸리면 콘솔 상에 서버가 반응하지 않음(server not responding)"이라고 출력하고 무한히 재시도한다. 이것이 기본값이다.

intr
타임아웃이 생기고 하드 옵션으로 마운트된 상태라면 파일 작업을 중지하도록 시그널을 보내도록 허용하고 EINTR 신호를 보내다. 기본 값은 파일 작업을 인터럽트 하지 않는 것이다. 주의해야 할 것은 기본 값으로 되어 있는 hard 옵션이 적용된 상태일 경우, 서버가 다운되어 있는 상태라면 서버가 정상 작동할 때까지 계속 대기 상태가 되어 부팅 도중에 그대로 멈춰 버리는 경우가 생긴다는 점이다.

5.2 부팅시 자동으로 NFS 파일 시스템 마운트 하기
리눅스 파일 시스템 정보를 갖고 있는 /etc/fstab 파일을 이용한다. 이 파일에 NFS 파일 시스템 정보를 추가하면 부팅시 자동으로 마운트 할 수 있다.

예)
#vi /etc/fstab
~
.
.
/dev/hda5 swap swap defalts 0 0
ahan.iflu.net:/home/iflu /mnt/iflu nfs intr 0 0

설명)
/etc/fstab 파일은 6개의 필드로 구성 되어 있다. 각 필드는 filesystem, mountpoint, type, options,dump,pass의 6개 항목이 있다.
-filesystem : 마운트할 디바이스다. 원격의 NFS 서버의 디렉토리가 디바이스이기 때문에 :<디렉토리>와 같은 형식으로 적어준다.
-mountpoint : 마운트할 위치이다. NFS파일 시스템일 경우는 새롭게 마운트할 디렉토리를 지정하면 된다.
-type : 각 파일 시스템에 대한 종류를 지정하면 된다. ext3.iso9660,swap,nfs등이 있을것이다. NFS 파일 시스템이므로 당연 nfs 이다.
-options : 마운트할 때 들어갈 각종 옵션을 지정한다. 위에 설명한 옵션중 필요한 옵션을 적으면 된다.
-dump : 시스템에 dump라는 프로그램에 의해 덤프할 파일 시스템인지 여부를 적는다. 0은 해당 파일 시스템이 덤프되 필요 없다는 것이다.
-pass : fsck 프로그램에 의해 부팅시 어떤 파일 시스템을 점검할 것인지 기재 한다. 0인 경우 fsck은 주어진 파일 시스템을 점검할 필요가 없다고 생각한다.

6. NFS 사용되는 유틸리티
6.1 showmount
NFS 서버에서 마운트 정보를 얻을 수 있다

# showmount -옵션
예)# showmount -a ahan.iflu.net

-a ,--all
클라이언트의 호스트 이름과 마운트된 디렉토리를 호스트:디렉토리 포멧으로 출력한다

-d, directories
클라이언트에서 사용하는 디렉토리 이름만 출력한다.

-e, --export
NFS 서버의 export 항목의 리스트를 출력한다.

-h, --help
간단한 도움말을 출력하낟.

-v, --version
현재 사용중인 showmount의 버전 정보를 출력한다

--no-headers
출력에서 요약 정보를 생략하고 출력한다.

6.2 nfsstat
NFS 서버와 클라이언트의 동작 상태를 보여주는 유틸리티이다.

-c
클라이언트의 상태만 보여주는 옵션

-s
서버측의 상태만을 보여주는 옵션

-W
넓은 포멧으로 출력을 조정하는 옵션으로 일반적으로 -c -s옵션과 함께 사용된다.

-w
일정한 시간을 가지고 간단한 nfs 서버와 클라이언트의 상태를 보여주는 옵션이다.

6.3 nhfsstone
NFS를 벤치마킹하기 위한 프로그램이지만 시간당 부하의 수, 전송률, 실패율 등의 관련 데이타를 제공한다.

-v
자세한 출력을 제공 하는 옵션

-t
초 실행시간에 대한 초단위로 설정한다.

-c
NFS에 방생시킬 요청의 총 갯수이다.

-I
초당 NFS에 호출을 방생시킬 부하의 갯수 이다.

7.기타
NFS는 상당히 오버헤드가 많은 프로토콜이다. 그렇기 때문에 속도가 상당히 느리다는 것을 인식해야한다. NFS의 속도는 다른 프로토콜과 비교해 볼 때 kermit과 비슷한 속도이다. 우리가 일반적으로 알고 있고, 인터넷에서 사용하는 ftp, http, rcp, ssh 등의 프로토콜들도 NFS 보다 빠르다. 따라서 네트워크 대역폭이 낮은 네트워크에서 사용하기 힘들며 또한 한 네트워크에 많은 수의 클라이언트가 빈번하게 트랜젝션을 수행하는 경우에는 그리 적합하지 않다. 이런 많은 수의 클라이언트가 트랜젝션을 수행하는 경우에는 네트워크 대역폭을 늘리거나, 아니면 NFS 서버에 복수의 네트워크 카드를 부착하여 물리적으로 클라이언트들을 하부 네트워크로 분할하여 네트워크 대역폭에 따른 트래픽을 분산시키는 방법 등을 사용 해야 한다.

댓글 없음: