Linux는 인터프리터다: 1.5달러를 아끼려다 발견한 OS의 재귀적 본질


최근 Hacker News에서 굉장히 흥미롭고, 동시에 엔지니어의 광기가 서려 있는 글을 하나 발견했다. 제목부터 도발적인 “Linux is an interpreter”다.

보통 우리는 Linux를 운영체제 커널로 생각한다. 하지만 이 글의 저자인 Astrid는 완전히 다른 시각을 제시한다. Linux 커널은 그저 cpio 포맷으로 된 initrd를 실행하기 위한 거대한 인터프리터에 불과하다는 것이다. 15년 넘게 시스템 엔지니어링과 아키텍처를 다뤄왔지만, OS 부팅 과정을 이토록 기괴하고 아름답게 비틀어버린 접근은 오랜만이다.

1.5달러를 아끼기 위한 광기의 시작

이 모든 기행의 출발점은 놀랍게도 클라우드 호스팅 비용이었다. 저자는 Contabo에서 Object Storage를 쓰기 위해 매월 1.5달러를 추가로 내는 것이 싫증 났고, 결국 curl로 디스크 이미지를 파이핑하여 VPS를 초기화하는 스크립트를 작성하기 시작했다.

저자가 공개한 20MB짜리 쉘 스크립트를 뜯어보면 가관이다. Base64로 인코딩된 바이너리 덩어리를 디코딩하여 cpio 아카이브를 만들고, 그 안에서 커널 이미지와 쉘 스크립트를 뽑아낸다.

cpio -uidv < r "k" > k
kexec --load k --initrd r --reuse-cmdline
kexec --exec

여기서 핵심은 kexec 명령어다. 시스템을 재부팅하지 않고 현재 실행 중인 커널 위에서 새로운 커널로 핫스왑을 해버린다. 악성코드처럼 보일 수 있지만, 사실 이는 매우 정교하게 짜여진 OS 교체 작업이다.

무한 재귀 부팅과 꼬리 재귀 최적화

가장 소름 돋는 부분은 추출된 cpio 내부의 /init 스크립트다.

#!/bin/sh
mkdir -p /proc
mount -t proc proc /proc
find / | grep -v /r | grep -v /proc | cpio -vo -H newc > /r
kexec --load /k --initrd /r --reuse-cmdline
kexec --exec

이 스크립트는 실행되자마자 자기 자신을 다시 cpio로 묶고, 그 파일로 또다시 kexec를 호출한다. 즉, Linux가 Linux를 부팅하고, 그 Linux가 다시 Linux를 부팅하는 무한 루프다.

저자는 이를 컴퓨터 공학의 Tail-call optimization (꼬리 재귀 최적화)에 비유한다. 일반적인 재귀 함수는 호출 스택이 쌓여 결국 Stack Overflow를 일으키지만, kexec는 기존 커널의 메모리 공간을 완전히 새로운 커널로 덮어씌우기 때문에 스택이 쌓이지 않는다. 운영체제 레벨에서 꼬리 재귀를 구현했다는 발상이 정말 미쳤다고밖에 할 수 없다.

인터프리터의 철학: 누가 해석자를 해석하는가?

저자는 한 발 더 나아가 Linux 커널을 하나의 인터프리터로 정의한다. 우리가 #!/bin/sh를 통해 쉘 스크립트를 실행하듯, 커널은 .cpio 파일을 해석하고 실행하는 런타임 환경이라는 것이다.

  • ELF: 리눅스의 기본 실행 포맷이지만, 동적 링크된 파일은 ld.so가 해석한다.
  • binfmt_misc: 커널 모듈을 통해 특정 매직 넘버를 가진 파일을 원하는 인터프리터로 연결할 수 있다.

저자는 이 binfmt_misc를 이용해 .cpio 파일에 실행 권한을 주고, QEMU나 kexec를 인터프리터로 등록해버린다. 이제 ./archive.cpio를 실행하면 곧바로 새로운 OS가 부팅된다. “모든 것은 파일이다”라는 유닉스 철학을 극한까지 밀어붙인 결과물이다.

Hacker News의 논쟁: 이것은 프로페셔널한가?

이 글이 HN에 올라간 후 커뮤니티의 반응은 뜨거웠다. 한 유저는 “1.5달러를 아끼려고 이런 짓을 한다면 프로페셔널이 아니다”라고 강하게 비판했다. 현업에서 인프라를 다루는 내 입장에서, 이 비판은 절반은 맞고 절반은 완전히 틀렸다.

물론 프로덕션 환경에서 1.5달러를 아끼겠다고 이런 기괴한 kexec 루프를 돌린다면 당장 해고감이다. 하지만 해커 문화에서 비용 은 그저 제약 조건일 뿐이다. 제한된 환경에서 극한의 꼼수를 부리다 보면 시스템의 밑바닥을 이해하게 된다. Docker도 처음에는 cgroup과 namespace를 이용한 가벼운 해킹에서 시작되지 않았던가? 자동화된 클라우드에 익숙해진 나머지, 이런 로우 레벨의 탐구를 “비생산적”이라고 폄하하는 것은 엔지니어링의 본질을 잃어버린 태도라고 생각한다.

결론 (Verdict)

이 아키텍처를 실무에 도입할 수 있을까? 절대 아니다. 당장 폐기해야 할 장난감에 가깝다. 하지만 이 글은 단순히 시스템을 설정하는 방법을 넘어, OS와 프로세스, 인터프리터의 경계를 허무는 훌륭한 사고 실험을 제공한다.

클라우드 벤더가 제공하는 추상화 계층 위에서 API나 호출하며 만족하고 있다면, 가끔은 이런 “쓸데없는” 하드코어 해킹을 통해 기술적 영감을 채울 필요가 있다. 진짜 혁신은 종종 가장 바보 같은 질문에서 시작되기 때문이다.