피드로 돌아가기
Hacker NewsInfrastructure
원문 읽기
저자가 kexec를 통한 재귀적 커널 체이닝으로 Linux 커널을 initrd 인터프리터로 재구성하는 개념 실증
Linux Is an Interpreter
AI 요약
Context
프로그램 실행의 본질은 어떤 프로그램이 다른 프로그램을 인터프리터로 사용하여 명령어를 해석하고 실행하는 과정입니다. 일반적으로 셸 스크립트는 sh에 의해, Python 스크립트는 python3에 의해 해석되는데, initramfs(initrd)는 Linux 커널에 의해 인터프리터되는 프로그램으로 간주할 수 없다는 개념적 간극이 존재했습니다.
Technical Solution
- 20MB 크기의 base64 인코딩된 shell script를 cpio 아카이브로 디코딩: tail 명령으로 base64 섹션 추출 후 디코딩하여 SVR4 형식의 유효한 cpio 아카이브 생성
- kexec를 사용한 재귀적 커널 실행: initrd 내부의 /init 스크립트가 find 명령으로 현재 filesystem을 cpio 형식으로 재패키징한 후 kexec로 동일 커널을 재로드하여 무한 루프 구성
- binfmt_misc를 통한 cpio 파일 직접 실행: /proc/sys/fs/binfmt_misc에 cpio 매직 넘버(\x30\x37\x30\x37\x30\x31)를 등록하여 커널이 cpio 파일을 자동으로 인터프리터로 실행
- tail call 최적화 적용: /bin/cpio-interpreter 스크립트를 통해 kexec 호출을 직접 실행 가능하게 하고, exec로 프로세스 대체하여 스택 프레임 무한 증가 방지
- binfmt 핸들러의 체이닝 구조 확립: initrd가 다음 재부팅의 커널을 자신의 인터프리터로 삼는 구조로, 프로그램 인터프리터 체인이 bottoming out 없이 순환
Key Takeaway
Linux 커널과 initrd의 관계를 '인터프리터와 프로그램' 관점에서 재해석하면, 시스템 부트 메커니즘이 일반적인 프로그램 실행 모델과 동일한 패러다임을 따른다는 것을 이해할 수 있습니다. 이는 binfmt_misc를 통해 arbitrary 바이너리 형식에 대해 custom interpreter를 등록할 수 있으며, kexec의 in-place 커널 재로드 능력과 결합하면 기존 부트로더 제약을 우회한 새로운 실행 모델을 구성할 수 있다는 설계 원칙을 제시합니다.
실천 포인트
Linux 커널 개발 및 initramfs 설계를 다루는 시스템 엔지니어는 binfmt_misc 메커니즘을 이용하여 custom 바이너리 형식(예: container image, unikernel)을 직접 실행 가능한 형태로 등록할 수 있으며, kexec와 결합하여 전통적인 bootloader 없이도 다단계 OS 로딩 파이프라인을 구축할 수 있습니다.