[파일] 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

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

2 Responses

  1. 2022년 6월 19일

    2microscopic

  2. 2023년 1월 26일

    3hurtful

페이스북/트위트/구글 계정으로 댓글 가능합니다.