答替身
回答来自于问答智囊团成员:赵智勇
专栏:https://cloud.tencent.com/developer/user/4476879
排查思路:
1.在vnc无法正常登录时可以先尝试ssh能否正常登录进系统,如果ssh也不行就需要进单用户模式,通过控制台进入linux单用户模式可参考:
https://cloud.tencent.com/developer/article/1731813
2.进入系统后通过vim /var/log/secure查看日志,该文件一般用来记录安全相关的信息,记录最多的是哪些用户登录服务器的相关日志,核实到有/lib/security/pam_limits.so的报错信息
📷
3.进入/etc/pam.d后通过以下命令搜索日志中报错的pam模块的关键字/lib/security/pam_limits.so,就找到了是system-auth文件中配置了这个参数
find . | xargs grep -ri "/lib/security/pam_limits.so" -l
📷
原因分析:
由于VNC登录会调用/etc/pam.d/login这个pam模块进行校验,而这个模块会将/etc/pam.d/system-auth这个模块引入进行校验,如下图是/etc/pam.d/login配置文件的内容:
📷
导致登录失败的原因是system-auth配置文件中的pam_limits.so模块的模块路径写错了,pam_limits.so模块的主要功能是限制用户会话过程中对各种系统资源的使用情况,这里如果是64位的系统可以写成绝对路径/lib64/security/pam_limits.so,也可以直接写成相对路径pam_limits.so,写错路径的话会导致找不到对应的认证模块,导致登录认证报错。
📷
解决方案
在vnc登录不上的时候可以尝试通过ssh远程登录实例,登录上之后修改pam_limits.so模块的模块路径即可,如果ssh也无法正常登录,此时就需要通过单用户模式或者救援模式进入系统后再修改配置,如仍无法登录可以提交工单解决