Ubuntu 18.04执行Coverity指令sysctl vsyscall=emulate失败如何解决?
解决Ubuntu 18.04中Coverity vsyscall配置报错的问题
别担心,这个报错是内核版本迭代导致的接口变化,不是你操作出问题了——绝对不能直接忽略这个指令,不然Coverity的二进制文件大概率还是跑不起来,得用新的方式来配置vsyscall模拟。
为什么原来的命令失效了?
Linux内核从4.11版本开始就废弃了/proc/sys/vsyscall这个sysctl接口,改用/proc/sys/kernel/vsyscall_mode来控制vsyscall的行为,同时也支持通过内核启动参数配置。Ubuntu 18.04的4.15内核自然已经没有那个旧的文件路径了,所以执行原来的命令会报错。
两种可行的替代方案
1. 临时生效(重启后失效)
直接用root权限修改新的接口文件:
sudo echo emulate > /proc/sys/kernel/vsyscall_mode
执行完这个命令后,Coverity应该就能正常运行了,不过重启系统后这个设置会重置。
2. 永久生效(重启后保持配置)
如果不想每次开机都重新设置,可以修改GRUB的内核启动参数:
- 编辑GRUB配置文件:
sudo nano /etc/default/grub - 找到
GRUB_CMDLINE_LINUX_DEFAULT这一行,在引号内添加vsyscall=emulate,修改后看起来像:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vsyscall=emulate" - 保存并退出编辑器后,更新GRUB配置:
sudo update-grub - 重启系统,配置就会永久生效了。
为什么不能忽略?
Coverity的部分二进制文件依赖旧的vsyscall机制,如果不开启模拟模式,这些文件会因为找不到对应的系统调用入口而启动失败,所以必须完成这个配置步骤,不能跳过。
内容的提问来源于stack exchange,提问作者Dimitri
相关产品推荐
相关产品推荐

