如何在一台虚拟服务器上安装 yum

1. 但我已经拥有 yum,而且用的是 CentOS

很多 Linux 发行版本都采用 yum 的一个变种。所有 CentOS 的发布都附上 yum 及一组相应的配置文件。某程度上这容让你的系统能运用 CentOS 在世界各地的镜像及更新系统日。有些下游的分叉损坏了些 yum 设置,导致它们的系统不能兼容。

基於下列种种原因,CentOS 的支持队决意不会恶化一个本身坏的情况(一个损坏了的 yum)。

2. 我的 CentOS 安装上没有 yum

假若 yum 未被安装或不能正常运作,你的系统不是 CentOS。如果你的安装是「建基於」或「改装自」CentOS,但 yum 并不存在,它其实不是真正的 CentOS。非开发者根本就没可能在未安装 yum 的情况下安装 CentOS。

有数间 VPS(虚拟服务器)的提供者、某些 CentOS 的下游分叉、及它们的管理工具(例如:OpenVZcPanelPleskwebminDirect AdminBlueQuartzAsteriskTrixboxElastix)似乎只会将 CentOS 的某部份安装在它们的虚拟服务器上。有些甚至将 yum 从系统中删除,或者更改 yum 的配置文件。常见的改动是将某些本地更改的组件「排除」于 yum 组件管理之外。

grep -ir exclud /etc/yum.* 

这个指令一般能列出被排除的组件。有些就在组件管理系统之外自行「管理」台机器。在「其它声音」这一页里,你可以找到更多全部或局部基於 CentOS 的分叉版本。

他们如此做的原因并不清楚。或许他们想令阻止你取代他们的内核。或许他们这样做是出於无知或懒惰。在 CentOS 的立场这样做是考虑不周。yum 拥有保护特定组件不受更改的机制。或许他们不懂得阅读 man yum 来查看 'exclude' 这个选项;又或许他们不想接听支持电话,因此甘愿销售一套不能更新的系统。采用第二个政策,当新发现的漏洞由於他们而不能修补,进而导致系统被入侵,他们便可以向你收取重新安装、或由备份撤消的费用。

<!> 在你尝试做任何事情之先:请停下来,并询问你的 VPS 提供者为甚么他们删除了 yum,以及你如何能够在没有 yum 的情况下保持系统在最新的状态。请篇文章作了设些假设,如果除了内核之外还有其它组件需要受保护,盲目跟随下面的推荐或许会损坏你的系统!

3. 你是说我被骗及误导?

对。一个真正的 CentOS 安装拥有 CentOS 内核、CentOS centos-release 组件、CentOS yum 组件,而且 /etc/yum.repos.d/ 目录的内容没有经过增加或删减[或许还会有个本地镜站,或已设置但不启用的附加软件库]。除了配置文件(见 man rpm),所有依赖性都被乎合,当你执行

$ sudo rpm -Va

这个指令除了显示预期被修改的配置文件外便没有其它输出。(请参考 man rpm 来协助你阅读这种清单,它包含了左边细节列的解读表。)

一个真正的 CentOS 系统亦可以在任何时候随意进行更新。我们提及这个条件,因为安全性修正亦可能随时出现。如果代管机架的供应商只提供 CentOS 4.X(当中 X 是一个数目字),而不是 CentOS 4,如此类推,这可能意味著有潜在的问题。CentOS 小组(以及上游发行版本的稳定小组)并不容许一个「停留」在不是最新、较旧的子版本,拥有正货产品的身份。

一个测试 yum 是否提供预期输出的快速方法是:

$ sudo yum grouplist \*

这样做应该返回 CentOS 4 及 CentOS 5 上所有可供安装的组件群组清单。

irc.freenode.net 上的 #centos IRC 频道里的成员很多时会要求你进行这个测试,以及下面一些相关的测试:

$  lsb_release -a ; uname -a ; rpm -V yum centos-release ; ls /etc/yum.repos.d/ ; yum repolist all

这样做会产生多行的输出。完整的输出(应该只有数行 —— 少於十,除非严重地出了错)应该被放上 CentOS 剪贴桶,而你应该在频道上通告内容的 URL。另外,有时一个快捷的分辨方法是利用:

$ uname -a

这里所得的单行输出可以直接贴在 #centos IRC 频道上。在这两种情况下,寻求这些信息的目的是要快速地评估系统的状况。

当被断定所牵涉的不是一台 CentOS 安装时,IRC 频道上常客及「知情」成员便不会继续提供支持或推荐。他们不希望推荐一个可能进一步损坏你的系统的方法,又或者以「填鸭式」教育那些不愿学好系统管理的人们。有关代管机架供应商对系统所做的改动,及它与真正的 CentOS 环境之间的差异,频道上的常客根本不能亦不可能知道。

