[파일] NFS 에 대하여 ..
NFS 에 대하여..
2000년 1월 18일 이성수(senux at
senux.com) 만듬
—————————————————————————
이 문서는 NFS를 소개하고 설치 후 사용하는 실무적인 내용을 설명합니다. 단국대 리눅스
동아리 DLUG의 세미나 자료입니다.
—————————————————————————
문서 내용에서 빨간 부분은 사용자가 직접 입력해야 하는 부분이고 파란 부분은 글쓴이가
추가한 설명 부분입니다.
1. 소개
Network File System (NFS)은 네트워크를 통해 파일을 공유 할 수 있도록 만들어진 프로
토콜 입니다. NFS는 하드웨어, 운영체제 또는 네트워크 구조가 달라도 파일을 공유 할 수
있도록 고안됐습니다. 파일 공유등을 비롯해 다른 부가 기능을 제공합니다. 하지만 공유
된 파일들에 대한 보안 문제가 생길 수도 있습니다. 사용하는 프로토콜은 Network Lock
Manager (NLM)과 Network Status Monitor (NSM)입니다.
현재 사용되는 NFS는 Version 2 (V2)와 Version 3 (V3)가 있으며 이 문서는 V3에 대해
설명합니다. 소스 파일은 …
ftp://ftp.mathematik.th-darmstadt.de/pub/linux/okir/dontuse/
nfs-server-2.2beta48.tar.gz
에서 구할 수 있습니다. NFS 서버에는 아래와 같은 2가지 종류가 있습니다.
———————————————————————–
NFS 서버 설치
선행 작업 1 : 리눅스 커널 설정
NFS 서버를 사용하려면 리눅스 커널에서 NFS 서버를 지원하도록 기능을 넣어주어야
합니다. 래드햇과 같은 배포판을 처음 설치하면 이런 기능을 사용 할 수 있도록 만들어
진 커널이 설치되지만, 다른 이유로 커널이 바뀌었거나 다른 배포판일 경우 커널 컴파일
을 해야 하는 경우도 있습니다. 커널 컴파일 옵션에 아래와 같은 항목을 넣어주면 됩니
다. 기능을 커널 자체에 넣고 싶으면 해당 항목에서 Y를 누르고 모듈로 만들어서 적재하
려면 M을 누르면 됩니다. 커널 컴파일에 관한 내용은 다른 관련 자료를 보시기 바랍니다.
(만약 NFS 클라이언트로도 사용된다면 NFS filesystem support도 함께 커널에 넣어야
합니다.)
Filesystems > Network File System > NFS server support (NEW)
단, NFS server support (NEW)기능은 아래 항목을 선택해줘야 나타납니다.
Code maturity level options > Prompt for development and/or incomplete code/drivers
선행 작업 2 : portmap 설치
NFS는 웹서나 FTP 서버와는 다르게 데몬 프로세스가 특정 네트워크 포트를 점유하면서
동작하여 접속을 대기하고 있는 것이 아니라 portmapper 라는 프로그램을 이용해서 네
트워크 포트를 할당 받습니다. portmapper는 111번 포트를 점유하면서 데몬 상태로 대기
하고 있다가 NFS 서비스를 요구하는 접속이 들어오면 nfsd(또는 rpc.nfsd)에게 포트 번호
를 바꾸어 접속을 연결시켜 줍니다. 일종의 bind 역활을 합니다.
저는 portmapper 프로그램의 소스를 다운로드 받아서 컴파일 한 후 설치했습니다.
아래와 같이 다운로드 받고 압축을 풉니다.
[root@coke /tmp]# ftp ftp.porcupine.org
Connected to ftp.porcupine.org.
220 rodent2.porcupine.org FTP server (Version 4.129 Tue Jan 4 10:55:27 EST 2000)
ready.
Name (ftp.porcupine.org:senux): anonymous
331 Guest login ok, send your email address as password.
Password: (자신의 이메일 주소 입력)
230- Guest login ok, access restrictions apply.
[ 중략 ]
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub/security
250 CWD command successful.
ftp> bin
200 Type set to I.
ftp> get portmap_4.tar.gz
local: portmap_4.tar.gz remote: portmap_4.tar.gz
200 PORT command successful.
150 Opening BINARY mode data connection for portmap_4.tar.gz (16152 bytes).
226 Transfer complete.
16152 bytes received in 2 secs (7.9 Kbytes/sec)
ftp> quit
221 Goodbye.
[root@coke /tmp]# tar zxvf portmap_4.tar.gz
portmap_4/
portmap_4/BLURB
portmap_4/CHANGES
portmap_4/Makefile
portmap_4/README
portmap_4/daemon.c
portmap_4/pmap_check.c
portmap_4/from_local.c
portmap_4/pmap_check.h
portmap_4/pmap_dump.c
portmap_4/pmap_set.c
portmap_4/portmap.c
portmap_4/strerror.c
압축이 풀렸으면 문서 파일을 찾아서 읽어봅니다. portmapper의 경우 README를 꼭
읽어봐야 합니다. 그리고 자신의 시스템에 컴파일시 특별한 내용이 있다면 Makefile 내용
을 살펴보고 수정해야 합니다. 일반적인 경우라면 그냥 make 명령으로 컴파일을 시작 할
수 있지만 제가 다운로드 받은 portmapper 프로그램은 리눅스 이외의 유닉스에서 컴파일
되도록 만들어졌기 때문에 약간의 패치가 필요합니다. Makefile에서 파일이나 디렉토리
경로가 다르기에 변경을 해야 합니다. 패치는 portmaper 프로그램의 src.rpm 버젼에
들어있던 파일을 이용했습니다. 아래는 세부적인 패치 내용으로서
portmap-4.0-17.src.rpm에 들어 있는 portmap-4.0-linux.patch 파일의 내용입니다.
— Makefile.orig Fri May 31 09:50:40 1996
+++ Makefile Fri Aug 9 17:40:43 1996
@@ 46,7 +46,7 @@
# libwrap.a object library. WRAP_DIR should specify the directory with
# that library.
-WRAP_DIR= ../tcp_wrappers
+WRAP_DIR= /usr/lib
# Auxiliary object files that may be missing from your C library.
#
@@ 67,9 +67,9 @@
SHELL = /bin/sh
-COPT = -Dconst= -Dperror=xperror $(HOSTS_ACCESS) $(CHECK_PORT) \\
+COPT = -Dconst= $(HOSTS_ACCESS) $(CHECK_PORT) \\
$(SYS) -DFACILITY=$(FACILITY) $(ULONG) $(ZOMBIES) $(SA_LEN)
-CFLAGS = $(COPT) -O $(NSARCHS) $(SETPGRP)
+CFLAGS = $(COPT) $(RPM_OPT_FLAGS) $(NSARCHS) $(SETPGRP)
OBJECTS = portmap.o pmap_check.o from_local.o $(AUX)
all: portmap pmap_dump pmap_set
Makefile 파일의 패치 방법은 아래와 같습니다. 위의 패치 내용이 저장된 파일이
portmapper 소스와 같은 디렉토리에 있어야 합니다. 여기서 -p0 옵션은 패치 정보
파일이 있는 위치와 패치될 파일이 똑같다는 것을 의미합니다. 디렉토리의 단계가
0 이라는 뜻입니다.
<./patch는 현재 작업 디렉토리에 있는 patch 라는 파일이 패치될 내용을 담고 있
는 정보 파일이라는 뜻입니다.
[root@coke portmap_4]# patch -p0 <./patch
역시 리눅스에서는 make로 컴파일 진행시 약간의 옵션을 더 추가해 주어야 에러
가 생기지 않고 바이너리 파일을 얻을 수 있습니다. make 명령 옵션은 아래와 같
으며 이 내용은 src.rpm 파일에서 spec 파일 내용중에서 찾은 것입니다. 리눅스
에서 컴파일이 잘 됩니다.
[root@coke portmap_4]# make FACILITY=LOG_AUTH ZOMBIES=\\
‘-DIGNORE_SIGCHLD -Dlint’ LIBS=”-lnsl”
RPM_OPT_FLAGS=”$RPM_OPT_FLAGS”
생성되는 바이너리 파일은 pmap_dump, pmap_set, portmap 입니다. 이 파일을
/usr/sbin 등의 적당한 디렉토리에 복사해 두고 사용하면 됩니다. 우리가 주로 사용
하게 될 파일은 portmap 입니다. 이것으로 portmap 프로그램의 설치가 끝났습니다.
NFS 서버 소스 다운로드, 압축 풀기 파일을 다운로드 받은 후 아래와 같이 압축을 풉
니다.
[root@coke /tmp]# ftp ftp.mathematik.th-darmstadt.de
Connected to fb0429.mathematik.tu-darmstadt.de.
220-Hello archive user! You are connected to an experimental FTP server at
220-Department of Mathematics, Technical University Darmstadt, Germany.
220-Local Time is Tue Jan 18 15:57:21 2000.
220-
220 fb0429.mathematik.tu-darmstadt.de FTP server
(Version wu-2.4.2-academ[BETA-18-VR13](1) Sun Feb 14 17:26:24 MEZ 1999)
ready. Name (ftp.mathematik.th-darmstadt.de:senux): anonymous
331 Guest login ok, send your complete e-mail address as password.
Password: (이곳에 자신의 이메일 주소 입력)
[ 중략 ]
230 Guest login ok, access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bin
200 Type set to I.
ftp> cd pub/linux/okir/dontuse
250 CWD command successful.
ftp> get nfs-server-2.2beta48.tar.gz
local: nfs-server-2.2beta48.tar.gz remote: nfs-server-2.2beta48.tar.gz
200 PORT command successful.
150 Opening BINARY mode data connection for nfs-server-2.2beta48.tar.gz
(200692bytes). 226 Transfer complete.
200692 bytes received in 41.6 secs (4.7 Kbytes/sec)
ftp> quit
221-You have transferred 200692 bytes in 1 files.
221-Total traffic for this session was 204138 bytes in 1 transfers.
221-Thank you for using the FTP service on fb0429.mathematik.tu-darmstadt.de.
221 Goodbye.
[root@coke /tmp]# tar zxvf nfs-server-2.2beta48.tar.gz
문서 파일 읽기
압축을 풀면서 새롭게 생긴 nfs-server-2.2beta23 디렉토리를 안에 README, INSTALL,
NEWS, COPYING 등의 문서 파일이 있는데 README와 INSTALL은 설치에 앞서 반드시
읽어야 합니다. 이 파일에는 NFS의 소개와 사용 방법 그리고 설치 과정에 대한 자세한
설명이 있습니다.
환경 설정 스크립트 실행하기
많은 프로그램들이 그러하듯이 NFS 서버 프로그램도 소스의 컴파일에 앞서 컴파일 환경
을 살펴보고 컴파일 시 필요한 옵션을 한번에 줄 수 있는 환경 설정 스크립트를 제공하고
있습니다. 스크립트 파일명은 BUILD와 configure인데 BUILD 스크립트를 실행하면 몇가
지 환경 설정 내용을 물어 본 후 configure 스크립트를 자동 으로 실행해 줍니다.
[senux@coke nfs-server-2.2beta48]$ ./BUILD
[ 중략 ]
****************************************************************
* Universal NFS Server 2.2beta48 Site Specific Configuration *
****************************************************************
Please answer the following questions to make the system
specific changes in configuration of the UNFS Server.
+——————+
| Big HD support |
+——————+
이 기능의 효과는 대용량 하드디스크에서 크게 발휘된다고 합니다.
inode의 크기가 32bits인 상태에서 동작합니다. 아직 개발중인
소스입니다.
This release of unfsd has experimental support for a new inode number
generation scheme that should work better with large disks. If you
have experienced problems with files suddenly turning into direcotries,
or vice versa, try this feature.
Enable new inode number scheme? [y/N] n
+——————+
| Multiple Servers |
+——————+
이전의 unfs (Universal NFS Server) 읽기, 쓰기 접근 제한 없이
동시에 여러개의 서버를 작동시키지 못했지만, 이 기능을 사용함으로써
가능하게 되었습니다. 기본값은 ‘Yes’입니다.
This release of unfsd has support for running multiple server processes
in read/write mode (previous release were strictly read-only when running
more than one NFS daemon).
Enable R/W support for multiple daemons? [Y/n] y
+———————+
| Dynamic UID mapping +
+———————+
This release of unfsd supports dynamic mapping of uids and gids between
hosts with different uid spaces. There are several flavors of uid mapping:
* Using a separate daemon named rpc.ugidd.
* Using the client host’s NIS server.
* Using a static mapping file.
Static mapping is always supported; if you want one of the dynamic mapping
flavors, you have to select them now.
Note that you should not use ugidd mapping unless you absolutely must,
because it can pose a security risk: When run unprotected, the ugidd
mapping daemon can be abused to obtain a complete list of all login
names on your NFS client machine. As a counter-measure, ugidd can
be protected with the hosts_access control mechanism used by Wietse
Venema’s tcp_wrapper package. Note that this does not offer a hundred
percent protection, though, as it can still be spoofed by hosts on the
same network as your client machine.
NFS 사용시 선택적으로 UID와 GID를 바꿀 수 있는 기능을 사용할 것인지 뭍는
항목입니다. 이것을 선택하면 임의로 다른 호스트에 설정된 UID나 GID를
NFS로 마운트 된 파일 시스템에 적용 할 수 있습니다. 하지만 이것은 심각한
보안 문제가 될 수 있으므로 기본값은 ‘No’입니다.
Are you going to use ugidd? (not recommended) [y/N] n
Good, I never liked ugidd.
UID와 GID를 결정하기 위해 NIS(Network Information Server)를 사용 할
것인지 묻는 항목입니다.
Are you going to use NIS uid mapping? [y/N] n
+——————————+
| Access control configuration |
+——————————+
Unfsd makes sure the exports file is always owned by the same user, and
is not writable by anyone but that user. I will now ask you for the uid
and gid of that user. Please enter appropriate user and group ids or names.
/etc/exports 파일의 소유자와 소유 그룹을 어떻게 설정 할 것인지
묻는 항목입니다. root로 하는 것을 권장합니다.
Which uid should own /etc/exports? [default 0 (root)] 0
Which gid should own /etc/exports? [default 0 (root)] 0
Mountd and ugidd (if you enabled it) can be protected from illegal access
with the hosts_access control mechanism used by Wietse Venema’s
tcp_wrapper package. Note that this does not offer a hundred percent
protection, though, as it can still be spoofed by hosts on the same
network as your client machine.
Especially if you run ugidd, enabling this is highly recommended.
TCP Wrapper 등으로 외부에서 접근하는 것을 제한 하는 기능을
사용할지 묻는 항목입니다. 단, 이 보안 방법을 100% 신뢰 할 수 있는건
아닙니다.
Do you want to protect mountd with HOST ACCESS? [Y/n] y
Looking for libwrap.a…
Okay, libwrap is in /usr/lib
UNFS Server 2.2beta5 and later can log mount requests and their
success/failure to syslogd. This can be very useful for systems
that are not protected from internet by firewalls. (Actually, it should
by very useful in all cases).
NFS로 접속하여 파일 시스템을 마운트 하려는 요구들을
모두 로그 파일에 기록할 것인지 묻는 항목입니다. 로그는
syslog 파일에 기록됩니다.
Do you want to log all mount reqests into syslog? (recommended) [Y/n] y
Good, I’d log all mount requests and their status into syslog
Creating custom configuration …
The following is your system specific configuration:
*** New inode numbering scheme is not enabled
*** Multi-Process nfsd read/write is supported
*** User/Group ID Map Daemon is not used
*** NIS User/Group Mapping is not used
*** Exports Control files should be owned by UID=0 GID=0
*** Mount requests will be logged to syslogd(8)
*** Mount Daemon is protected with host access control
Updating site.h…
Updating site.mk …
여기서부터는 configure 스크립트를 자동으로 실행하는 모습입니다.
I’m now running GNU configure to determine some system-specific things.
This make take a while on your first attempt.
Please press return to continue
creating cache ./config.cache
checking for gcc… gcc
checking whether the C compiler (gcc ) works… yes
checking whether the C compiler (gcc ) is a cross-compiler… no
checking whether we are using GNU C… yes
checking whether gcc accepts -g… yes
checking how to run the C preprocessor… gcc -E
checking for ranlib… ranlib
checking for rpcgen.new… no
checking for rpcgen… rpcgen
checking for rpcgen -C… yes
checking for rpcgen -I… yes
checking whether gcc needs -traditional… no
checking for AIX… no
checking for minix/config.h… no
checking for POSIXized ISC… no
checking for a BSD compatible install… /usr/bin/install -c
checking for ANSI C header files… yes
checking for GNU libc2… yes
checking for working const… yes
checking for vprintf… yes
checking for dirent.h that defines DIR… yes
checking for opendir in -ldir… no
checking for st_blksize in struct stat… yes
checking for st_blocks in struct stat… yes
checking for st_rdev in struct stat… yes
checking whether stat file-mode macros are broken… no
checking return type of signal handlers… void
checking for uid_t in sys/types.h… yes
checking for mode_t… yes
checking type of array argument to getgroups… gid_t
checking for xdrproc_t… yes
checking whether utime accepts a null argument… yes
checking whether sys/types.h defines makedev… yes
checking size of unsigned long… 4
checking size of unsigned short… 2
checking size of unsigned int… 4
checking for dev_t… yes
checking for ino_t… yes
checking size of uid_t… 4
checking size of gid_t… 4
checking size of ino_t… 4
checking size of dev_t… 8
checking for unistd.h… yes
checking for string.h… yes
checking for memory.h… yes
checking for fcntl.h… yes
checking for syslog.h… yes
checking for sys/file.h… yes
checking for sys/time.h… yes
checking for utime.h… yes
checking for sys/fsuid.h… yes
checking for working alloca.h… yes
checking for alloca… yes
checking for main in -lnsl… yes
checking for main in -lsocket… no
checking for main in -lrpc… no
checking for main in -lcrypt… yes
checking for main in -lnys… no
checking for strerror… yes
checking for realpath… yes
checking for mkdir… yes
checking for rename… yes
checking for utimes… yes
checking for strdup… yes
checking for strstr… yes
checking for getopt… yes
checking for getopt_long… yes
checking for getcwd… yes
checking for seteuid… yes
checking for setreuid… yes
checking for getdtablesize… yes
checking for setgroups… yes
checking for lchown… yes
checking for setsid… yes
checking for setfsuid… yes
checking for setfsgid… yes
checking for innetgr… yes
checking for quotactl… yes
checking for authdes_getucred… yes
checking for strsignal… yes
checking for authdes_getucred in rpc/auth_des.h… yes
checking for broken setfsuid(-2)… yes
checking how to get list of mounted filesystems… getmntent1
checking how to get filesystem space usage… statfs2_bsize
checking for link problem with libwrap.a… yes
checking for BSD signal semantics… yes
updating cache ./config.cache
creating ./config.status
creating Makefile
creating config.h
Uphh… Done. Now you can run `make install’ to build and install the
binaries and manpages.
prefix
이제 make 명령을 내리면 소스가 컴파일 되고 make install 명령을 내리면 컴파일된
바이너리 파일들이 시스템의 디렉토리로 복사가 됩니다. 저의 경우 Makefile에서 아래
와 같이 일부분을 수정해서 NFS 서버 관련 파일들이 복사되는 디렉토리를 변경했습니
다. 대부분 NFS 서버 바이너리 파일들은 /usr/sbin 디렉토리에 복사됩니다.
그냥 기본값으로 /usr/sbin 으로 사용하여도 무방합니다.
prefix = /coke/nfsd
#prefix = $(install_prefix)/usr
즉, 원래 있던 prefix 부분을 주석처리 하고 새롭게 prefix = /coke/nfsd 라고 지정
했습니다.
컴파일
이제 make와 make install을 입력해서 컴파일 한 후 설치하세요.
[root@coke nfs-server-2.2beta48]# make; make install
이것으로 NFS 서버의 설치가 모두 끝났습니다.
3. NFS 서버 실행
portmap 실행
먼저 portmapper 프로그램을 실행해 둡니다. 실행 파일명은 portmap 입니다.
portmap이 제대로 동작하고 있는지 rpcinfo와 ps 명령으로 확인 할 수 있습니다.
[root@coke /tmp]# rpcinfo -p localhost
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
*용어 설명:RPC) RPC는 Remote Procedure Call의 약자로 C 프로그램이 네트워크
의 다른 컴퓨터에게 프로시저 콜을 할 수 있도록 한다. RPC라고 하면 일반적으로 Sun
RPC의 변종을 말하는 것이다. 또한 RPC portmapper는 RPC 프로그램 번호를 TCP/IP
(혹은 UDP/IP) 프로토콜 포트 번호로 변환하는 서버이다.
exports 파일 설정
/etc/exports 파일은 NFS 서버가 다른 클라이언트들에게 마운트를 허용할 디렉토리,
NFS 서버에 접근 할 수 있는 호스트 목록, 그리고 접근 권한을 설정하는 파일입니다.
이 파일의 소유권한은 root 어야 하며 다른 사용자가 수정 할 수 없어야 합니다.
*설정 예제:자신의 컴퓨터 /tmp 디렉토리를 dlug.anseo.dankook.ac.kr 컴퓨터에게
읽기(Read), 쓰기(Write)권한으로 마운트 할 수 있도록 합니다. 더 자세한 설정은
exports 관련 메뉴얼 페이지 를 참고하세요.
/tmp dlug.anseo.dankook.ac.kr(rw)
이제 nfsd와 mountd를 작동합니다. nfsd는 NFS 를 통한 파일 시스템 마운트 요청을
받아들이는 역활을 합니다. mountd는 NFS 마운트 데몬으로써 NFS 클라이언트로부터
마운트 요청이 들어오면 /etc/exports 파일을 참고해서 실제로 마운트 작업을 합니다.
[root@coke /tmp]# rpc.nfsd
[root@coke /tmp]# rpc.mountd
4. NFS 클라이언트 실행
NFS 클라이언트를 사용하기 위한 특별한 프로그램은 필요하지 않습니다. 리눅스에
기본으로 설치되어 있는 mount 를 사용하면 됩니다. 단, 리눅스 커널이 NFS 파일
시스템을 지원하도록 컴파일 되거나 모듈이 만들어져 있어야 합니다. NFS 파일 시스템
을 사용하기 위한 커널 옵션은 아래와 같습니다.
Filesystems > Network File System > NFS filesystem support
이제 mount 명령을 이용해서 원격지의 NFS서버의 파일 시스템을 마운트 하면 됩니다.
아래는 203.237.219.112 컴퓨터의 /tmp 디렉토리를 자신의 컴퓨터 /mnt/tmp 디렉토리
로 마운트 하는 명령입니다. -t 옵션은 파일 시스템 종류를 나타내며 생략하면 자동으로
인식합니다.
mount -t nfs 203.237.219.112:/tmp /mnt/tmp