서버/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 서버가 준비되어 있어야 한다.
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) |
- 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 사용자로 인정한다.
# 도메인이 'local.domain'이며,'proj'로 시작하는 호스트에 대해서 /procects 디렉토리 읽기/쓰기가 가능하다.
# 도메인이 'local.domain'인 모든 호스트들에 대해서 /usr 디렉토리 읽기만 가능하며, @trusted 넷그룹 이름을 가진 호스트들에 대해서는 읽기/쓰기가 가능하다.
5 /home/user1 pc1(rw.all_squash.anonuid=150.anongid=100) UID=150, GID=100으로 설정한다.
6 /pub *(ro.insecure.root_squash) 모든 호스트의 root를 nobody로 변환한다.
# 'test.example.com'에 대해서 /home 디렉토리 읽기/쓰기가 가능하다.
# 'test.example.com'에 대해서 /home 디렉토리 읽기만 가능하며, 모든 호스트에 대해서 읽기/쓰기가 가능하다.
9 /home test.example.com(ro) *(rw) # 'test.example.com'에 대해서 /home 디렉토리 읽기만 가능하며, 모든 호스트에 대해서 읽기/쓰기가 가능하다.
|
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
~ 중간 생략 ~
마운트를 실시한다. 이때 마운트 타임아웃은 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) <- 삭제 : 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
'서버 > Linux III' 카테고리의 다른 글
Linux III - 10. DNS 서버 (0) | 2016.03.25 |
---|---|
Linux III - 09. DNS 서비스 이해 (0) | 2016.03.22 |
Linux III - 07. FTP 서버(vsftpd) (0) | 2016.03.16 |
Linux III - 06. FTP 클라이언트 (0) | 2016.03.15 |
Linux III - 05. 리눅스 서비스 운영 방식(Standalone & xinetd) (0) | 2016.03.14 |