본문으로 바로가기

NFS

category Linux/Linux Network 2017. 9. 14. 21:19
  • NFS ( Network File System )
NFS는 컴퓨터 사용자가 원격지 컴퓨터에 있는 파일을 마치 자신의 컴퓨터에 있는 것처럼 검색하고, 마음대로 저장하거나 수정하도록 해주는 클라이언트/서버형 응용프로그램이다. 사용자 시스템에는 NFS 클라이언트가 있어야하며, 다른 컴퓨터 (원격지의 컴퓨터)에는 NFS 서버가 설치되어 있어야 한다. 또한, 둘 모두 TCP/IP 프로토콜이 설치되어 있어야 하는데, 왜냐하면, NFS 서버와 클라이언트가 파일을 보내거나 수정하는 프로그램으로 TCP/IP를 사용하기 때문이다 (그러나, 초기버전의 NFS에서는 TCP 대신에 UDP가 사용되기도 한다). 

# rpcinfo -p  /* rpc 정보 확인 */

 

    프로그램 버전 원형   포트

    100000    2   tcp    111  portmapper

    100000    2   udp    111  portmapper

    100024    1   udp    910  status

    100024    1   tcp    913  status

 


# service nfs restart


# rpcinfo -p 

 

   프로그램 버전 원형   포트

    100000    2   tcp    111  portmapper

    100000    2   udp    111  portmapper

    100024    1   udp    910  status

    100024    1   tcp    913  status

    100011    1   udp    691  rquotad

    100011    2   udp    691  rquotad

    100011    1   tcp    694  rquotad

    100011    2   tcp    694  rquotad

    100003    2   udp   2049  nfs

    100003    3   udp   2049  nfs

    100003    4   udp   2049  nfs

    100021    1   udp  54371  nlockmgr

    100021    3   udp  54371  nlockmgr

    100021    4   udp  54371  nlockmgr

    100003    2   tcp   2049  nfs

    100003    3   tcp   2049  nfs

    100003    4   tcp   2049  nfs

    100021    1   tcp  53183  nlockmgr

    100021    3   tcp  53183  nlockmgr

    100021    4   tcp  53183  nlockmgr

    100005    1   udp    730  mountd

    100005    1   tcp    733  mountd

    100005    2   udp    730  mountd

    100005    2   tcp    733  mountd

    100005    3   udp    730  mountd

    100005    3   tcp    733  mountd

 

-> nfs 서비스를 실행하면 TCP와 UDP포트를 사용하는 것을 알수 있다.

-> nfs, requotad, nlockmgr, mountd 있다. 


  •  NFS Server
- NFS 서버 데몬
NFS 서버는 언제든지 클라이언트가 마운트 할 수 있도록 준비 되어 있어야 하며 NFS는 rpc.mountd, rpc.nfsd 두 데몬을 가지고 있다. rpc.mountd 데몬과 rpc.nfsd 데몬은 RPC 기반의 서비스이기 때문에, rpcbind(portmapper)가 반드시 떠 있어야만 사용이 가능하다.


-------NFS Client-------                    -------NFS Server-------
mount                                           share

rpc.statd                                     rpc.mountd     rpc.rquotad
rpc.lockd                                    rpc.nfsd       rpc.statd    rpc.lockd


- 버전
v2 /v3 
rpc.mountd NFS mount daemon /* 클라이언트에 마운트 요청에 응답 */
rpc.nfsd NFS server process /* 클라이언트가 마운트 된 자원을 사용할 수 있도록 도움 */
rpc.rquotad(rquotad) remote quota server /* 쿼타 설정 관리*/
rpc.statd NSM(Network Status Monitor) status monitor /* 연결이 되어있는지 상태정보 확인*/
rpc.lockd start kernel lockd process /* 락킹 알고리즘 */
portmapper DARPA port to RPC program number mapper

v4
rpc.nfsd (mount) NFS server process  (+rpc.mountd)/* 클라이언트가 마운트 요청에 응답 마운트 된 자원을 사용할 수 있도록 도움 */
rpc.rquotad(rquotad) remote quota server /* 쿼타 설정 관리*/
rpc.statd NSM(Network Status Monitor) status monitor /* 연결이 되어있는지 상태정보 확인*/
rpc.lockd start kernel lockd process /* 락킹 알고리즘 */
portmapper DARPA port to RPC program number mapper


