+

문제

처음 Jetson NX Module과 EN715 캐리어 보드의 조합을 접했을 땐 Nvidia SDK Manager로 EN715 보드에 Jetpack 설치를 시도하였다. 설치도 무난하게 되었으나 문제가 있었다. 모듈 내부에 OS는 설치되나 외부 SD카드가 인식되지 않는 다는 것. 모듈의 스토리지 크기는 16GB이고 OS가 대부분을 차지한다. SD카드를 인식하지 못하는 상황이면 사실 OS 설치 이후에 다른 행동들을 하는 것에 제약이 생긴다는 것. 그래서 아예 처음 BSP 부터 설치하는 법을 알아본다. 최종적으로 SD카드에 OS를 올리고 모듈 내부에 있는 용량은 여유 스토리지로 사용할 것이다.

준비

  • ubuntu 18.04 Host PC
    • 작업을 하는 host pc 해당 우분투 버전은 설치하려는 jetpack 의 os와 같은 것이다. 즉, 추후 20.04 우분투를 사용하는 Jetpack 을 설치하는 일이 있을 땐 호스트 머신의 OS가 20.04 ubuntu 에서 구동한다.
  • Micro SD card + 어댑터
  • jetson Module + EN715 Carrier Board

BSP 다운로드

BSP란 Board Support Package의 약자로 루트파일시스템, 부트로더, 운영체제를 포함하여 하드웨어에 있는 장치를 사용하기 위한 디바이스 드라이버이다. 이러한 BSP 를 통한 외부 장치에 OS설치를 구현한다. BSP는 보드 제조사인 Avermedia 사이트에서 받을수 있다. 아래의 링크에서 BSP를 내려받자. BSP 파일 이름에 NX가 언급되어 있으면 NX Module 용, 언급이 없다면 Nano Module 용이다. 헷갈릴 수 있으니 주의하자.
link: Avermedia en715 carrier board support link

BSP를 다운로드 받았다면 주로 파일 형식은 tar.gz 혹은 zip 형식의 EN715-NX-xxxxxxx.tar.gz 이런 이름일 것이다.

  1. 루트 권한으로 압축해제해준다.
    $ sudo tar zxf EN715-xxxxxxxxx.tar.gz
    
    • 일부 BSP 버전의 경우에는 *.tar.gz.001, *.tar.gz.002 처럼 분할 압축되어 있는 경우가 있다. 이 경우에는 다음과 같이 분할 압축 해제를 한다.
      $ cat 파일명.tar.gz* | tar xvfz - 
      
  2. 디렉토리 진입
    $ cd JetPack_xxxxxxxxxxx/Linux_for_Tegra
    
  3. (옵션) MIPI CSI 카메라 모듈 셋업
    $ sudo ./setup.sh
    
     Supported CSI camera profiles:
     	0) default-respberry-pi-v2
     	1) imx179
     	2) imx290
     	3) imx290isp
     	4) imx290thcv
     	5) imx334
     	6) imx334+dual-imx290isp
     	7) imx334isp
     	8) imx334thcv
    

여기서 만약 SD카드가 아닌 모듈 자체에 OS를 설치한다면 바로 아래과정을 거쳐 설치할 수 있다.

모듈에 BSP jetpack 바로 설치

  1. Jetson 모듈 + EN715 보드에 5pin to usb 케이블을 이용해 host PC와 연결
  2. Jetson Board 복구 모드 진입
    • 복구모드는 다음과 같이 버튼을 조작하여 들어간다.
      power off -> press recovery button -> power on -> wait 2 seconds -> release recovery button
      
  3. flash.sh 파일 이용하여 설치. -r 옵션을 주면 모듈을 추가적으로 더 설치한다.
    $ sudo ./install.sh -r
    

