임베디드 리눅스 기반의 Board 에서 NFS로 편리하게 파일 전송 하는 방법(우분투 NFS 설정)

임베디드 리눅스 기반의 시스템을 개발하다 보면 개발 서버와 타켓 보드 간에 파일 전송이 필요할 때가 굉장히 많습니다. 라즈베리파이 같은 경우는 “라즈비안” 이라는 데비안 기반의 일반 리눅스가 올라가기 때문에 파일 전송을 “삼바”를 구축하여 사용하면 되지만 타켓 보드에 커널과 파일시스템을 최소한의 크기로 올리는 임베디드 리눅스 같은 경우에는 삼바를 구동하기에는 다소 시스템 자원이 부족할 수 있습니다. ( 라즈비안에 올라가는 리눅스는 일반 리눅스와 동일하기 때문에 라즈비안 안에서 컴파일 및 개발이 가능합니다. )

따라서 이런 경우에는 파일 전송을 “WinSCP”를 이용할 수 있습니다만 리눅스 개발 서버와 타켓 보드간의 파일전송은 다소 불편해 집니다. 이럴 때 간편하게 사용할 수 있는 전송 수단이 “NFS” 입니다. 

NFS는  “Network File Sytem”의 약자로 말 그대로 네트워크로 파일 시스템을 연결하여 파일 공유를 할 수 있는 방식을 의미합니다. NFS는 NFS 서버와 NFS 클라이언트 간에 이루어지면 NFS 클라이언트에서 마운트(Mount) 를 통해 연결을 합니다. 

그래서 임베디드 리눅스 시스템을 개발할때 리눅스 서버에는 NFS 서버를 실행하고 임베디드 리눅스 타켓 보드에는 NFS 클라이언트를 실행하여 타켓 보드에서 리눅스 서버쪽의 파일 시스템을 마운트하면 됩니다.  그러면 이후에는 리눅스 서버와 타켓 보드 사이에 파일 전송이 매우 간편해 지고 편리해집니다. 물론 서로간에 네트워크로 연결이 되어야 하겠지요. 

이번 포스트에서는 NFS의 설정 방법과 사용방법에 대해 알아보겠습니다. 임베디드 리눅스 시스템 개발시에 NFS를 구축해 놓으면 활용 용도가 다양하니 꼭 구축하여 개발 도구로 사용하시기 바랍니다. 

NFS 관련 우분투 패키지 설치

NFS 구축은 우분투 기분으로 설명을 드리도록 하겠습니다. 먼저 리눅스 서버 쪽에 NFS 서버를 구축해야 합니다. 그럴려면 NFS 관련 패키지들을 설치를 해야 합니다. 아래 명령어로 NFS 관련 패키지들을 설치하시기 바랍니다.

$ sudo apt-get install nfs-common nfs-kernel-server rpcbind

위 명령어를 실행하면 위의 화면과 같이 패키지를 설치하겠냐고 물어봅니다. y를 누른후에 설치를 진행하면 됩니다. 

NFS로 공유할 디렉토리 생성 및 권한 설정

리눅스 서버에 NFS 관련 패키지의 설치가 완료되었다면 NFS로 공유할 디렉토리를 생성합니다. 자신이 계정 홈 디렉토리 전체를 설정해도 되지만 잘못하다 홈 디렉토리 일부를 실수로 삭제할 수도 있기 때문에 방지하고자 별도로 하위 디렉토리를 생성하여 공유하는게 좋습니다. 

아래 명령어를 사용하여 NFS  공유 디렉토리 생성 및 읽기 쓰기가 가능한 권한인 777을 할당합니다.

$ mkdir ~/nfs

$ chmod 777 ~/nfs

저는 NFS로 할당할 디렉토리를 nfs 라고 생성하였습니다. 

/etc/exports 파일 수정

리눅스 서버 쪽에 NFS로 사용할 디렉토리를 생성하였으면 이제 NFS 관련 설정을 해줍니다. NFS 서버쪽의 설정 파일은 /etc/exports 파일입니다. 이 파일을 vi 에디터로 열어서 아래와 같이 수정합니다.

$ 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)
#

