NFS - RootFs Mount

SMJ·2026년 3월 10일

BSP development

목록 보기
17/17

전체 작업 흐름

호스트 PC(Ubuntu)가 작업 서버가 되고, 타겟보드(MA35D1)가 클라이언트가 되어 네트워크로 파일을 읽어오는 구조

[Phase 1] Ubuntu 호스트 설정 (NFS 서버 준비)

  1. NFS 서버 패키지 설치
# NFS 서버 설치
$ sudo apt-get install nfs-kernel-server
$ sudo apt install nfs-kernel-server
  1. RootFs 디렉토리 생성 및 권한 설정
# RootFs을 놓을 폴더 생성
$ sudo mkdir -p /opt/nfsroot
    
# 폴더 권한을 모든 사용자가 접근 가능하게 변경 (보드 접속)
$ sudo chmod 777 /opt/nfsroot
  1. Yocto 이미지 압축 및 해제
# Yocto 빌드 결과물(RootFs.tar.bz2)을 해당폴더에 풀어놓는다
$ sudo tar -xvf nvt-image-qt5-numaker-som-ma35d16a81.tar.bz2 -C /opt/nfsroot
  1. NFS 공유 설정 수정 (/etc/exports)
$ sudo nano /etc/exports
    
# 파일 맨 아래에 다음 내용 추가 (보드 IP)
/opt/nfsroot 192.168.0.*(rw,sync,no_root_squash,no_subtree_check,insecure)
  1. NFS 서비스 재시작
# 설정 파일 갱신
$ sudo exportfs -ra
$ sudo systemctl restart nfs-kernel-server
    
# 실제로 공유된 목록 확인
$ sudo showmount -e

[Phase 2] U-Boot 환경 변수 설정 (보드 측)

  1. 네트워크 정보 등록
setenv ipaddr 192.168.0.*            # 보드 IP
setenv serverip 192.168.0.**       # Ubuntu 
setenv gatewayip 192.168.0.1       # 공유기(게이트웨이) IP
setenv netmask 255.255.255.0       # 서브넷 마스크
setenv nfsroot /opt/nfsroot        # PC의 RootFs 경로
  1. 부팅인자 설정 (bootargs) - 가장 중요
U-Boot> setenv bootargs "noinitrd root=/dev/nfs rw nfsroot=${serverip}:${nfsroot},v3,tcp ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:ma35d1:eth0:off console=ttyS0,115200n8 rdinit=/sbin/init mem=248M rootwait=1"
    
U-Boot> setenv bootargs "noinitrd root=/dev/nfs rw nfsroot=192.168.0.140:/opt/nfsroot,v3,tcp ip=192.168.0.43:192.168.0.140:192.168.0.1:255.255.255.0:ma35d1:eth0:off console=ttyS0,115200n8 rdinit=/sbin/init mem=248M rootwait=1"
    
# 설정 저장
U-Boot> saveenv

[Phase 3] 부팅 실행

nand read <Memory_Address> <offset> <Size>

# 1. 커널로드
$ nand read 0x80080000 0x400000 0x1800
000

# 2. DTB로드
$ nand read 0x85000000 0x3c0000 0x40000

# 3.실행
$ booti 0x80080000 - 0x85000000

  • images/nuwriter/pack-nand.json 파일에 있는 offset을 기록
  • Kernel 불러올 때 로그로 offset과 size 파악
  • 커널 위치: NAND read: device 0 offset 0x400000, size 0x1800000
  • DTB 위치: NAND read: device 0 offset 0x3c0000, size 0x40000

[Tip] 매번 치기 귀찮을 때: 단축 명령어 만들기

위의 복잡한 과정을 nfs라는 명령어 하나로 합쳐버릴 수 있습니다.

# nfs라는 이름의 실행 스크립트 등록
setenv nfs "nand read 0x80080000 0x400000 0x1800000; nand read 0x85000000 0x3c0000 0x40000; booti 0x80080000 - 0x85000000"
saveenv

# 이후에는 이것만 치면 됩니다.
run nfs

결과

  • Ubuntu에 있는 해당 파일로 RootFs 접속이 됐다고 뜨는 모습

테스트

  • /usr 디렉토리 밑에 hello.txt를 만들고 임베디드 보드에도 똑같이 있는지 확인
smjeon@smjeon-VirtualBox:/opt/nfsroot/usr$ echo "hello!" > hello.txt
smjeon@smjeon-VirtualBox:/opt/nfsroot/usr$ ls
bin  games  hello.txt  include  lib  libexec  sbin  share  src

  • 더 나아가 U-Boot만 보드에 Bring Up 한 후 Kernel은 TFTP로, RootFs은 NFS로 Mount하면 개발시간을 크게 단축 시키고 편하게 개발할 수 있다.
profile
Embedded Junior Developer

0개의 댓글