base

NFS(Network File System)

평소 개발을 하다 보면 여러 대의 서버가 하나의 파일을 공유해야 하는 상황이 자주 발생합니다. 이런 상황에서 각각의 서버마다 같은 파일을 복사해 관리하는 건 번거롭고, 파일의 동기화 문제나 관리 비용까지 고려하면 머리가 아파지죠. 이런 문제를 해결하는 방법이 바로 오늘 소개할 NFS(Network File System) 입니다.


파일을 하나만 수정해도 모든 서버에서 같은 파일을 볼 수 있다면 편리하지 않을까요? 오늘은 바로 이러한 편리함을 제공하는 NFS가 무엇인지, 어떤 원리로 동작하는지 알아 봅시다.

NFS란 무엇인가요?

NFS(Network File System)는 네트워크를 통해 원격으로 파일을 공유할 수 있게 해주는 분산 파일 시스템입니다. 1984년에 Sun Microsystems가 개발했으며, 주로 리눅스 및 유닉스 환경에서 널리 사용됩니다.


NFS는 클라이언트와 서버 구조로 되어 있어서, 원격 서버(NFS 서버)에 파일을 저장하고, 여러 클라이언트(NFS 클라이언트)가 네트워크를 통해 서버의 파일을 자신의 로컬 디렉터리처럼 사용할 수 있게 해줍니다. 이 덕분에 분산 환경에서 파일의 일관성 및 유지 관리 비용을 크게 절감할 수 있습니다.

NFS의 기본 동작 방식 이해하기

NFS는 간단한 RPC(Remote Procedure Call) 프로토콜을 사용하여 동작합니다. 파일의 요청이나 저장 등 클라이언트의 모든 파일 시스템 작업은 NFS 프로토콜을 통해 서버로 전달되고 처리된 결과가 다시 클라이언트에게 전달됩니다. 클라이언트 입장에서는 원격의 파일 시스템이 마치 자신의 로컬 디스크처럼 투명하게 보이기 때문에 사용자는 네트워크상의 파일이라는 사실을 의식하지 않고 사용할 수 있습니다. 즉, NFS는 파일에 접근하는 방식의 추상화를 제공하여 사용 편의성을 높여줍니다.


NFS의 가장 큰 장점 중 하나는 높은 효율성과 사용의 용이성입니다. 별도의 복잡한 설정 없이 간단히 서버와 클라이언트를 연결할 수 있으며, 운영체제 수준에서 지원되기 때문에 성능이 뛰어납니다. 또한 하나의 파일 시스템을 여러 대의 서버가 함께 사용할 수 있어 데이터 관리와 동기화 비용이 줄어듭니다. 리소스를 절약할 수 있으며, 관리의 용이성도 좋아서 유지 보수나 확장에도 큰 이점을 제공합니다. 다만 네트워크 환경에 따라 성능이 좌우될 수 있으며, 보안 설정을 제대로 하지 않으면 파일의 보안성에 문제가 발생할 수 있으므로 주의해야 합니다.


실제로 NFS는 다양한 환경에서 널리 활용됩니다. 대표적인 활용 예시를 몇 가지 살펴보겠습니다. 첫째로, 웹 서버 환경입니다. 여러 웹 서버가 동일한 정적 콘텐츠를 제공해야 하는 경우, 각 서버마다 파일을 배포할 필요 없이 NFS를 통해 하나의 원본 파일 시스템을 공유하면 편리하게 관리할 수 있습니다. 둘째로, 클러스터 환경에서 데이터를 공유할 때입니다. 여러 서버에서 데이터를 병렬로 처리하고 결과를 공유해야 하는 데이터 분석 환경에서도 NFS를 활용하면 효율적이고 빠르게 데이터를 공유할 수 있습니다. 마지막으로, 개발 환경에서도 유용합니다. 팀원들이 동일한 개발 환경과 소스를 공유하고 싶을 때 NFS를 통해 공통의 소스 디렉터리를 공유하여 협업의 효율성을 높일 수 있습니다.

간단한 NFS 설정 방법 (리눅스 기준)

NFS 설정은 간단히 서버와 클라이언트 측에서 몇 가지 설정만으로 완료할 수 있습니다.

NFS 서버 설정하기

먼저, 서버에서 NFS 관련 패키지를 설치합니다.

$ sudo apt-get install nfs-kernel-server

그리고 공유할 디렉터리를 생성하고, /etc/exports 파일에 클라이언트 접근 설정을 추가합니다. 예를 들어, /data 디렉터리를 모든 클라이언트에게 공유하고 싶다면 다음과 같이 입력합니다. 이 설정은 NFS 서버에서 /data 디렉토리를 모든 클라이언트(*)에게 읽기/쓰기 권한(rw)으로 공유하고, 몇 가지 성능 및 권한 관련 옵션을 설정한 것입니다.

$ sudo mkdir -p /data
$ /data \*(rw,sync,no\_root\_squash,no\_subtree\_check)
  • rw: 읽기 및 쓰기 허용
  • sync: 쓰기 작업이 완료된 후에만 클라이언트에 응답
  • no_root_squash: 클라이언트의 root 권한을 서버에서도 유지
  • no_subtree_check: 서브디렉터리 확인 생략 (성능 향상)

설정을 적용하려면 아래 명령어를 실행합니다.

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server

마지막으로 NFS 서버를 재시작합니다.

$ sudo systemctl restart nfs-kernel-server

NFS 클라이언트 설정하기

클라이언트에서도 패키지를 설치합니다.

$ sudo apt-get install nfs-common

그리고 마운트할 디렉터리를 생성한 후, 서버의 공유 디렉터리를 마운트합니다.

$ sudo mount [서버IP]:/data /mnt
  • [서버IP]는 예: 192.168.0.10
  • /mnt는 클라이언트에서 미리 생성된 디렉터리여야 함
  • 자동 마운트를 위해 /etc/fstab 설정도 고려 가능

이제 클라이언트의 /mnt 디렉터리를 통해 서버의 공유 파일을 사용할 수 있습니다. 클라이언트 설정 부분을 정리하면 아래와 같습니다.

$ sudo apt-get install nfs-common
$ sudo mkdir -p /mnt
$ sudo mount 192.168.0.10:/data /mnt

NFS 사용 시 주의사항

NFS는 편리하지만 몇 가지 주의할 점이 있습니다.

  • 네트워크 장애나 서버 다운 시 파일 접근이 불가능할 수 있습니다. 중요 파일은 별도의 백업을 권장합니다.
  • 기본적으로 보안이 약하기 때문에 외부 네트워크에 노출되지 않도록 설정에 주의해야 합니다. 필요하면 방화벽이나 별도의 VPN을 통한 접근 통제가 필수입니다.
  • 너무 많은 클라이언트가 동시에 접근하면 성능 저하가 발생할 수 있으므로 적절한 규모로 구성하는 것이 중요합니다.

정리

NFS(Network File System)는 네트워크 환경에서 여러 클라이언트가 하나의 파일 시스템을 공유할 수 있도록 하는 매우 유용한 기술입니다. 로컬 파일처럼 손쉽게 사용하면서도 분산 환경에서 유지 관리 비용과 동기화 문제를 효율적으로 해결할 수 있습니다. 실무에서 서버 자원을 절약하고 효율적인 관리를 위해 자주 사용되지만, 성능과 보안 측면에서 철저한 관리가 필요합니다.


참고 자료