본문으로 건너뛰기

AVS300 플래시 가이드 — L4T R39.2.1 · 3세대(gen3) MFI 번들

이 문서는 MFI 번들(Massflash Image) 하나로 AVS300(Jetson AGX Thor)에 OS 를 설치(플래시)하는 방법을 설명합니다. 번들에는 굽기에 필요한 이미지와 도구가 모두 들어 있어 소스 트리 없이(의존 패키지 설치 제외) 최대 4대를 동시에 구울 수 있습니다.

항목값
릴리스r39.2.1-20260916
소프트웨어L4T R39.2.1 · JetPack 7.2.1 · Ubuntu 24.04 · 커널 6.8.12-tegra · CUDA 13.2 · DeepStream 9.1
대상 모듈Jetson AGX Thor T5000 (P3834-0008) · FAB 500
캐리어gcam8-r3 (GMSL 8채널 · fsync · GPS PPS 입력)
기본 카메라gmsl-4x2-3g-sg3s-isx031c (Sensing ISX031, 8채널) — 플래시 후 jetson-io 로 변경 가능
저장장치외장 NVMe (첫 부팅에 디스크 전체로 자동 확장)
번들 파일mfi_avs300-t5000-gcam8-r3_cam-4x2-3g-sg3s-isx031c_gen3a-jp7.2.1-r39.2.1-20260916.tar.gz (약 15 GB)
번들 받는 곳

다운로드 페이지에서 번들과 그 옆의 .sha256 두 파일을 받습니다.

이 번들은 T5000 FAB 500 모듈 · gcam8-r3 캐리어 전용입니다

AVS300 캐리어에는 EEPROM 이 없어 전원(PMIC) 설정이 FAB 500 모듈 기준으로 고정됩니다. FAB 400 이하 모듈에는 쓰지 마세요. 모듈 라벨의 부품번호가 699-13834-0008-500 인지 확인합니다. 캐리어는 보드 DTB 에 들어가 있어 플래시 후에 바꿀 수 없습니다.

3세대(gen3)에서 달라진 점
  • 캐리어 설정(GMSL·fsync·PPS)이 보드 DTB 에 합쳐졌습니다. 카메라만 extlinux.conf 의 OVERLAYS 한 줄로 고릅니다.
  • 카메라는 보드에서 jetson-io 메뉴로 바꿉니다. 바꿔도 캐리어·PPS 설정은 사라지지 않습니다.
  • 오버레이 파일 이름이 tegra264-avs300-camera-gmsl-<구성>-overlay.dtbo 형식으로 바뀌었습니다.

명령어만 필요하시면

빠른 시작 (Quick Start) 페이지에 0~6단계 명령을 한 덩어리로 모아 뒀습니다. 처음이시면 아래를 순서대로 보세요.


1. 준비물​

필요한 것내용
호스트 PCUbuntu 22.04 / 24.04 · x86_64
디스크 여유약 45GB (번들 15GB + 푼 것 29GB)
USB 케이블보드 전면의 FLASH 라고 쓰인 USB-C ↔ 호스트 USB(데이터용 케이블). 여러 대면 USB 허브
대상 보드AVS300 (AGX Thor T5000 FAB 500) + 외장 NVMe 장착

1-1. 번들 무결성 확인​

받은 파일은 두 개입니다 — 번들 .tar.gz 와 그 옆의 .tar.gz.sha256. 둘을 같은 디렉터리에 둡니다.

sha256sum -c mfi_avs300-t5000-gcam8-r3_*.tar.gz.sha256
# → "OK" 가 나와야 합니다. FAILED 면 삭제 후 다시 받으세요. (15GB 읽기, 약 1분 40초)

1-2. 번들 풀기 (권한 보존 필수)​

sudo tar xzpf mfi_avs300-t5000-gcam8-r3_*.tar.gz # 약 30GB, 5분 남짓
cd mfi_avs300
반드시 sudo + p 옵션(권한 보존)

p 를 빼면 굽기 도구의 권한이 틀어져 굽기가 실패하거나, 설치된 보드의 보안 권한이 어긋납니다.

더 빠르게 — pigz 가 깔려 있을 때만
sudo sh -c 'pigz -dc mfi_avs300-t5000-gcam8-r3_*.tar.gz | tar xpf -'

pigz 는 1-3 의 의존 패키지 목록에 없습니다. 없는 상태에서 이 줄을 쓰면 pigz: not found 뒤에 tar: This does not look like a tar archive 가 이어져 번들이 깨진 것처럼 보입니다. 그런 메시지가 나오면 위의 sudo tar xzpf 를 쓰세요.

