amd64运行arm64 Debian容器配置libc-bin报QEMU信号11如何解决?
问题描述
amd64架构宿主机运行Arch Linux系统,内核版本5.18.7-zen1-1-zen,Docker版本20.10.17,QEMU版本7.0.0,已通过tonistiigi/binfmt安装全架构binfmt支持。在该环境运行arm64v8/aarch64架构的Debian容器,安装、配置libc-bin包时触发段错误,核心报错日志如下:
#6 18.65 Setting up libc-bin (2.31-13+deb11u3) ... #6 18.92 qemu: uncaught target signal 11 (Segmentation fault) - core dumped #6 19.03 Segmentation fault (core dumped) #6 19.06 qemu: uncaught target signal 11 (Segmentation fault) - core dumped #6 19.15 Segmentation fault (core dumped) #6 19.15 dpkg: error processing package libc-bin (--configure): #6 19.15 installed libc-bin package post-installation script subprocess returned error exit status 139 #6 19.20 Errors were encountered while processing: #6 19.20 libc-bin #6 19.31 E: Sub-process /usr/bin/dpkg returned an error code (1) ------ executor failed running [/bin/sh -c apt-get -y reinstall libc-bin]: exit code: 100
该问题会导致容器内dpkg --configure -a等基础包管理操作无法执行,直接阻碍使用multistrap构建arm64设备根文件系统的流程。
最小复现示例
使用如下Dockerfile即可稳定触发问题:
FROM arm64v8/debian RUN apt-get -y update RUN apt-get -y reinstall libc-bin
环境版本详情
# QEMU版本(通过pacman -S qemu-full安装) $ qemu-system-aarch64 --version QEMU emulator version 7.0.0 Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developer $ qemu-system-arm --version QEMU emulator version 7.0.0 Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developer # Docker版本 $ docker --version Docker version 20.10.17, build 100c70180f # Binfmt安装命令 $ docker run --privileged --rm tonistiigi/binfmt --install all & # 内核信息 $ uname -a Linux <hostname> 5.18.7-zen1-1-zen #1 ZEN SMP PREEMPT_DYNAMIC Sat, 25 Jun 2022 20:22:03 +0000 x86_64 GNU/Linux # 宿主机系统 Arch Linux
已验证无效的排查方向
- 已使用Arch官方源最新版QEMU,确认
arm64v8/debian镜像未废弃可正常拉取,当前环境不是Docker for Mac,公开渠道同类问题多为arm64主机运行amd64容器的反向场景,对应方案不适用 - 问题与git操作无关联
- 已测试源码编译版、官方二进制版的qemu-user-static v7.0.0,问题仍存在
- 当前内核版本为5.18.7,高于已知同类问题要求的最低5.10版本阈值
- 问题与C语言代码开发场景无关
解决方案
该问题根因为QEMU 7.0.0版本aarch64用户态模拟存在内存映射bug,触发glibc 2.31版本自带的ldconfig执行时段错误,可选择以下任意一种方案修复:
- 方案一(稳定性最高,推荐生产构建使用):降级QEMU到6.2.x稳定版本
从Arch Linux官方归档仓库安装6.2.0-3版本的qemu和qemu-user-static包,降级完成后重新执行binfmt注册命令docker run --privileged --rm tonistiigi/binfmt --install all,再重新构建容器即可,无后续兼容问题。 - 方案二(快速验证用,临时绕过):构建时临时替换ldconfig跳过执行
不想调整QEMU版本的话,可以在apt执行相关操作前,临时将ldconfig替换为直接返回0的占位脚本,等libc-bin配置完成后再还原原文件,Dockerfile示例如下:
注意该方案仅临时绕过问题,后续其他包安装流程如果触发ldconfig执行仍可能报同样的错,不推荐正式构建使用。FROM arm64v8/debian RUN apt-get -y update RUN mv /usr/bin/ldconfig /usr/bin/ldconfig.bak && \ echo -e '#!/bin/sh\nexit 0' > /usr/bin/ldconfig && \ chmod +x /usr/bin/ldconfig && \ apt-get -y reinstall libc-bin && \ mv /usr/bin/ldconfig.bak /usr/bin/ldconfig - 方案三:升级QEMU到7.1.0及以上版本
QEMU 7.1.0版本已经正式修复该aarch64用户态模拟bug,等Arch官方源推送7.1.0以上版本的QEMU包后,直接全量升级系统和QEMU组件即可,不需要额外调整配置。
内容的提问来源于stack exchange,提问作者typecasto
相关产品推荐
相关产品推荐

