개요
리눅스부트(LinuxBoot)는 UEFI(Unified Extensible Firmware Interface) 펌웨어의 후반부 부팅 단계, 특히 DXE(Driver Execution Environment) 모듈을 리눅스 커널과 사용자 공간 프로그램으로 대체하는 자유 소프트웨어 프로젝트이다. 리눅스부트는 2018년 공식 리눅스 재단 프로젝트로 승인되었다.
배경과 목적
전통적인 PC 및 서버 펌웨어는 BIOS 또는 UEFI 규격에 따라 동작하며, 하드웨어 초기화부터 운영체제 로딩까지의 전 과정을 담당한다. UEFI 펌웨어는 SEC(Security), PEI(Pre-EFI Initialization), DXE(Driver Execution Environment), BDS(Boot Device Selection)의 네 단계로 구성된다. 이 중 DXE 단계는 네트워크 스택, 파일 시스템 모듈, 각종 장치 드라이버 등 방대한 양의 펌웨어 코드를 포함한다.
리눅스부트의 핵심 목표는 이러한 폐쇄적이고 벤더 종속적인 UEFI DXE 드라이버를 리눅스 커널과 오픈 소스 기반의 사용자 공간 프로그램으로 대체함으로써, 펌웨어의 복잡성을 줄이고 신뢰성과 보안성을 향상시키는 것이다. 구체적으로는 다음과 같은 이점이 있다:
- 신뢰성: 검증이 충분하지 않은 펌웨어 드라이버 대신 이미 대규모 환경에서 검증된 리눅스 커널 드라이버를 사용한다.
- 보안성: Go 언어 기반의 u-root 사용자 공간은 메모리 안전성과 타입 안전성을 제공한다.
- 부팅 속도: 불필요한 코드를 제거하여 일반적으로 부팅 시간을 20배 가량 단축한다.
- 엔지니어링 생산성: 드라이버를 한 번만 작성하면 되며, 리눅스 커널 엔지니어가 펌웨어 개발에도 참여할 수 있다.
역사
리눅스부트 프로젝트는 구글에 의해 NERF(Network Enabled Recovery Firmware)라는 이름으로 시작되었다. NERF는 리눅스 커널과 사용자 공간 애플리케이션을 포함하는 EFI 기반의 경량 펌웨어였다. 이후 이 프로젝트는 사용자 공간 애플리케이션을 포함하는 LinuxBoot(부트 블록 및 커널 포함)와 u-root로 분할되었다.
2018년 리눅스 재단은 리눅스부트를 공식 프로젝트로 채택하였다.
동작 방식
리눅스부트는 UEFI 부팅 과정의 DXE 단계에서 개입한다. SEC 단계와 PEI 단계는 하드웨어에 밀접하게 결합되어 있어 수정이 어렵지만, DXE 단계부터는 리눅스 커널이 하나의 DXE 모듈처럼 로드되어 실행된다. 구체적인 과정은 다음과 같다:
- SEC 및 PEI 단계에서 하드웨어 최소 초기화를 수행한다.
- DXE 단계에서 리눅스 커널이 로드된다.
- 리눅스 커널은 initramfs(초기 RAM 파일시스템)를 메모리에 압축 해제한다.
- initramfs 내의 u-root(Go 언어 기반 도구 모음) 사용자 공간이 실행된다.
- u-root 환경에서 kexec 시스템 콜을 통해 실제 운영체제 커널을 로드한다.
리눅스부트는 kexec를 통해 리눅스를 부팅할 수 있으며, 다른 방식으로는 Windows를 부팅할 수도 있다.
구성 요소
리눅스부트는 세 가지 주요 구성 요소로 이루어진다:
- 최소한의 UEFI 펌웨어: SEC 및 PEI 단계만 포함하며, 대부분의 DXE 모듈은 제거된다.
- 리눅스 커널:
CONFIG_EFI_BDS옵션이 활성화된 상태로 빌드된다. - initramfs: u-root 또는 Heads를 기반으로 한 최소한의 사용자 공간 환경이다.
지원 하드웨어
리눅스부트의 EFI 지원은 주로 특정 서버 모델로 제한된다:
- Dell R630
- Intel S2600WF
- Open Compute Project Winterfell, Leopard, Monolake, Tioga Pass 노드
- QEMU 에뮬레이션 Q35 시스템
이론적으로는 coreboot 프로젝트에서 지원되는 모든 메인보드에서도 동작할 수 있으나, 플래시 메모리 크기 제약으로 인해 실제 지원은 제한적이다.
관련 프로젝트
리눅스부트 프로젝트는 두 가지 참조 구현을 제공한다:
- linuxboot: u-root(Go 기반 최소 사용자 공간)를 포함하는 표준 구현.
- Heads: TPM 기반 로컬 증명, GPG 보안 측정, 재현 가능 빌드에 중점을 둔 구현으로, BusyBox 기반의 더 풍부한 도구 모음을 제공한다.
이 외에도 petitboot(OpenPOWER), k-boot(BayLibre), ZFSBootMenu 등 독립적인 구현체들이 존재한다.
한계
리눅스부트는 SEC 및 PEI 단계를 완전히 대체하지 못하며, 이 단계들은 여전히 벤더 제공 바이너리 블롭에 의존한다. 또한 지원되는 하드웨어가 특정 서버 모델로 제한되어 있어 일반 데스크톱이나 노트북 환경에서는 사용이 어렵다.