U-Boot 포팅 (6. U-Boot 기능 확장 및 디바이스 드라이버 추가 / U-Boot 환경 변수 설정)

2025. 2. 26. 12:27프로그래밍/시스템

부팅 스크립트 및 자동 부팅

U-Boot에서는 자동 부팅을 설정하여 지정된 저장 장치(SD 카드, eMMC) 또는 네트워크(TFTP, NFS)에서 커널을 로드하고 실행할 수 있습니다.
이를 위해 bootcmd 환경 변수를 활용하여 부팅 스크립트를 구성할 수 있습니다.

이 문서에서는 자동 부팅 설정, 네트워크 부팅(TFTP/NFS), SD 카드 및 eMMC 부팅 설정 방법을 설명합니다.


1. bootcmd 환경 변수 설정하여 자동 부팅 구성

🔹 bootcmd란?

  • bootcmd는 U-Boot가 자동으로 실행할 부팅 명령어를 지정하는 환경 변수입니다.
  • bootdelay 값이 0이 아닌 경우, 지정된 시간 동안 키 입력이 없으면 bootcmd가 실행됩니다.
  • bootcmd는 저장 장치(eMMC, SD 카드) 또는 네트워크(TFTP, NFS)에서 커널을 로드하는 역할을 합니다.

🔹 bootcmd 기본 설정 예제 (eMMC 부팅)

📌 현재 bootcmd 확인

printenv bootcmd

📌 부팅 딜레이(초) 설정 (bootdelay)

setenv bootdelay 3
saveenv

📌 자동 부팅 명령어 설정 (eMMC 부팅)

setenv bootcmd 'load mmc 0:1 0x82000000 /boot/zImage; load mmc 0:1 0x83000000 /boot/dtb/myboard.dtb; bootz 0x82000000 - 0x83000000'
saveenv

3초 후 eMMC에서 zImage(커널)와 myboard.dtb(디바이스 트리)를 로드하여 자동 부팅

📌 부팅 테스트

run bootcmd

📌 자동 부팅 비활성화 (bootdelay를 -1로 설정)

setenv bootdelay -1
saveenv

2. 네트워크 부팅 (TFTP, NFS 활용)

U-Boot는 네트워크 부팅(TFTP/NFS)을 지원하여, 로컬 저장 장치 없이 커널을 원격 서버에서 불러올 수 있습니다.

🔹 1) 네트워크 설정 (IP 주소, 서버 IP 설정)

📌 U-Boot에서 네트워크 설정 확인

printenv ipaddr serverip

📌 IP 주소 설정

setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.1
saveenv

✅ ipaddr: 보드의 IP 주소
✅ serverip: TFTP/NFS 서버 IP 주소


🔹 2) TFTP 부팅 설정

📌 TFTP를 이용한 커널 및 DTB 파일 로드

setenv bootcmd 'tftpboot 0x82000000 zImage; tftpboot 0x83000000 myboard.dtb; bootz 0x82000000 - 0x83000000'
saveenv

네트워크에서 zImage(커널) 및 myboard.dtb(디바이스 트리)를 다운로드하여 실행

📌 TFTP 부팅 실행

run bootcmd

🔹 3) NFS 부팅 설정

📌 NFS 서버에서 루트 파일 시스템 마운트 설정

setenv bootargs "console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.1:/nfsroot rw ip=dhcp"
setenv bootcmd 'tftpboot 0x82000000 zImage; tftpboot 0x83000000 myboard.dtb; bootz 0x82000000 - 0x83000000'
saveenv

네트워크에서 커널을 다운로드하고, NFS를 통해 루트 파일 시스템을 마운트

📌 NFS 부팅 실행

run bootcmd

3. SD 카드 및 eMMC 부팅 설정

U-Boot는 SD 카드 또는 eMMC에서 커널을 로드하여 부팅할 수 있도록 설정할 수 있습니다.

🔹 1) SD 카드 부팅 설정

📌 SD 카드에서 커널 및 DTB 파일 로드

setenv bootcmd 'load mmc 1:1 0x82000000 /boot/zImage; load mmc 1:1 0x83000000 /boot/dtb/myboard.dtb; bootz 0x82000000 - 0x83000000'
saveenv

mmc 1:1 → SD 카드(mmcblk1)의 첫 번째 파티션에서 부팅 파일 로드

📌 SD 카드에서 부팅 테스트

run bootcmd

🔹 2) eMMC 부팅 설정

📌 eMMC에서 커널 및 DTB 파일 로드

setenv bootcmd 'load mmc 0:1 0x82000000 /boot/zImage; load mmc 0:1 0x83000000 /boot/dtb/myboard.dtb; bootz 0x82000000 - 0x83000000'
saveenv

mmc 0:1 → eMMC(mmcblk0)의 첫 번째 파티션에서 부팅 파일 로드

📌 eMMC에서 부팅 테스트

run bootcmd

4. 부팅 순서 설정 (eMMC → SD 카드 → 네트워크 순)

📌 부팅 순서 자동 설정 (bootcmd 수정)

setenv bootcmd '
if fatload mmc 0:1 0x82000000 /boot/zImage; then
    echo "Booting from eMMC...";
    load mmc 0:1 0x83000000 /boot/dtb/myboard.dtb;
    bootz 0x82000000 - 0x83000000;
else
    if fatload mmc 1:1 0x82000000 /boot/zImage; then
        echo "Booting from SD card...";
        load mmc 1:1 0x83000000 /boot/dtb/myboard.dtb;
        bootz 0x82000000 - 0x83000000;
    else
        echo "Trying network boot...";
        tftpboot 0x82000000 zImage;
        tftpboot 0x83000000 myboard.dtb;
        bootz 0x82000000 - 0x83000000;
    fi;
fi'
saveenv

부팅 순서
1️⃣ eMMC (mmc 0:1)에서 먼저 부팅 시도
2️⃣ SD 카드 (mmc 1:1)에서 부팅 시도
3️⃣ TFTP를 통한 네트워크 부팅 시도

📌 자동 부팅 테스트

run bootcmd

📌 정리

bootcmd 환경 변수를 사용하여 자동 부팅 구성 가능
네트워크(TFTP, NFS)를 이용한 커널 및 루트 파일 시스템 부팅 방법 학습
SD 카드 및 eMMC에서 부팅하는 설정 방법 정리
부팅 순서를 설정하여 eMMC → SD 카드 → 네트워크 순서대로 부팅 가능