강좌
클라우드/리눅스에 관한 강좌입니다.
네트워크 분류

리눅스마스터1급 : NFS 서버 설정하기

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

리눅스마스터1: NFS 서버 설정하기





 

 

1) NFS 서버 설정

 

 

NFS 서버는 항상 클라이언트가 자신의 자원을 마운트할 수 있도록 준비하고 있어야 하는데 이러한 과정을 exporting이라고 한다.

 

 

 

따라서 클라이언트가 항상 NFS 데몬인 mounted, nfsd 두 데몬이 프로세스 상에서 작동할 수 있도록 설정해야 한다.

 

 

 

/usr/sbin/rpc.nfsd 데몬은 클라이언트의 파일 시스템 요청을 처리하며 /usr/sbin/rpc.mountd 데몬은 NFS접근 정보에 대한 요청과 파일 시스템 마운트 요청에 대해 응답을 해 주는 RPC 서버이다.

 

 

 

 

 

NFS 서버에서 exporting 설정은 /etc/exports 파일에 마운트 디렉토리와 마운트 할 수 있는 컴퓨터 목록과 옵션을 첨가해 줌으로써 가능하다.

 

 

 

/etc/exports 파일에서 사용 가능한 옵션은 다음과 같다.

 

 

 

 

 

옵션

기능

root_squash

클라이언트에서 루트를 서버상에 nobody 사용자로 매핑

no_root_squash

서버와 클라이언트가 root 계정을 사용

ro

공유된 자원을 읽기 전용으로 마운트

rw

공유된 자원을 읽기/쓰기로 마운트

insecure

인증되지 않은 액세스도 가능하도록 함

link_relative

절대 심볼리 링크를 상대 심볼릭 링크로 변경시 사용

 

 

 

다음 예제는 /etc/exports 파일의 내용을 보여주고 있다.

 

 

 

 

 

 

 

 

 

[root@sulinux ~]# cat /etc/exports

/home/sulinux sulinux.net(ro)

/home/sulinux linux.co.kr(rw)

 

 

 

 

 

 

 

위의 예제는 /home/sulinux 디렉토리를 sulinux.netlinux.co.kr 두 개의 클라이언트 컴퓨터들이 마운트할 수 있도록 해 주며, sulinux.net 클라이언트 컴퓨터는 읽기 전용으로 마운트 되고, linux.co.kr 클라이언트 컴퓨터는 읽기/쓰기 전용으로 마운트되는 것을 보여주고 있다.

 

 

 

 

 

이렇게 설정이 끝나면 클라이언트가 NFS 파일 시스템을 마운팅할 수 있도록 NFS 데몬을 실행해 주어야 하는데, 다음 예제는 이것을 보여주고 있다.

 

 

 

 

 

 

 

 

 

[root@sulinux init.d]# pwd

/etc/rc.d/init.d

[root@sulinux init.d]# cat nfs

#!/bin/sh

#

# nfs This shell script takes care of starting and stopping

# the NFS services.

#

# chkconfig: - 60 20

# description: NFS is a popular protocol for file sharing across TCP/IP \

# networks. This service provides NFS server functionality, \

# which is configured via the /etc/exports file.

# probe: true

# config: /etc/sysconfig/nfs

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Source networking configuration.

[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network

 

# Check for and source configuration file otherwise set defaults

[ -f /etc/sysconfig/nfs ] && . /etc/sysconfig/nfs

 

RETVAL=0

 

# See how we were called.

case "$1" in

start)

 

# Check that networking is up.

[ "${NETWORKING}" = "no" ] && exit 6

 

[ -x /usr/sbin/rpc.nfsd ] || exit 5

[ -x /usr/sbin/rpc.mountd ] || exit 5

[ -x /usr/sbin/exportfs ] || exit 5

# Don't fail if /etc/exports doesn't exist; create a bare-bones

# version and continue.

[ -r /etc/exports ] || \

{ touch /etc/exports && chmod u+rw,g+r,o+r /etc/exports ; } || \

{ echo "/etc/exports does not exist" ; exit 0 ; }

[ -z "$MOUNTD_NFS_V2" ] && MOUNTD_NFS_V2=default

[ -z "$MOUNTD_NFS_V3" ] && MOUNTD_NFS_V3=default

# Number of servers to be started by default

[ -z "$RPCNFSDCOUNT" ] && RPCNFSDCOUNT=8

 

# Remote quota server

[ -z "$RQUOTAD" ] && RQUOTAD=`type -path rpc.rquotad`

 

# Start daemons.

[ -x /usr/sbin/rpc.svcgssd ] && /sbin/service rpcsvcgssd start

 

