[Jetson] USB로 부팅 디스크 만들기

2022. 1. 19. 21:17Jetson

 Jetson을 구매하면 한번쯤은 용량 문제로 골머리를 앓을 때가 있다. Developer Kit 은 그나마 SD Card 를 좀 더 넉넉한 용량을 쓴다던가 하면 되지만, NX Module 같은 16G 용량만 달린 걸 썻다가는 Jetpack 설치만 해도 2G 남짓밖에 공간이 남지 않는다. 요새는 모델파일만 2G가 훌쩍 넘어가는게 많은데...

 그래서 USB 같은 외부 저장장치로 부팅할 수는 없을까 하는 고민을 해봤고, 다행히도 NVIDIA 공식 문서로 잘 정리되어 있었다. 하지만 NVIDIA 문서가 그렇듯 친절한 듯 하면서도 또 겁나 어렵게 써놔서 내가 성공했던 방법을 공유하고자 한다.

 

내 환경


  • Host Machine : Linux Ubuntu 18.04 버전만 깔려있으면 사양은 상관없다.
  • NVIDIA Jetson Xavier NX Module
  • USB 32GB ( 문구점에서 파는 9천원짜리 )

 

시작해 봅시다


1. Host Machine 에서 할 일

일단 USB를 구울 때 필요한 파일들을 설치하자.

  • Jetson Xavier Board Support Package (BSP)
  • Sample Root File System (rootfs)

위 파일들은 NVIDIA 공식 홈페이지에서 구할 수 있다. 

NVIDIA 공식 홈페이지: L4T Archive

 

위 링크에 접속하여, 원하는 버전을 클릭해준다. 나는 32.6.1 최신버전을 받으려 한다.

 

링크를 클릭하여, Driver Details > DRIVERS 의 아래 두 파일들을 다운로드 받아준다. (BSP, rootfs)

 

다운로드한 파일은 아래 2가지이다. 버전에 따라 파일명이 조금씩 다를 수 있다. 아래 파일명 기준으로 설명을 이어가겠다.

  • Jetson_Linux_R32.6.1_aarch64.tbz2
  • Tegra_Linux_Sample-Root-Filesystem_R32.6.1_aarch64.tbz2

두 파일을 동일한 디렉토리에 위치시킨 후 아래 명령어를 실행하자. USB 를 플래시 하기 위한 파일들을 압축을 푸는 과정이다.

tar xf Jetson_Linux_R32.6.1_aarch64.tbz2
cd Linux_for_Tegra/rootfs/
sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R32.6.1_aarch64.tbz2
# 또는 sudo tar -jxpf ../../Tegra_Linux_Sample-Root-Filesystem_R32.6.1_aarch64.tbz2
cd ..
sudo ./apply_binaries.sh

정상적으로 완료되면 Success 가 뜬다. 이것으로 준비는 완료 되었다!

 

 

2. 본격적으로 USB 플래시를 시작해보자

먼저 Host Machine에 USB를 꼽아준다. 

그 다음 공식문서에 따라서 차근차근 하면 된다.

NVIDIA 공식문서 (Flashing to a USB Drive)

 

먼저 USB가 /dev/sdb 인지 아닌지를 아래 명령어를 통해 확인한다. 이 뒤부터 진행할 명령어에서 sdb, sdc 인지를 sdx 라 하겠다. 아마 Host Machine 에 USB 외에 별다른게 안꼽아져 있다면 sdb 일게다. 나도 sdb이다.

sudo lsblk -p -d | grep sd

 

GPT 파티션을 만들어준다. 

sudo parted /dev/<sdx> mklabel gpt

# 나같은 경우는 sdb 이므로 아래 명령어가 되겠다.
# sudo parted /dev/sdb mklabel gpt

파티션 크기를 조정해주는데, 이건 USB 크기에 맞추어서 조정하면 된다. 32GB라면 대략 30GB 정도까지. 64GB라면 대략 60GB 정도로 맞춰주면 된다.

sudo parted /dev/<sdx> mkpart APP 0GB <size>

# sdb 이고 32GB USB인 경우 아래 명령어
# sudo parted /dev/sdb mkpart APP 0GB 30GB

# 찾아보니 32GB를 자동으로 Full 로 잡으려면 아래 명령어를 써도 된다고 한다.
# sudo parted -s /dev/sdb mkpart APP 0% 100%

이제 USB 포맷을 해주자.

sudo mkfs.ext4 /dev/<sdx>1
sudo mount /dev/<sdx>1 /mnt

# sdb 인 경우
# sudo mkfs.ext4 /dev/sdb1
# sudo mount /dev/sdb1 /mnt

 

이제 Host Machine 과 Jetson NX Module 을 USB Cable 로 이어주고, Jetson 은 강제 복구모드 (Force Recovery Mode)로 기동한다.

 

 

 

Host Machine에서 1번 과정에서 압축을 풀고 세팅한 Linux_for_Tegra 를 이용하여 USB 플래시를 한다. 아래 명령어 중 sda1 로 되어있는 부분은 그대로 하면 되고 <board> 가 문제인데 자신의 Jetson 모델에 따라서 <board>를 다르게 설정해주어야 한다.

 

Board Name 참고

Jetson NX Module 의 경우에는 아래와 같이 jetson-xavier-nx-devkit-emmc 이다.

 

cd Linux_for_Tegra/

sudo BOOTDEV=sda1 ./flash.sh --no-flash <board> sda1
# Jetson NX Module 의 경우에는 아래 명령어
# sudo BOOTDEV=sda1 ./flash.sh --no-flash jetson-xavier-nx-devkit-emmc sda1 

sudo mkdir tmp_system
sudo mount bootloader/system.img.raw ./tmp_system
sudo rsync -axHAWX --numeric-ids --info=progress2 --exclude=/proc ./tmp_system/ /mnt

정상적으로 완료되었다면 언마운트를 해준다.

sudo umount /mnt
sudo umount ./tmp_system

 

이제 USB를 Host Machine 에서 뽑고, USB Cable 도 제거해주자.

그리고 Jetson NX Module 에 USB를 꼽은뒤, 정상적인 부팅을 시도해본다. 모든게 정상적으로 완료되었다면 oem config (리눅스 초기세팅) 하는 화면이 뜰 것이다.

 

세팅이 완료되면 아래 명령어로 Jetpack 을 설치해주면 된다.

sudo apt update
sudo apt install nvidia-jetpack