nfs란
nfs 구축 필요성
nfs 사용시 주의 점
리눅스 호스트의 nfs 서버 환경 설정
nfs 실행
nfs 동작 시험
nfs 문제시 점검 사항

nfs란

nfs는 Network File System의 약자로 RPC를 이용하여 리모트 호스트 상의 파일을 유저가 마치 로컬 파일에 엑세스 하듯이 엑세스 할 수 있도록 해 줍니다. 이는 리모트 호스트 파일 시스템을 사용하는 클라이언트 측의 커널 기능과 서버측(데이터를 제공하는)의 nfs 서버의 혼합으로 가능하며, nfs의 파일 엑세스는 다양한 서버와 호스트 아키텍쳐에서 동작이 가능합니다. 아울러 nfs는 다음과 같은 이점을 제공합니다.

  • 개발 호스트에서 개발된 내용을 타겟 보드에서 바로 사용이 가능합니다.
  • 여러 개발자가 하나의 PC에 개발된 내용을 동시에 공유가 가능합니다.
  • 개발된 어플리케이션의 크기에 관계 없이 수행이 가능합니다.

nfs 구축 필요성

타겟 보드로 개발된 리눅스 어플리케이션 이나 리눅스 디바이스 드라이버를 전송할 때 때 부트로더를 이용하거나 tftp 만을 사용해야 한다면 개발하기가 매우 힘이 듭니다. 부트로더만 이용해야 한다면 프로그램이 버전업될 때 마다 매번 램디스크 이미지를 만들어서 부트로더로 다운로드 하여야 하기 때문입니다.

tftp를 이용한다고 하더라도 역시 버전업 때마다 tftp 명령을 실행해서 파일을 개발 호스트에서 타겟보드로 복사를 먼저 실행한 후에야 실행할 수 있습니다.

그러나 nfs를 이용하면 개발 호스트의 공유 디렉토리를 마치 타겟보드의 일부 디렉토리처럼 사용할 수 있어서 앞서 말씀드린 불편한 절차를 수행할 필요가 없이 매우 편리합니다. 즉, 개발 호스트에서 작업하는 하는 디렉토리를 nfs 서버를 통해 공개하고, 타겟보드는 호스트에서 제공하는 nfs 공유 디렉토리는 자신의 디렉토리로 마운트하여 사용하며, 개발 호스트에서 작업이 완료되면 타겟보드에서는 완료된 프로그램을 실행하여 디버깅을 할 수 있습니다.

nfs 사용시 주의 점

nfs를 사용하시기 위해서는 아래의 내용을 주의하셔야 합니다.

  • 특수 파일은 nfs에 연결된 디렉토리에 만들수 없습니다. ( 예:장치 파일 )
  • 읽고 쓰는 속도가 빠른 파일로는 사용이 곤란합니다. ( 멀티미디어 파일 )

리눅스의 nfs는 많은 면에서 Rick Sladkey가 노력의 결과라 할 수 있습니다. 그는 nfs 커널 소스와 nfs 서버의 많은 부분을 썼는데, 후자는 원래 Mark Shand가 쓴 unfsd user-space nfs 서버와 Donald Becker가 쓴 hnfs Harris nfs서버에서 유래한 것입니다.

nfs에 대한 자셍한 설명은 아래의 링크를 참고하여 주십시오.

http://kldp.org/Translations/html/NAG/11.html

리눅스 호스트의 nfs 서버 환경 설정

nfs 서버 환경을 설정해 보겠습니다. 제일 먼저 nfs 서버를 통해 공유할 디렉토리를 만듭니다. 또는 기존 디렉토리를 선택합니다. 본 설명에서는 /home/nfs 폴더를 만들고 공유하도록 하겠씁니다.

]# cd /home
]# mkdir nfs

새로 만들어진 /home/nfs를 다른 호스트로 공유하기 위해서는 nfs 서버의 환경 파일에 등록해야 합니다. nfs의 공유 폴더 정보 내용은 /etc/exports 에 등록하므로 이 파일을 아래와 같이 수정합니다.

]# vi /etc/exports
/home/nfs 192.168.10.*(rw,sync,no_root_squash)

위 내용의 의미는 다음과 같습니다.

  • /home/nfs : 공유 디렉토리
  • 192.168.10.* : 192.168.10.xxx 네트워크 IP를 사용하는 모든 호스트에게 공
  • rw : 읽기(r)와 (w)쓰기를 허용
  • ro : 읽기만 가능
  • sync : 클라이언트가 파일 쓰기를 완료한 후 디스크 동기화를 진행
  • no_root_squash : 클라이언트에게 root권한을 부여
  • root_squash : 클라이언트에 nfsnobody 권한을 갖도록 설정
  • noaccess : 디렉토리를 접근하지 못하게 막음
  • insecure : 암호 인증을 하지 않음

