免责声明: 本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。
问题描述
符合如下条件的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