네트워크 파일 시스템

**네트워크 파일 시스템**(Network File System, **NFS**)은 1984년에 썬 마이크로시스템즈(썬)가 원래 개발한 분산 파일 시스템 프로토콜로, 클라이언트 컴퓨터의 사용자가 컴퓨터 망을 통해 로컬 저장소에 접근하는 것과 유사하게 파일에 접근할 수 있게 해준다. NFS는 다른 많은 프로토콜과 마찬가지로 ONC RPC(Open Network Computing Remote Procedure Call) 시스템을 기반으로 구축되었다. NFS는 개방형 IETF 표준이다. 썬 마이크로시스템즈 내부에서 개발된 첫 번째 실험적 버전 이후, 프로토콜의 모든 후속 버전은 일련의 RFC(Request for Comments)에 정의되어 누구나 프로토콜을 구현할 수 있도록 허용하고 있다.

## 버전 및 변형
썬은 버전 1을 내부 실험 목적으로만 사용했다. 개발 팀이 NFS 버전 1에 상당한 변경 사항을 추가하고 썬 외부로 출시했을 때, 버전 간 상호 운용성과 RPC 버전 폴백(fallback)을 테스트할 수 있도록 새 버전을 v2로 출시하기로 결정했다.

### NFSv2
프로토콜의 버전 2(1989년 3월, 에 정의됨)는 원래 사용자 데이터그램 프로토콜(UDP) 위에서만 작동했다. 설계자들은 서버 측을 상태 비보존형(stateless)으로 유지하고자 했으며, 잠금 등은 핵심 프로토콜 외부에서 구현되었다. NFS 버전 2 생성에 참여한 사람들로는 러셀 샌드버그, 밥 라이언, 빌 조이, 스티브 클라이먼 등이 있다.

가상 파일 시스템 인터페이스는 모듈식 구현을 가능하게 하며, 이는 단순한 프로토콜에 반영되었다. 1986년 2월까지 System V 릴리스 2, DOS, VAX/VMS(Eunice 사용)와 같은 운영 체제에 대한 구현이 시연되었다.
NFSv2는 32비트 제한으로 인해 파일의 처음 2GB까지만 읽을 수 있다.

### NFSv3
버전 3(1995년 6월, )에서 추가된 사항은 다음과 같다.
* 2기가바이트(GB)보다 큰 파일을 처리하기 위한 64비트 파일 크기 및 오프셋 지원.
* 쓰기 성능 향상을 위한 서버의 비동기 쓰기 지원.
* 속성을 다시 가져올 필요가 없도록 많은 응답에 추가 파일 속성 포함.
* 디렉터리를 스캔할 때 파일 이름과 함께 파일 핸들 및 속성을 얻기 위한 READDIRPLUS 작업.
* 기타 다양한 개선 사항.

썬 마이크로시스템즈 내부의 첫 번째 NFS 버전 3 제안은 NFS 버전 2 출시 직후에 만들어졌다. 주요 동기는 NFS 버전 2의 동기 쓰기 작업에 따른 성능 문제를 완화하려는 시도였다. 1992년 7월까지 구현 관행을 통해 NFS 버전 2의 많은 단점이 해결되었으며, 대용량 파일 지원(64비트 파일 크기 및 오프셋) 부족만이 시급한 문제로 남았다. 버전 3가 도입될 무렵, 전송 계층 프로토콜로서 TCP에 대한 벤더들의 지원이 증가하기 시작했다. 일부 벤더들이 이미 TCP를 전송 수단으로 사용하는 NFS 버전 2 지원을 추가했었지만, 썬 마이크로시스템즈는 버전 3 지원을 추가함과 동시에 NFS용 TCP 전송 지원을 추가했다. TCP를 전송 수단으로 사용함으로써 WAN에서 NFS를 사용하는 것이 더 실용적이 되었으며, 사용자 데이터그램 프로토콜에 의해 부과된 8KB 제한을 넘어 더 큰 읽기 및 쓰기 전송 크기를 사용할 수 있게 되었다.

#### YANFS/WebNFS

