nfs 사용하여 클러스터의 로컬 네트워크 안에서 공유 디렉토리 설정하기

nfs 서버

클러스터 서버가 서로 특정 머신의 홈 디렉토리를 공유하도록 하기 위해서 nfs 서버를 운영할 생각이다.

현재 라즈베리파이들에는 각각 호스트명을 w01 부터 차례대로 붙여놓았는데, w01 노드의 홈디렉토리를 나머지 노드들이 전부 공유하는 방식이다.

w01 노드가 nfs 서버 역할을 하기 때문에, apt-get install nfs-common nfs-kernel-server portmap로 필요한 패키지들을 설치한다.

패키지를 모두 설치한 이후에는 /etc/exports 파일을 수정해준다.

$ vi /etc/exports
# 어쩌구 저쩌구
# ...

# [공유디렉토리]  [네트워크대역/CIDR(옵션)]
/home 192.168.100.0/24(rw,no_all_squash,sync,no_root_squash,no_subtree_check)

맨 앞에는 nfs 서버에서 공유할 디렉토리를, 두번째는 접근할 수 있는 네트워크에 대한 설정이다.

현재 라즈베리파이 클러스터는 192.168.100.0 네트워크 안에서 아이피를 고정적으로 설정해놓았기 때문에, 이 네트워크에 속한 rpi 클러스터의 노드들만 접근할 수 있게 했다.

exports 설정이 완료되면 nfs 서비스를 재실행시켜 반영되도록 한다(sudo systemctl restart nfs-server).


nfs 클라이언트

공유 디렉토리에 접근할 클라이언트들에서는 간단하게 마운트할 수 있다.

apt-get install nfs-common으로 기본적인 패키지를 설치해준 뒤, mount 등의 명령어를 사용하여 nfs 파일시스템을 마운트할 수 있다.

그러나 재부팅시에도 자동으로 마운트되는 것이 편하기 때문에 매번 수동으로 하기보단 /etc/fstab을 수정하는 것이 좋다.

$ sudo vi /etc/fstab
# 기존의 파일시스템들
# ...
# ...

# [NFS서버]:[공유디렉토리]  [마운트지점]  nfs defaults  0 0
w01:/home /home nfs defaults  0 0

현재 상황으로는 nfs 서버(w01)의 홈디렉토리를 nfs 클라이언트들의 홈디렉토리에 마운트하고 싶기 때문에, w01:/home /home 의 형태가 된다.

설정을 완료한 뒤에는 클라이언트를 재부팅시키면, 부팅 과정에서 fstab 파일을 읽으며 마운트를 진행하기 때문에, nfs 서버의 공유디렉토리에 연결되는 것을 확인할 수 있다.


주의사항

nfs 클라이언트들이 nfs 서버 역할을 하는 노드의 홈디렉토리에 자신의 홈디렉토리들을 연결했기 때문에, 만약 서버와 클라이언트의 사용자 계정 상태가 다를 경우 일반적인 사용자 프롬프트를 볼 수 없다.

연결중인 클라이언트들의 계정을 모두 동일하게 맞춰주던가, ldap 등을 운영하여 계정 정보를 통합할 수도 있다.

또다른 문제로는, 루트로 마운트된 로컬 파일시스템 아래에 있는 /home 에는 접근할 수 없다는 것이다.

실제로 디스크 상에는 루트 아래에 홈디렉토리가 있고 그 아래에 여러 파일들이 존재하겠지만, 아무리 접근하고 싶어도 네트워크를 통해 nfs 서버의 홈디렉토리를 조회하게 되는 것이다.

만약 이때 로컬에 마운트된 홈디렉토리에 크기가 큰 파일이 있을 경우, df를 통한 전체 디스크 사용량에는 잡히지만, du로 아무리 확인해도 홈디렉토리에 있는 크기는 확인할 수 없다.

이런 경우에는 디스크가 부족해서 정리하려고해도 원인을 찾을 수 없기 때문에, nfs로 홈디렉토리를 공유할 때에는 미리 파악해놓아야 한다.