我的系统是centos7。
[root@centos7 caiyiheng]# uname -a
Linux centos7 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015
x86_64 x86_64 x86_64 GNU/Linux
我的系统在虚拟机中运行。
当我运行 cmdyum -y update
并ctrl+c
在 yum 更新某些内容时按下。之后我发现我不能再使用 yum 或 rpm 了。当我输入 yum 或 rpm 时它显示为:
[root@centos7 caiyiheng]# yum
error: Failed to initialize NSS library
error: no dbpath has been set
error: cannot open Packages database in /%{_dbpath}
CRITICAL:yum.main:
Error: rpmdb open failed
[root@centos7 caiyiheng]# rpm
error: Failed to initialize NSS library
大多数 yum 或 rpm 命令无法工作,例如yum install
,yum clean all
甚至yum --help
。
我检查/var/log/yum.log
,它显示为:
[root@centos7 caiyiheng]# tail -f /var/log/yum.log
Sep 21 05:53:21 Installed: wget-1.14-15.el7_4.1.x86_64
Sep 21 05:53:21 Installed: lsof-4.87-5.el7.x86_64
Sep 21 05:53:22 Installed: net-tools-2.0-0.22.20131004git.el7.x86_64
Sep 26 17:28:11 Updated: libgcc-4.8.5-28.el7_5.1.x86_64
Sep 26 17:28:12 Installed: 1:grub2-common-2.02-0.65.el7.centos.2.noarch
Sep 26 17:28:13 Installed: 1:grub2-pc-modules-2.02-0.65.el7.centos.2.noarch
Sep 26 17:28:13 Installed: firewalld-filesystem-0.4.4.4-14.el7.noarch
Sep 26 17:28:14 Updated: tzdata-2018e-3.el7.noarch
Sep 26 17:28:14 Updated: ncurses-base-5.9-14.20130511.el7_4.noarch
Sep 26 17:28:15 Updated: nss-softokn-freebl-3.36.0-5.el7_5.x86_64
我在谷歌上搜索了一整天,发现了很多可能类似于我的问题的解决方案,我试过了但没有任何效果。
例如
我甚至下载了 rpmhttps://centos.pkgs.org/7/centos-updates-x86_64/nss-softokn-freebl-3.36.0-5.el7_5.x86_64.rpm.html
并将rpm2cpio nss-softokn-freebl-3.36.0-5.el7_5.x86_64.rpm | cpio -idmv
./usr/lib 或 lib64 或 ./etc 复制到 /usr/lib /usr/lib64 /etc,但所有这些都无法解决我的问题。
有人提到 yum 的 chroot 有问题(https://bugs.centos.org/view.php?id=14767),但它不符合我的情况,我甚至尝试过,但什么也没发生。
答案1
我刚刚遇到了同样的问题。我花了几个小时才找到问题并解决它。我的情况是中断,yum update
最后的yum.log
记录和你一样
Oct 22 19:04:36 Updated: 1:grub2-pc-modules-2.02-0.65.el7.centos.2.noarch
Oct 22 19:04:36 Updated: tzdata-2018e-3.el7.noarch
Oct 22 19:04:37 Updated: bash-4.2.46-30.el7.x86_64
Oct 22 19:04:37 Updated: nss-softokn-freebl-3.36.0-5.el7_5.x86_64
我搜索并尝试了所有的解决方案,但和你一样没有运气。然后我阅读了 rpm 源代码,发现rpm/rpmio/digest_nss.c
#if HAVE_NSS_INITCONTEXT
PRUint32 flags = (NSS_INIT_READONLY|NSS_INIT_NOCERTDB|
NSS_INIT_NOMODDB|NSS_INIT_FORCEOPEN|
NSS_INIT_NOROOTINIT|NSS_INIT_OPTIMIZESPACE);
_nss_ctx = NSS_InitContext(NULL, NULL, NULL, NULL, NULL, flags);
if (_nss_ctx == NULL) {
#else
if (NSS_NoDB_Init(NULL) != SECSuccess) {
#endif
rpmlog(RPMLOG_ERR, _("Failed to initialize NSS library\n"));
rc = -1;
} else {
_crypto_initialized = 1;
}
sigaction(SIGPIPE, &oact, NULL);
}
/* Register one post-fork handler per process */
if (_new_process) {
if (pthread_atfork(NULL, NULL, at_forkchild) != 0) {
rpmlog(RPMLOG_WARNING, _("Failed to register fork handler: %m\n"));
}
_new_process = 0;
}
return rc;
}
然后我尝试用这样的代码来验证
#include <stdio.h>
#include <nss.h>
int main() {
NSSInitContext * _nss_ctx = NULL;
printf("hello world!\n");
PRUint32 flags = (NSS_INIT_READONLY|NSS_INIT_NOCERTDB|
NSS_INIT_NOMODDB|NSS_INIT_FORCEOPEN|
NSS_INIT_NOROOTINIT|NSS_INIT_OPTIMIZESPACE);
_nss_ctx = NSS_InitContext(NULL, NULL, NULL, NULL, NULL, flags);
if(_nss_ctx == NULL){
printf("Error");
}else{
printf("OK");
}
return 0;
}
并得到NSS_InitContext
没有被引用。~~所以很明显 lib 版本不匹配
wget 两者
nss-3.36.0-7.el7_5.x86_64.rpm
(
nspr-4.13.1-1.0.el7_3.x86_64.rpm
我的系统是 centos7)
使用rpm2cpio *rpm | cpio -idmv
提取文件并复制到/usr
运行rpm
仍然有错误
version `NSSUTIL_3.31' not found (required by /lib64/libnss3.so)
wget nss-util-3.36.0-1.el7_5.x86_64.rpm 并执行更多rpm2cpio and copy
然后一切都好起来了〜希望这可以帮助你