action $"Starting NFS services: " /usr/sbin/exportfs -r

 

# Set the ports lockd should listen on

if [ -n "$LOCKD_TCPPORT" ]; then

/sbin/sysctl -w fs.nfs.nlm_tcpport=$LOCKD_TCPPORT >/dev/null 2>&1

fi

if [ -n "$LOCKD_UDPPORT" ]; then

/sbin/sysctl -w fs.nfs.nlm_udpport=$LOCKD_UDPPORT >/dev/null 2>&1

fi

 

if [ -n "$RQUOTAD" -a "$RQUOTAD" != "no" ]; then

echo -n $"Starting NFS quotas: "

[ -n "$RQUOTAD_PORT" ] \

&& RPCRQUOTADOPTS="$RPCRQUOTADOPTS -p $RQUOTAD_PORT"

daemon rpc.rquotad $RPCRQUOTADOPTS

RETVAL=$?

echo

fi

echo -n $"Starting NFS daemon: "

daemon rpc.nfsd $RPCNFSDARGS $RPCNFSDCOUNT

RETVAL=$?

echo

[ $RETVAL -ne 0 ] && exit $RETVAL

 

[ -n "$MOUNTD_PORT" ] \

&& RPCMOUNTDOPTS="$RPCMOUNTDOPTS -p $MOUNTD_PORT"

 

case $MOUNTD_NFS_V1 in

no|NO)

RPCMOUNTDOPTS="$RPCMOUNTDOPTS --no-nfs-version 1" ;;

esac

 

case $MOUNTD_NFS_V2 in

no|NO)

RPCMOUNTDOPTS="$RPCMOUNTDOPTS --no-nfs-version 2" ;;

esac

case $MOUNTD_NFS_V3 in

no|NO)

RPCMOUNTDOPTS="$RPCMOUNTDOPTS --no-nfs-version 3" ;;

esac

 

echo -n $"Starting NFS mountd: "

daemon rpc.mountd $RPCMOUNTDOPTS

RETVAL=$?

echo

[ $RETVAL -ne 0 ] && exit $RETVAL

touch /var/lock/subsys/nfs

 

# Let rpc.idmapd know that rpc.mountd just started

[ -x /usr/sbin/rpc.idmapd ] && /sbin/service rpcidmapd condstart

 

;;

stop)

# Stop daemons.

echo -n $"Shutting down NFS mountd: "

killproc rpc.mountd

echo

echo -n $"Shutting down NFS daemon: "

killproc nfsd -2

echo

if [ -n "$RQUOTAD" -a "$RQUOTAD" != "no" ]; then

echo -n $"Shutting down NFS quotas: "

killproc rpc.rquotad

RETVAL=$?

echo

fi

# Do it the last so that clients can still access the server

# when the server is running.

cnt=`/usr/sbin/exportfs -v | /usr/bin/wc -l`

if [ $cnt -gt 0 ]; then

action $"Shutting down NFS services: " /usr/sbin/exportfs -au

else

action $"Shutting down NFS services: " /bin/false

fi

[ -x /usr/sbin/rpc.svcgssd ] && /sbin/service rpcsvcgssd stop

rm -f /var/lock/subsys/nfs

;;

 

status)

[ -x /usr/sbin/rpc.svcgssd ] && /sbin/service rpcsvcgssd status

status rpc.mountd

status nfsd

if [ -n "$RQUOTAD" -a "$RQUOTAD" != "no" ]; then

status rpc.rquotad

fi

RETVAL=$?

;;

restart)

$0 stop

$0 start

;;

reload)

/usr/sbin/exportfs -r

touch /var/lock/subsys/nfs

;;

probe)

if [ ! -f /var/lock/subsys/nfs ] ; then

echo $"start"; exit 0

fi

/sbin/pidof rpc.mountd >/dev/null 2>&1; MOUNTD="$?"

/sbin/pidof nfsd >/dev/null 2>&1; NFSD="$?"

if [ $MOUNTD = 1 -o $NFSD = 1 ] ; then

echo $"restart"; exit 0

fi

if [ /etc/exports -nt /var/lock/subsys/nfs ] ; then

echo $"reload"; exit 0

fi

;;

condrestart)

[ -x /usr/sbin/rpc.svcgssd ] && /sbin/service rpcsvcgssd condrestart

[ -f /var/lock/subsys/nfs ] && {

$0 stop

$0 start

}

;;

*)

echo $"Usage: nfs {start|stop|status|restart|reload|condrestart}"

RETVAL=3

;;

esac

 

exit $RETVAL

 

 

 

 

 

 

 

 

 