이전의 WebNFS였던 YANFS(Yet Another NFS)는 NFSv2 및 NFSv3의 확장으로, Portmap 및 MOUNT 프로토콜의 복잡성 없이 제한적인 방화벽 뒤에서 작동할 수 있게 해준다. YANFS/WebNFS는 고정된 TCP/UDP 포트 번호(2049)를 사용하며, 클라이언트가 모든 파일 시스템의 초기 파일 핸들을 결정하기 위해 MOUNT RPC 서비스에 접속할 필요 없이, 시작점으로 사용할 수 있는 공용 파일 핸들(NFSv2의 경우 null, NFSv3의 경우 길이가 0인 값) 개념을 도입했다. 이 두 가지 변경 사항은 나중에 NFSv4에 통합되었다. YANFS의 WebNFS 이후 개발에는 서버 측 통합도 포함되었다.

### NFSv4
버전 4(2000년 12월 ; 2003년 4월  및 2015년 3월 에서 개정됨)는 앤드루 파일 시스템(AFS)과 서버 메시지 블록(SMB)의 영향을 받았으며, 성능 향상, 강력한 보안 의무화, 상태 보존형(stateful) 프로토콜 도입 등을 포함한다. 버전 4는 썬 마이크로시스템즈가 NFS 프로토콜 개발을 넘긴 후 국제 인터넷 표준화 기구(IETF)와 함께 개발한 첫 번째 버전이 되었다.

NFS 버전 4.1(2010년 1월 ; 2020년 8월 에서 개정됨)은 여러 서버에 분산된 파일에 대해 확장 가능한 병렬 액세스를 제공하는 기능(pNFS 확장)을 포함하여 클러스터형 서버 배포를 활용할 수 있도록 프로토콜 지원을 제공하는 것을 목표로 한다. 버전 4.1에는 세션 트렁킹 메커니즘(NFS 멀티패싱으로도 알려짐)이 포함되어 있으며 VMware ESXi와 같은 일부 기업용 솔루션에서 사용할 수 있다.

NFS 버전 4.2()는 2016년 11월에 다음과 같은 새로운 기능과 함께 발표되었다. 서버 측 복제 및 복사, 애플리케이션 I/O 어드바이스, 스파스 파일, 공간 예약, 애플리케이션 데이터 블록(ADB), 모든 MAC 보안 시스템을 수용하는 sec_label이 있는 레이블링된 NFS, 그리고 pNFS를 위한 두 가지 새로운 작업(LAYOUTERROR 및 LAYOUTSTATS).

이전 버전들에 비해 NFSv4가 갖는 큰 장점 중 하나는 서비스를 실행하는 데 하나의 UDP 또는 TCP 포트(2049)만 사용된다는 점이며, 이는 방화벽을 가로질러 프로토콜을 사용하는 것을 단순화한다.

### 기타 확장
버전 2 및 버전 3의 확장인 WebNFS는 NFS가 웹 브라우저에 더 쉽게 통합되고 방화벽을 통해 작동할 수 있게 해준다. 2007년 썬 마이크로시스템즈는 클라이언트 측 WebNFS 구현을 오픈 소스로 공개했다.

다양한 사이드밴드 프로토콜이 NFS와 연관되었다. 참고사항:
* 바이트 범위 권고형 네트워크 락 매니저(Network Lock Manager, NLM) 프로토콜 (유닉스 시스템 V 파일 잠금 API를 지원하기 위해 추가됨)
* 원격 쿼터 보고(RQUOTAD) 프로토콜: NFS 사용자가 NFS 서버에서 자신의 데이터 저장 쿼터를 볼 수 있도록 함
* NFS over RDMA: 원격 직접 메모리 접근(RDMA)을 전송 수단으로 사용하는 NFS의 변형
* NFS-Ganesha: 사용자 공간에서 실행되는 NFS 서버로, 각각의 FSAL(파일 시스템 추상화 계층) 모듈을 통해 GPFS/Spectrum Scale, CephFS와 같은 다양한 파일 시스템을 지원한다. CephFS FSAL은 libcephfs를 사용하여 지원된다.
* 신뢰된 NFS(Trusted NFS, TNFS)

