본문으로 건너뛰기
피드

ARM Docker에서 x86 에뮬레이션 — 설정이 똑같은데 왜 하나만 되는 거야

devops 약 5분
vote
0
댓글
북마크

ARM에서 Docker x86 에뮬레이션 시 tonistiigi/binfmt는 되는데 systemd-binfmt는 안 되는 미스터리 디버깅기. 원인은 QEMU가 동적 링크라서 F 플래그로 메모리에 올려도 의존 라이브러리가 Docker 네임스페이스에 없었던 것.

  • 1

    Docker 방식과 systemd-binfmt 방식이 동일한 /proc 설정을 보여줬지만 동작이 달랐음

  • 2

    핵심 원인: ArchLinux의 QEMU가 동적 링크 바이너리라서 Docker 네임스페이스에서 라이브러리 접근 불가

  • 3

    해결: 정적 컴파일된 QEMU 바이너리를 추출해서 교체

  • ARM(라즈베리 파이) 위에서 x86/amd64 Docker 컨테이너를 돌리려고 binfmt_misc + QEMU를 세팅하는데, 겉으로 완전히 동일한 설정이 전혀 다르게 동작해서 대혼란에 빠진 디버깅 이야기임. 한때 대장장이로 전직할까 고민했다고 함

문제 상황

  • Archive Team의 Docker 이미지를 ARM에서 돌리려면 QEMU로 x86 에뮬레이션이 필요함. Docker 공식 방법은 tonistiigi/binfmt 이미지를 실행하는 거임

  • 근데 재부팅마다 매번 Docker 명령 치기 귀찮으니까, ArchLinux ARM의 systemd-binfmt를 쓰면 부팅 시 자동 설정될 거라 생각함

  • Docker 방식: 동작함 ✅

  • systemd-binfmt 방식: 파일시스템에서는 x86 바이너리 실행 가능한데, Docker 컨테이너 안에서는 exec format error

  • /proc/sys/fs/binfmt_misc/qemu-x86_64 내용: 완전히 동일 🤯

원인

  • 핵심은 F(fix_binary) 플래그의 실제 동작 방식임. 이 플래그가 설정되면 에뮬레이터 바이너리를 등록 시점에 열어서 메모리에 유지함. mount namespace나 chroot 환경에서도 동작하려면 이게 필수임

  • tonistiigi/binfmt 컨테이너는 자체 정적 컴파일된 QEMU 바이너리를 가지고 있어서, F 플래그로 메모리에 올린 뒤 컨테이너가 사라져도 동작함. /proc에 표시되는 interpreter 경로는 이미 존재하지 않는 경로인데 상관없음

  • systemd-binfmt가 실패한 이유: ArchLinux의 QEMU가 동적 링크된 바이너리였기 때문임. F 플래그로 바이너리 자체는 메모리에 있지만, 의존하는 라이브러리들은 없으니까 Docker의 네임스페이스 안에서 실행이 안 됨

$ file /usr/bin/qemu-x86_64
ELF 64-bit LSB pie executable, ARM aarch64, dynamically linked...
  • ArchLinux 문서에도 "정적 링크된 QEMU는 보통 필요 없다(usually not needed)"고 적혀있음. 보통은요... 😅

해결

  • tonistiigi/binfmt 컨테이너에서 정적 컴파일된 QEMU 바이너리를 추출해서 /usr/bin/qemu-x86_64-static으로 복사
  • /etc/binfmt.d/qemu-x86_64.conf를 오버라이드해서 정적 바이너리를 가리키도록 수정 + FPOC 플래그 설정
  • systemd-binfmt 재시작하면 끝

교훈

  • 단서는 다 눈앞에 있었지만 경험이 부족해서 조합을 못 했음: Docker 이미지가 자체 QEMU를 가지고 있다는 것, F 플래그의 진짜 의미, 바이너리가 없는데도 실행될 수 있다는 것, 동적/정적 링킹의 차이...

  • Claude한테 러버덕 디버깅 시도했는데 할루시네이션이 트럭 한 대 분량이었다고 함 — 존재하지 않는 systemd 기능, 없는 커맨드 플래그 등으로 삽질을 유도당함

💡

> ARM에서 Docker x86 에뮬레이션이 안 되면, QEMU가 정적 링크인지 먼저 확인할 것. file /usr/bin/qemu-x86_64로 "dynamically linked"가 나오면 그게 원인임

binfmt_misc의 F 플래그가 바이너리를 메모리에 유지한다는 것과 동적/정적 링킹의 실제 차이를 체감할 수 있는 훌륭한 디버깅 사례.

댓글

댓글

댓글을 불러오는 중...

devops

메타, 루이지애나 AI 데이터센터를 5기가와트급으로 키운다

메타가 미국 루이지애나주 리치랜드 패리시에 짓는 하이페리온 데이터센터의 컴퓨팅 용량을 5기가와트 규모로 확대한다. 투자액도 기존 270억 달러에서 500억 달러 이상으로 커졌고, 2027년까지 전체 컴퓨팅 용량 14기가와트를 목표로 하는 AI 인프라 전략의 일부로 해석된다.

devops

오케스트로, 모로코 관세청에 AI·클라우드 네이티브 전환 노하우 공유

오케스트로 클라우드가 모로코 관세청 고위 공무원과 IT 전문가 10명을 한국으로 초청해 AI·클라우드 네이티브 기반 관세행정 고도화 연수를 진행했다. 핵심은 AI 기반 위험관리, 모놀리식 시스템의 MSA·쿠버네티스 전환, 클라우드 관리 플랫폼을 활용한 공공 시스템 운영 효율화다.

devops

오케스트로, 모로코 관세청에 AI·클라우드 네이티브 전환 노하우 전수

오케스트로 클라우드가 모로코 관세청 고위 공무원과 IT 전문가 10명을 초청해 AI·클라우드 네이티브 기반 관세행정 고도화 연수를 진행했다. 교육은 AI 위험관리, 모놀리식 시스템의 MSA·쿠버네티스 전환, 클라우드 관리 플랫폼 활용 사례에 초점을 맞췄다.

devops

NHN, 양평 AI 데이터센터 가동으로 클라우드 매출 확대 기대

한국투자증권이 NHN의 클라우드 매출 확대와 실적 개선 전망을 근거로 목표주가를 4만5000원에서 5만6000원으로 올렸다. NHN은 양평 데이터센터에 약 7600장 규모의 AI 전용 GPU 인프라를 구축했고, 2분기부터 실적에 반영될 것으로 전망됐다.

devops

빅테크 AI 인프라, 이제는 빚으로 버티는 구간에 들어감

AI 데이터센터 투자가 폭증하면서 빅테크들이 올해에만 수백조 원 규모의 회사채를 발행했다. 시장은 이제 AI 기대감보다 실제 현금 창출력과 부채 상환 능력을 묻기 시작했고, 자체 칩과 비용 절감이 생존 전략으로 떠오르고 있다.