라즈베리파이 4/5 계열은 부트로더가 보드 위 EEPROM에 저장되어 있고, rpi-eeprom-update로 최신 버전으로 갱신할 수 있다. “부트로더를 빌드한다”는 말 때문에 소스를 내려받아 컴파일하는 과정을 떠올리기 쉬운데, 실제로는 다르다. rpi-eeprom 저장소에는 이미 컴파일된 바이너리 이미지가 채널별로 들어있고, 사용자가 하는 일은 그중 하나를 골라 EEPROM에 쓰거나, 기존 이미지의 부팅 설정 블록만 추출해서 고친 뒤 다시 포장하는 것이다. 이 글에서는 실제 rpi-eeprom 저장소 구조와 진짜 업데이트·커스터마이즈 절차를 확인한다.
rpi-eeprom 저장소 구조 — 빌드가 아니라 이미 빌드된 이미지
$ git clone https://github.com/raspberrypi/rpi-eeprom.git
$ cd rpi-eeprom && ls
firmware-2711/ firmware-2712/ imager/ test/ tools/
rpi-eeprom-config rpi-eeprom-digest rpi-eeprom-update ...
$ ls firmware-2711/
beta critical default latest old stable release-notes.md versions.txt
이 저장소에 Makefile은 없다. firmware-2711(Pi 4/400/CM4 계열, BCM2711)과 firmware-2712(Pi 5/500/CM5 계열, BCM2712) 아래로 beta/critical/default/latest/stable 채널 디렉터리가 있고, 각 채널 안에 이미 완성된 pieeprom-YYYY-MM-DD.bin 이미지와 recovery.bin이 들어있다. 즉 “부트로더 업데이트”의 실체는 이 미리 빌드된 이미지 중 하나를 선택해서 EEPROM에 쓰는 작업이다.
표준 업데이트 — rpi-eeprom-update
실제 라즈베리파이 OS에는 이 저장소 내용이 rpi-eeprom 패키지로 미리 설치되어 있다. 어떤 채널을 따라갈지는 /etc/default/rpi-eeprom-update에서 정한다.
FIRMWARE_ROOT=/usr/lib/firmware/raspberrypi/bootloader
FIRMWARE_RELEASE_STATUS="default"
FIRMWARE_BACKUP_DIR="/var/lib/raspberrypi/bootloader/backup"
# Pi 5에서 재부팅 없이 즉시 반영하려면
#RPI_EEPROM_IMMEDIATE_UPDATE=1
FIRMWARE_RELEASE_STATUS를 stable이나 latest로 바꾸면 그 채널 기준으로 최신 버전을 찾는다. 업데이트 자체는 한 줄이다.
$ sudo rpi-eeprom-update -a
기본 동작은 즉시 플래시가 아니라 스테이징이다. 새 이미지(pieeprom.upd)와 recovery.bin을 부트 파티션에 써두고, 다음 재부팅 시 ROM이 recovery.bin을 실행해 실제로 EEPROM을 갱신한다. 성공하면 recovery.bin은 스스로 recovery.000으로 이름을 바꿔 재실행을 막고 시스템을 재시작한다. 파일 시스템 손상으로 잘못된 이미지가 플래시되는 걸 막기 위해 SHA256 해시(pieeprom.sig)도 함께 검증한다.
부팅 설정 커스터마이즈 — rpi-eeprom-config
진짜 “빌드”에 가까운 작업은 이쪽이다. 기존 EEPROM 이미지에서 설정 블록만 뽑아 고친 뒤 새 이미지로 다시 포장한다. 실제로 최신 이미지 하나로 전체 사이클을 확인했다.
$ ./rpi-eeprom-config firmware-2711/latest/pieeprom-2026-05-17.bin
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
NET_INSTALL_AT_POWER_ON=1
$ ./rpi-eeprom-config firmware-2711/latest/pieeprom-2026-05-17.bin --out boot.conf
$ sed -i 's/BOOT_UART=0/BOOT_UART=1/' boot.conf
$ ./rpi-eeprom-config --config boot.conf \
--out pieeprom-custom.bin firmware-2711/latest/pieeprom-2026-05-17.bin
$ ls -la pieeprom-custom.bin
-rw-rw-r-- 1 noble noble 524288 pieeprom-custom.bin
$ ./rpi-eeprom-config pieeprom-custom.bin
[all]
BOOT_UART=1
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
NET_INSTALL_AT_POWER_ON=1
BOOT_UART=0이던 원본 이미지에서 설정만 뽑아 1로 고친 뒤 524,288바이트(512KB)짜리 새 이미지로 재포장했고, 그 이미지를 다시 읽으면 바뀐 값이 그대로 반영되어 있다. 원본 이미지 자체를 손대는 게 아니라 설정 블록만 교체하는 방식이라, 부트로더 본체(펌웨어 코드)는 그대로 두고 WAKE_ON_GPIO, POWER_OFF_ON_HALT 같은 동작만 바꾸고 싶을 때 적합하다.
서명 다이제스트 만들기 — rpi-eeprom-digest
커스텀 이미지를 만들었다면 .sig 파일도 새로 만들어야 한다. rpi-eeprom-update가 플래시 전에 이 해시로 무결성을 검사하기 때문이다.
$ ./rpi-eeprom-digest -i pieeprom-custom.bin -o pieeprom-custom.sig
$ cat pieeprom-custom.sig
e4a96f9c05997428722687b8ce2dafc0c4373ccd9fe51ce20da9fb4209d40d40
ts: 1784464103
SHA256 해시와 타임스탬프가 담긴다. 시큐어 부트를 쓰는 경우에는 여기에 RSA 서명까지 추가되지만, 일반적인 커스터마이즈에는 이 정도면 충분하다.
실제로 플래시하기
완성된 커스텀 이미지는 -f로 지정해서 설치한다.
$ sudo rpi-eeprom-update -d -f pieeprom-custom.bin
-f는 최신 버전 자동 선택 대신 지정한 파일을 강제로 쓰겠다는 뜻이고, -d는 그 파일에 담긴 설정을 그대로 쓰겠다는 뜻이다. 이후 흐름은 표준 업데이트와 같다 — 다음 재부팅 시 recovery.bin이 실제로 EEPROM을 갱신한다. 이 글의 이미지 추출·수정·재포장·서명 과정은 x86 환경에서 파일 처리만으로 검증한 것이고, 실제 EEPROM 플래시와 재부팅 반영은 라즈베리파이 실기가 있어야 확인할 수 있다는 점은 밝혀둔다.
주의사항
- 기본 스테이징 방식은 재부팅이 필요한 대신 안전하다.
RPI_EEPROM_IMMEDIATE_UPDATE=1로 재부팅 없이 즉시 플래시하는 옵션도 있지만, 이 방식은 플래시 도중 전원이 끊기면 EEPROM이 손상될 수 있다. 손상되면 Raspberry Pi Imager의 부트로더 복구 기능으로 복구해야 한다. - 즉시 플래시에 쓰이는
flashrom1.4~1.6 버전 중 일부는 SFDP로만 인식되는 칩에서 지우기(erase) 명령을 잘못 보내는 버그가 있다. 라즈베리파이 OS가 제공하는 패치된flashrom을 쓰거나, 그게 아니라면RPI_EEPROM_IMMEDIATE_UPDATE를 켜지 말고 기본 스테이징 방식을 쓰는 게 안전하다. - CM4/CM4S는
rpi-eeprom-update가 기본적으로 비활성화되어 있다. 권장 업데이트 경로는 별도의usbboot도구다. - Pi 5 계열은
config.txt수정이 필요 없다. AB EEPROM이 활성화된 보드는rpi-eeprom-ab가, 그렇지 않으면flashrom이 즉시 업데이트를 처리한다.
마무리
“부트로더를 빌드한다”는 표현과 달리, 실제로는 이미 컴파일된 이미지를 채널에서 골라 쓰거나 설정 블록만 추출·수정·재포장하는 작업이다. rpi-eeprom-update로 표준 채널을 따라가는 게 대부분의 경우 전부이고, WAKE_ON_GPIO나 BOOT_UART 같은 옵션을 커스터마이즈하고 싶을 때만 rpi-eeprom-config로 이미지를 직접 다뤄야 한다. 두 경로 모두 소스 컴파일과는 무관하다는 걸 기억해두면 된다.