## 플랫폼
NFS는 다음에서 사용할 수 있다.

* 유닉스 계열 운영 체제 (솔라리스, AIX, HP-UX, FreeBSD, NetBSD, OpenBSD, DragonFly BSD, 리눅스 배포판, MacOS. 단, macOS의 기본 네트워크 프로토콜은 서버 메시지 블록(SMB)이다.)
* 아미가OS
* ArcaOS
* 하이쿠
* IBM i, 단, 기본 네트워크 프로토콜은 OS/400 파일 서버(QFileSvr.400)이다.
* 마이크로소프트 윈도우, 단, 기본 네트워크 프로토콜은 서버 메시지 블록(SMB)이다.
* MS-DOS
* 노벨 넷웨어, 단, 기본 네트워크 프로토콜은 넷웨어 코어 프로토콜(NCP)이다.
* OpenVMS
* OS/2
* RISC OS

섬네일|600px|center|2013년 11월 22일 기준 NFS SPECsfs2008 성능 비교

## 프로토콜 개발
ONC 프로토콜(당시에는 썬RPC라고 불림) 개발 당시, Apollo의 네트워크 컴퓨팅 시스템(Network Computing System, NCS)만이 유사한 기능을 제공했다. 두 개의 경쟁 그룹이 두 가지 원격 프로시저 호출 시스템의 근본적인 차이점을 두고 발전했다. 논쟁은 데이터 인코딩 방식에 집중되었다. ONC의 외부 데이터 표현(XDR)은 연결된 두 피어(peer)의 머신 아키텍처가 리틀 엔디언이더라도 항상 빅 엔디언 순서로 정수를 렌더링한 반면, NCS 방식은 두 피어가 공통된 엔디언 방식을 공유할 때마다 바이트 스왑(byte-swap)을 피하려고 시도했다. 1987년 3월에 네트워크 컴퓨팅 포럼(Network Computing Forum)이라는 산업 그룹이 결성되어 두 네트워크 컴퓨팅 환경을 화해시키려 시도했으나 결과적으로 성공하지 못했다.

1987년, 썬과 AT&T는 AT&T의 유닉스 시스템 V 릴리스 4를 공동 개발할 것이라고 발표했다. 이는 AT&T의 다른 유닉스 시스템 라이선스 보유자들이 썬이 유리한 위치에 서게 될 것을 우려하게 만들었고, 결국 1988년에 디지털 이큅먼트, HP, IBM 등이 개방 소프트웨어 재단(OSF)을 결성하게 되었다. 아이러니하게도 썬과 AT&T는 이전에 썬의 NFS 대 AT&T의 원격 파일 시스템(Remote File System, RFS)으로 경쟁했으나, 디지털 이큅먼트, HP, IBM 및 많은 다른 컴퓨터 벤더들이 RFS 대신 NFS를 신속하게 채택하면서 대다수의 사용자가 NFS 쪽으로 기울게 되었다.
NFS의 상호운용성은 1986년부터 시작된 "커넥터손(Connectathons)"이라는 이벤트를 통해 도움을 받았으며, 이를 통해 벤더 중립적인 방식으로 서로의 구현을 테스트할 수 있었다. OSF는 썬/ONC RPC 및 NFS 대신 분산 컴퓨팅 환경(DCE)과 DCE 분산 파일 시스템(DFS)을 채택했다. DFS는 DCE를 RPC로 사용했으며, 앤드루 파일 시스템(AFS)에서 파생되었다. DCE 자체는 Apollo의 NCS 및 커버로스를 포함한 일련의 기술에서 파생되었다.

### 1990년대
썬 마이크로시스템즈와 인터넷 협회(ISOC)는 ONC RPC의 "변경 권한"을 양도하기로 합의하여, ISOC의 엔지니어링 표준 기구인 국제 인터넷 표준화 기구(IETF)가 ONC RPC 프로토콜과 관련된 표준 문서(RFC)를 게시하고 ONC RPC를 확장할 수 있게 되었다. OSF는 DCE RPC를 IETF 표준으로 만들려 시도했으나, 결국 변경 권한을 포기하지 않으려 했다. 이후 IETF는 프로토콜 표준이 적절한 보안을 갖추어야 한다는 IETF 요구 사항을 충족하기 위해 GSSAPI를 기반으로 한 새로운 인증 방식인 RPCSEC GSS를 추가하여 ONC RPC를 확장하기로 선택했다.