[root@sulinux init.d]# ./nfs stop

NFS mountd를 종료 중: [ OK ]

NFS 데몬을 종료 중: [ OK ]

NFS 서비스를 종료 중: [ OK ]

[root@sulinux init.d]# ./nfs start

NFS 서비스를 시작 중: [ OK ]

NFS 쿼터를 시작 중: [ OK ]

NFS 데몬을 시작 중: [ OK ]

NFS mountd를 시작 중: [ OK ]

 

 

 

 

 

 

 

 

위 쉘 스크립트 중간을 보면 이전에 설명하였던 2개의 데몬인 rpc.mountd, rpc.nfsd 데몬이 같이 실행되는 것을 볼 수 있다.

 

 

 

 

2) 클라이언트 NFS 마운트

 

 

 

클라이언트에서 NFS 서버를 마운트하기 위해서는 portmap 데몬이 항상 동작하고 있어야 하고 그런 다음에 mount 명령이나 부팅 시 자동으로 마운트 되도록 /etc/fstab 파일을 이용한다.

 

 

 

다음 예제는 mount 명령을 이용하여 NFS 서버에 마운트하는 것을 보여주고 있는 것으로 사용 형식은 아래와 같다.

 

 

 

 

 

 

 

 

 

mount [-t nfs] 서버:디렉토리 /마운트위치

 

[root@sulinux ~]# mount nfs.linux.co.kr:/home/linux /mnt/linux

[root@sulinux ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

18G 1.5G 16G 9% /

/dev/hda1 99M 12M 82M 13% /boot

tmpfs 502M 0 502M 0% /dev/shm

nfs.linux.co.kr:/home/linux

47G 36G 9.2G 80% /mnt/linux

[root@sulinux ~]#

 

 

 

 

 

만약에 /etc/fstab 파일에 NFS 파일 시스템 정보를 추가하면 부팅 시 자동으로 NFS를 마운트할 수 있다.

 

 

 

다음 예제는 NFS 서버에 있는 디렉토리를 마운트하는 것을 보여주고 있다.

 

 

 

 

 

 

 

 

 

[root@sulinux /]# cat /etc/fstab

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1

LABEL=/boot /boot ext3 defaults 1 2

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

/dev/VolGroup00/LogVol01 swap swap defaults 0 0

nfs.linux.co.kr:/home/linux /mnt/linux nfs timeo=25

[root@sulinux /]#

 

 

 

 

 

다음 표는 NFS를 마운트할 때 사용되는 옵션과 각각의 의미를 보여주고 있다.

 

 

 

 

 

옵션

의미

rsize

NFS 서버로부터 읽어들이는 바이트 수를 지정하는 것으로 기본은 1024바이트

wsize

NFS 서버에 기록할 때 사용하는 바이트 수를 지정하는 것으로 기본은 1024바이트

timeo

클라이언트에서 타임아웃이 발생되고 나서, 다시 재전송 요구를 보낼 때 사용하는 시간

retrans

재전송 횟수를 지정

port

NFS 서버에 연결할 때 사용하는 포트 번호 지정

fg

NFS 서버에 타임아웃이 발생되면 즉각 접속을 중지

intr

타임아웃이 발생하면 신호를 보내 NFS 호출을 인터럽트

hard

타임아웃이 발생되는 "server not responding" 메시지를 출력하고 계속 재시도

soft

타임아웃이 발생하면 I/O 에러 표시

 

마운트된 NFS 서버의 디렉토리를 언마운트 하려면 다음과 같은 형식으로 사용한다.

 

 

 

 

 

 

 

 

[root@sulinux /]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

18G 1.5G 16G 9% /

/dev/hda1 99M 12M 82M 13% /boot

tmpfs 502M 0 502M 0% /dev/shm

nfs.linux.co.kr:/home/linux

47G 36G 9.2G 80% /mnt/linux

[root@sulinux /]# umount /mnt/linux

[root@sulinux /]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

18G 1.5G 16G 9% /

/dev/hda1 99M 12M 82M 13% /boot

tmpfs 502M 0 502M 0% /dev/shm

 

 

 

 

 

 

 

 

지금까지 NFS 기능을 이용하여 NFS 서버가 가지고 있는 자원을 NFS 클라이언트가 접속하여 자원을 어떻게 사용하는지에 대해 알아보았다.

 

 

 

그러나 이렇게 NFS 서버를 쉽게 접근할 수 있다는 것은 그만큼 보안에 취약하므로 이것만 보완한다면 매우 훌륭한 NFS 서버가 될 것이다.

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,034 명
  • 현재 강좌수 :  35,791 개
  • 현재 접속자 :  98 명