我在 DigitalOcean 上设置了一个 CentOS 7.2 x64 服务器。后来我按照DigitalOcean 的指示将内核更新为DigitalOcean GrubLoader v0.2 (20160714) CentOS
.
这是可以想象的最简单的服务器设置之一。这就是我开始做的所有事情:
yum -y install epel-release
yum -y groupinstall "Development Tools"
yum -y install bind-utils curl-devel dos2unix expat-devel gettext-devel libtool lrzip openssl openssl-devel p7zip perl-CPAN perl-devel screen unzip whois zlib-devel
yum -y install httpd mod_ssl certbot-apache
我确定我做了其他一些事情,但这就是它的要点。我sudo yum update
不时使用以保持最新状态。
我在 Apache 上设置了一些静态站点。我开始并启用certbot-renew.timer
,以便我的 Let's Encrypt 证书将始终更新。
当我最近收到一封来自 Let's Encrypt 的电子邮件说我的证书即将过期时,我就知道出了点问题。如果我只是自己发出命令certbot
,我会得到:
An unexpected error occurred:
VersionConflict: (certbot 0.19.0 (/usr/lib/python2.7/site-packages), Requirement.parse('certbot==0.14.1'))
Please see the logfile '/tmp/tmp3fGvUd' for more details.
哦,但这只是开始。我试着做sudo yum update
,并得到Multilib version problems found
了这里。所以我按照指示删除并重新安装了grub2-tools
相关软件包。然后我又试了一次。问题NetworkManager
。然后我遇到了问题glibc
。
我不断收到各种重复的包装问题,所以我找到了其他说明要做的方向sudo package-cleanup --cleandupes
。它发现了大量重复,但说:
Error: Trying to remove "systemd", which is protected
Error: Trying to remove "yum", which is protected
You could try using --skip-broken to work around the problem
其他网站告诉我,我不应该使用任何形状或形式--skip-broken
,所以我没有。
现在当我回到尝试做一个简单的sudo yum update
事情时,它会找到 2 个要安装的包,98 个要升级,3 个要删除。在愉快地下载了 100 个包之后,它开始尝试更新东西。但是其中很多都以这样的消息失败:
error: Couldn't fork %post(cronie-anacron-1.4.11-17.el7.x86_64): Cannot allocate memory
但htop
显示我只使用 121M/489M!
我也看到这样的事情:
httpd-2.4.6-45.el7.centos.4.x86_64 was supposed to be removed but is not!
在这一点上,我认为可能有一些更新,所以我做了一个sudo systemctl reboot
.
重新启动后,现在我可以运行了certbot
!我做了 asudo yum check-update
和 a sudo yum update
,并且说“应该被删除但没有被删除”的东西似乎已经安装了。虽然我确实遇到了一些错误
Re-declaration of type docker_t
Failed to create node
Bad type declaration at /etc/selinux/targeted/tmp/modules/100/docker/cil:1
/usr/sbin/semodule: Failed!
我再次重新启动并尝试package-cleanup --dupes
查看是否仍有重复的包。我有——还有很多!
openssh-clients-7.4p1-13.el7_4.x86_64
openssh-clients-6.6.1p1-35.el7_3.x86_64
nss-tools-3.28.4-1.2.el7_3.x86_64
nss-tools-3.28.4-15.el7_4.x86_64
perl-5.16.3-291.el7.x86_64
perl-5.16.3-292.el7.x86_64
iputils-20160308-8.el7.x86_64
iputils-20160308-10.el7.x86_64
libX11-1.6.5-1.el7.x86_64
libX11-1.6.3-3.el7.x86_64
systemtap-devel-3.0-7.el7.x86_64
systemtap-devel-3.1-4.el7_4.x86_64
…
于是我又试sudo package-cleanup --cleandupes
了一次。它说它将删除 199 个包裹,并且……这次它完成了!现在我没有重复!现在没有可用的更新,所以也许它们都已安装!我的网站可用!(我会等着看 certbot 是否会自动更新证书。)
现在我想知道的是我的系统是如何进入所有这些重复包的状态的?我在这么简单的系统配置上做错了什么?以及如何防止它再次发生!?
yum
在安装过程中崩溃时,您最终会得到重复的包。由于您显然有一个 512MB 的 droplet,您应该知道
yum
通常需要更多的内存来完成任何大量软件包的升级。512MB的虚拟机
yum
在安装时内存不足是很常见的,解决方法是设置swap空间。