검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Setting Up An NFS Server And Client On CentOS 5.5

  CentOS 5.5에서 입문 수준의 간단한 NFS(Network File System: 네트워크를 통해 파일과 디렉토리를 공유하는 프로토콜) 세팅을 단계별로 보여주는 포스트입니다. 말이 CentOS지 일단 설치만 하면 설정이야 다 똑같지만요. 저는 우분투를 가지고 했기 때문에 우분투에서 차이가 있는 부분은 따로 기술하겠습니다.

1. 서버와 클라이언트의 도메인과 IP
  본 포스트에서 사용할 NFS 서버와 클라이언트의 도메인 및 IP는 다음과 같습니다.
  • NFS 서버 : server.example.com, 192.168.0.100
  • NFS 클라이언트 : client.example.com, 192.168.0.101
2. NFS 설치
  서버와 클라이언트 모두 아래의 두 패키지를 설치합니다.
yum install nfs-utils nfs-utils-lib
  덤으로 우분투라면 아래의 명령어를 통해 설치가 가능합니다.
sudo apt-get install nfs-kernel-server
  그리고 서버의 경우 아래의 명령어를 통해 이후 부팅 시 자동으로 NFS 데몬이 실행되도록 만들고 그것과 별도로 바로 데몬을 실행합니다.
chkconfig --levels 235 nfs on
/etc/init.d/nfs start

3. 서버에서 공유할 디렉토리 설정
  이제 서버에서 공유할 디렉토리를 설정해야 하는데 이 작업을 "export"라고 합니다. 이 포스트에서는 /var/nfs라는 디렉토리를 만들어서 export하겠습니다.

  NFS를 이용할 때 알아둬야 할 것이 있는데 바로 서버가 공유한 디렉토리를 클라이언트가 이용할 때 클라이언트에서 NFS를 이용하는 계정의 UID와 GID 값을 서버에서도 사용한다는 겁니다. 그래서 만약 클라이언트에서 UID 값이 100인 사용자가 어떤 NFS 서버의 공유 디렉토리를 이용하는데 그 서버에서 UID가 100인 사용자가 전혀 다른 사용자라면 클라이언트 사용자는 NFS 서버의 공유 디렉토리에서 전혀 다른 사용자 계정의 권한을 가지고 행동할 수 있습니다. 이것이 특히 문제가 되는 경우는 클라이언트에서 root 계정(UID 0)을 가지고 서버의 공유 디렉토리로 접근하는 경우인데 root 계정의 UID는 0이므로 클라이언트의 root가 서버의 공유 디렉토리에서도 root 계정 권한을 가지고 행동할 수 있게 됩니다. 그렇기 때문에 NFS에서는 클라이언트 계정의 UID가 0일 경우 옵션에서 따로 설정하지 않는 한 기본적으로 클라이언트의 UID와 GID를 65534로 바꿔버립니다. 참고로 NFS는 이 UID에 해당하는 계정와 그룹은 각각 nobody와 nogroup라고 가정합니다.

  하지만 클라이언트의 계정이 일반 계정일 경우 어쨌든 문제가 되기 때문에 저는 옵션을 하나 첨가하여 접속하는 모든 계정의 UID와 GID를 65534로 만들어버리겠습니다. 즉, FTP의 anonymous처럼 만들어버리는 거죠. 먼저 /var/nfs라는 디렉토리를 만들고 대충 권한을 755쯤으로 준 다음에 소유자를 nobody, 소유 그룹을 nogroup으로 만듭니다. 우분투의 경우 물론 명령어 앞에 sudo가 필요하겠죠.