1-3. 의존 패키지 설치 (최초 1회, 인터넷 필요)​

sudo ./tools/l4t_flash_prerequisites.sh # 약 1분
이 스크립트는 번들 안에 있습니다

1-2 를 먼저 해야 실행할 수 있습니다. 푼 뒤 mfi_avs300 디렉터리 안에서 실행하세요.

AVS300 은 NFS 를 쓰지 않습니다

AVS200 과 달리 AVS300 은 이미지를 USB 위의 ADB 로 보냅니다. nfs-kernel-server 설정이나 방화벽 NFS 예외는 필요 없습니다.


2. 보드를 리커버리(RCM) 모드로 연결​

리커버리(RCM, Recovery Mode)는 보드의 부트ROM 이 USB 로 넘어오는 이미지를 받는 상태입니다. 이 상태여야 굽기가 시작됩니다.

2-1. 전면 패널 — 어느 포트, 어느 버튼인가​

1✕324

빨간 1 = 호스트 USB 케이블을 꽂는 곳 · 노란 2 = 리커버리 버튼 · 회색 ✕ = 굽기에 쓰지 않는 포트

표시무엇굽기에 쓰나
1FLASH (USB-C)Jetson 디바이스 모드 — 이미지를 받는 포트✅ 여기에 호스트를 연결합니다
✕USB3 (USB-C)일반 USB 호스트 포트 (USB 3)❌ 쓰지 않습니다
2RCV SW리커버리(FORCE_RECOVERY) 버튼✅ 2-2
3RST SW리셋 버튼✅ 2-2 — 켜져 있을 때
4PWR SW전원 버튼✅ 2-2 — 꺼져 있을 때
DEBUG (USB-C)디버그 시리얼 콘솔선택 — 부팅 과정을 보려면
MICOM (USB-C)보조 MCU 전용❌
FLASH 와 USB3 는 둘 다 USB-C 라 헷갈립니다

USB3 에 꽂으면 호스트에서 아무것도 잡히지 않습니다(오류도 안 납니다). 라벨을 확인하세요.

보드의 FLASH 포트와 호스트 PC 의 USB 포트를 데이터용 USB-C 케이블로 연결합니다. 여러 대를 구우려면 USB 허브를 씁니다(최대 4대).

리커버리 단계가 USB 2.0 으로 잡히는 것은 정상입니다

리커버리(RCM)는 규격상 USB 2.0 입니다. 다만 그 뒤 이미지를 보내는 본 구간은 USB 3 로 붙으면 훨씬 빨라집니다 — 실측으로 약 36 MB/s(USB 2.0) ↔ 약 220 MB/s(USB 3) 차이가 나고, 전체 시간이 약 15분 ↔ 약 5분으로 갈립니다. USB 3 를 지원하는 호스트 포트와 케이블을 쓰는 편이 좋습니다.

2-2. 리커버리로 들어가기​

보드 상태에 따라 셋 중 하나를 씁니다. 버튼 방법은 OS 상태와 무관하게 언제나 됩니다.

방법 A. 버튼으로 — 보드가 켜져 있을 때​

  1. RCV SW(위 그림 2)를 누른 채 유지합니다.
  2. 누른 상태에서 RST SW(그림 3)를 짧게 눌렀다 뗍니다.
  3. 2초쯤 더 기다린 뒤 RCV SW 를 뗍니다.

방법 B. 버튼으로 — 보드가 꺼져 있을 때​

  1. RCV SW(그림 2)를 누른 채 유지합니다.
  2. 누른 상태에서 PWR SW(그림 4)로 전원을 인가합니다.
  3. 2초쯤 더 기다린 뒤 RCV SW 를 뗍니다.

방법 C. 명령으로 — OS 가 부팅돼 있고 SSH 가 되는 경우​

ssh avs@<보드IP> 'sudo reboot forced-recovery' # 3초쯤 뒤 RCM 으로 들어갑니다

어느 방법이든 들어갔는지는 2-3 의 lsusb 로 확인합니다. 화면·LED 로는 구분되지 않습니다 (리커버리 상태에서는 모니터에 아무것도 나오지 않는 것이 정상입니다).

리커버리 상태는 웜 리셋으로 안 풀립니다

