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 두 파일을 받습니다.
gcam8-r3 캐리어 전용입니다AVS300 캐리어에는 EEPROM 이 없어 전원(PMIC) 설정이 FAB 500 모듈 기준으로 고정됩니다. FAB 400 이하 모듈에는 쓰지 마세요.
모듈 라벨의 부품번호가 699-13834-0008-500 인지 확인합니다. 캐리어는 보드 DTB 에 들어가 있어 플래시 후에 바꿀 수 없습니다.
- 캐리어 설정(GMSL·fsync·PPS)이 보드 DTB 에 합쳐졌습니다. 카메라만
extlinux.conf의OVERLAYS한 줄로 고릅니다. - 카메라는 보드에서
jetson-io메뉴로 바꿉니다. 바꿔도 캐리어·PPS 설정은 사라지지 않습니다. - 오버레이 파일 이름이
tegra264-avs300-camera-gmsl-<구성>-overlay.dtbo형식으로 바뀌었습니다.
빠른 시작 (Quick Start) 페이지에 0~6단계 명령을 한 덩어리로 모아 뒀습니다. 처음이시면 아래를 순서대로 보세요.
1. 준비물
| 필요한 것 | 내용 |
|---|---|
| 호스트 PC | Ubuntu 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 디렉터리 안에서 실행하세요.
AVS200 과 달리 AVS300 은 이미지를 USB 위의 ADB 로 보냅니다. nfs-kernel-server 설정이나 방화벽 NFS 예외는 필요 없습니다.
2. 보드를 리커버리(RCM) 모드로 연결
리커버리(RCM, Recovery Mode)는 보드의 부트ROM 이 USB 로 넘어오는 이미지를 받는 상태입니다. 이 상태여야 굽기가 시작됩니다.
2-1. 전면 패널 — 어느 포트, 어느 버튼인가
빨간 1 = 호스트 USB 케이블을 꽂는 곳 · 노란 2 = 리커버리 버튼 · 회색 ✕ = 굽기에 쓰지 않는 포트
| 표시 | 무엇 | 굽기에 쓰나 | |
|---|---|---|---|
| 1 | FLASH (USB-C) | Jetson 디바이스 모드 — 이미지를 받는 포트 | ✅ 여기에 호스트를 연결합니다 |
| ✕ | USB3 (USB-C) | 일반 USB 호스트 포트 (USB 3) | ❌ 쓰지 않습니다 |
| 2 | RCV SW | 리커버리(FORCE_RECOVERY) 버튼 | ✅ 2-2 |
| 3 | RST SW | 리셋 버튼 | ✅ 2-2 — 켜져 있을 때 |
| 4 | PWR SW | 전원 버튼 | ✅ 2-2 — 꺼져 있을 때 |
DEBUG (USB-C) | 디버그 시리얼 콘솔 | 선택 — 부팅 과정을 보려면 | |
MICOM (USB-C) | 보조 MCU 전용 | ❌ |
FLASH 와 USB3 는 둘 다 USB-C 라 헷갈립니다USB3 에 꽂으면 호스트에서 아무것도 잡히지 않습니다(오류도 안 납니다). 라벨을 확인하세요.
보드의 FLASH 포트와 호스트 PC 의 USB 포트를 데이터용 USB-C 케이블로 연결합니다.
여러 대를 구우려면 USB 허브를 씁니다(최대 4대).
리커버리(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. 버튼으로 — 보드가 켜져 있을 때
RCV SW(위 그림 2)를 누른 채 유지합니다.- 누른 상태에서
RST SW(그림 3)를 짧게 눌렀다 뗍니다. - 2초쯤 더 기다린 뒤
RCV SW를 뗍니다.
방법 B. 버튼으로 — 보드가 꺼져 있을 때
RCV SW(그림 2)를 누른 채 유지합니다.- 누른 상태에서
PWR SW(그림 4)로 전원을 인가합니다. - 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:7026 | RCM — 구울 준비 완료 |
0955:7035 | 굽기용 임시 OS 로 부팅하는 중 |
0955:7100 | 굽기용 임시 OS(ADB)로 부팅된 상태 — 굽는 중 |
0955:7020 | 굽기가 끝나 OS 가 부팅된 상태 |
굽기 도구는 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초) |
호스트에서 확인할 수 있습니다 — 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)
여러 대를 구울 때 보드별 결과는 화면이 아니라 로그 파일(initrdlog/flash_*.log)로만 남습니다.
flash.sh 가 보드별 로그의 Flashing finished Successfully 를 대수만큼 세어 판정합니다.
4. 굽고 난 뒤
- 굽기가 끝나도 보드가 굽기용 임시 OS(
0955:7100)에 머물러 있으면 전원을 한 번 껐다 켭니다. - 첫 부팅에 약 2~3분간 자동 작업이 돕니다: 디스크 전체로 확장 · docker 설치(인터넷 필요) · USB-C 전원 컨트롤러(CCG8) 펌웨어 적용.
- 계정은
avs/ 비밀번호telelian입니다. - 확인합니다.
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 (아래 참고)
보드 리비전에 따라 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-isx031c | tegra264-avs300-camera-gmsl-2x2-6g-am03ss-isx031-2x2-3g-sg3s-isx031c-overlay.dtbo |
AVS300 4x2-am03ss-isx031 | tegra264-avs300-camera-gmsl-4x2-6g-am03ss-isx031-overlay.dtbo |
AVS300 4x2-acc02ong | tegra264-avs300-camera-gmsl-4x2-6g-acc02ong-overlay.dtbo |
AVS300 4x2-astra-s36 | tegra264-avs300-camera-gmsl-4x2-6g-astra-s36-overlay.dtbo |
AVS300 4x2-atech-rgbir | tegra264-avs300-camera-gmsl-4x2-6g-atech-rgbir-overlay.dtbo |
AVS300 4x2-atech-stereo | tegra264-avs300-camera-gmsl-4x2-6g-atech-stereo-overlay.dtbo |
AVS300 4x2-sg2-imx390 | tegra264-avs300-camera-gmsl-4x2-6g-sg2-imx390-overlay.dtbo |
AVS300 4x2-sg5-ox05bc | tegra264-avs300-camera-gmsl-4x2-6g-sg5-ox05bc-overlay.dtbo |
AVS300 4x2-sg8-isx028 | tegra264-avs300-camera-gmsl-4x2-6g-sg8-isx028-overlay.dtbo |
AVS300 4x2-sg8-ox08bc | tegra264-avs300-camera-gmsl-4x2-6g-sg8-ox08bc-overlay.dtbo |
AVS300 dummy | tegra264-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, 몇 초 만에)
보드가 굽기용 부트로더로 넘어가지 못한 상태입니다. 보드나 번들이 망가진 것이 아니고, 이 단계에서는 보드에 아무것도 쓰이지 않았습니다.
조치 — 순서대로
- 보드를 OS 로 정상 부팅시킵니다(리커버리 아님). 부팅될 때까지 기다립니다.
sudo reboot forced-recovery로 리커버리에 다시 넣습니다.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_SETPARAMSioctl 로 이벤트 모드를 GPIO 로 바꿉니다.