假若你被骗,请要求你的供应商弥补他的过错。你可以要求他们:

4. 安装 yum

好啦、好啦 —— 我明白了 —— 我拥有的不是 CentOS。但我依然想要 yum,或者尝试删除及维修一组损坏了的 yum 配置文件。

<!> 首先,请进行完整的备份并确定它们可被读入。这个步骤可能会失败。

接著,你必须有下列组件才能令 yum 运作 —— 它们都可以从任何一个 CentOS 镜像下载:

你应该已经安装了这个组件。你可以这样检查

rpm -q centos-release
centos-release-4-4.3.i386

如果它已经在你的系统上,请检查 yum 的配置文件没有被移走,而且存在於你的系统上:

ls -l /etc/yum.repos.d/

这个目录应该只藏有这些文件:CentOS-Base.repoCentOS-Media.repo。如果它们不在里面,你应该在那里创建一个 'attic' 的目录,然后将现有的内容 'mv' 入 attic 中作备份,准备重装所有 centos-release 组件:

rpm -Uvh --replacepkgs centos-release.*.rpm

如果你的系统没有安装 centos-release,你可以在上述指令去除 --replacepkgs。请创建 ./attic/ 备份目录并将现有的任何文件都移进里面,这样即使你觉得「太深奥」了,仍有一条回头路。

接著你须要下列组件:

CentOS 4

(收录於你取得 centos-release 组件的地方):

CentOS 5

(收录於你取得 centos-release 组件的地方):

CentOS 6

(收录于你取得 centos-release 组件的地方):

<!> 这是根据某些受影响人仕所提供的数据而初步为 CentOS 6 预备的列表(截至 2012 年 7 月 19 日)。还有其它组件可能被违漏了,也有可能上述组件已安装在你的系统上。

将这些下载到一个独立的目录,并在这个目录以下列指令安装它们

rpm -Uvh *.rpm

如前,请将 /etc/yum.conf 备份,好让你可以取消任何改动。

5. 确保你的内核不会被取替

现在我们考虑到你期望(运作中的)内核,举例说是个专为 VPS 而设的内核,不会被 CentOS 的内核更新所取替,。

请在你喜欢的编辑器打开 /etc/yum.conf,然后在 [main] 部份的结尾加入下面一行:

exclude=kernel*

这样做会防止 yum 安装以 kernel 符串开头的组件,因此你的 VPS 内核便不用怕被 yum 所取替。

6. 撤消 yum 只用原装的 CentOS 软件库

<!> 有些系统管理员发现他们的 yum 配置文件内含有「自己施加」的改变,例如新增、启用、或编辑了配置文件来应用非 CentOS 的软件库。这部份描述一个恢复的方法。

你所需的「原装」文件都收录在 centos-release 组件内。其中一个办法就是以手动方式取得这个组件,然后将这些文件恢复到 /etc/yum.repos.d 这个目录内。很明显的,/etc/yum.conf 或其它文件或许都曾经被修改,而一个类同的修复方法亦适用。

我们假设这个样例是一个 CentOS 4 发行,於是我们利用 wget 将适当的 centos-release rpm 取到 /tmp/unpack 内:

$ # …… 以一般用户的身份
$ cd /tmp
$ mkdir unpack
$ wget http://mirror.centos.org/centos-4/4.6/os/i386/CentOS/RPMS/centos-release-4-4.4.i386.rpm
$ mkdir -p /tmp/unpack/var/lock/rpm/
$ # 在这个特殊情况下(一个「主目录树外」的 RPM --root),
$ # 使用 --nodeps 是没有不妥的
$ sudo rpm -Uvh --root /tmp/unpack/ --nodeps centos-release*rpm
$ # …… 成为 root
$ su -
# cd /etc/yum.repos.d/
# mkdir attic
# mv *.repo attic/
# cp /tmp/unpack/etc/yum.repos.d/* .

这样,你使再次有一个原装的 CentOS yum 软件库设置。因为我们已经完成在「主目录树外」解压配置文件,我们可以用:rm -rf /tmp/unpack 作善后清理。

7. 其它有用的连结

有时人们会在 IRC 频道上为一台机器,它的代管机构声称安装了 CentOS,但 yum 不能正常运作,亦找不到发行在网上镜像的更新,即管已计算传播的延误在内。这一页提供了一些捷径让频道上的常客能辨认冒牌 CentOS 的特性。

Translation of revision 37

zh/TipsAndTricks/BrokenVserver (last edited 2012-10-27 10:18:50 by TimothyLee)