320 likes | 550 Vues
제 29 장. Network File System. 목 차. 1. 개요 2. Sun 원격 프로시저 호출 3. XDR: 외부 데이터 표현 4. 포트 맵퍼 5. NFS 프로토콜 6. NFS 예 7. NFS 버전 3 8. 요약. 1. 개 요. NFS 의 구성요소: Sun RPC NFS 를 사용하는 클라이언트 프로그램 특별한 것 사용 불필요 커널은 RPC 호출 생성 액세스 되고 있는 파일이 NFS 서버에 있는 것을 자동적으로 파일 액세스 목적
E N D
제 29 장 Network File System
목 차 1. 개요 2. Sun 원격 프로시저 호출 3. XDR: 외부 데이터 표현 4. 포트 맵퍼 5. NFS 프로토콜 6. NFS 예 7. NFS 버전 3 8. 요약
1. 개 요 • NFS의 구성요소: Sun RPC • NFS를 사용하는 클라이언트 프로그램 • 특별한 것 사용 불필요 • 커널은 RPC 호출 생성 • 액세스 되고 있는 파일이 NFS 서버에 있는 것을 자동적으로 파일 액세스 목적 • NFS 관심사: 인터넷 프로토콜 사용
2. Sun 원격 프로시저 호출 • 네트워크 프로그램의 특징 • 특정한 네트워크 동작을 실행하기 위해 시스템에 의해 제공되는 각종 함수를 호출하는 응용프로그램을 기술하여 수행. • 네트워크 프로그램을 위한 대표적 함수: 소켓과 TLI • 클라이언트에서 사용되는 API와 서버에 의해 사용되는 API는 다를 수 있음. • 클라이언트와 서버가 서로 통신을 할 수 있는 지를 결정하는 것은 통신프로토콜과 응용 프로토콜임. • 대부분 각종 응용 프로그램들은 명령과 응답으로 만들어짐.
2. Sun 원격 프로시저 호출(계속..) • RPC(Remote Procedure Call) • 네트워크 프로그램을 위한 다른 방법 • 클라이언트에서 함수를 호출하도록 기술 • 호출 절차 • 클라이언트는 로컬 호스트에 함수(client stub)를 호출 • Client stub: 프로시저 arguments를 네트워크 메시지로 패키지화하고 서버에 메시지 송신 • 서버 호스트의 Server stub는 네트워크 메시지 수신 • 네트워크 메시지로부터 argument 추출 • 서버 프로시저 호출 • server stub은 반환값을 네트워크 메시지로 패키지화 • client stub에 송신, 네트워크 메시지로부터 반환값 획득 • 응용 프로그램에 반환
2. Sun 원격 프로시저 호출(계속..) • 네트워크 프로그램은 stub에 의해 수행 • RPC library routines은 소켓 또는 TLI와 같은 API 사용 • 사용자 응용 프로그램은 API를 다루지 않음. • 모든 네트워크 프로그래밍 상세는 RPC 패킷, 클라이언트 stub과 서버 stub에 의해 숨겨짐. • RPC 패킷의 장점 • 프로그램이 쉬움 • 사용자 응용 프로그램을 단순화 • 다른 환경에서 동작하는 클라이언트와 서버의 코딩을 단순화 • RPC 패킷: Sun RPC와 OSF(Open Software Foundation)의 DCE(Distributed Computing Environment) RPC 패킷
2. Sun 원격 프로시저 호출(계속..) • Sun RPC • 2개의 버전 • 소켓 API를 사용, TCP와 UDP로 작동 • TI(Transport Independent)-RPC로 칭하는 TLI API 사용 • 커널에 의해 제공되고 있는 트랜스포트층에서 작동
2. Sun 원격 프로시저 호출(계속..) RPC 프로시저 응답 메시지 (UDP 데이터그램)의 형식 • RPC 프로시저 호출 메시지 (UDP 데이터그램)의 형식 IP 헤더 20 바이트 IP 헤더 20 바이트 UDP 헤더 8 UDP 헤더 8 transaction ID (XID) transaction ID (XID) 4 4 Call (0) reply (1) 4 4 RPC version (2) status(0=accepted) 4 4 모든 Sun RPC 프로시저 호출에 대해 공통 Program number 4 verifier 400 바이트까지 version number 4 procedure number Accept status(0=success) 4 4 credentials 408 바이트까지 verifier Procedure parameters ... 408 바이트까지 N 호출되는 프로시저에 따라 다름 Procedure parameters ... N
2. Sun 원격 프로시저 호출(계속..) • Transaction ID(XID): • 클라이언트에서 의해 설정 • 서버에 의해 반환 • Call 변수: 호출=0, 응답=1 • program number, version number, procedure number: • 서버에 의해 호출되는 하나의 프로시저를 지정 • Credential: 클라이언트 확인 • Verifier: secure RPC로 사용. DES 암호화 기법 사용 • Accept status: • 0=성공, 기타 숫자=버전 숫자 다르거나 무효인 프로시저 번호 표시
3. XDR: 외부 데이터 표현 • XDR(External Data Representation)은 RPC 호출과 응답 메시지에서 값을 코드화 하기 위해 사용된 표준 • RFC 1014에 정의 • 여러 가지 데이터 타입 정의, RPC 메시지에 전송되는 방법 정의 • 송신자: XDR형식에 RPC 메시지를 설립 • 수신기: 원래 표현으로 XDR 형식 변환 • XDR에 정의된 다른 데이터 유형 • 부호없는 정수, 부울값, 부동 소수점, 고정길이 배열, 가변길이 배열과 구조형 포함
4. 포트 맵퍼 • RPC 서버 프로그램은 순간적인 포트 사용, 잘 알려진 포트 사용하지 않음. • Register: • 순간적인 포트의 사용 추적을 유지하는 형식 • Sun RPC는 이 레지스터를 포트 맵퍼(port mapper)라 부름. • 포트 맵퍼는 잘 알려진 포트를 가져야 함 • UDP 111, TCP 111 • 포트 맵퍼는 RPC 서버 프로그램 • 프로그램 번호(100000), 버전 번호(2), 111의 TCP 포트, 111의 UDP 포트를 갖음
4. 포트 맵퍼 (계속...) • 포트 맵퍼는 4개의 서버 프로시저 제공 • PMAPPROC_SET • 프로그램 번호, 버전 번호, 포트 번호를 가진 프로토콜 저장 시작할 때 RPC 서버에 의해 호출 • PMAPPROC_UNSET • 저장된 맵핑을 제거하기 위해 서버에 의해 호출 • PMAPPROC_GETPORT • 프로그램 번호, 버전 번호, 프로토콜에 대해 포트 번호를 획득 시작시 RPC 클라이언트에 의해 호출 • PMAPPROC_DUMP • 모든 요소들을 되돌림
4. 포트 맵퍼(계속...) • RPC 서버 프로그램 시작, 후에 RPC 클라이언트 프로그램에 의해 호출 시 다음 과정 확립 • 시스템 초기 가동시 포트 맵퍼는 처음 시작 • TCP 종단 생성, TCP 포트 111에 대해 수동적 개방 수행 • UDP 종단 생성, UDP 포트 111에 대해 UDP 데이터그램 도착대기 • 서버는 각 프로그램, 버전, 프로토콜, 포트 맵퍼 번호를 PMAPPROC_SET 프로시저에 RPC에 의해 등록 • RPC 클라이언트 프로그램이 시작할 때 PMAPPROC_GETPORT 프로시저 호출 • 포트 맵퍼의 주어진 프로그램, 버전, 프로토콜에 대한 순간적인 포트 번호를 획득 • 클라이언트는 단계 3에서 되돌려진 포트 번호에 RPC 호출 메시지 송신
4. 포트 맵퍼(계속..) • 프로그램 rpcinfo(8)에 의한 포트 맵퍼의 현 맵퍼 출력 Sun % /usr/etc/rpcinfo -p program vers proto port 100005 1 tcp 702 mountd mount daemon for NFS 100005 1 udp 699 mountd 100005 2 tcp 702 mountd 100005 2 udp 699 mountd 100003 2 tcp 2049 nfs NFS itself 100021 1 tcp 709 nlockmgr NFS lock manager 100021 1 udp 1036 nlockmgr 100021 2 tcp 721 nlockmgr 100021 2 udp 1039 nlockmgr 100021 3 tcp 713 nlockmgr 100021 3 udp 1037 nlockmgr
5. NFS 프로토콜 • NFS는 클라이언트가 서버에 파일과 파일 시스템에 투명한 방식의 파일 접근을 제공 • NFS는 프로세스 기준의 파일 부분을 접속하고, 접근하는 데 투명성 제공 • NFS는 Sun RPC를 사용 클라이언트-서버 응용 프로그램 설정 • NFS 클라이언트는 송신 RPC가 서버에 요구함으로써 NFS 서버에 파일을 접속
5. NFS 프로토콜(계속..) • NFS 클라이언트와 NFS 서버의 전형적인 배열 user process local file access NFS client NFS server local file access kernel UDP port 2049 TCP/UDP IP TCP/UDP IP client kernel server kernel local disk local disk
5. NFS 프로토콜(계속..) • 많은 subtle point 존재 • 로컬 파일 또는 NFS 파일 접속 여부에 상관없이 클라이언트에 투명 • NFS 클라이언트는 TCP/IP 모듈을 통해 NFS 서버에 RPC 요구 송신 • NFS 서버는 포트 2049에 대해 UDP 데이터그램으로써 클라이언트 요구를 수신 • NFS 서버가 클라이언트 요구를 수신할 때 요구들은 서버에 있는 로컬 디스크를 접근하는 로컬 파일 접근 루틴에 보내짐 • NFS 서버는 클라이언트의 요구를 처리하는 동안 수행 • NFS 클라이언트는 클라이언트 호스트에 대해 사용자 프로세스로부터 요구를 처리하는 동안 수행
5. NFS 프로토콜(계속..) • NFS와 함께 사용된 다양한 RPC 프로그램 • Lock 관리자와 상태 모니터는 NFS 서버에 존재하는 파일의 lock 부분에 클라이언트를 허용 • 두 프로그램들은 NFS 프로토콜에 독립, NFS는 서버에 statelessness
5. NFS 프로토콜 (계속..) • 파일 처리(File Handles) • NFS의 기본 개념 • 서버에 파일 또는 디렉토리를 기준으로 사용하는 opaque 객체 • opaque: 서버가 파일 처리를 만들고 클라이언트에 그것을 돌려주고 클라이언트가 파일을 접속할 때 파일 처리를 사용한다는 의미 • 클라이언트는 파일 처리의 내용을 보지 못함 • 보통 사용자 프로세스는 파일 처리를 다루지 않음 • 앞뒤로 전달하는 NFS 클라이언트 코드와 NFS 서버 코드 • NFS 버전 2: 파일 처리는 32 byte 차지 • NFS 버전 3: 파일 처리는 64 byte로 증가
5.NFS 프로토콜(계속..) • Mount 프로토콜 • 클라이언트가 파일 시스템에 접속할 수 있기 전에 클라이언트는 서버의 파일 시스템 유지를 위해 NFS mount 프로토콜 사용 • UNIX mount 명령에 사용되는 Mount 프로토콜 user process user process user process mount command port mapper (1) register mountd daemon at start (6)mount system call (2) get port# RPC request NFS (3) RPC reply w/port# (4) mount RPC request client kernel server kernel (5) RPC request w/file handle
5.NFS Protocol(Mount Protocol) • 단계적 흐름 • 서버가 초기 가동할 때 포트 맵퍼가 서버에서 시작 • Mount 데몬(mountd)는 포트 맵퍼 후에 서버에서 시작 • mount 명령은 클라이언트에서 실행. 서버 mount 데몬의 포트 번호 획득을 위해 서버에 있는 포트 맵퍼에 RPC 호출 발행 • 포트 맵퍼는 포트번호에 응답 • mount 명령은 서버에 파일 시스템을 유지하기 위해 mount 데몬에 RPC 호출을 발생 • mount 데몬은 주어진 파일 시스템에 대해 파일 처리에 응답 • mount 명령은 클라이언트에 있는 로컬 mount 지점을 가지고 단계 5에서 되돌아온 파일 처리에 관련된 클라이언트 위의 mount 시스템을 발행
5.NFS 프로토콜(계속..) • Sun # mount -t nfs bsdi:/usr /nfs/bsdi/usr sun 클라이언트 / nfs bsdi 서버 bsdi / NFS mount usr usr rstevens hello.c 호스트 sun/nfs/bsdi/usr 디렉토리에서 bsdi:/usr/ 디렉토리 마운팅
5. NFS 프로토콜(계속..) • NFS 프로시저 • NFS 서버가 제공하는 15 프로시저 • 프로시저명은 실제로 NFSPROC_ 으로 시작 1. GETATTR 9. RENAME 2. SETATTR 10. LINK 3. STATFS 11. SYMLINK 4. LOOKUP 12. READLINK 5. READ 13. MKDIR 6. WRITE 14. RMDIR 7. CREATE 15. READDIR 8. REMOVE
5. NFS 프로토콜(계속..) • UDP 또는 TCP? • NFS는 원래 모든 판매자가 제공하는 UDP를 사용하여 쓰여진 것임. • 새로운 구현들은 TCP를 제공 • TCP는 WAN에서 사용되도록 지원 • NFS는 더 이상 지역적인 사용에 제한을 두지 않음 • 망의 유동성은 LAN에서 WAN으로 변화 • 왕복 시간은 넓게 변하고 빈번한 혼잡 발생 • WAN의 특성은 TCP와 같은 알고리즘 사용성 증대 • UDP는 TCP와 같은 특징을 제공하지 못함.
5. NFS 프로토콜(계속..) • TCP 상의 NFS • NFS의 버클리 Net/2 구현은 UDP 또는 TCP 지원 • TCP 사용의 차이점 • 서버가 bootstraps할 때, TCP port 2049에 대해 수동적 개방을 시작. 클라이언트 연결 요구를 대기 • 클라이언트가 TCP를 사용 파일 시스템을 마운트할 때, 서버에 있는 TCP port 2049에 능동적 개방을 수행: 클라이언트와 서버사이의 TCP 연결 • 클라이언트와 서버 모두 그들의 연결 끝에 대해 TCP의 keepalive 옵션을 설정 • 서버 파일 시스템을 사용하는 클라이언트 위의 모든 응용은 이 파일 시스템에 대한 단일 TCP 연결을 공유 • 클라이언트는 서버가 충돌, 재부팅하는 것을 검출하면 서버에 다시 연결 시도 • 클라이언트가 충돌하더라도 실행 중인 응용 프로그램은 실행
6. NFS 예 • 파일 읽기 • cat(1) 명령어 사용 터미널에 NFS 서버에 있는 파일 복사 예제 sun % cat /nfs/bsdi/usr/rstevens/hello.ccopy file to terminal main() { printf(“hello, world\n”); } 1 0.0 sun.7aa6 > bsdi.nfs: 104 getattr 2 0.003587 (0.0036) bsdi.nfs > sun.7aa6: reply ok 96 3 0.005390 (0.0018) sun.7aa7 > bsdi.nfs: 116 lookup “rstevens” 4 0.009570 (0.0042) bsdi.nfs > sun.7aa7:reply ok 128 5 0.011413 (0.0018) sun.7aa8 > bsdi.nfs: 116 lookup “hello.c” 6 0.015512 (0.0041) bsdi.nfs > sun.7aa8: reply ok 128 7 0.018843 (0.0033) sun.7aa9 > bsdi.nfs: 104 getattr 8 0.022377 (0.0035) bsdi.nfs > sun.7aa9: reply ok 96 9 0.027621 (0.0052) sun.7aaa > bsdi.nfs: 116 read 1024 bytes @ 0 10 0.032170 (0.0045) bsdi.nfs > sun.7aaa: reply ok 140
6. NFS 예(계속..) • 디렉토리 만들기 • 작업중인 디렉토리를 NFS에 있는 다른 디렉토리로 변경 및 새로운 디렉토리 생성 예제 sun % cd /nfs/bsdi/usr/rstevens작업 디렉토리 변경 sun % mkdir Mail그리고 디렉토리 생성 1 0.0 sun.7ad2 > bsdi.nfs: 104 getattr 2 0.004912 (0.0049) bsdi.nfs > sun.7ad2: reply ok 96 3 0.007266 (0.0024) sun.7ad3 > bsdi.nfs: 104 getattr 4 0.010846 (0.0036) bsdi.nfs > sun.7ad3: reply ok 96 5 35.769875 (35.7590) sun.7ad4 > bsdi.nfs: 104 getattr 6 35.773432 ( 0.0036) bsdi.nfs > sun.7ad4: reply ok 96 7 35.775236 (0.0018) sun.7ad5 > bsdi.nfs: 112 lookup “Mail” 8 35.780914 (0.0057) bsdi.nfs > sun.7ad5: reply ok 28 9 35.782339 (0.0014) sun.7ad6 > bsdi.nfs: 144 mkdir “Mail” 10 35.992354 (0.2100) bsdi.nfs > sun.7ad6: reply ok 128
6. NFS 예(계속..) • Server Crash • NFS 서버로부터 파일을 읽는 도중에 서버가 갑자기 동작을 멈추거나 재시동 되는 경우 sun % cat /nfs/svr4/usr/share/lib/termcap 1 0.0 sun.7ade > svr4.nfs: 104 getattr 2 0.007653 (0.0077) svr4.nfs > sun.7ade: reply ok 96 3 0.009041 (0.0014) sun.7adf > svr4.nfs: 116 lookup “share” 4 0.017237 (0.0082) svr4.nfs > sun.7adf: reply ok 128 5 0.018518 (0.0013) sun.l7ae0 > svr4.nfs: 112 lookup “lib” 6 0.026802 (0.0083) svr4.nfs > sun.7ae0: reply ok 128 7 0.028096 (0.0013) sun.7ae1 > svr4.nfs: 116 lookup “termcap” 8 0.036434 (0.0083) svr4.nfs > sun.7ae1: reply ok 128 9 0.038060 (0.0016) sun.7ae2 > svr4.nfs: 104 getattr 10 0.045821 (0.0078) svr4.nfs > sun.7ae2: reply ok 96 11 0.050984 (0.0052) sun.7ae3 > svr4.nfs: 116 read 1024 bytes @ o 12 0.084995 (0.0340) svr4.nfs > sun.7ae3: reply ok 1124 reading continues
6. NFS 예(계속..) 128 3.430313 (0.0013) sun.7b22 > svr.nfs: 116 read 1024 bytes @ 64512 129 3.441828 (0.0115) svr4.nfs > sun.7b22: reply ok 1124 130 4.125031 (0.6832) sun.7b23 > svr4.nfs: 116 read 1024 bytes @ 65536 131 4.868593 (0.7436) sun.7b24 > svr4.nfs: 116 read 1024 bytes @ 73728 144 71.090305 (19.2594) sun.7b23 > svr4.nfs: 116 read 1024 bytes @ 65536 145 71.830155 (0.7398) sun.7b24 > svr4.nfs: 116 read 1024 bytes @ 73728 retransmissions continue 167 291.824285 (0.7400) sun.7b24 > svr4.nfs: 116 read 1024 bytes @ 73728 168 311.083676 (19.2594) sun.7b23 > svr4.nfs: 116 read 1024 bytes @ 65536 server reboots 169 311.149476 (0.0658) arp who-has sun tell svr4 170 311.150004 (0.0005) arp reply sun is-at 8:0:20:3:f6:42 171 311.154852 (0.0048) svr4.nfs > sun.7b23: reply ok 1124 172 311.156671 (0.0018) sun.7b25 > svr4.nfs: 116 read 1024 bytes @ 66560
6. NFS 예(계속..) • Idempotent 프로시저 • 서버에 의해 한번 이상 실행되어질 수 있고 여전히 같은 결과가 나온다면 RPC 프로시저를 Idempotent라 부름. • Idempotent 인 NFS operations: • GETATTR, STATFS, LOOKUP, READ, WRITE, READLINK, READDIR. • Idempotent 가 아닌 프로시저: • CREATE, REMOVE, RENAME, LINK, SYMLINK, MKDIR, RMDIR. • NFS 서버는 nonidempotent 동작을 처리할 수 있는 방법 필요 • 잃어버린 응답은 UDP에서 발생 할 수 있음. • Nonidempotent 동작을 위해 최근의 응답을 저장한 recent-reply 캐쉬 구현
7. NFS 버전 3 구 분 버전 2 버전 3 파일처리 크기 READ/WRITE RPC 당 바이트 수 파일크기, READ/WRITE 순서 시작 바이트 offset 파일 속성 WRITE 동기 여부 추가 프로시저 32 바이트 고정 8192 바이트 까지 제한 32 비트 GETATTR 동기 필요 64 바이트 까지 가변 제한 없음 64 비트까지 확장 속성에 영향을 주는 모든 요구마다 되돌려질 수 있음 비동기 가능 - STATFS 삭제 - ACCESS, MKNOD, READDIRPLUS, FSINFO, FSSTAT, PATHCONF, COMMIT 추가
8. 요 약 • RPC는 클라이언트가 서버에게 수행하도록 요청하는 것 같은 클라이언트 서버 응용 프로그램을 구체화 하기 위한 하나의 방법 • 모든 망의 세부 사항은 클라이언트와 서버 stub, RPC 라이브러리 루틴 내에 숨겨져 있음. • XDR은 RPC 클라이언트와 서버들이 다른 구조를 가진 머신들에서 동작하도록 값을 암호화 하는데 사용 • NFS와 NFS가 UDP와 TCP를 사용 방법 • 15개 프로시저가 NFS 버전 2 프로토콜에서 정의 • 한 NFS 서버에 클라이언트의 접근은 mount 프로토콜로 시작, 클라이언트에 하나의 파일 처리 반환 • NFS는 그것의 프로시저를 idempotent화 시도