我在 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 是否会自动更新证书。)
现在我想知道的是我的系统怎么会陷入这么多重复包的状态?在如此简单的系统配置上我做错了什么?我该如何防止这种情况再次发生!?
答案1
yum
当安装过程中崩溃时,您最终会得到重复的软件包。
由于您显然有一个 512MB 的 droplet,您应该意识到,yum
通常需要比这更多的内存才能完成大量软件包的升级。
yum
在512MB虚拟机上,安装时内存不足是很常见的,解决方法是设置交换空间。