La foret rouge
Published on

NFS 서버 구성, 클라이언트 연결 실습

Authors
  • avatar
    Name
    신주용

NFS란?

NFS는 Network File System의 약어로 Sun Microsystems에서 Unix 기반 시스템을 위한 상태 유지 파일 공유 프로토콜로 개발되었습니다1. 네트워크에 연결된 Unix, Linux 시스템끼리 NFS 디렉토리를 마운트하면 로컬 디렉토리처럼 자유롭게 사용할 수 있습니다. Windows에서도 NFS를 지원하는 것 같긴 하나, 기본적으로는 Unix-like 시스템을 위한 프로토콜입니다2.

작동 방식

NFS 서버-클라이언트 동작 방식은 다음과 같습니다1.

  1. 클라이언트는 RPC를 사용해 서버에 파일 또는 디렉토리를 요청합니다.
  2. 서버는 (1) 파일 또는 디렉토리의 가용성, (2) 클라이언트에 필요한 액세스 권한이 있는지 여부를 확인합니다.
  3. 서버는 파일 또는 디렉토리를 클라이언트에 원격으로 탑재하고 가상 연결을 통해 액세스를 공유합니다.

NFS 서버 설치

그럼 지금부터는 설치 실습을 해보겠습니다. 실습 환경은 Linux VM 2대(서버, 클라이언트)를 준비했습니다.

Prepare two VMs
  1. nfs-utils 패키지를 설치합니다.

    Install nfs-utils on server
    • 여기에서 nfs-utils와 함께 rpcbind가 자동으로 설치되지 않는다면 추가로 설치해줘야 합니다.
  2. nfs-server를 실행해봅시다. 시스템 부팅 시 자동으로 시작되도록 enable도 해줍니다.

    Start nfs server
  3. 만약 방화벽을 사용 중이라면 nfs를 허용해줍니다.

    Allow nfs firewall
  4. 공유 디렉토리를 생성하고 등록해줍니다.

    Create and regist a shared directory
    1. /data 디렉토리를 생성하고
    2. /etc/exports 파일에 경로 클라이언트(옵션) [...] 형식으로 추가합니다.
      • 최초에는 파일 내용이 없기 때문에 스크린샷과 같이 입력해줘도 되지만, vi나 nano 같은 에디터를 쓰는 것이 작성이나 수정하기 더 수월합니다.
      • 클라이언트는 호스트명이 올 수도 있고, IP주소가 올 수도 있습니다.
      • 저는 우선 rw(read & write) 권한만 줬는데 async/sync, root_squash/no_root_squash/all_squash, anonuid/anongid 등 다른 옵션들에 대해서는 터미널에서 man exports 명령을 실행하면 자세한 설명을 볼 수 있습니다.
    3. exportfs로 변경사항을 반영해줍니다. -r은 reexport이고 제대로 적용됐는지 -v로 볼 수 있습니다.
      • 제가 준 rw 옵션 말고도 기본 옵션이 많이 적용되어 있습니다.
  5. 연결 후 확인 가능하도록 임의로 파일과 디렉토리를 만들어둡시다.

    Create dummy file and directory

NFS 서버에 연결

로컬에서 마운트

우선 로컬에서 마운트를 해보겠습니다.

  1. 마운트 할 디렉토리를 생성하고 마운트 합니다.

    Create target directory and mount
  2. 파일, 디렉토리 생성/삭제를 해봅니다.

    Create/remove the file and directory
    • 위에서 rw 권한을 줬는데 권한이 없다고 생성/삭제가 안됩니다.

NFS는 기본적으로 클라이언트의 root 사용자를 서버의 nobody에 매핑하는 root_squash 기능을 사용하여 무단 쓰기를 방지합니다3.

  1. 권한 문제를 해결하기 위해 NFS 서비스 계정을 따로 만들어서 사용하겠습니다.

    Add user and modify ownership
    • 이 유저에 원격 접속을 하지는 않을거라 유저 생성 시 -M, -s /sbin/nologin 옵션을 사용했습니다.
    • 공유 디렉토리 /data의 소유자/소유그룹을 변경해줍니다.
  2. 새로 생성한 nfsuser의 uid, gid를 확인하고, 공유 옵션을 수정한 뒤 nfs-server를 재시작합니다.

    Modify server option and restart
  3. 이제는 파일, 디렉토리의 생성/삭제가 다 잘 되는 것을 확인할 수 있습니다.

    Create/remove the file and directory

원격지에서 마운트

그러면 이제 원격지(이번 테스트에서는 다른 VM)에서 마운트 해봅시다.

  1. 클라이언트도 nfs-utils 패키지가 필요하므로 설치합니다.

  2. 그 다음은 [로컬에서 마운트]와 과정은 비슷한데, mount 명령어 옵션에 원격지 주소를 적어줘야 합니다.

    Create target directory and mount
  3. 이번에도 파일, 디렉토리 생성/삭제 테스트를 해봅시다.

    Create/remove the file and directory
  4. 추가로, 재부팅 후에도 마운트가 되도록 설정해봅시다. /etc/fstab 파일을 수정해줘야 합니다.

    Mount after restart
    • /etc/fstab 파일에 적는 값은 server:path /mountpoint fstype option,option,... 0 0 형식입니다.
      • 마지막 두 0은 NFS에서는 사용되지 않는 값이라 0으로 둡니다.
      • 더 자세한 설명은 man nfs를 참고하세요.

이렇게 NFS 서버-클라이언트 구성 및 연결 실습을 해봤습니다. 유용하게 잘 사용하시길 바라겠습니다.

참고: 이 글에서 언급되었으나 깊게 설명하지 않은 내용입니다.

  • Linux shell

Footnotes

  1. AWS. "NFS와 SMB의 차이점은 무엇인가요?" aws.amazon.com. https://aws.amazon.com/ko/compare/the-difference-between-nfs-smb/ (accessed Nov. 13, 2024). 2

  2. Microsoft. "네트워크 파일 시스템 개요." Microsoft Learn. https://learn.microsoft.com/ko-kr/windows-server/storage/nfs/nfs-overview (accessed Oct. 26, 2024).

  3. Red Hat. "6.5. 마운트된 NFS 내보내기에 대한 파일 권한." Red Hat Documentation. https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/9/html/managing_file_systems/file-permissions-on-mounted-nfs-exports_securing-nfs (accessed Oct. 26, 2024).