一、起因

用作开发平台的centos服务器,在搭django项目时报了sqlite版本低。使用rpm -e sqlite-3.7 --nodeps卸载后,手动编译安装sqlite3.39。之后运行rpm命令报错:Failed to initialize NSS library。


二、第一轮修复

利用百度查资料,多数集中在修复nss、nss-util这几个包和对应的so文件上。使用类似方法下载系统对应版本的nss、nss-util包,rpm2cpio提取出so文件,替换/usr/lib64下的文件尝试修复,具体操作百度查一下,这里不赘述。

此处强烈建议多开一个ssh连接,因为我替换libnss3.so后rpm并没有恢复,而此时很巧合的网断了,然后ssh连不上了!!还好这台服务器是开发平台,装了vnc-server,使用vnc连接上。替换libnss3.so之后,报错变成libnssutil3.so版本不对应,由于层层依赖关系,最后从同版本的centos7上复制过来libnss3.so、libnssutil3.so、libsmime3.so共四个动态链接库文件,至此终于出现久违的rpm、yum命令正常执行结果。


三、第二轮修复

本以为一切恢复正常,直到运行django demo,打开firefox准备验证,无法正常打开(vnc图形界面)。使用命令行运行firefox,报错:

XPCOMGlueLoad error for file /usr/lib64/firefox/libxul.so:
/lib64/libnss3.so: version `NSS_3.59\' not found (required by /usr/lib64/firefox/libxul.so)
Couldn\'t load XPCOM.

是熟悉的味道。至此恍然,虽然我复制了动态库过来,由于这台服务器安装图形界面,应该升级了nss这些包。第一轮修复,是降到了低版本适配状态,rpm、yum功能恢复,但是图形界面的相关应用需要用到高版本。使用rpm查询出果然这台服务器上用的是nss-3.67.0-4.el7_9.x86_64,继续沿用上面方法,下载好对应版本提取so替换,替换完libnss3.so、libnssutil3.so后firefox终于恢复正常,验证rpm、yum依然正常,至此修复完毕。如果不是使用图形界面的firefox可能都不会发现问题,不过如果不用图形界面的话,应该也不会升级nss的版本。

记录分享一下,希望给遇到同样问题的朋友一点帮助。