부트로더(Bootloader)란?
부트로더는 기기가 켜질 때 가장 먼저 실행되는 코드로, 기기의 운영 체제(OS)를 시작하기 위한 초기 단계를 담당한다. 임베디드 시스템에서 부트로더의 역할은 아래와 같이 요약할 수 있다.
1. 하드웨어 초기화
부트로더는 시스템을 켤 때 기본적인 하드웨어 초기화를 담당한다. 이 과정에는 메모리 검사, 프로세서 초기 설정, 입력/출력 시스템의 설정 등이 포함될 수 있으며, 이 단계에서 OS가 자신의 작업을 시작하기 전에 필요한 하드웨어 리소스가 올바르게 설정되고 준비되도록 보장한다.
2. 운영 체제 로딩
부트로더의 주요 목적 중 하나는 저장 장치에서 운영 체제를 찾아서 메모리로 로드하는 것이다. 이 과정에는 OS 커널 이미지를 찾고, 메모리에 복사하며, 실행을 시작하기 위해 제어를 OS에 전달하는 작업이 포함된다.
3. 복구 및 업데이트
많은 임베디드 시스템은 시스템 복구나 펌웨어 업데이트 기능을 제공한다. 만약 시스템이 제대로 부팅되지 않거나 소프트웨어 업데이트가 필요한 경우, 부트로더는 이를 가능하게 하는 대체 부팅 시퀀스나 네트워크를 통한 이미지 다운로드 기능을 제공할 수 있다.
4. 환경 설정 및 관리
부트로더는 시스템 설정이나 환경 변수를 관리하는 인터페이스를 제공한다. 이는 네트워크 설정, 부팅 순서, 로깅 수준과 같은 중요한 시스템 파라미터들을 설정하고 관리할 수 있게 해 준다. 이러한 설정은 시스템이 어떻게 부팅될지, 어떤 조건에서 특정 작업을 실행할지를 결정하는 데 중요하다.
부트로더는 운영 체제보다는 간단한 프로그램이지만, 시스템이 성공적으로 시작하고 실행될 수 있도록 하는 데 필수적인 역할을 한다. 다양한 하드웨어 플랫폼과 임베디드 시스템에서는 U-Boot, RedBoot 같은 일반적인 오픈 소스 부트로더를 사용하기도 하며, 특정 제조사는 자체적인 맞춤형 부트로더를 개발하여 사용하기도 한다.
부트로더(Bootloader) 진입
필자가 관리하는 시스템의 경우 부팅 도중 특정 메시지가 출력되고 카운트를 세는 동안 'Ctrl+C' 커맨드로 인터럽트를 주어 진입할 수 있다. U-Boot과 같은 오픈소스 부트로더에서는 아래와 같이 출력될 수 있다. (이는 부트로더나 제조사마다 다를 수 있으며, 아래부터는 U-Boot 오픈소스를 기준으로 작성되었음을 참고해 주세요.)
Hit any key to stop autoboot: 3
부트로더 명령 프롬프트에 진입하면, 사용자는 다양한 U-Boot 명령어를 사용하여 시스템을 구성하거나 부팅 매체를 선택할 수 있다. 예를 들어, printenv 명령어를 사용하여 부트로더의 환경 변수를 확인하거나 bootd 명령어로 부팅 절차를 계속 진행할 수 있다. 그럼 부트로더와 관련한 명령어를 살펴보자.
bootloader 명령어 (U-Boot 기준)
U-Boot의 부트로더 모드에서 사용할 수 있는 대표적인 명령어들은 시스템 설정, 파일 로딩, 네트워크 관리 등 다양한 작업을 수행할 수 있게 해준다. 다음은 U-Boot에서 자주 사용되는 명령어들이다.
명령어
|
내용
|
printenv
|
부트로더의 환경 변수(환경 설정)들을 보여준다.
|
setenv
|
새로운 환경 변수를 생성하거나 기존 변수의 값을 변경할 때 사용된다.
|
saveenv
|
변경된 환경 변수들을 비휘발성 메모리(ROM, flash)에 저장한다.
setenv를 사용하여 환경 변수를 변경한 후, 이 변경사항을 저장하기 위해 saveenv를 실행해야 한다. |
bootd
|
기본 부팅 명령어로, U-Boot가 환경 변수에 설정된 대로 운영 체제를 부팅한다.
|
reset
|
시스템을 재부팅한다.
|
tftpboot
|
네트워크 부팅
네트워크를 통해 TFTP 서버에서 커널이나 다른 이미지 파일을 메모리로 로딩한다. 네트워크를 통한 시스템 업데이트나 디버깅 시 자주 사용된다. |
ping
|
네트워크 연결을 테스트하기 위해 사용된다. 특정 IP 주소로 ICMP Echo 요청을 보내 응답을 확인한다.
|
fatload
|
FAT 파일 시스템을 가진 저장 매체(예: SD 카드, USB 드라이브)에서 파일을 메모리로 로딩한다.
|
ext2load, ext4load
|
ext2 또는 ext4 파일 시스템을 가진 저장 매체에서 파일을 메모리로 로딩한다.
|
mmc
|
MMC(멀티미디어 카드) 디바이스에 대한 작업을 수행한다. 예를 들어, MMC 디바이스의 리스트를 보거나 특정 MMC 디바이스를 초기화한다.
|
nand, nor
|
NAND 또는 NOR 플래시 메모리와 관련된 작업을 수행한다. 예를 들어, 플래시 메모리의 내용을 읽거나 쓰거나 지울 수 있다.
|
usb
|
USB 시스템을 초기화하고, USB 디바이스를 검색하며, 파일을 USB 디바이스에서 로딩할 때 사용된다.
|
printenv 출력값
U-Boot의 버전에 따라 다를 수 있지만, 일반적으로 printenv를 통해 아래와 같은 환경 변수들을 확인할 수 있다.
bootdelay=3 ## 자동 부팅을 중지하고 사용자 입력을 기다리는 시간(초)
baudrate=115200 ## 리얼 통신의 전송 속도
ipaddr=192.168.1.100 ## 장비의 IP 주소
serverip=192.168.1.1 ## TFTP 서버의 IP 주소
netmask=255.255.255.0 ## 서브넷마스크
gatewayip=192.168.1.254 ## 게이트웨이의 IP 주소
ethaddr=00:1E:8C:76:81:2D ## 이더넷 MAC 주소
bootfile=uImage ## 네트워크 부트 시 로드할 파일의 이름 (OS명)
bootcmd=tftp ${loadaddr} ${bootfile}; bootm ${loadaddr} ## 시스템이 부팅할 때 실행할 기본 명령어
stdin=serial ## 표준 입력 처리 장치 (여기서는 모두 시리얼 포트 사용)
stdout=serial ## 표준 출력 처리 장치 (여기서는 모두 시리얼 포트 사용)
stderr=serial ## 표준 에러 처리 장치 (여기서는 모두 시리얼 포트 사용)
setenv로 환경 변수 설정하기
TFTP 서버 IP 지정
setenv serverip 192.168.1.2
장비의 IP 주소 설정
setenv ipaddr 192.168.1.100
부트 파일 설정
예를 들어 TFTP 서버 내 /home/user/u-boot 디렉토리 내 uImage라는 이름의 커널 이미지가 있다면, 다음과 같이 설정할 수 있다.
setenv bootfile /home/user/u-boot/uImage
부트 커맨드 설정
장비가 부팅할 때 수행할 기본 명령어를 설정한다. TFTP 서버에서 bootfile로 지정된 파일을 로드하여 실행하도록 설정하는 예이다.
setenv bootcmd 'tftp ${loadaddr} ${bootfile}; bootm ${loadaddr}'
이 명령어는 먼저 tftp 명령을 사용해 serverip에서 bootfile 변수에 지정된 파일을 loadaddr에 지정된 메모리 주소로 로드한다. (여기서는 /home/user/u-boot디렉토리에서 uImage 파일을 가져와 로드) 로딩이 완료되면 bootm 명령어를 사용하여 그 주소에서 커널을 실행한다.
환경 변수 저장
변경한 환경 변수들을 저장하고 U-Boot 설정에 영구적으로 반영하려면, saveenv 명령어를 실행한다. 해당 명령어는 변경된 모든 환경 변수를 비휘발성 메모리에 저장하여, 시스템을 재부팅하거나 전원을 껐다 켜도 설정이 유지되도록 한다.
saveenv
적용 확인
boot 명령어를 통해 설정한 대로 TFTP 서버에서 커널 이미지를 로드하여 부팅 과정이 시작된다. 이 과정을 통해 네트워크를 통한 원격 부팅 설정이 완료된다.
boot
'네트워크&인프라 > Switch&Router' 카테고리의 다른 글
Mac Address Table과 Transparent Bridging (0) | 2024.09.21 |
---|---|
네트워크 운영 체제(Network Operating System, NOS) - ZebOS (2) | 2024.08.29 |
UTP FTP S-FTP 랜(LAN) 케이블 / 동축 케이블 / 광 케이블 / SFP 종류 (0) | 2024.08.26 |
EVE-NG 다운로드 및 설치, 이미지 사용법, 웹(Web) UI 접속 (1) | 2024.08.11 |
Vlan(Virtual Lan)이란 무엇이며 어떻게 동작할까? (Access Port와 Trunk Port 그리고 Native Vlan) (1) | 2024.08.06 |