1 问题背景
近期遇到一个问题,RHEL8.0因为扫出漏洞,根据漏洞做了更新,重启后,发现图形化界面进入异常,提示“Oh no! Something has gone wrong.Logout!”,此时,ssh远程登录正常。
2 排查过程
2.1 日志
ssh登录,查看 messages 日志,从日志中可以查看到以下错误信息(还有其他的错误日志,但是后面排查了才发现此为关键日志)。
/usr/libexec/gdm-x-session[37969]: gbm: failed to open any driver (search paths /usr/lib64/dri)
/usr/libexec/gdm-x-session[37969]: gbm: Last dlopen error: /usr/lib64/dri/vmwgfx_dri.so: undefined symbol: amdgpu_bo_list_create_raw
/usr/libexec/gdm-x-session[37969]: failed to load driver: vmwgfx
/usr/libexec/gdm-x-session[37969]: gbm: failed to open any driver (search paths /usr/lib64/dri)
/usr/libexec/gdm-x-session[37969]: gbm: Last dlopen error: /usr/lib64/dri/kms_swrast_dri.so: undefined symbol: amdgpu_bo_list_create_raw
/usr/libexec/gdm-x-session[37969]: failed to load driver: kms_swrast
/usr/libexec/gdm-x-session[37969]: gbm: failed to open any driver (search paths /usr/lib64/dri)
/usr/libexec/gdm-x-session[37969]: gbm: Last dlopen error: /usr/lib64/dri/swrast_dri.so: undefined symbol: amdgpu_bo_list_create_raw
/usr/libexec/gdm-x-session[37969]: failed to load swrast driver
/usr/libexec/gdm-x-session[37969]: couldn't get display device
根据查到的错误日志的信息,初步判断为 drvier 加载失败,导致图形化界面无法启动,会话关闭退出。
2.2 从报错出发
/usr/libexec/gdm-x-session[37969]: gbm: Last dlopen error: /usr/lib64/dri/kms_swrast_dri.so: undefined symbol: amdgpu_bo_list_create_raw
根据以上报错,查询到相关的解决方案,更新 libdrm 至最新版 libdrm-2.4.100-1.el8.x86_64,安装后需重启 gdm 服务,这个是图形化界面管理服务,重启系统实际上也是重启了此服务。所以重启服务也可以重现到以上问题。
参考链接 https://access.redhat.com/solutions/5212951
安装后重启服务,则一直卡在以下画面,查看 messages 日志,可以看到一直在刷着相关的信息,即类似不断重启 gdm 的过程。由此可见,仅安装 libdrm 还不足以解决问题。
2.3 检查更新的包
因为更新包之前是正常的,所以确认是此次更新导致,再加上按照官方的方案处理,还是存在问题,可能还是包的问题。
首先,根据 /usr/lib64/dir/ 目录确认相关的包,为 mesa-dri-drivers-19.3.4-2.el8.x86_64 。
rpm -qf /usr/lib64/dri/kms_swrast_dri.so
尝试查询该包的相关依赖,因为把所需要升级的包都放到一个目录,配置成 repo 源,所以直接使用 yum 查询。
但这种方式所查询到的依赖,是不全的,这在后面的排查中才发现。
yum deplist mesa-dri-drivers | grep provider | sort | uniq
进入更新包所在目录,确认 mesa- 相关的包,以及当前系统中相关名称的包,可以确定,只安装了两个,其他几个没有安装。
所以尝试将升级几个版本较低的相关的包,升级到统一版本,经过测试,还需要其他的依赖,包列表如下。
libdrm-2.4.100-1.el8.x86_64.rpm
libglvnd-1.2.0-6.el8.x86_64.rpm
libglvnd-egl-1.2.0-6.el8.x86_64.rpm
libglvnd-gles-1.2.0-6.el8.x86_64.rpm
libglvnd-glx-1.2.0-6.el8.x86_64.rpm
mesa-libEGL-19.3.4-2.el8.x86_64.rpm
mesa-libgbm-19.3.4-2.el8.x86_64.rpm
mesa-libGL-19.3.4-2.el8.x86_64.rpm
mesa-libglapi-19.3.4-2.el8.x86_64.rpm
安装完成之后,因为前面一直在重试,所以也不需要另外重启服务了,问题恢复。
2.3 其他方法
此问题其实还有一个更简单的方法,卸载导致问题的包,重新找回原来版本的包安装回去即可。
rpm -e --nodeps llvm-libs-9.0.1-4.module+el8.2.0+5887+847e8a86.x86_64
rpm -e --nodeps mesa-dri-drivers-19.3.4-2.el8.x86_64
rpm -e --nodeps mesa-filesystem-19.3.4-2.el8.x86_64
rpm -ivh llvm-libs-7.0.1-1.module+el8+2560+c32c7af1.x86_64.rpm
rpm -ivh mesa-dri-drivers-18.3.1-2.el8.x86_64.rpm
rpm -ivh mesa-filesystem-18.3.1-2.el8.x86_64.rpm