서버/Linux III 2016. 3. 18. 14:45

Linux III - 08. NFS 서버

 

 

 

login as: root
root@192.168.1.100's password:
Last login: Wed Mar 16 13:40:25 2016 from 192.168.1.1
[root@main /root]#

 

login as: root
root@192.168.1.101's password:
Last login: Fri Mar 18 11:38:25 2016 from 192.168.1.1
[root@clone1 /root]#

 

 

 

 

1. NFS(Network File System)

 

NFS는 TCP/IP 네트워크를 통하여 원격 시스템에 있는 파일을 자신의 시스템에 있는 것처럼 검색, 저장, 삭제, 수정이 가능한 서버/클라이언트 응용 서비스이다. (Ex : 윈도우 폴더 공유) 이때, 로컬 시스템에는 NFS 클라이언트가 있어야하며, 원격 시스템에는 NFS 서버가 준비되어 있어야 한다.

 

@NFS 캡처 내용.pcap


 

 

2. RPC(Remote Procedure Call)

 

RPC는 원격 시스템에 있는 프로그램을 로컬 시스템 프로그램으로 호출하여 사용하는 서비스를 의미한다.

 

 

 

 

3. NFS 서버 데몬

 

NFS 서버는 Standalone 방식이며, 클라이언트가 마운트 할 수 있도록 항상 준비 상태로 있어야 한다, 그리고 다음과 같이 'rpc.mountd', 'rpc.nfsd'라는 2개의 데몬을 갖고 있어야 한다. 이 2개의 데몬은 RPC 기반 서비스이기 때문에 'rpcbind' 서비스(portmapper)가 활성화되어 있어야 한다.

 

 - rpc.mountd : NFS 클라이언트 마운트 요청에 응답하는 데몬

 - rpc.nfsd : NFS 클라이언트가 마운트된 자원을 사용할 수 있도록 해주는 데몬

 


[root@main /root]# pgrep -lf rpcbind
1804 rpcbind


[root@clone1 /root]# chkconfig --list rpcbind
rpcbind         0:해제  1:해제  2:활성  3:활성  4:활성  5:활성  6:해제

 

 

또한, rpc.mountd는 동적 포트를 사용하기 때문에, portmap 기능이 활성화 되어 있어야 한다.

 

[root@main /root]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
~ 중간 생략 ~

 

 

[root@main /root]# chkconfig --list rpcbind

rpcbind         0:해제  1:해제  2:활성  3:활성  4:활성  5:활성  6:해제

 

 

 

4. NFS 서비스 구성

 

 - main에서 공유할 디렉토리를 생성한다.

 

[root@main /root]# cd /var
[root@main /var]# mkdir share1 share2 share3

[root@main /var]# chmod 777 s1 s2 s3

 

 

 - share1, share2, share3 디렉토리에 각각 testfile1, testfile2, testfile3을 생성한다.

 

[root@main /var]# touch share1/testfile1
[root@main /var]# touch share2/testfile2

[root@main /var]# touch share3/testfile3


[root@main /var]# ls -l share1
합계 0
-rw-r--r-- 1 root root 0 2016-03-21 11:06 testfile1


[root@main /var]# ls -l share2
합계 0
-rw-r--r-- 1 root root 0 2016-03-21 11:06 testfile2


[root@main /var]# ls -l share3
합계 0
-rw-r--r-- 1 root root 0 2016-03-21 11:12 testfile3

 


 - '/etc' 디렉토리에 있는 'exports' 파일를 이용하여 공유 설정을 실시한다.


[root@main /var]# cd /etc
[root@main /etc]# ls exports
exports

 

 

[root@main /etc]# vi exports

 

  1 /var/share1 172.20.1.101(rw)
  2 /var/share2 172.20.1.101(ro)
  3 /var/share3 172.20.1.101(rw)

: wq!

 

 

 - NFS 공유 내용을 확인한다. NFS는 Standalone 방식이기 때문에 서비스를 활성화 시켜야 한다.


[root@main /etc]# exportfs
[root@main /etc]#

 

[root@main /etc]# pgrep -lf nfs


[root@main /etc]# ls /etc/init.d/*nfs*
/etc/init.d/nfs  /etc/init.d/nfslock


[root@main /etc]# chkconfig --list nfs
nfs             0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제

 

 

- NFS 서버 데몬을 활성화 한다.

 

[root@main /etc]# service nfs start
NFS 서비스를 시작하고 있습니다:                            [  OK  ]
NFS 쿼터를 시작하고 있습니다:                              [  OK  ]
NFS mountd를 시작중 입니다.                                [  OK  ]
NFS 데몬을 시작함:                                         [  OK  ]
RPC idmapd를 시작 중:                                      [  OK  ]

 

 