RCV SW 로 들어간 뒤 굽지 않고 빠져나오려면 전원을 완전히 껐다 켜야 합니다. RST SW 만 누르면 리커버리로 다시 들어갑니다. 굽기가 끝난 직후도 마찬가지입니다(→ 4. 굽고 난 뒤).

--force 를 붙이면 리커버리로 안 들어갑니다

sudo reboot --force forced-recovery 는 그냥 재부팅됩니다. --force 가 systemd 종료 절차를 건너뛰어 forced-recovery 인자가 전달되지 않기 때문입니다. 반드시 sudo reboot forced-recovery 로, --force 없이 실행하세요.

굽기 전에 한 번 정상 부팅시키는 것을 권합니다

보드를 오래 꺼 두었거나, 앞서 굽기가 중간에 실패했거나, 캐리어·모듈을 교체한 뒤라면 바로 리커버리로 넣지 말고 OS 로 한 번 정상 부팅시킨 다음 sudo reboot forced-recovery 로 들어가세요. 그렇지 않으면 굽기가 초반에 might be timeout in USB read 로 실패할 수 있습니다(→ 6. 문제 해결).

2-3. 호스트에서 확인​

lsusb -d 0955:7026 # 구울 보드 수만큼 줄이 나와야 합니다
USB ID뜻
0955:7026RCM — 구울 준비 완료
0955:7035굽기용 임시 OS 로 부팅하는 중
0955:7100굽기용 임시 OS(ADB)로 부팅된 상태 — 굽는 중
0955:7020굽기가 끝나 OS 가 부팅된 상태
다른 Jetson 을 같은 호스트에서 빼 두세요

굽기 도구는 0955: 로 시작하는 USB 장치를 전부 대상으로 모읍니다. 포트를 지정해 하나만 고르는 방법은 없습니다. 다른 Jetson(개발 키트 포함)이 같은 호스트에 꽂혀 있으면 그 보드까지 건드릴 수 있습니다.

lsusb -d 0955: # 구울 보드 외에 다른 줄이 없어야 합니다

아무것도 안 잡힐 때 — ① 케이블이 데이터용인지(충전 전용 케이블은 안 됩니다) ② USB3 가 아니라 FLASH 포트인지 ③ RCV SW 를 누른 채로 RST SW/전원을 넣었는지 ④ 전원을 완전히 껐다가 2-2 를 다시 — 순서로 확인합니다.


3. 굽기​

mfi_avs300 디렉터리 안에서 실행합니다.

sudo ./flash.sh # 1대
sudo ./flash.sh 4 # 4대 동시 (최대 4)

flash.sh 는 ① 선검사(root 권한 · 도구 · RCM 대수 = 지정 대수) → ② 굽는 구성 표시 → ③ 굽기 → ④ 판정 순서로 진행합니다. 1대 기준 소요는 USB 링크 속도로 갈립니다(QSPI 지우기 약 3분 포함). 여러 대를 동시에 구우면 대당 시간이 늘어납니다.

링크이미지 전송 속도1대 소요
USB 2.0 (480Mbps)약 36 MB/s약 15분 (실측 936초)
USB 3 (5Gbps)약 220 MB/s약 5분 (실측 285초)
15분 넘게 걸리면 USB 2.0 으로 붙은 것입니다

호스트에서 확인할 수 있습니다 — 480 이면 USB 2.0, 5000 이상이면 USB 3 입니다.