# NFS 관련 설정 옵션
#######################
# *  : 모든 IP의 액세스를 허용
# ro : 파일시스템을 Read Only(읽기 전용) 으로 마운트한다.
# rw : 파일시스템을 Read&Write(읽기 쓰기 가능) 으로 마운트 한다. 
# no_root_squash : NFS 서버와 NFS 클라이언트 간의 root 사용하를 같도록 설정함.
# no_all_squash : root 이외에 모든 사용자에 대해 동일한 권한을 준다. 
# sync : NFS 서버와 클라이언트 사이에 Sync를 맞춘다. 
# async : NFS 서버와 클라이언트 사이에 Sync를 맞추지 않는다.
# insecure : 인증이 되지 않는 장치도 액세스가 가능하게 설정.
########################

/home/codedosa/nfs *(rw,no_root_squash,async)

제가 사용할 NFS 디렉토리는 /home/codedosa/nfs 입니다. 일반적으로 계정은 /home/(계정이름) 으로 되어 있기 때문에 절대경로인 /home/(계정이름)/nfs 로 설정하였습니다. nfs 이외에 다른 디렉토리는 타켓 보드쪽에서 접근이 불가합니다. 

파일 수정이 끝났으면 :wq 로 저장을 하고 빠져나온 후에 NFS Server를 재 실행 시켜줍니다. 아래 명렁어로 재실행을 해주면 됩니다. 

$ sudo service nfs-server restart 

이제 NFS 서버 쪽은 설정이 완료되었다고 보면 됩니다. 

NFS Client 쪽에서 Mount 하기

NFS 서버 쪽(리눅스 서버)에 설정이 완료 되었다면 타켓 보드인 임베디드 리눅스 기반의 시스템에서 마운트를 하면 됩니다. “mount” 명령어는 리눅스에서 데이터를 저장하는 장치들을 연결할때 사용하는 명령어인데요, NFS 서버의 파일 시스템도 mount를 할 수 있습니다. 

일단 타켓 보드에서 네트워크 설정이 잘 되어 있는지 확인합니다. 타켓 보드의 이더넷이나 WiFi 등이 활성화 되어 있는지 확인하고 리눅스 서버와 연결이 잘 되어 있는지 “ping” 명령어를 통해 확인할 수 있습니다. 네트워크 연결이 문제 없다면 아래의 명령어로 리눅스 서버의 파일시스템을 마운트 합니다. 

$ mount -o nolock 192.168.0.101:/home/codedosa/nfs /mnt/nfs/

mount 명령어의 의미는 아래와 같습니다. 

$ mount -o nolock (NFS 서버의 IP 혹은 도메인 주소):(NFS 공유 디렉토리[절대경로]) (NFS Client의 마운트 위치)

마운트가 정상적으로 되었다면 실제 마운트한 경로로 이동하여 파일 복사 혹은 파일 쓰기 등을 해보면 됩니다. “df” 명령어로 확인해 보면 NFS 파일 시스템의 경로와 용량이 표시됩니다.

제가 사용하는 리눅스 서버의 정보가 표시되는군요. 2 테라 하드 디스크인데 대략 175 GB 정도를 사용하고 1.5 TB 정도 남아있습니다. NFS 는 서버 쪽이 설정되어 있으면 다른 임베디드 리눅스의 타켓보드 및 리눅스라고 얼마든지 마운트 해서 사용할 수 있게 됩니다. 

정말 편리하죠? 리눅스 서버 쪽에서 컴파일한 어플리케이션이나 작성한 파일들을 단순히 복사만 하면 타켓 보드에서 실행하거나 작업을 할 수 있게 됩니다. 개발의 효율성이 꽤 높아질꺼 같군요. 

NFS는 파일 전송 이외에도 타켓 보드에서 리눅스 서버에 있는 커널 바이너리를 로드해서 부팅도 가능합니다. 이와 관련된 내용은 별도로 기술해 보도록 하겠습니다. 

NFS로 임베디드  리눅스 개발을 좀더 편리하게 진행하시기 바랍니다.

'코드도사(codedosa.com)'에는 쿠팡파트너스 등의 제휴링크가 포함되어 있으며 수수료를 제공받을 수 있습니다.