nfs 실행

환경 설정이 끝났다면 다음 명령을 수행하여 nfs 서버를 실행합니다.

]# /etc/init.d/nfs restart
NFS mountd를 종료 중:                                      [실패]
NFS 데몬을 종료 중:                                        [실패]
NFS quota를 종료 중:                                       [실패]
NFS 서비스를 종료 중:                                      [실패]
NFS 서비스를 시작 중:                                      [  OK  ]
NFS 쿼터를 시작 중:                                        [  OK  ]
NFS 데몬을 시작 중:                                        [  OK  ]
NFS mountd를 시작 중:                                      [  OK  ]
[root@jwCentOS5 ~]#

리눅스 배포본에 따라 /etc/init.d/nfs 가 없다면 /etc/rc.d/init.d/nfs 를 이용하십시오.

또는 ntsysv를 실행하시고 nfs를 등록하시면 리눅스 시스템이 부팅될 때 마다 자동으로 nfs가 실행됩니다.

root 권한으로 ntsysv를 실행합니다.

]# ntsysv

서비스를 선택하고 [확인] 버튼을 클릭합니다.

nfs 동작 시험

개발 호스트가 제공하는 nfs 공유 디렉토리를 타겟보드에서 마운트하겠습니다. EZ보드에는 nfs 디렉토리를 마운트하기 위해 /mnt/nfs 디렉토리가 미리 준비되어 있습니다. mount 명령으로 공유 디렉토리를 /mnt/nfs 리렉토리로 마운트 합니다.

아래의 내용은 타겟보드에서 실행한 내용입니다.

]$ mount -t nfs -o nolock 192.168.10.50:/home/nfs /mnt/nfs
]$ cd /mnt/nfs
]$ ls -al          // 개발 호스트의 /home/nfs 의 파일 내용입니다.
drwxr-xr-x    2 1007     1001         1024 Oct 19  2007 .
drwxr-xr-x   18 root     root         1024 Dec 17  2007 ..
-rwxr-xr-x    1 1007     1001          938 Oct 19  2007 zImage.ez-s3c2440
]$

를 수행한다.

수행 시 아무런 메시지가 나오지 않는 것이 정상이지만 간혹 다음과 같은 메시지를
표출한다. nfs warning: mount version older than kernel 이것은 에러가 아니다.
마운트된 디렉토리에 임의의 파일을 쓴 후 /nfs에 같은 파일이 있으면 정상이다.

nfs 문제시 점검 사항

