부트로더와 OTA 업데이트 썸네일

내 스마트폰, 어떻게 업그레이드될까? 부트로더와 OTA의 비밀!

혹시 “내 스마트폰은 어떻게 새로운 기능이 생기고, 왜 밤새 저절로 업데이트 될까?” 궁금했던 적이 있을 것이다. 오늘은 여러분의 궁금증을 풀어줄, 스마트폰 속 숨겨진 영웅들, ‘부트로더’와 ‘OTA’에 대해 쉽고 재미있게 이야기해 보자.

부트로더란 무엇인가? OS 실행 전 부트로더

전원 버튼을 누르면 OS가 바로 켜질까? 사실은 아니다. 그보다 먼저 ‘부트로더(Bootloader)’라는 작은 프로그램이 실행된다. 부트로더는 시스템의 문지기라고 생각하면 쉽다.

전원이 켜지면 Bootloader 실행되는 이미지
전원이 켜지면 Bootloader 실행

기기에 전원이 들어오면, 부트로더는 CPU, 메모리, 저장 장치 등 핵심 하드웨어를 점검하고 초기화한다. 그리고 자신이 불러올 운영체제에 대한 유효성 검사를 수행한다. 모든 하드웨어 준비가 끝나고 운영체제의 유효성 검사가 끝나야 비로소 메인 운영체제(OS) 커널을 메모리에 불러와 실행시킨다. 즉, 부트로더가 없으면 기기는 OS를 시작조차 할 수 없다.

이 중요한 코드는 보통 플래시 메모리(Flash Memory)처럼 전원이 꺼져도 지워지지 않는 곳에 저장된다. 부트로더는 단순히 OS를 부팅하는 것 외에도, 개발을 위한 디버깅 모드나 시스템 복구 모드로 진입하는 등 특수한 임무도 수행한다. 그렇기 때문에 무척 중요하고, 일반적으로 공장에서 출고된 이후에는 업데이트가 안되도록 설계되어 있다.

OTA, 원격 업데이트는 어떻게 동작하는가?

요즘 기기들은 아주 치명적인 상태가 아닌 이상, 서비스 센터에 갈 필요 없이 자동으로 기능이 추가되거나 버그가 수정된다. 이것이 바로 OTA(Over-the-Air) 기술 덕분이다. 일반적으로 펌웨어(Firmware)를 무선으로 업데이트한다고 해서 FOTA(Firmware Over-the-Air)라고도 부른다.

과정은 이렇다.

  1. 기기가 주기적으로 또는 사용자의 요청에 의해서 인터넷을 통해 제조사의 서버에 접속해 새 업데이트가 있는지 확인한다.
  2. 새 버전이 있다면, 업데이트 패키지 파일을 다운로드한다.
  3. 이 파일은 중간에 해킹당하거나 변조되는 것을 막기 위해 암호화되거나 디지털 서명이 되어 있다.
  4. 다운로드가 완료되면 기기는 이 파일이 정말 안전한지, 손상되지는 않았는지 검증한다.
  5. 검증이 성공하면, 기기는 사용자에게 설치를 알리고 재부팅을 준비한다.

바로 이 재부팅 순간부터 부트로더의 진짜 역할이 시작된다.

부트로더와 OTA의 핵심 : A/B 파티션 전략

왜 OTA에 부트로더가 꼭 필요할까? 이유는 간단하다. 달리는 기차의 바퀴를 갈아 끼울 수 없기 때문이다. OS도 마찬가지다. OS가 한창 실행 중인 상태에서는 OS 자신을 업데이트할 수 없다. 그래서 OTA 과정은 OS가 아닌, OS가 시작되기 이전 단계인 부트로더가 담당해야 한다.

현대적인 시스템은 이 과정을 안전하게 처리하기 위해 ‘A/B 파티션’이라는 영리한 방법을 사용한다. 이것은 시스템이 설치되는 저장 공간을 A 슬롯과 B 슬롯, 두 개로 복제해 두는 방식이다.

A/B 파티션 OTA 이미지
A/B 파티션 OTA

가령 현재 사용자가 A 슬롯의 OS를 사용 중이라고 하자. OTA 업데이트 패키지가 다운로드되면, 시스템은 사용자가 기기를 사용하는 동안 조용히 ‘비활성’ 상태인 B 슬롯에 새 펌웨어를 설치한다. 설치가 완료되고 사용자가 재부팅을 선택하면, 제어권은 부트로더에게 넘어간다.

이때 부트로더는 “아, B 슬롯에 새 업데이트가 완료되었군. 다음 부팅은 A가 아니라 B로 해야겠다”라고 판단한다. 그리고 B 슬롯으로 부팅을 시도한다.

