Alibaba Cloud Linux 2系统的ECS实例运行低版本Docker镜像时报“段错误(segfault)”

说明

本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

问题描述

符合如下条件的ECS实例运行低版本Docker镜像时报“段错误(segfault)”错误:

  • 镜像:aliyun-2.1903-x64-20G-alibase-20190327.vhd及之后所有的镜像。

  • 内核:kernel-4.19.24-9.al7及之后所有的内核版本。

具体报错信息如下。

bash[2299] vsyscall attempted with vsyscall=none ip:ffffffffff600400 cs:33 sp:7ffd1b965a48 ax:ffffffffff600400 si:7ffd1b965f5c di:0
bash[2299] segfault at ffffffffff600400 ip ffffffffff600400 sp 00007ffd1b965a48 error 15
Code: Bad RIP value.

问题原因

vsyscall和vDSO是内核中用于加速特定系统调用的两种机制,介绍如下:

  • vsyscall暴露出许多安全风险,因此在较新的操作系统中,推荐使用vDSO。

  • vDSO提供了vsyscall的模拟兼容,但是会显著影响应用的性能。

glibc版本低于2.14版本的Docker镜像使用的是vsyscall机制,而非vDSO机制,因此产生报错。更多信息可参考On vsyscalls and the vDSO

解决方案

说明
  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

临时解决方案

在ECS示例中依次执行以下命令,修改vsyscall为emulate模式,并重启操作系统。

说明

修改vsyscall模式及重启操作系统属于风险操作,请在操作前提前创建快照并备份数据,确保数据安全。

sudo grubby --update-kernel="/boot/vmlinuz-$(uname -r)" --args="vsyscall=emulate"
sudo reboot
说明

如果使用此方案,容器中的应用程序性能可能会下降。

固化解决方案

确认Docker镜像中的glibc版本是否低于2.14版本。如果是,请升级Docker镜像中的glibc版本。如果您使用的是基于CentOS或RHEL等发行版制作的镜像,建议使用CentOS 7或RHEL 7及以上版本。

适用于

  • 云服务器ECS