[Linux] NFS 설정하기 (+ 사용 예제)

2 minute read

NFS 설정 방법과 사용 예제 입니다.
저는 Ubuntu Desktop을 사용하지만, redhat 계열 OS도 크게 다르지 않습니다.
명령어 정도만 다를 뿐이니, 리눅스 OS라면 전체적인 흐름은 같습니다.

nfs 설정하기

nfs 란

nfs는 N(etwork) F(ile) S(ystem) 입니다.
당연히 네트워크가 구축된 상태에서 사용할 수 있습니다.
단어 그대로, 네트워크 주소를 매개로 파일 시스템에 접근할 수 있습니다.

예상대로, 네트웍 통신이 기본이기 때문에 serverclient 가 존재하며, 둘의 세팅 방법이 다릅니다.

nfs 설정하기: server

서버용 nfs 패키지를 설치합니다.
$ sudo apt install nfs-kernel-server

패키지 설치가 완료되면 /etc/exports 파일이 생성됩니다.
서버 입장에서는 접근을 허용할 파일 경로와 클라이언트 주소를 알고 있어야 합니다.

/etc/exports 파일을 수정합니다.

exports 파일 수정하기 (예시)

$ sudo vi /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#

/home/how2flow 192.168.0.*(rw,sync,no_root_squash,no_subtree_check)


작성 내용을 보면,
/home/how2flow 은 서버의 /home/how2flow 경로에 있는 모든 파일을 대상으로 export 한다는 뜻입니다.
192.168.0.*(rw,sync,no_root_squash,no_subtree_check)
클라이언트 ip 주소와 파일시스템 access 옵션(괄호 안)을 작성했습니다.

옵션 중에서,
ro_root_squash 은 클라이언트에서도 root 권한을 가질 수 있다는 옵션입니다.

작성한 내용을 보면 알겠지만, 와일드 카드가 허용됩니다.
따라서, 클라이언트 부분을 이렇게 작성할 수도 있습니다.
*(rw,sync,no_root_squash,no_subtree_check)

물론, 특정 클라이언트만 허용하는 것도 가능합니다.
192.168.11.75(rw,sync,no_root_squash,no_subtree_check)

파일 수정이 끝났으면 설정을 적용합니다.

$ sudo exportfs -ra


서버 설정은 끝났습니다.
이제 남은 것은 client에서 서버의 파일시스템 으로 access하는 방법입니다.

nfs 접근하기: client

클라이언트용 nfs 패키지를 설치합니다.
$ sudo apt install nfs-common

서버에서 클라이언트에 대한 설정을 마쳤으면, 다음 명령어로 mount 가능합니다.

$ sudo mount -t nfs <server_ip>:/<file_path>


예를 들어서, 서버의 /home/how2flow/Pictures에 접근하려고 하고,
서버의 ip 주소가 192.168.0.2 이라면,

$ sudo mount -t nfs 192.168.0.2://home/how2flow/Pictures


명령을 실행한 위치에서 파일 확인을 합니다.

$ ls
Pictures


이제 서버의 Pictures 디렉토리에 접근할 수 있습니다.

mount 추가 설명

리눅스에서는 mount 라는 기능을 지원합니다.
다른 파일 시스템이나 하드웨어 장치 등을 기존에 존재하는 파일시스템에 마운트 하는 기능입니다.

USB나 SSD 처럼 저장장치를 연결 했을 때, 파티션 단위로 특정 디렉토리에 마운트 할 수 있습니다.

명령어 사용방법은 다음과 같습니다.

$ sudo mount [OPTION] <source> <destination>


자세한 설명은 다음을 참조하세요

$ mount --help


사용 예제

nfs 를 설정하고, client에서 사용하는 방법까지 봤습니다.
그런데 대부분 구글링을 해보면 여기까지만 알 수 있는게 대부분입니다.

그래서 실제 사용 예제를 추가해 보겠습니다.
주로 제가 사용하는 사용처에 대해 소개합니다.

리눅스 임베디드 커널 설치

저는 리눅스 커널이 올라가는 임베디드 개발자다 보니, 커널 테스트를 할 때 가장 많이 사용한 것 같습니다.

임베디드 장치에 커널을 설치하는 방법은 크게 두가지가 있습니다.

1. PC에서 크로스 컴파일 후, 임베디드 저장장치에 커널 설치
2. 임베디드에서 native install 하기

두 가지 모두 장/단점이 있다고 생각합니다.

1번의 장점은 커널 빌드가 2번 보다 훨씬 빠릅니다.
하지만 커널 빌드/설치를 할 때마다 임베디드 장치 전원 off하고 sd카드를 분리한 후,
sd 카드를 PC에 연결하고
설치 명령을 실행해야 합니다.

$ cd linux
$ make "target's defconfig"
$ sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/dev/disk4/rootfs -j$(nproc) modules_install


2번은 반대로 설치를 바로 할 수 있지만, 빌드 시간이 너무 느립니다.
하지만 nfs 를 사용하면 두 가지 방법의 장점만 가져갈 수 있습니다.

먼저 서버(PC, 192.168.0.2 )에서 커널을 빌드합니다.

$ cd linux
$ sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)


클라이언트(Embedded) 장치에서 nfs 마운트를 하고 native install을 진행합니다.

$ mkdir linux
$ sudo mount -t nfs 192.168.0.2://home/how2flow/linux ./linux
$ cd linux
$ sudo make modules_install && sudo make install


이렇게 하면, 빠른 속도로 커널을 빌드할 수 있고,
커널 설치를 임베디드 장치 system on 상태에서 진행할 수 있습니다.

또 다른 예제

저는 주로 이렇게 사용하는데,
앞으로 다른 좋은 사용처를 발견한다면 공유하겠습니다.

Leave a comment