반응형
임베디드 리눅스 시스템 개발에서 U-Boot는 하드웨어와 운영체제를 연결하는 핵심 가교입니다. 그중에서도 환경 변수(Environment Variable)는 소스 코드를 재컴파일하지 않고도 부팅 경로, 커널 파라미터, 업데이트 로직 등을 유연하게 제어할 수 있게 해주는 필수 도구입니다. 이번 글에서는 Rockchip RK3399 플랫폼을 예시로, U-Boot 환경 변수의 구조와 실무에서 즉시 활용 가능한 스크립트 작성법을 정리해 보겠습니다.

핵심 요약
- 환경 변수는 U-Boot의 동작을 결정하는 핵심 설정값으로, 부팅 프로세스와 시스템 파라미터를 소스 수정 없이 변경합니다.
- printenv, setenv, saveenv 명령어의 조합만으로 대부분의 부팅 시나리오를 구성할 수 있습니다.
- 환경 변수를 활용하면 단순 부팅을 넘어 펌웨어 업데이트 등 복잡한 자동화 스크립트까지 구현 가능합니다.
1. U-Boot 핵심 환경 변수
U-Boot 환경 변수는 시스템 부팅 과정에서 결정적인 역할을 수행합니다.
| 변수명 | 역할 |
| bootcmd | 자동 부팅 카운트다운 후 실행되는 명령어 묶음 |
| bootargs | 리눅스 커널에 전달되는 커맨드 라인 파라미터 |
| bootdelay | 자동 부팅 전 사용자의 입력을 대기하는 시간(초) |
| 주소 변수 | 커널(kernel_addr_r), DTB(fdt_addr_r) 등이 로드될 메모리 주소 |
2. 저장 위치와 생명 주기
환경 변수는 실행 시점과 저장 매체에 따라 두 가지 상태로 구분됩니다.
| 구분 | 위치 | 특징 |
| Runtime | RAM | 부팅 직후 복사되며, setenv 수정 시 즉시 적용되지만 재부팅 시 초기화 |
| Persistent | eMMC/Flash | saveenv 명령 시 기록되며, 영구적으로 설정값 유지 |
3. 필수 명령어 가이드
실무 콘솔에서 환경 변수를 다룰 때 가장 많이 사용하는 명령어들입니다.
| 명령어 | 설명 |
| printenv | 현재 설정된 모든 환경 변수 출력 |
| setenv [var] [val] | 변수 생성 및 수정 (값을 비우면 변수 삭제) |
| saveenv | RAM의 변경 사항을 저장 매체에 영구 기록 |
| env default -a | 모든 변수를 공장 초기값으로 복구 |
4. 실전! 부팅 스크립트 설정
RK3399 보드에서 커널 부팅을 위한 필수 설정을 적용하는 예시입니다.
- 커널 부팅 인자 설정
-
Bash
=> setenv bootargs "console=ttyS2,1500000 root=/dev/mmcblk0p5 rw rootwait"
* **자동 부팅 구성 (bootcmd)**
```bash
=> setenv bootcmd 'mmc dev 0; fatload mmc 0:1 0x02000000 Image; fatload mmc 0:1 0x01f00000 rk3399.dtb; booti 0x02000000 - 0x01f00000'
=> saveenv
5. 고급 활용: 펌웨어 업데이트 자동화
U-Boot 환경 변수를 활용하면 if-then-else 조건문을 포함한 스크립트 작성이 가능합니다.
Bash
# 업데이트 모드 진입 설정
=> setenv upgrade_flag 1
# 조건부 부팅 스크립트
=> setenv bootcmd 'if test "${upgrade_flag}" = "1"; then \
echo "--- Firmware Update Mode ---"; \
usb start; \
fatload usb 0:1 0x20000000 update.img; \
run update_script; \
else \
run normal_boot; \
fi'
6. 개발을 위한 팁
- 변수 백업: 중요한 설정을 변경하기 전, printenv 결과를 별도로 복사해두거나 saveenv 이전에 설정을 검증하는 습관을 들이세요.
- 스크립트 모듈화: 긴 명령어를 하나의 변수에 넣지 말고, run normal_boot와 같이 여러 개의 작은 변수로 나누어 관리하면 가독성과 수정 편의성이 크게 향상됩니다.
7. 흔히 하는 실수
- saveenv 누락: 열심히 setenv로 환경을 구성하고 나서 saveenv를 하지 않아 재부팅 후 초기화되는 사례가 매우 많습니다.
- 메모리 영역 충돌: 커널 이미지와 DTB가 로드되는 메모리 주소가 겹치면 부팅 도중 시스템이 멈춥니다. 주소 설계 시 충분한 공간을 확보하세요.
결론
U-Boot 환경 변수는 임베디드 시스템의 단순 설정값을 넘어, 개발자가 시스템의 흐름을 자유자재로 제어할 수 있게 해주는 자동화 엔진입니다. 오늘 정리한 명령어와 스크립트 작성법을 숙달한다면, 어떤 하드웨어 환경에서도 유연하게 대응할 수 있는 임베디드 엔지니어가 될 것입니다.
반응형
'Embedded System > Bootloader & System Startup' 카테고리의 다른 글
| 임베디드 개발자를 위한 RK3399 U-Boot 부팅 디버깅 및 커스터마이징 가이드 (0) | 2025.12.10 |
|---|---|
| 임베디드 개발자를 위한 U-Boot 커널 로딩 및 부팅 시퀀스 완벽 가이드 (0) | 2025.12.09 |
| 임베디드 개발자를 위한 U-Boot 커스텀 명령어 추가 및 활용 가이드 U_BOOT_CMD 완벽 분석 (0) | 2025.12.07 |
| 임베디드 개발자를 위한 U-Boot 드라이버 모델(DM) 핵심 분석과 포팅 가이드 (0) | 2025.12.05 |
| U-Boot 부팅 시퀀스 완벽 분석: 다단계 부팅 구조와 로그 해석 (0) | 2025.12.04 |