티스토리 뷰

728x90
반응형

How to set up a network file system on CentOS 8

클라이언트 / 서버 파일 시스템이라고도 부르는 NFS (Network File System)는 클라이언트가 네트워크를 통해 다른 사용자와 디렉토리 및 파일을 공유하고 상호 작용할 수 있도록 마치 로컬에 마운트된 것 처럼 네트워크를 통해 로컬 파일 시스템을 내보내는데 널리 사용되는 교차 플랫폼 및 분산 파일 시스템 프로토콜이다.

두 대의 머신에 CentOS 8을 설치하고 NFS 설정을 통해서 클라이언트 / 서버간의 파일 공유를 검증해 본다.

NFS Server 구성

NFS (Network File System)는 네트워크 상의 다른 머신에서 파일 시스템으로 마운트하여 사용할 수 있도록 공유하는 방법이다.

  • NFS 서버 패키지 설치

    # 이미 설치되어 있는 경우는 최신 버전으로 업그레이드 된다. (nfs-utils-1:2.3.3-35.el8.x86_64)
    $ sudo dnf install -y nfs-utils
  • NFS 서버 Exports 설정

    공유할 디렉터리를 구성한다.

    $ sudo mkdir /data/NFS

    NFS 서버의 특정 IP 호스트 접속을 허용하는 설정을 구성한다. (/etc/exports)

    $ sudo vi /etc/exports
    
    /data/NFS 10.0.1.*(rw,sync,no_root_squash)

    주의

    • 위의 /etc/exports 파일 내에 옵션을 설정할 때는 빈 공백이 없이 붙여서 작성해야 한다.
    • 10.0.1.* 는 10.0.1.0/24 와 같은 의미로 어떤 것을 사용해도 좋다.

    사용할 수 있는 옵션들은 다음과 같다.

    • rw: 읽기 및 쓰기 가능
    • ro: 읽기만 가능
    • secure: 클라이언트 마운트 요청시 포트를 1024 이하로 지정
    • noaccess: 액세스 거부
    • root_squash: 클라이언트의 root 사용자가 서버의 root 권한을 획득하는 것을 방지
    • no_root_squach: 클라이언트의 root 사용자와 서버의 root를 동일하게 설정
    • sync: 파일 시스템이 변경되면 즉시 동기화
    • all_sqash: root를 제외하고 서버와 클라이언트의 사용자를 동일한 권한으로 설정
    • no_all_sqash: root를 제외하고 서버와 클라이언트의 사용자들을 하나의 권한을 가지도록 설정
  • NFS 실행

    # NFS Server 서비스 시작
    $ sudo systemctl start nfs-server.service
    
    # NFS Server 서비스가 재 부팅시 자동으로 시작될 수 있도록 설정
    $ sudo systemctl enable nfs-server.service
    Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
    
    # NFS Server 서비스 상태 확인
    $ sudo systemctl status nfs-server.service
    ● nfs-server.service - NFS server and services
      Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
      Drop-In: /run/systemd/generator/nfs-server.service.d
              └─order-with-mounts.conf
      Active: active (exited) since Wed 2020-12-30 10:04:37 UTC; 1min 21s ago
    Main PID: 13041 (code=exited, status=0/SUCCESS)
        Tasks: 0 (limit: 23978)
      Memory: 0B
      CGroup: /system.slice/nfs-server.service
    
    12월 30 10:04:37 ccambo-nfs systemd[1]: Starting NFS server and services...
    12월 30 10:04:37 ccambo-nfs systemd[1]: Started NFS server and services.

    위의 명령을 통해서 NFS 서버 서비스를 실행하거나 NFS 공유를 마운트하는데 필요한 다른 서비스들 (nfsd, nfs-idmapd, rpcbind, rpc.mountd, lockd, rpc.startd, rpc.rquotad, rpc.idmapd)은 자동으로 시작된다.

    NFS 서버의 구성 파일들은 아래와 같다.

    • /etc/nfs.conf: NFS Daemon 및 도구에 대한 기본 구성 파일
    • /etc/nfsmount.conf: NFS 마운트 구성 파일
  • NFS 공유 디렉터리 정상 동작 확인

    NFS로 공유할 디렉터리들이 정상적으로 동작하는지 확인은 아래와 같이 수행한다.

    $ sudo exportfs -v
    /data/NFS       10.0.1.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
    
    $ sudo exportfs -arv
    exporting 10.0.1.*:/data/NFS
    
    $ sudo exportfs -s
    /data/NFS  10.0.1.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

    옵션은 다음과 같다.

    • a: 모든 공유 디렉터리를 내보내거나 내보내지 않는다.
    • r: 모든 공유 디렉터리를 다시 내보내고, /var/lib/nfs/etab과 /etc/exports 파일, 그리고 /etc/exports.d 디렉터리 밑의 모든 파일들에 대한 동기화 한다.
    • v: 자세한 출력
    • s: 현재 내보내기 대상 리스트 출력
  • 방화벽 처리

    firewalld 서비스가 동작 중이라면 NFS 서버 서비스에 필요한 포트들 (mountd, nfs, rpc-bind)을 열어 주어야 한다. (CentOS 8에는 기본 설치되어 있지 않다)

    $ sudo firewall-cmd --permanent --add-service=nfs
    $ sudo firewall-cmd --permanent --add-service=rpc-bind
    $ sudo firewall-cmd --permanent --add-service=mountd
    
    $ sudo firewall-cmd --reload