나중에 썬과 ISOC는 NFS 버전 2와 버전 3를 제외하도록 계약을 신중하게 작성하면서, NFS에 대한 변경 권한을 ISOC에 부여하는 유사한 합의에 도달했다. 대신 ISOC는 NFS 프로토콜에 새로운 버전을 추가할 권리를 얻었으며, 그 결과 IETF는 2003년에 NFS 버전 4를 명시하게 되었다.

### 2000년대
21세기에 이르러 DFS나 AFS는 SMB나 NFS와 비교했을 때 상업적으로 큰 성공을 거두지 못했다. DFS와 AFS의 주요 상업 벤더였던 트랜스아크(Transarc)를 인수했던 IBM은 2000년에 AFS 소스 코드의 대부분을 자유 소프트웨어 공동체에 기부했다. OpenAFS 프로젝트는 계속 유지되고 있다. 2005년 초, IBM은 AFS 및 DFS의 판매 종료를 발표했다.

2010년 1월, Panasas는 데이터 액세스 병렬화 기능을 향상시킨다고 주장하며 병렬 NFS(pNFS) 기술에 기반한 NFSv4.1을 제안했다. NFSv4.1 프로토콜은 파일 시스템 메타데이터를 파일 데이터 위치에서 분리하는 방법을 정의한다. 이는 데이터 서버 세트 사이에 데이터를 스트라이핑함으로써 단순한 이름/데이터 분리를 넘어선다. 이는 파일 이름과 데이터를 서버라는 단일 우산 아래에 두는 전통적인 NFS 서버와 다르다. 일부 제품은 다중 노드 NFS 서버이지만, 메타데이터와 데이터의 분리에 클라이언트가 참여하는 것은 제한적이다.

NFSv4.1 pNFS 서버는 서버 리소스 또는 구성 요소의 집합이며, 이들은 메타데이터 서버에 의해 제어되는 것으로 가정된다.

pNFS 클라이언트는 네임스페이스 탐색 또는 상호 작용을 위해 여전히 하나의 메타데이터 서버에 액세스한다. 클라이언트가 서버로 데이터를 이동하거나 서버로부터 데이터를 가져올 때 pNFS 서버 컬렉션에 속한 데이터 서버 세트와 직접 상호 작용할 수 있다. NFSv4.1 클라이언트는 파일 데이터의 정확한 위치에 직접 참여하고 데이터를 이동할 때 단일 NFS 서버와의 고립된 상호 작용을 피하도록 활성화될 수 있다.

pNFS 외에도 NFSv4.1은 다음을 제공한다.
* 세션
* 디렉터리 위임 및 알림
* 다중 서버 네임스페이스
* 접근 제어 목록 및 임의 접근 제어
* 보존 속성
* SECINFO_NO_NAME

## 같이 보기
* 공유 자원
* 커베로스
* 네트워크 정보 서비스
* 삼바
* 서버 메시지 블록

## 각주


## 외부 링크
* RFC 5661 - Network File System (NFS) Version 4 Minor Version 1 Protocol
* RFC 3530 - NFS Version 4 Protocol Specification
* RFC 2054 - WebNFS Specification
* RFC 2339 - Sun/ISOC NFS Change Control Agreement
* RFC 2203 - RPCSEC_GSS Specification
* RFC 1813 - NFS Version 3 Protocol Specification
* RFC 1790 - Sun/ISOC ONC RPC Change Control Agreement
* RFC 1094 - NFS Version 2 Protocol Specification
* Network File System Version 4 (nfsv4) Charter
* Linux NFS Overview, FAQ and HOWTO Documents
* NFSv4 delivers seamless network access
* NFS operation explained with sequence diagrams 


분류:파일 시스템
분류:인터넷 기반 프로토콜
분류:인터넷 프로토콜 기반 네트워크 소프트웨어
분류:네트워크 부팅