- NFS 공유 내용 배포 및 확인한다.

 

[root@main /etc]# exportfs -a

 

[root@main /etc]# exportfs
/var/share1     172.20.1.101
/var/share2     172.20.1.101
/var/share3     172.20.1.101

 


[root@main /etc]# exportfs -v
/var/share1     172.20.1.101(rw,wdelay,root_squash,no_subtree_check)
/var/share2     172.20.1.101(ro,wdelay,root_squash,no_subtree_check)
/var/share3     172.20.1.101(rw,wdelay,root_squash,no_subtree_check)

 

 

[root@main /root]# showmount -e
Export list for main:
/var/share3 172.20.1.101
/var/share2 172.20.1.101
/var/share1 172.20.1.101

 


 - clone1에서 NFS 서비스에서 사용한 NFS, SUNRPC 포트를 확인한다.


[root@main /etc]# cat /etc/services | grep -w nfs
nfs             2049/tcp        nfsd shilp      # Network File System
nfs             2049/udp        nfsd shilp      # Network File System
nfs             2049/sctp       nfsd shilp      # Network File System

 

 

[root@main /etc]# cat /etc/services | grep -w sunrpc
sunrpc          111/tcp         portmapper rpcbind      # RPC 4.0 portmapper TCP
sunrpc          111/udp         portmapper rpcbind      # RPC 4.0 portmapper UDP

 

 

[root@main /etc]# cd
[root@main /root]#

 

 

 - clone1에서 NFS 서버로부터 공유 받을 수 있는 내용을 확인하도록 한다.

 

[root@clone1 /root]# showmount -e 172.20.1.1
Export list for 172.20.1.1:
/var/share3 172.20.1.101
/var/share2 172.20.1.101
/var/share1 172.20.1.101

 

 

 - clone1에서 마운트 디렉토리 생성 및 마운트를 실시한다.

 

[root@clone1 /root]# mkdir /mnt/nfs1 /mnt/nfs2 /mnt/nfs3

 

 

[root@clone1 /root]# ls /mnt
hgfs  nfs1  nfs2  nfs3

 

 

[참고] hgfs(Host Guset File System)

 

VMware와 리눅스 사이에서 파일 공유시 사용하는 기본 디렉토리


 


[root@clone1 /root]# mount -t nfs 172.20.1.1:/var/share1 /mnt/nfs1
[root@clone1 /root]# mount -t nfs 172.20.1.1:/var/share2 /mnt/nfs2
[root@clone1 /root]# mount -t nfs 172.20.1.1:/var/share3 /mnt/nfs3

 

 

[root@clone1 /root]# df -h -t nfs
Filesystem            Size  Used Avail Use% Mounted on
172.20.1.1:/var/share1
                      4.7G  549M  4.0G  13% /mnt/nfs1
172.20.1.1:/var/share2
                      4.7G  549M  4.0G  13% /mnt/nfs2
172.20.1.1:/var/share3
                      4.7G  549M  4.0G  13% /mnt/nfs3

 

 

[root@clone1 /root]# ls /mnt/nfs1
testfile1

 

 

[root@clone1 /root]# ls /mnt/nfs2
testfile2

 

 

[root@clone1 /root]# ls /mnt/nfs3
testfile3

 

 

 - clone1에서 main 서버에 있는 'testfile1'를 복사되는지 확인하도록 한다.

 

[root@clone1 /root]# cd /mnt/nfs1
[root@clone1 /mnt/nfs1]# ls
testfile1


[root@clone1 /mnt/nfs1]# cp testfile1 /tmp

 


[root@clone1 /mnt/nfs1]# ls /tmp | grep testfile1
testfile1

 

 

[root@clone1 /mnt/nfs1]# cd
[root@clone1 /root]#

 

 

 

 

5. NFS 서비스 연결 과정

 

 

 

 ① rpc.mountd에 대한 포트 번호 요청

 ② rpc.mountd에 대한 포트 번호 응답

 ③ rpc.mountd에 대한 포트 번호를 이용한 접속 요청

 ④ '/etc/exports' 공유 설정 내용 확인

 ⑤ 접속 허용 또는 거부 실시

 

 

① 클라이언트는 서버 portmap 데몬에게 rpc.mountd에 대한 포트 번호를 요청한다.

    다음 정보 확인은 서버에서 대기 중인 rpc.mountd 포트 번호를 확인한 것이다.

 

[root@main /root]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      2258/vsftpd
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2123/sshd  
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1950/cupsd 
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2457/master
tcp        0      0 0.0.0.0:45467               0.0.0.0:*                   LISTEN      3560/rpc.mountd
tcp        0      0 0.0.0.0:59198               0.0.0.0:*                   LISTEN      3560/rpc.mountd
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN      -          
tcp        0      0 0.0.0.0:49218               0.0.0.0:*                   LISTEN      1913/rpc.statd
tcp        0      0 0.0.0.0:875                 0.0.0.0:*                   LISTEN      3555/rpc.rquotad
tcp        0      0 0.0.0.0:33996               0.0.0.0:*                   LISTEN      3560/rpc.mountd
~ 중간 생략 ~

 

 