cat /sys/bus/usb/devices/*/speed # 보드가 붙은 포트의 값

느려도 굽기 결과는 같습니다. 급하지 않으면 그대로 두어도 됩니다.

진행 상황 보기

굽는 동안 화면이 한동안 조용할 수 있습니다. 보드별 진행은 로그로 따라갑니다.

tail -f initrdlog/flash_*_$(date +%Y%m%d)-*.log

USB 상태로도 확인됩니다 — 0955:7026(RCM) → 0955:7035/0955:7100(굽는 중) → 부팅.

굽는 동안 하지 말아야 할 것
  • USB 케이블을 뽑거나 보드 전원을 건드리지 않습니다.
  • 호스트의 네트워크 인터페이스 설정을 바꾸지 않습니다.
  • 다른 Jetson 을 새로 연결하지 않습니다.

성공 판정​

화면 마지막이 아래처럼 나와야 성공입니다.

[flash] ✅ flash_<포트>_0_<시각>.log took …
[flash] ✅ 1 대 전부 'Flashing finished Successfully' (rc=0)
종료코드 0 만으로 판단하지 마세요

여러 대를 구울 때 보드별 결과는 화면이 아니라 로그 파일(initrdlog/flash_*.log)로만 남습니다. flash.sh 가 보드별 로그의 Flashing finished Successfully 를 대수만큼 세어 판정합니다.


4. 굽고 난 뒤​

  1. 굽기가 끝나도 보드가 굽기용 임시 OS(0955:7100)에 머물러 있으면 전원을 한 번 껐다 켭니다.
  2. 첫 부팅에 약 2~3분간 자동 작업이 돕니다: 디스크 전체로 확장 · docker 설치(인터넷 필요) · USB-C 전원 컨트롤러(CCG8) 펌웨어 적용.
  3. 계정은 avs / 비밀번호 telelian 입니다.
  4. 확인합니다.
systemctl list-jobs # 비어 있으면 첫 부팅 작업 완료
. /etc/avs-release && echo "$AVS_RELEASE" # r39.2.1-20260916
systemctl --failed # 0 loaded units listed
avs-camera show # 지금 부팅된 카메라 구성
ip link show enP2p1s0 # 유선 MAC (아래 참고)
유선 LAN 칩이 두 종류입니다

보드 리비전에 따라 Realtek RTL8125 또는 RTL8126 이 실립니다(lspci -nn | grep 10ec 로 확인). 이 판은 두 경우 모두 이더넷 MAC 을 모듈 고유값으로 고정합니다 — 재설치해도 바뀌지 않습니다.

MAC 이 고정됐는지 한 줄로 보는 법:

cat /proc/device-tree/chosen/nvidia,ether-mac5; echo # 모듈에 새겨진 값
cat /sys/class/net/enP2p1s0/address # 지금 쓰는 값 — 위와 같아야 합니다

두 값이 다르면 MAC 이 고정되지 않은 것이니 알려 주세요.


5. 카메라 바꾸기 — jetson-io​

sudo /opt/nvidia/jetson-io/jetson-io.py
# Configure Jetson AGX CSI Connector → Configure for compatible hardware → 카메라 선택
# Save and reboot to reconfigure pins

명령줄로 바로 고를 수도 있습니다.

sudo /opt/nvidia/jetson-io/config-by-hardware.py -l # 메뉴 목록
sudo /opt/nvidia/jetson-io/config-by-hardware.py -n 1="AVS300 4x2-am03ss-isx031" # 헤더 번호 1 = CSI
sudo reboot
  • 한 번에 하나만 고릅니다. jetson-io 는 OVERLAYS 줄을 선택한 것으로 덮어씁니다. 캐리어·PPS 는 보드 DTB 에 있어 영향을 받지 않습니다.
  • jetson-io 는 /boot/extlinux/extlinux.conf 에 LABEL JetsonIO 항목을 만들고 DEFAULT 를 그쪽으로 바꿉니다. 출하 구성은 LABEL primary 에 남아 있어 DEFAULT primary 로 고치면 되돌아갑니다.
  • 현재 부팅된 카메라는 avs-camera show 로 확인합니다.
  • 카메라를 바꾼 뒤에는 보드 전원을 완전히 껐다 켭니다. GMSL 카메라는 부팅할 때만 인식합니다.
  • AVS300 에는 물리 CSI 커넥터가 없습니다. jetson-io 의 "수동 핀 설정" 메뉴는 쓰지 않습니다.
이 번들에 들어 있는 AVS300 카메라 오버레이 (jetson-io 메뉴 12종)
메뉴 이름파일
AVS300 4x2-sg3s-isx031c ← 기본값tegra264-avs300-camera-gmsl-4x2-3g-sg3s-isx031c-overlay.dtbo
AVS300 2x2-am03ss-isx031-2x2-sg3s-isx031ctegra264-avs300-camera-gmsl-2x2-6g-am03ss-isx031-2x2-3g-sg3s-isx031c-overlay.dtbo
AVS300 4x2-am03ss-isx031tegra264-avs300-camera-gmsl-4x2-6g-am03ss-isx031-overlay.dtbo
AVS300 4x2-acc02ongtegra264-avs300-camera-gmsl-4x2-6g-acc02ong-overlay.dtbo
AVS300 4x2-astra-s36tegra264-avs300-camera-gmsl-4x2-6g-astra-s36-overlay.dtbo
AVS300 4x2-atech-rgbirtegra264-avs300-camera-gmsl-4x2-6g-atech-rgbir-overlay.dtbo
AVS300 4x2-atech-stereotegra264-avs300-camera-gmsl-4x2-6g-atech-stereo-overlay.dtbo
AVS300 4x2-sg2-imx390tegra264-avs300-camera-gmsl-4x2-6g-sg2-imx390-overlay.dtbo
AVS300 4x2-sg5-ox05bctegra264-avs300-camera-gmsl-4x2-6g-sg5-ox05bc-overlay.dtbo
AVS300 4x2-sg8-isx028tegra264-avs300-camera-gmsl-4x2-6g-sg8-isx028-overlay.dtbo
AVS300 4x2-sg8-ox08bctegra264-avs300-camera-gmsl-4x2-6g-sg8-ox08bc-overlay.dtbo
AVS300 dummytegra264-avs300-camera-dummy-overlay.dtbo

이름의 4x2 는 디시리얼라이저 4개 × 2채널(= 8채널), 3g/6g 는 GMSL 링크 속도입니다. 카메라 벤더가 다르면 링크 속도가 달라(예: Sensing ISX031 = 3G, Atech ISX031 = 6G) 잘못 고르면 전 채널이 인식되지 않습니다.


6. 문제 해결​

증상조치
ERROR: might be timeout in USB read 로 굽기 시작 직후 실패보드를 OS 로 한 번 정상 부팅시킨 뒤 리커버리로 다시 넣습니다 → 아래 상세
Core FW Flashing Failed: 122외장 NVMe 가 없거나 인식되지 않습니다. NVMe 를 장착하고 다시 굽습니다
대수가 안 맞는다 로 멈춤lsusb -d 0955:7026 줄 수와 flash.sh N 의 N 을 맞춥니다
lsusb 에 아무것도 안 잡힘케이블(데이터용인지) · FLASH 포트인지 · RCV SW 순서를 확인합니다 → 2-3
pigz: not found + This does not look like a tar archive번들이 깨진 게 아닙니다. sudo tar xzpf … 로 푸세요 → 1-2
굽기 후 0955:7100 에 머묾전원을 껐다 켭니다(쓰기는 끝난 상태입니다)
카메라가 안 보임avs-camera show 로 구성을 확인하고, 카메라 벤더에 맞는 오버레이(3G/6G)인지 봅니다. 바꾼 뒤 전원을 완전히 껐다 켭니다
docker 가 없음첫 부팅 때 인터넷이 없으면 설치가 미뤄집니다. 인터넷 연결 후 재부팅합니다

might be timeout in USB read — 굽기 시작 직후 실패​

로그가 여기까지는 정상으로 흐르다가 마지막 한 줄에서 멈춥니다.

Sending bct_br
Sending mb1
Sending psc_bl1
Sending bct_mb1
tegrarcm_v2 … --pollbl --download applet applet/applet_blob.bin
→ ERROR: might be timeout in USB read (OSError: 43, 몇 초 만에)

보드가 굽기용 부트로더로 넘어가지 못한 상태입니다. 보드나 번들이 망가진 것이 아니고, 이 단계에서는 보드에 아무것도 쓰이지 않았습니다.

조치 — 순서대로

  1. 보드를 OS 로 정상 부팅시킵니다(리커버리 아님). 부팅될 때까지 기다립니다.
  2. sudo reboot forced-recovery 로 리커버리에 다시 넣습니다.
  3. lsusb -d 0955:7026 로 확인하고 다시 굽습니다.
언제 잘 생기나

캐리어나 모듈을 교체한 직후, 또는 앞선 굽기가 중간에 끊긴 뒤에 잘 나타납니다. 교체 후 한 번도 정상 부팅을 거치지 않고 바로 리커버리로 들어간 경우가 대표적입니다.

호스트 환경을 의심하기 전에 위부터 하세요

이 오류는 호스트 OS·USB 컨트롤러·컨테이너 설정과 무관합니다. 같은 증상을 두고 호스트 쪽을 파면 시간만 듭니다 — 1~3 을 먼저 하세요.


부록 A. GPS PPS 입력​

캐리어의 GPS PPS 입력(GPS_PPS_IN → 모듈 핀 B62 / PDD.03)은 nvpps 장치에 연결돼 있습니다(/dev/nvpps0).

  • 부팅 시 모드는 TIMER(NVIDIA 기본값)입니다. GPS 가 없어도 동작에 영향이 없습니다.
  • GPS PPS 를 쓰려면 애플리케이션이 NVPPS_SETPARAMS ioctl 로 이벤트 모드를 GPIO 로 바꿉니다.