nfs를 사용시 문제가 발생하면 다음 내용을 확인하십시오.

  • nfs warning: mount version older than kernel
    이것은 에러가 아닙니다. 개발 호스트에서 nfs 공유 디렉토리로 파일을 생성했을 때, 역시 마운트하여 사용하는 타겟보드에서도 파일이 보인다면 정상입니다.
  • 커널 지원 옵션
    nfs는 커널에 포함되어야 하는데 nfs 지원이 커널에 포함되어 있는지를 확인하기 위해서는 /proc/filesystems에 nfs 항목이 있는가를 확인하셔야 합니다. 만약 포함되어 있지 않다면 커널 옵션의 nfs 지원을 활성화 시킨 후 재 컴파일하여 설치합니다.
  • nfs 서버 데몬 확인
    nfs 서비스를 정상적으로 수행하기 위한 스크립트는 /etc/rc.d/init.d/nfs 입니다.
  • portmap
    이 서비스는 RPC 서비스를 TCP/UDP 포트에 연결하는 역할을 합니다. RPC를 이용한 프로그램이 시작되면 그 프로그램은 자신이 제공하는 서비스와 자신이 사용하는 포트를 portmap 에 등록하게 됩니다. 그리고, 클라이언트는 portmap에 문의한 후, 원하는 서버에 접근할 수 있는 방법을 알아내게 됩니다.

    리눅스에서 돌아가고 있는 portmapper를 확인하려면 다음과 같이 확인하시면 됩니다.

    ]# ps aux | grep portmap  
    rpc       1929  0.0  0.2   1788   600 ?        Ss   19:56   0:00 portmap
    root      3028  0.0  0.2   5020   692 pts/1    R+   20:43   0:00 grep portmap

  • rpc.mountd
    외부에서 마운트 요청이 오면 응답해 주는 역할을 합니다. nfs 클라이언트가 서버의 파일 시스템을 이용하기 위해서는 먼저 서버가 자신의 파일 시스템을 nfs를 이용해 다른 호스트가 공유할 수 있도록 설정해 주기 위해서 리눅스에서는 /etc/exports 라는 파일을 이용합니다.

    nfs 클라이언트가 공유된 nfs 서버의 파일 시스템을 이용하기 위해서는 반드시 서버의 파일 시스템을 마운트 해야 하며, nfs 클라이언트가 마운트를 요청해오면, rpc.mountd (mountd) 데몬이 /etc/exports 파일의 설정에 따라 마운트 요청을 처리합니다.

  • rpc.nfsd
    서버파일을 클라이언트에 제공하는 역할을 합니다. nfs 클라이언트 마운트 요청시 rpc.mountd가 클라이언트의 마운트 요청을 받아들이면, nfs 클라이언트는 마운트된 파일 시스템에 대해 다양한 작업을 할 수 있습니다.

    rpc.nfsd 데몬은 클라이언트가 작업을 수행하면서 서버 쪽 파일 시스템에 무언가를 요구하게 되면 이를 맡아서 처리하게 됩니다.

    리눅스에서 돌아가고 있는 rpc 데몬들을 확인하려면 다음과 같이 하면 됩니다.

    ]# ps aux | grep rpc
    rpc       1929  0.0  0.2   1788   600 ?        Ss   19:56   0:00 portmap
    rpcuser   1964  0.0  0.2   1804   724 ?        Ss   19:56   0:00 rpc.statd
    root      2006  0.0  0.2   5396   588 ?        Ss   19:56   0:00 rpc.idmapd
    root      2968  0.0  0.0   4968   244 ?        Ss   20:35   0:00 rpc.rquotad
    root      2972  0.0  0.0      0     0 ?        S<   20:35   0:00 [rpciod/0]
    root      2984  0.0  0.3   1960   816 ?        Ss   20:35   0:00 rpc.mountd
    root      3034  0.0  0.2   5024   692 pts/1    R+   20:45   0:00 grep rpc
    ]#

    rpc.nfsd의 적절한 설정 수는 nfs의 성능에 영향을 받게 됩니다. 이론적으로 수천개의 rpc.nfsd 를 실행하는 것이 가능하지만 임베디드의 시스템 및 성능을 고려 하여 일반적으로 4개 미만의 rpc.nfsd를 실행시키는 것이 적절합니다.
  • rpc.lockd
    파일 잠금을 통해 여러 명이 동시에 한 파일을 수정하는 것을 막을 때 사용하지만 리눅스에서는 실행되지 않습니다. 하지만 ntsysv 명령으로 이 데몬을 수행하시면 됩니다.
  • 데몬 실행 확인
    위의 데몬들이 제대로 실행되었는지를 확인하기 위해서는 rpcinfo -p 명령을 통해서 rpc.mountd와 rcp.nfsd가 portmap에 제대로 등록되었는지를 확인합니다. 등록된 이름은 실제 데몬 이름과 약간 다를 수 있으며, rpc.mountd 가 mountd로 rpc.nfsd가 nfsd로 등록 될 수도 있습니다.
    ]# rpcinfo -p
       프로그램 버전 원형   포트
        100000    2   tcp    111  portmapper
        100000    2   udp    111  portmapper
        100024    1   udp  32768  status
        100024    1   tcp  32768  status
        100011    1   udp    633  rquotad
        100011    2   udp    633  rquotad
        100003    2   udp   2049  nfs
        100003    3   udp   2049  nfs
        100003    4   udp   2049  nfs
        100021    1   udp  32822  nlockmgr
        100021    3   udp  32822  nlockmgr
        100021    4   udp  32822  nlockmgr
        100005    1   udp    616  mountd
        100005    1   tcp    619  mountd
        100005    2   udp    616  mountd
        100005    2   tcp    619  mountd
        100005    3   udp    616  mountd
        100005    3   tcp    619  mountd
    ]#
  • 그 외
    그 외적인 요인으로는 방화벽이나 네트웍 문제입니다. 이 문서에는 이에 대한 내용을 언급하지 않겠습니다만 방화벽을 완전히 제거하기를 원한다면 다음 명령을 사용하십시오.

    ]# /sbin/ipchains -F

    이 명령이 없다면 설치된 리눅스 배포본과 버전에 따라 방화벽을 제거하여 주십시오.