[root@main /root]# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0     52 192.168.1.100:22            192.168.1.1:1583            ESTABLISHED 2869/sshd  
tcp        0      0 172.20.1.1:2049             172.20.1.101:955            ESTABLISHED -          

 


[root@main /root]# netstat -tp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0     52 192.168.1.100:ssh           192.168.1.1:simbaexpress    ESTABLISHED 2869/sshd  
tcp        0      0 main:nfs                    clone1:955                  ESTABLISHED -

 

 

② 서버는 portmap 데몬이 rpc.mountd 포트 번호를 확인하여 클라이언트에게 응답한다.

 

③ 클라이언트는 서버로부터 수신한 rpc.mountd 포트 번호를 이용하여 rpc.mountd로 접속을 실시한다.

 

④ 서버는 클라이언트로부터 접속 요청을 받게되면, '/etc/exports' 내용을 확인한다.

 

⑤ 만약, 접속 가능한 클라이언트이면 접속이 허용되어 디렉토리가 공유(읽기/쓰기)되며, 그렇지 않은 경우 접속은 거부된다.

 

 

 

 

6. NFS 서버 '/etc/exports' 파일 이해

 

 - NFS 서버에서 부팅시에 공유하는 정보를 관리하는 파일이다.

 

[root@main /root]# cat /etc/exports
/var/share1 172.20.1.101(rw)
/var/share2 172.20.1.101(ro)
/var/share3 172.20.1.101(rw)

 

 옵션

내용 

 root_squash

 NFS 마운트된 볼륨에 수퍼유저 권한을 가진 root 사용자로 접근하는 것을 차단

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

 no_root_squash

 클라이언트 root 사용자로 NFS를 통해 마운트된 디렉토리에 슈퍼유저 권

 한을 가지고 접근하는 것을 허용한다.

 ro

 파일 시스템을 읽기 전용으로 마운트한다. (다운로드 가능)

 rw

 파일 시스템을 읽기/쓰기 전용으로 마운트한다. (다운로드/업로드 가능)

 secure

 인증되지 않은 접근을 차단한다. (기본값)

 insecure

 인증되지 않은 접근을 허용한다.

 link_relative

 심볼릭 링크를 상대 심볼릭 링크로 변경할 때 사용한다.

 noaccess

 마운트된 디렉토리의 하위 디렉토리 접근을 차단한다.

 특정 시스템에 대한 공유 디렉토리 일부를 접근 차단할 경우 사용한다.

 all_squash

 모든 사용자의 UID/GID 를 익명 사용자로 변환한다.

 anonuid, anongid

 익명사용자에 대한 UID/GID를 변경한다.  

 

 

[root@main /root]# vi /etc/exports.test


  1   /           172.20.1.101(rw) 172.20.1.111(rw.no_root_squash)

# / 디렉토리를 '172.20.1.101', '172.20.1.111'이 읽기/쓰기가 가능하며, '172.20.1.111'은 root 사용자로 인정한다.


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

# 도메인이 'local.domain'이며,'proj'로 시작하는 호스트에 대해서 /procects 디렉토리 읽기/쓰기가 가능하다.


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

# 도메인이 'local.domain'인 모든 호스트들에 대해서 /usr 디렉토리 읽기만 가능하며, @trusted 넷그룹 이름을

   가진 호스트들에 대해서는 읽기/쓰기가 가능하다.


  4   /data1      172.20.0.0/255.255.0.0(ro)
# 호스트 주소가 '172.20.0.0/16'인 호스트만 접근 가능하며, 읽기만 가능하다.

 

  5   /home/user1 pc1(rw.all_squash.anonuid=150.anongid=100)
# pc1 호스트에 대해서 /home/user1 디렉토리 읽기/쓰기가 가능하며, 익명사용자로 사용자를 변환하고

   UID=150, GID=100으로 설정한다.

 

  6   /pub        *(ro.insecure.root_squash)
# 모든 호스트들에 대해서 /pub 디렉토리 읽기만 가능하며, 인증 없이 접근(마운트) 가능하고 마운트하는

   모든 호스트의 root를 nobody로 변환한다.


  7   /home       test.example.com(rw)

# 'test.example.com'에 대해서 /home 디렉토리 읽기/쓰기가 가능하다.


  8   /home       test.example.com    (rw) 

# 'test.example.com'에 대해서 /home 디렉토리 읽기만 가능하며, 모든 호스트에 대해서 읽기/쓰기가 가능하다.

 

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