mkdir /var/nfs
chown nobody:nogroup /var/nfs     또는    chown 65534:65534 /var/nfs
chmod 755 /var/nfs
  그런데 여기에 또 함정이 있습니다. 서버에서 /etc/passwd와 /etc/group 파일의 nobody와 nogroup의 UID와 GID를 확인하시기 바랍니다. 만약 두 값이 65534가 아니면 위 명령어 중 chown nobody:nogroup /var/nfs 명령어가 나중에 문제가 됩니다. 왜냐하면 NFS는 (앞으로 할 저의 설정에 의해)클라이언트의 UID와 GID를 65534로 취급할 것인데 위의 chown nobody:nogroup /var/nfs 명령어는 nobody와 nogroup의 UID와 GID가 65534일 것이라고 가정하고 내린 것이기 때문입니다. 따라서 nobody와 nogroup의 UID와 GID가 65534가 아니라면 클라이언트는 저 공유 디렉토리 안에서 주인이 아닌 other의 권한을 가지게 됩니다. 따라서 nobody와 nogroup의 UID와 GID를 65534로 바꾸거나 직접 UID와 GID를 지정해주는 chown 65534:65534 /var/nfs 명령어를 사용해야 합니다.

  이제 NFS의 공유 설정을 담당하는 /etc/exports 파일을 편집해야 합니다. 다음과 같은 줄을 추가합니다.
/var/nfs 192.168.0.101(rw,sync,no_subtree_check,all_squash)
  맨 앞에는 공유할 디렉토리 경로를 입력합니다. 그 다음은 한 칸 띄고 접속을 허용할 IP나 도메인을 입력하고 괄호 안에 적용할 옵션을 나열합니다.

  rw는 읽기/쓰기를 허용하는 옵션으로 이 옵션이 없으면 디렉토리의 퍼미션과 상관없이 쓰기를 할 수 없습니다. sync는 요청한 내용이 서버의 스토리지에 적용된 후에만 응답을 주도록 하는 옵션입니다.

  no_subtree_check는 보안과 관련된 옵션으로 파일시스템의 전체가 아닌 서브 디렉토리를 export한 경우 클라이언트가 파일을 요청했을 때 해당 파일이 해당 파일시스템에 진짜 존재하는지까지만 검사할 것인지, 아니면 export한 디렉토리에 진짜 속해있는지까지 검사할 것인지를 결정하는 옵션 중 전자에 해당하는 옵션입니다. 특별히 신경 쓸 필요는 없는 옵션이며 괜히 보안성 높인다고 후자에 해당하는 subtree_check 옵션을 사용할 경우 파일을 열고 있을 때 어떤 이유로 인해 그 파일의 이름이 바뀔 경우 공유에 문제가 발생할 수 있다는 것을 염두해야 합니다.

  all_squash는 모든 클라이언트를 '손님'으로 취급하겠다는 것으로 '손님'의 디폴트 UID/GID 값은 앞서 65534입니다. 이 옵션으로 인해 모든 클라이언트는 동일한 권한을 가지게 됩니다. 앞에서 제가 한 설정에 따르면 nobody/nogroup에 계정에 해당합니다.

  /etc/exports 파일의 수정이 끝났으면 아래의 명령으로 수정한 내용을 적용합니다. 우분투라면 언제나 그렇듯 앞에 sudo를 추가로 써줍니다.
exportfs -a

4. 클라이언트에서 공유 디렉토리 마운트하기
  서버의 설정이 모두 끝났으므로 이제 클라이언트에서 마운트를 하겠습니다. 먼저 마운트할 디렉토리를 만듭니다.
mkdir ~/nfs
  그리고 마운트를 합니다. 우분투 유저는 sudo를 잊지 맙시다.
mount 192.168.0.100:/var/nfs ~/nfs
  df 명령어를 통해 아래처럼 마운트된 NFS 디렉토리들을 볼 수 있습니다.
mirashi@myservlab:/home/mirashi$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             224G  1.9G  211G   1% /
udev                 1003M  216K 1003M   1% /dev
none                 1003M     0 1003M   0% /dev/shm
none                 1003M  544K 1003M   1% /var/run
none                 1003M     0 1003M   0% /var/lock
none                 1003M     0 1003M   0% /lib/init/rw
/dev/sda1             177M   52M  116M  31% /boot
192.168.1.10:/var/nfs
                      224G  1.9G  211G   1% /home/mirashi/nfs
  마운트된 NFS 공유 디렉토리는 umount를 통해 마운트를 해제할 수 있습니다. 역시 루트 권한이 필요하므로 우분투 유저는 sudo를 사용합시다.


2010/11/19 15:18 2010/11/19 15:18