본문으로 건너뛰기
피드

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 데이터센터 붐 수혜주로 뜬 이유는 자동차가 아니라 ESS였다

포드의 에너지 저장 사업이 AI 데이터센터 건설 붐을 타고 새 성장축으로 주목받고 있어. 전기차 수요 둔화로 남는 배터리 생산능력을 데이터센터·전력망용 ESS로 돌리는 전략이고, EDF 북미 사업체에 2028년부터 연간 4기가와트시 규모 공급 계약까지 체결했어.

devops

클라우드 빅3 차별화 논쟁, 정작 컴퓨트·스토리지는 거의 범용재가 됐다는 얘기

클라우드 업체들은 인공지능, 데이터베이스, 전용 서비스로 차별화를 강조하지만, 대부분의 기업 워크로드는 여전히 컴퓨트와 스토리지 위에서 돌아간다는 주장이다. AWS, 애저, 구글 클라우드의 핵심 인프라는 성숙도가 높아져 실질 역량 차이가 줄었고, 아키텍트는 브랜드보다 워크로드 적합성·비용·거버넌스·운영 정합성을 봐야 한다는 내용이다.

devops

DynIP, RFC 2136·IPv6·DNSSEC 지원하는 동적 DNS 서비스 공개

DynIP는 홈랩, 엣지 라우터, 인프라 팀을 겨냥한 동적 DNS(DDNS) 서비스다. 60초 안팎의 전파, RFC 2136 TSIG 기반 라우터 업데이트, 개인 도메인 연결, IPv6와 DNSSEC 지원을 핵심 기능으로 내세운다.

devops

깃허브 액션, 내부 데이터베이스 마이그레이션 여파로 4시간 지연

깃허브에서 2026년 5월 12일 13:41부터 17:43 협정세계시까지 일부 서비스 처리 지연이 발생했음. 내부 데이터베이스 마이그레이션으로 복제 지연이 생겼고, 작업 큐에 쌓이는 요청을 처리할 워커가 부족해진 게 원인이었음.

devops

AI 강국 경쟁, 결국 전기와 데이터센터 싸움으로 간다

AI 경쟁의 핵심이 모델과 반도체만이 아니라 안정적인 전력 확보로 이동하고 있다는 분석이야. 글로벌 데이터센터 전력 사용량은 2024년 400TWh에서 2030년 800TWh, 2050년 3500TWh 이상으로 커질 전망이고, 한국도 AI 데이터센터와 에너지 전략을 같이 설계해야 하는 상황이야.