# 'test.example.com'에 대해서 /home 디렉토리 읽기만 가능하며, 모든 호스트에 대해서 읽기/쓰기가 가능하다.


: q!

    

 

 

 

 

7. NFS 클라이언트 '/etc/fstab' 파일 이해

 

 - NFS 클라이언트에서 부팅시에 마운트하는 정보를 관리하는 파일이다.

 - 다음과 같이 마운트를 실시하면, 재부팅되었을 경우 마운트는 초기화되기 된다.

 

[root@clone1 /root]# mount -t nfs -o timeo=15,intr 172.20.1.1:/var/share1 /mnt/nfs1

 

 

 - 그렇기 때문에 다음과 같이 '/etc/fstab' 파일에 부팅시에 마운트될 수 있도록 설정을 실시해야 한다.

 

[root@clone1 /root]# vi /etc/fstab

 

~ 중간 생략 ~


 18 172.20.1.1:/var/share1  /mnt/nfs1               nfs     timeo=15,intr   0 0
# '172.20.1.1' NFS 서버의 '/var/share1' 디렉토리를 clone1 'mnt/nfs1' 디렉토리에 NFS를 이용하여

   마운트를 실시한다. 이때 마운트 타임아웃은 15초이며, 중간에 인터럽트가 기능을 사용한다.


: q!

 


 


8. 부팅시 NFS 서버 구동하는 방법


 - NFS 서비스는 시스템이 재부팅되면, 서비스가 비활성화된다. main을 재부팅하도록 한다.


[root@main /root]# reboot



login as: root
root@192.168.1.100's password:
Last login: Mon Mar 21 10:27:59 2016 from 192.168.1.1
[root@main /root]#
[root@main /root]# chkconfig --list nfs
nfs             0:해제  1:해제  2:해제  3:해제  4:해제  5:해제  6:해제



 - 다음과 같이 setup 설정에서 'nfs' 서비스를 체크를 실시하면, 재부팅시에도 NFS 서비스는 자동 활성화된다.


[root@main /root]# ntsysv





[root@main /root]# reboot



login as: root
root@192.168.1.100's password:
Last login: Tue Mar 22 14:16:02 2016 from 192.168.1.1
[root@main /root]#
[root@main /root]# chkconfig --list nfs
nfs             0:해제  1:해제  2:해제  3:해제  4:해제  5:활성  6:해제


[root@main /root]# exportfs
/var/share1     172.20.1.101
/var/share2     172.20.1.101
/var/share3     172.20.1.101



 

9. NFS 클라이언트 마운트 해지

 

 - clone1에서 현재 프롬프트가 마운트 디렉토리이면, 마운트가 해지가 안되기 때문에 루트 디렉토리로 전환하도록 한다.


[root@clone1 /root]# df -h -t nfs
Filesystem            Size  Used Avail Use% Mounted on
172.20.1.1:/var/share1
                      4.7G  552M  3.9G  13% /mnt/nfs1
172.20.1.1:/var/share2
                      4.7G  552M  3.9G  13% /mnt/nfs2
172.20.1.1:/var/share3
                      4.7G  552M  3.9G  13% /mnt/nfs3

 


[root@clone1 /root]# umount /mnt/nfs1
[root@clone1 /root]# umount /mnt/nfs2
[root@clone1 /root]# umount /mnt/nfs3



[root@clone1 /root]# df -h -t nfs
df: no file systems processed

 






 - 다음 실습을 하기 위해서 main에서 NFS 관련 설정을 삭제한다.

 

[root@main /root]# rm -rf /var/share1

[root@main /root]# rm -rf /var/share2

[root@main /root]# rm -rf /var/share3



[root@main /root]# vi /etc/exports


  1 /var/share1 172.20.1.101(rw) <- 삭제
  2 /var/share2 172.20.1.101(ro) <- 삭제
  3 /var/share3 172.20.1.101(rw) <- 삭제


: wq! 



[root@main /root]# exportfs
/var/share1     172.20.1.101
/var/share2     172.20.1.101
/var/share3     172.20.1.101



[root@main /root]# exportfs -u 172.20.1.101:/var/share1
[root@main /root]# exportfs -u 172.20.1.101:/var/share2
[root@main /root]# exportfs -u 172.20.1.101:/var/share3

 


[root@main /root]# exportfs

 


  - 다음 실습을 하기 위해서 clone1에서 NFS 관련 설정을 삭제한다.


[root@clone1 /root]# rm -rf /mnt/nfs1
[root@clone1 /root]# rm -rf /mnt/nfs2
[root@clone1 /root]# rm -rf /mnt/nfs3

Posted by 김정우 강사(카카오톡 : kim10322)
,


Q