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

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

更新时间:2020-02-24 11:15:10

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

 

问题描述

符合如下条件的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是内核中用于加速特定系统调用的两种机制。介绍如下。glibc版本低于2.14版本的Docker镜像使用的是vsyscall机制,而非vDSO机制。更多信息可参考On vsyscalls and the vDSO

  • vsyscall暴露出许多安全风险,因此在较新的操作系统中,推荐使用vDSO。
  • vDSO提供了vsyscall的模拟兼容,但是会显著影响应用的性能。

 

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于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
    注:
    • 镜像:aliyun-2.1903-x64-20G-alibase-20190327.vhd及之后所有的镜像。
    • 内核:kernel-4.19.24-9.al7及之后所有的内核版本。

 

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。