SD카드 셋팅

  1. Micro SD 카드는 어댑터에 꽂아 Host PC에 연결한다.
  2. 해당 SD카드의 장치명 찾기
    $ sudo fdisk -l
    
    • 해서 /dev/sdx 의 형식으로 나오는 장치명을 기억한다. 앞으로 사용할 명령어는 해당 장치명을 사용한다. ex) /dev/sdc, /dev/sdc1
  3. 해당 SD 카드를 GPT 파티션으로 변경한다. 아래 명령어들은 gdisk를 수행하고 이어서 수행하는 커맨드 목록이다. 해당 작업은 파티션을 초기화 하고 새로운 파티션을 만드는 것 밖에 없다.
    $ sudo gdisk /dev/sdx
      "o" -> clear all current partition data
      "n" -> create new partition
      "1" -> partition number /dev/sdx1
      "40M"first sectors -> Press enter or "+32G" last sectors
      "Linux filsystem" -> using default type
      "c" -> partition's name "PARTLABEL"
      "w" -> write to disk and exit. 
    
    • o를 통해 장치 초기화
    • n을 통해 새로운 파티션 생성
      • 파티션 넘버는 1 지정
      • 처음 섹터는 40M 지정, 라스트 섹터는 엔터로 넘어감 혹은 32G.
      • +32G를 입력할 경우 나중에 PARTUUID를 못얻는 경우가 있다. 그래서 웬만하면 Enter키로 넘어가자.
    • c를 통해 파티션의 이름을 PARTLABEL로 설정
    • W를 통해 쓰고 저장 후 종료
  4. 파티션의 UUID를 얻고 rootfs 복사. 현재 경로는 JetPack_xxxxxxxxxxx/Linux_for_Tegra/ 기준이다.
    $ sudo mkfs.ext4 /dev/sdx1
    $ sudo blkid /dev/sdx1
      > 여기서 나오는 PARTUUID를 잘 기억한다. (그냥 UUID 혹은 PTUUID와 다르다)
    $ sudo mount /dev/sdx1 /mnt
    $ echo '{아까 기억한 UUID}' > bootloader/l4t-rootfs-uuid.txt
    $ cd ./rootfs/
    $ sudo tar -cpf - * | ( cd /mnt/ ; sudo tar -xpf - )
    $ sudo umount /mnt
    
    • sudo blkid ...을 입력했을 때 그냥 UUID 혹은 PTUUID 만 출력된다면 뒤에 나오는 장치명을 /dev/sdⅹ1 이 아니라 /dev/sdⅹ만 입력한 것은 아닌지 확인해보자.
    • 위에서 l4t-rootfs-uuid.txt를 만드는 과정은 설치하려는 제트팩(l4t) 버전이 r32.5 보다 크거나 같으면 꼭 수행해줘야한다.

설치

여기서 상당한 혼동을 가질 수 있다. 현재 상태는 Host PC에 어댑터로 SD카드가 꽂혀있는 상태. 굳이 빼서 EN715 보드에 당장 연결할 필요 없다. SD카드는 전혀 관계없이 해당 과정을 진행한다.

  1. SD카드랑 관계없이 Jetson Module + EN715 Board에 5 pin to USB로 host pc에 연결하여 복구모드로 부팅한다. 복구모드는 위에 한번 언급된 것처럼 아래와 같은 과정으로 진행된다.
    power off -> press recovery button -> power on -> wait 2 seconds -> release recovery button
    
  2. 해당 상태에서 아까 Linux_for_Tegra 경로에서 flash.sh 파일을 실행한다. 여기서 주의해야한다. flash.sh 스크립트 뒤에 옵션으로 붙는 항목들이 설치하는 디바이스 + 부팅 디바이스이다. flash.sh파일을 vinano로 열어서 보면 알 수 있지만 아래와 같은 예시가 있다.
    # Examples:
    # ./flash.sh <target_board> internal			- boot <target_board> from on-board device (eMMC/SDCARD)
    # ./flash.sh <target_board> external			- boot <target_board> from external device
    # ./flash.sh <target_board> mmcblk0p1			- boot <target_board> from eMMC
    # ./flash.sh <target_board> mmcblk1p1			- boot <target_board> from SDCARD
    # ./flash.sh <target_board> sda1			- boot <target_board> from USB device
    # ./flash.sh <target_board> nvme0n1			- boot <target_board> from NVME storage device
    # ./flash.sh -N <IPaddr>:/nfsroot <target_board> eth0	- boot <target_board> from NFS
    # ./flash.sh -k LNX <target_board> mmcblk1p1		- update <target_board> kernel
    # ./flash.sh -k EBT <target_board> mmcblk1p1		- update <target_board> bootloader
    
  3. SD카드로 부팅을 할 것이기에 다음과 같이 입력한다.
    $ sudo ./flash.sh jetson-xavier-nx-en715 mmcblk1p1
    
    • SD카드가 외부장치 인것은 맞기에 기존에 external 옵션으로 flash.sh를 실행했었는데 부팅 시 전혀 다른 uuid의 장치를 찾아서 부팅이 안되는 현상이 있었다. 이를 SD 카드 부팅용인 mmcblk1p1으로 작성하고 플래시하니 부팅에 문제가 없었다.

완료

flash.sh 설치가 완료되면 Host PC에 연결해둔 SD카드를 어댑터에서 분리하여 EN715 보드에 연결하고 보드 부팅 준비를 한다. HDMI와 마우스, 키보드 등의 입력장치를 연결하여 설치 완료를 확인할 수 있다. 부팅을 하면 계정을 로그인하라고 모니터 출력이 될 것이다. 기본 계정은 nvidia 이고 비밀번호도 nvidia 이다(BSP Jetpac OS 공용). 이후 IP 설정을 하고 필요한 라이브러리를 설치해서 개발자키트 처럼 사용한다. 이후 df -h를 입력해서 파티션 정보를 보면 기존 모듈이 가지고 있는 약 16GB 의 스토리지는 /media파티션에 할당 되어있는 것을 확인할 수 있다.

댓글남기기