리눅스마스터1급 : NFS 서버 설정하기
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 2,352 조회
- 0 추천
- 목록
본문
리눅스마스터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.net과 linux.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 서버가 될 것이다.
관련자료
-
이전
-
다음