만약 B 슬롯의 새 펌웨어에 심각한 오류가 있어 부팅에 실패하면 어떻게 될까? 부트로더는 즉시 이를 감지하고, 다음 부팅을 다시 기존의 안전한 A 슬롯으로 되돌린다. 이것이 ‘롤백(Rollback)’ 기능이다. 이 덕분에 사용자는 업데이트 실패로 기기가 ‘벽돌’이 되는 끔찍한 경험을 피할 수 있다.

작은 임베디드 시스템 vs 안드로이드

부트로더와 OTA는 기기의 특성에 따라 다르게 구현된다. 일반적인 임베디드 시스템과 우리에게 익숙한 안드로이드의 차이를 통해 이를 알아보자.

소형 임베디드 시스템 (IoT, MCU)

IoT 센서나 스마트 조명 같은 프로그램의 크기가 작은 임베디드 기기를 떠올려보자. 이 기기들은 CPU 성능, 메모리, 저장 공간이 극히 제한적이다. 따라서 부트로더도 매우 가볍고 빠르게 만들어져야 한다.

리눅스 기반 임베디드 기기에서는 ‘U-Boot(Universal Boot Loader)’가 많이 사용되며, 일반 범용 MCU(Microcontroller) 레벨에서는 제조사가 제공하는 최소한의 부트로더를 사용하거나, 특정 기능(예: 펌웨어 암호화 해제)만 수행하도록 직접 개발 한다.

이런 환경에서의 OTA는 A/B 파티션 방식을 쓰기도 하지만, 메모리가 너무 작을 경우 ‘백업 슬롯’ 하나만 두는 단순한 방식을 쓰기도 한다. 부트로더의 로직도 상대적으로 단순할 수 있다.

// 아주 간단한 임베디드 부트로더의 OTA 로직 (의사 코드)
void main() {
    // 1. 하드웨어를 기본적으로 초기화한다.
    init_hardware();

    // 2. OTA 업데이트 플래그가 설정되어 있는지 확인한다.
    if (check_ota_update_flag() == TRUE) {
        
        // 3. 백업 슬롯에 있는 새 펌웨어를 검증한다.
        if (verify_firmware(BACKUP_SLOT) == SUCCESS) {
            
            // 4. 새 펌웨어를 메인 슬롯으로 복사(적용)한다.
            copy_firmware(BACKUP_SLOT, MAIN_SLOT);
            
            // 5. OTA 플래그를 지우고 재부팅한다.
            clear_ota_update_flag();
            reboot_system();
        } else {
            // 검증 실패. 플래그만 지우고 기존 펌웨어로 부팅.
            clear_ota_update_flag();
        }
    }
    
    // 6. (업데이트가 없거나 완료된 경우) 메인 슬롯의 펌웨어로 점프한다.
    jump_to_application(MAIN_SLOT);
}

안드로이드 시스템

안드로이드는 현존하는 가장 복잡하고 거대한 임베디드 시스템 중 하나다. 안드로이드의 부트로더는 매우 복잡하며 구글에 의해 상당 부분 표준화 되어 있다. 개발자라면 ‘fastboot’ 모드나 ‘recovery’ 모드를 들어봤을 것이다. 이 모드들이 모두 부트로더 레벨에서 동작한다.

대부분의 시스템이 그렇듯이 안드로이드에서도 부트로더의 가장 중요한 임무 중 하나는 ‘보안’이다. 그래서 대부분의 상용 기기는 ‘부트로더 락(Lock)’이 걸려있다. 이는 인증되지 않은 OS(커스텀 롬 등)가 설치되는 것을 막아 사용자의 데이터를 보호하기 위함이다.

안드로이드의 OTA는 ‘심리스 업데이트(Seamless Updates)’라고 불리는 A/B 파티션 방식을 적극적으로 사용한다.

wordpress.org

사용자가 스마트폰을 사용하는 동안 백그라운드에서 모든 업데이트가 B 슬롯에 조용히 설치된다. 사용자는 그저 밤에 기기를 재부팅하기만 하면 된다. 아침에 일어나면 모든 것이 업데이트되어 있다.

이 모든 편리함 뒤에는 부트로더가 A/B 슬롯 상태를 확인하고 부팅 대상을 전환해주는 정교한 작업이 숨어있다.

우리 폰을 늘 새롭게 만드는 숨은 일꾼

이제 부트로더와 OTA가 우리 스마트폰이나 다른 똑똑한 기기들 속에서 어떤 중요한 역할을 하는지 조금 이해가 되었는가? 부트로더는 기기에 ‘생명’을 불어넣는 첫 번째 코드이고, OTA는 그 생명력을 끊임없이 ‘새롭게’ 만들어주는 기술이라고 할 수 있다.

이 두 녀석이 서로 손발을 맞춰서 열심히 일해주는 덕분에, 우리는 늘 안전하고 편리하게 최신 기능들을 경험하고, 새로운 기술을 만날 수 있는 것이다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다