我正在执行从 CentOS 7.4 到 CentOS 7.5 的 yum 更新,当 nspr 和 nss soft-softoken 收到更新时,出现以下错误:
yum update nspr
error: Failed to initialize NSS library
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
cannot import name ts
Please install a package which provides this module, or
verify that the module is installed correctly.
It's possible that the above module doesn't match the
current version of Python, which is:
2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
If you cannot solve this problem yourself, please go to
the yum faq at:
http://yum.baseurl.org/wiki/Faq
更新后的软件包为:
nss 3.34.0-4.el7
nss-softokn 3.34.0-2.el7
nss-softokn-freebl 3.34.0-2.el7
nss-sysinit 3.34.0-4.el7
nss-tools 3.34.0-4.el7
nss-util 3.34.0-2.el7
故障排除尝试:读者应注意,升级后的文件系统是版本控制的。以下每个步骤均在同一时间点执行,并在继续进行下一个故障排除步骤之前恢复。
- 为了尝试解决此问题,我执行了以下步骤: https://access.redhat.com/solutions/3134931
- 遵循这里所有不同的解决方案:错误:无法初始化 NSS 库
- 我在更新之前已经更新了 glibc.i686 和 nspr。
- rpm -e --nodeps --justdb nspr
- rpm -e --nodeps --justdb nss nss-softokn nss-softokn-freebl nspr
- https://bugzilla.redhat.com/show_bug.cgi?id=1477308
这些文章和解决方案都未能解决我的特定问题。
感谢您的时间。
答案1
特别感谢#centos 上的 TrevorH 和 jhodrien。
问题是 chroot 阻止访问 /dev/urandom(如设计的那样)。成功安装的更新需要这些随机位来初始化 GnuTLS。
解决方案是:
mount -o bind /dev dev/
到 chroot 并照常进行更新。
或者,如果您不想挂载整个 /dev 目录,您可以创建自己的!
mknod -m 666 /dev/random c 1 8
mknod -m 666 /dev/urandom c 1 9
问题已解决。
答案2
接受的答案表明问题是由引起的chroot(8)
,在这种情况下我意识到我应该使用systemd-nspawn(1)
。
使用 systemd-nspawn 容器完美地解决了我这个问题。
答案3
Arlion 说得对,但这样做也有缺点,而且是很大的缺点。最好使用
mount -o bind /dev/urandom dev/urandom
根据我使用 Centos 7 的经验,如果大部分时间都挂载了 /dev,即使在卸载后,/dev/pts 也会出错,导致 ssh 登录到该机器失败。发生这种情况时,ssh 将无法连接,并会出现以下消息:
Server refused to allocate pty
/var/log/messages 或 dmesg 中没有任何内容表明存在问题。虽然交互式会话无法连接,但仍可以通过 ssh 进行恢复:
ssh root@stuck_machine 'umount /dev/pts; mount devpts /dev/pts -t devpts'