- 관련파일
/etc/exports(NFS Server)에서 부팅시에 공유하는 정보를 담는 파일
/etc/fstab (NFS Client)에서 부팅시에 마운트하는 정보를 담는 파일


# cat /etc/exports  /* 비어있기때문에 체워넣어야한다. 다음은 예시 */

 

 #

# sample /etc/exports file

#

#/               master(rw) trusty(rw,no_root_squash)

#/projects       proj*.local.domain(rw)

#/usr            *.local.domain(ro) @trusted(rw)

#/home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)

#/pub            (ro,insecure,all_squash)

/backup         backupserver(rw,no_root_squash)

/share          *(rw)

 


[참고] exports 의 공유 옵션

 

 옵션

설명

 

 

 root_squash

 클라이언트에서 root 사용자를 서버상에서는 nobody 사용자로 매핑한다.

 

 

 no_root_squash

서버와 클라이언트 모두 같은 root를 사용한다. 즉, 클라이언트에서의 root 사용자의 요청을 서버의 root 사용자로 매핑한다. ( 기본값 )

 

 

 ro

 파일시스템을 읽기 전용(Read Only)로 마운트한다.

 

 

 rw

 파일시스템을 읽고 쓸수 있도록 마운트한다.(Read/Write)

 

 

 insecure

 인증되지 않은 접근도 가능하도록 한다.

 

 

 link_relative

 심볼릭 링크를 상대 심볼릭 링크로 바꿀 때 사용한다.

 

 

 noaccess

 지정된 디렉토리에는 접근을 금지한다. 특정시스템에 대한 공유 디렉토리 일부를 접근 못하게 할 경우에 사용한다.

 

 

 anonuid, anongid

 익명사용자(Anonymous/Nobody 사용자에 대한 UID/GID 번호 맞추기

 


(주의) /etc/exports 설정의 차이점

1. /home test.example.com(rw)

2. /home test.example.com  (rw)    /* /home    test.example.com(ro)  *(rw) */

-> 1. /home 폴더가 test.example.com 도메인을 가진 Client에게 rw 권한을 가지고 공유한다.

-> 2. /home 폴더가 test.example.com 도메인을 가진 Client에게 ro 권한을 가지고 공유하고 모든 호스트에게 rw 권한으로 공유한다.

-띄어쓰기 조심-


# cat /etc/fstab

 

 #

# (1) NFS Test

#

nfs.linux.co.kr:/usr/local    /usr/local        nfs    timeo=15,intr    0 0

 

-> mount 장치         마운트포인터  파일시스템  옵션         외부자원이므로 백업 받을 필요 x

->nfs.linux.co.kr 서버의 /usr/local 디렉토리를 로컬시스템의 /usr/local 디렉토리에 NFS을 통해 마운트한다. 마운트시 timeout 시간은 15초, 중간에서 인터럽트(Interrupt) 걸수 있도록 설정 되어 있다.

-> 이러한 설정을 하지 않으면 마운트 시도를 계속 하게된다. 그렇게 되면 서버가 정상 작동하지 않는다.


[참고] /etc/fstab 파일의 마운트 옵션

 

 옵션

설명 

 

 

 timeo=n 

 RPC 타임아웃이 발생되고 나서 첫번째 재전송 요구를 보낼때 사용되는 시간, 기본값은 7(1/10초)

 

 

 intr

 주 타임아웃이 발생되었을 때 신호를 보내 NFS 호출을 인터럽트한다.

 

 

 rsize=n

 NFS 서버로부터 읽어들이는 바이트 수 지정, 기본값은 1024Bytes

 

 

 wsize=n

 NFS 서버에 쓰기할 때 사용하는 바이트 수 지정, 기본값은 1024Bytes

 

 

 retrans=n

 주 타임아웃을 발생시키는 부 타임아웃을 재전송 회수 기본값은 3번의 타임아웃

 

 

 port=n

 NFS 서버와 연결할 수 있는 포트번호 지정

 

 

 fg

 첫번째 NFS 마운트 시도에서 타임아웃이 발생되면 즉시 중단함. 기본값

 

 

 hard

 주 타임아웃이 발생되면 "server not responding"을 출력하고 무한정 재시도

 

 

 soft

 주 타임아웃이 발생되면 프로그램에게 I/O 에러 보고

 



- NFS 명령어
exportfs 명령어         (NFS Server) 공유자원을 확인 할 때 사용하는 명령어
showmount 명령어 (NFS Client) 공유할 자원 확인 할 때 사용하는 명령어
mount 명령어 (NFS Client) 공유된 자원 마운트 할 때 사용하는 명령어

  • 실습
[조건] Server / Client
Server : 192.168.17.220
Client : 192.168.17.120
( 서버 설정과 클라이언트 설정이 다르므로 주의 )

- NFS 간단 확인
[Server]
# mkdir -p /share    /* 공유 폴더 생성 */
# cp /etc/passwd /share/file1     /* 확인용 파일 생성 */
# vi /etc/exports    /* 공유 폴더 설정파일에 추가 */
/share        192.168.17.0/255.255.255.0(rw)
-> 띄어쓰기 조심 / 클라이언트 대역대를 적어주시면 됩니다. 

# service nfs restart
# chkconfig nfs on

# exportfs /* 공유 폴더 확인 */
/share        192.168.17.0/255.255.255.0

# exportfs -v  /* 옵션 자세히 보기 */
/share          192.168.17.0/255.255.255.0(rw,wdelay,root_squash,no_subtree_check,anonuid=65534,anongid=65534)

[Client]
# showmount -e  192.168.17.220    /* 192.168.17.220에서 공유된 폴더 확인 */
Export list for 192.168.17.220:
/share 192.168.17.0/255.255.255.0
-> /share 폴더가 클라이언트 가 마운트 할수있는 대역대에 공유된것을 확인
-> 대역대가 맞지 않으면 마운트 할 수 없다. = Server가 특정 IP에게만 공유할 수 있다.

# mkdir /p     /* 마운트 포인터 생성 */
# mount 192.168.17.220:/share /p        /* 마운트  -o timeo=10,intr  옵션 권장사항 */
# df -h
192.168.17.220:/share             36G  4.5G   30G  14% /p
-> 추가된 것을 확인 할 수 있다. 

# cd /p     /* 마운트 포인터로 이동 */
# ls     /* 서버에서 만든 file1 확인 */
file1
# cat file1 /* 서버에서 만든 /etc/passwd가 잘 보인다. */

# cd ; umount /p     /* 옵션 지정을 안했기때문에 언마운트작업을 꼭 수행한다. */

- (GUI) system-config-nfs
 툴을 이용한 실습 작업
[Server]
# system-config-nfs


-> /etc/exports 파일의 내용이 보인다. 

더하기 클릭

-> 디렉토리에 공유할 폴더이름을 적고 호스트에 대역대를 적고 권한을 부여하고 확인을 누르면 추가가 된다.

( 툴에는 디렉토리를 생성하는 기능이 없기때문에 반드시 만들어 져있는 디렉토리를 선택한다. )


-> 추가하면 추가된것을 볼 수 있다. 

-> 삭제하려면 클릭하고 지우기를 누르면 된다. 

-> 설정후 나간다. 


# exportfs /* 공유 디렉토리 확인*/

/share2         192.168.17.0

/share          192.168.17.0/255.255.255.0

-> nfs 서비스를 재시작하지 않아도 추가가 되었다. 툴에서 알아서 해준다는 것을 알 수 있다.

# exportfs -v /* 권한 확인 */
/share2         192.168.17.0(ro,wdelay,root_squash,no_subtree_check,anonuid=65534,anongid=65534)
/share          192.168.17.0/255.255.255.0(rw,wdelay,root_squash,no_subtree_check,anonuid=65534,anongid=65534)
-> 권한에서 약간의 차이가 보인다. 

-권한 확인 실습


[Client]
# showmount -e 192.168.17.220    /* TUI 와 GUI로 추가한 디렉토리 하나씩 공유 가능 */
Export list for 192.168.17.220:
/share  192.168.17.0/255.255.255.0
/share2 192.168.17.0

# mount 192.168.17.220:/share /p     /* 마운트 */

# df -h  

192.168.17.220:/share             36G  4.5G   30G  14% /p


# cd /p ; ls    /* 만들어 놓은 file1 파일 확인 가능 앞서 cat 명령어도 가능 하다는것을 확인함 */

file1


# echo 1111 >> file1    /* 수정 확인 */
bash: file1: 허가 거부됨

# ls -l file1 /* file1 퍼미션 확인 */
-rw-r--r-- 1 root root 1945  9월 14 20:05 file1
-> root 사용자의 rw 권한이 있지만 허가가 거부된다.
-> nfs 는 기본값으로 루트만 익명의 사용자로 판단한다. 
why?  
Server는 디렉토리를 공유할때 옵션을 부여하여 공유한다 ( EX: (rw) read write (ro) read only ... )  그러나 각 Client에도 root 사용자가 있기때문에 그 각각의 root 사용자를 관리자의 권한으로 인정해버리면 Server에서 옵션을 (ro)로 주어도 write 기능이 가능해진다. 그러면 Server에서 부여한 옵션이 의미가 없어지고 보안상 위험해 질 수도 있다. 때문에 기본값으로 Client의 root 사용자는 nfs 공유 디렉토리에서는 익명 사용자로 인식한다.

# mkdir /dir     /* 파일을 만들거나 디렉토리를 만드는 것도 거부된다. */
mkdir: `dir1' 디렉토리를 만들 수 없습니다: 허가 거부됨

[Server]
# chmod 777 /share      /* 모든 권한을 다 부여한다. */

[Client]
# mkdir /dir
# touch file2
# ls -l 
합계 8
drwxr-xr-x 2 nfsnobody nfsnobody 4096  9월 14 20:31 dir1
-rw-r--r-- 1 root      root      1945  9월 14 20:05 file1
-rw-r--r-- 1 nfsnobody nfsnobody    0  9월 14 20:31 file2
-> root가 익명 사용자로 인식된다는 것을 알 수 있다. 


- root 사용자 권한 부여
[Server]
# vi /etc/exports /* no_root_squash 옵션 추가 */
/share          192.168.17.0/255.255.255.0(rw,no_root_squash)

# service nfs restart

[Client]
# mkdir dir2
# touch file3
# ls -l
합계 12
drwxr-xr-x 2 nfsnobody nfsnobody 4096  9월 14 20:31 dir1
drwxr-xr-x 2 root      root      4096  9월 14 20:33 dir2
-rw-r--r-- 1 root      root      1945  9월 14 20:05 file1
-rw-r--r-- 1 nfsnobody nfsnobody    0  9월 14 20:31 file2
-rw-r--r-- 1 root      root         0  9월 14 20:33 file3
-> root 사용자의 권한을 얻었다. 

[참고] root 이외의 일반 사용자들
root 이외의 일반 사용자들은 UID와 GID로 판단한다. Server에서 사용자의 이름과는 상관없이 UID가 3000과 사용자가 파일을 만들었다면
Client의 3000번의 UID를 가진 사용자가 그 파일의 소유권을 가진다.  
Server user : testuser UID 3000
ls -l /share/testfile            -rw-rw-r-- 1 testuser  testuser     5  9월 14 20:40 testfile

Client user : test UID 3000
ls -l /p/testfile                  -rw-rw-r-- 1 test      test         0  9월 14 20:39 testfile
-> 아예 이름이 소유권의 이름에 맞게 변경되어 출력된다.       

(실무 예) Diskless Client(EX: Hardless Client)
NFS는 심지어 OS 자체를 공유할 수있다.  적은 용량의 마운트 포인터를 가진 디렉토리로 OS를 서버에서 받아서 사용이 가능하다.

(실무 예) Application Server 
# rpm --root=/disk/app1 -ivh <PKG>.rpm        /* --root=/ -> 정해진 디렉토리에 패키지가 설치된다. */
# vi /etc/exports        /* 패키지가 설치된 디렉토리를 공유한다 */
/disk *(rw)
# service nfs restart 

-> 패키지가 설치된 디렉토리를 공유받아 사용하면 그 패키지를 설치하지 않고도 사용이 가능하다.

- 사용자 홈디렉토리 공유
[Server]
# useradd -u 3000 -g 100 -d /export/home/nfsuser nfsuser     /* UID 3000 GID 100 홈디렉토리 /export/home/nfsuser 로 하는 nfsuser */
# passwd nfsuser

# vi /etc/exports        /* 공유 추가 */
/export/home        192.168.17.0/255.255.255.0(rw)
# service nfs restart

[Client]
# useradd -u 3000 -g 100 -M nfsuser     /* UID 3000 GID 100 -M 홈디렉토리 생성하지 않는다 */
(주의) 홈디렉토리를 공유할 사용자는 UID GID 가 같아야 한다. 
-> 그래야 공유된 디렉토리에서 본인이 소유권을 가진다.  ( 이름은 상관없음 )
-> Server의 디렉토리를 홈디렉토리를 사용하기때문에 홈디렉토리를 따로 만들지않아도 된다. Server에 /etc/skel/* 이미 다 생성되어있다

# showmount -e 192.168.17.220  /* 공유된 폴더 확인 */
# mkdir /home/nfsuser    /* 마운트 포인터 생성 */
# chown nfsuser:users /home/nfsuser   (nfsuser UID: 3000, users GID: 100)    

# mount -o timeo=10.intr 192.168.17.220:/home  /home/nfsuser    /* 마운트 */ ( # vi /etc/fstab )

# df -h     /*확인 */
# su - nfsuser
$ pwd        /* 홈디렉토리가 정상적으로 설정 되었다. */
/home/nfsuser 


[참고] CD NFS
CD또한 공유할 수 있다. 
CD를 넣으면 자동으로 /media 밑에 마운트된다. 
그 마운트된 디렉토리를 /etc/exports 에 추가하고 
클라이언트에서 추가된 디렉토리를 마운트하면 CD를 사용할 수 있다. 
-> 이러한 방법은 CD를 사용할 수 없는 환경에서 유용하게 쓰일 수 있다.

- 원격 백업 서버 구축
[Server]
# mkdir /backup/linux120     /* 공유할 디렉토리 생성 */

# vi /etc/exports     /* 공유할 디렉토리 추가 */
/backup/linux120        192.168.17.120/255.255.255.0(rw,no_root_squash)
-> 백업 파일이 다른 클라이언트와 섞여 오버라이트 되는것을 방지하기위해 특정 IP로 지정해 다른 클라이언트의 접속을 막는다.
-> 백업 파일은 망가졌을때 접속해서 다시 받아온다. root 권한을 부여하면 편하게 바로 받아 올 수 있다.

# service nfs restart

[Client]
# showmount -e 172.16.6.220    /* 자신에게 공유된 백업 디렉토리를 확인한다 */
# mkdir /backup         /* 마운트 포인터 생성 */
# mount -o timeo=10,intr 192.168.17.220:/backup/linux120 /backup    /* 마운트 */

# tar cvzf /backup/home.tar.gz /home  /* home 폴더를 백업받는다. */
-> Client의 /backup 디렉토리에 백업을 받는 것 같이 실행하지만 사실 Server의 /backup/linux120에 저장된다.
-> Client의 home이 손상되어도 Server에 접속해서 백업을 받을 수 있다.

(실무 예) 웹 서버 ( EX : 이중화 )
WEB1(/www)
L4              WEB2(/www)            NFS 서버 (/www)
WEB3(/www)

-> L4는 부하 분산을 담당한다.  ( DNS 도 가능 )
-> 요청이 많은 웹서버는 여러개의 IP의 웹서버가 같은 서비스를 담당한다.
-> 각각의 WEB Server는 각각의 httpd 패키지를 가지고 있으며 NFS 서버또한 같은 패키지를 사용하고 같은 설정을 가진다.
-> 소스는 NFS 서버에 존재하며 나머지 WEB Server는 NFS에서 마운트해서 사용한다.
-> 마운트 되었으므로 자신의 자원인 것처럼 사용이 가능해지고 WEB1에서 소스를 추가해도 공유하고 있는 모든 서버에 적용된다. 
-> WEB 서버 하나가 다운되더라도 소스는 유지되며 서비스에는 문제가 없다. 






'Linux > Linux Network' 카테고리의 다른 글

HAproxy & Keepalived  (0) 2018.05.25
SAMBA  (0) 2017.09.15
Web Mail Server  (0) 2017.09.13
MAIL Server  (0) 2017.09.13
FTP  (0) 2017.09.13