참고

실제 여러 가지 환경에서 NFS 서버에 연결을 하다보면 (예를 들면 Kubernetes NFS Dynamic Provisiner 설정 등) 다양한 오류가 발생할 수 있다.

  • 접근 권한 관련: sudo chmod 666 <nsf directory>로 권한을 지정해 준다.

여기까지 작업으로 NFS 서버 설정은 완료되었다. 이제 클라이언트를 구성해서 접속 여부를 검증하면 된다.

NFS 클라이언트 구성

  • NFS 패키지 설치

    $ sudo dnf install -y nfs-utils nfs4-acl-tools
  • Mount 후 정상 동작 확인

    아래의 명령으로 NFS 서버의 공유 가능한 정보를 확인한다.

    # NFS Server에 내보내기된 목록 확인
    $ showmount -e 10.0.1.20

    아래의 명령으로 공유된 NFS 디렉터리를 마운트 한다.

    # 로컬 마운트 경로 생성
    $ sudo mkdir -p /data/mountNFS
    
    # NFS 공유 디렉터리를 로컬 경로로 마운트
    $ sudo mount -t nfs 10.0.1.20:/data/NFS /data/mountNFS
    
    # 마운트 확인
    $ mount | grep nfs
    sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
    10.0.1.20:/data/NFS on /data/mountNFS type nfs4 (rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.1.117,local_lock=none,addr=10.0.1.20)
    
    # NFS 서버에서 파일 생성
    $ sudo touch /data/NFS/file-created-on-server.txt
    
    # 클라이언트에서 파일 생성 확인
    $ ls -l /data/mountNFS
    합계 0
    -rw-r--r--. 1 root root 0 12월 30 10:53 file-created-on-server.txt
    
    # 클라이언트에서 파일 생성
    $ sudo touch /data/mountNFS/fil-created-on-client.txt
    
    # NFS 서버에서 파일 생성 확인
    $ ls -l /data/NFS
    합계 0
    -rw-r--r--. 1 root root 0 12월 30 10:55 file-create-on-client.txt
    -rw-r--r--. 1 root root 0 12월 30 10:53 file-created-on-server.txt

    참고

    마운트를 하는 중에 mount.nfs: access denied by server while mounting 10.0.1.20:/data/NFS와 같은 오류가 발생할 수 있다.
    이 오류를 확인하기 위해서는 NFS 서버에서 sudo tail -f /var/log/messages 명령을 수행하면 rpc.mountd[13025]: refused mount request from 10.0.1.117 for /data/NFS (/data/NFS): unmatched host 라는 오류를 확인할 수 있다.
    이 경우는 NFS도 도메인 이름과 관련이 있기 때문에 /etc/hosts 파일에 요청한 IP에 대한 도메인 설정이 있는지를 확인하고 도메인 설정된 호스트 명을 /etc/exports 파일에 추가해 주면 된다.
    도메인 이름도 없는데 동일한 오류가 계속된다면 10.0.1.* 설정을 10.0.1.0/24로 변경하고 다시 exportfs -a 명령을 수행하면 된다.

  • 재 부팅시 마운트 설정

    /etc/fstab 에 마운트에 대한 설정을 추가해서 재 부팅해도 동작할 수 있도록 설정한다.

    # fstab 등록
    $ echo "10.0.1.20:/data/NFS     /data/mountNFS  nfs     defaults 0 0">>/etc/fstab
    
    # 등록 확인
    $ cat /etc/fstab
  • Unmount 처리

    $ unmount /data/mountNFS

    주의

    위의 명령을 /data/mountNFS 경로에서 실행하면 /data/mountNFS: device is busy라는 메시지가 출력되고 처리되지 않는다. 따라서 다른 경로로 이동해서 처리하면 된다.

참고 자료

728x90
반응형
댓글
댓글쓰기 폼