- 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 서버 데몬
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 서버 하나가 다운되더라도 소스는 유지되며 서비스에는 문제가 없다.