服务器架设篇 - CentOS 4.x

第八章、资安二 - Linux 在线自动升级

利用网络来直接进行在线的升级行为!

最近更新时间: 2006/09/10

本文数据主要针对 CentOS 4.x 的系统进行说明,而 CentOS 4.x 已经在 2012 年 2 月份正式不再进行维护,事实上,在 2009 年底几乎就不再维护了。 因此,建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 CentOS 4 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!
在现在的 Internet 上面,Cracker 实在是太多了!这些 Cracker 会利用已经存在的系统漏洞,来进行侦测、入侵您的主机, 因此,除了未来架设防火墙之外,最重要的 Linux 日常管理工作,莫过于套件的升级了! 不过,经由每日观察网络安全通报所告知的套件漏洞,以及等待各大 distribution 针对这些漏洞来提供 RPM 文件,以使 Client 来升级的过程中,实在是有点缓慢啊!因此, 目前就有很多在线直接更新的机制出现了!有了这些在线直接更新 RPM 的手段与方法,我们系统管理员在管理主机系统上面,可就轻松的多啰!赶紧来看看吧!

为何需要进行软件升级

很多朋友在网络上面常常会这样留言: 『大家好,我的 Linux 好像怪怪的,因为没有办法以 root 的身份登录了』, 呵呵!几乎可以直接告诉这位朋友:『你的系统被入侵了』!嗄~真假?早上才装好,下午被入侵? 没错啊~但~对方是如何办到的呢?

在前一章我们不是有提到『网络连接的 port 其实是由软件所打开的』, 所以,如果该软件本身就有问题的话,那么当然你的系统就容易被攻破了! 咦!那自由软件干嘛开发出有问题的程序啊?这是因为程序是人写出来的, 在设计之初有些奇怪的用法可能没有考虑到,或者是某些安全问题没有考虑到, 而造成程序的疏失。当这样的程序发布后,很多人会针对这些程序进行检验,如果发现问题就会回报给社群。 那么当回报后直到程序更新之前,总会有一段空窗期,这期间可能就会有些 cracker 开发出具有攻击码的程序, 如果这些攻击程序散布出来的话,那么随便一个小朋友拿到这样的程序,就能攻击你啦!

这个问题并非仅存在于某个单一操作系统,而是所有的操作系统都存在这样的问题, 而且套件的漏洞倒不是一定是会被利用来进行入侵,有的时候,某些套件的漏洞可能导致您 Linux 主机的运行不良或者是容易产生系统当机等等的问题呢!所以,一个好的 Linux 主机, 他的套件最好是随时保持在较新的版本上面,这样还是比较好一点的啦!关于安全漏洞的通报您可以参考底下的网站:
所以啊,并不是有防火墙就万事 OK !你还必须要更新你的软件才行, 通常建议你,安装 Linux 完毕后的第一项工作那就是..... 立刻进行整体软件的升级!
Tips 鸟哥 事实上,自由软件的安全性还是比较好的!因为有太多人帮忙检验代码与更新代码, 并且,万一程序真的有问题,在发现问题到推出修补程序的期间是比较短的, 也就是说,攻击者可以利用的时间相对缩短,当然使用自由软件的我们就比较安全啦! ^_^

如何进行软件升级

还记得你是如何安装你 Linux 上面的软件吗?不就是 rpm, tarball 与 dpkg 吗? 所以啰,你的软件如果想要升级,那就得依据当时你安装该软件的方式来进行升级啊! 而每种方式都有其适用性:
  • RPM:这是目前最常见于 Linux distribution 当中的套件安装管理方式, 包括 CentOS / Fedora / SuSE / Red Hat / Mandriva 等等,都是使用这个方式来管理的;

  • Tarball:利用软件的官方网站所发布的原代码在您的系统上面编译与安装, 一般来说,由于软件是直接在自己的机器上面编译的,所以性能会比较好一些。 不过,升级的时候就比较麻烦,因为又得要下载新的原代码并且重新编译一次。 这种安装模式常见于某些特殊软件 (没有包含在 distribution 当中),或者是 Gentoo 这个强调性能的 distribution;

  • dpkg:是 debian 这个 distribution 所使用的套件管理方式,与 RPM 很类似,都是通过预先编译的处理,可以让 end user 直接使用来升级与安装。
举例来说,如果你的系统是 CentOS ,我们知道他使用的是 RPM 类型的套件管理模式,那如果你想要安装 B2D 的软件怎办?要注意, B2D 是使用 debian 的 dpkg 来管理套件的,两者并不相同啊!要互相安装太难了! 所以说,要升级的话,得先了解到你系统上的套件安装与管理的方法才行。

不过,有个特殊案例,那就是旧版本的 Linux (例如 Red Hat 9) 的软件升级该如何是好? 由于旧版本的软件支持度本来就比较差,商业公司或者是社群也没有这么多心力放在旧版本的支持上, 所以,你这个时候可以选择: (1)升级到较新的版本,例如 CentOS 4.3 或者是 SuSE 10 等等,或者是 (2)利用 Tarball 来自行升级内核与软件 。不过,比较建议升级到新版本啦,因为要自行以手动方式由 Tarball 安装到最新的版本,实在是很费时费力,而且还得要常常查阅官方网站所推出的最新消息, 漏过一则都可能发生无法预期的状况。

但不管怎么说,单纯使用 RPM / Tarball / dpkg 的方式来安装与升级软件时, 你都必须要由原版光盘或者是由官方网站下载可安装的套件文件,然后再手动来实际安装到你的系统上。 如此一来,你还是得要盯着官方网站提供的信息,才能够在第一时间进行升级的动作。 唉!怎么这么麻烦?

我们都晓得在 Windows 的环境下,他有提供一个 Live update 的项目可以自动的在线升级, 甚至很多的杀毒软件与防木马软件也都有推出即时的在线更新,如此一来可以让您的软件维持在最新版的状况, 真是好啊!咦!那我们的 Linux 是否有这样的功能?如果有的话,那么系统自动进行软件升级, 不就可以轻松又快乐了?没错!确实是这样的!所以就让我们来谈一谈 Linux 的在线升级机制吧!

各种 distributions 的自动升级机制

在 Linux 最常见的套件安装方式: RPM / Tarball / dpkg 当中,Tarball 由于取得的是原代码, 所以要用 Tarball 来作在线自动更新是不太可能进行的,所以仅能用 RPM 或 dpkg 这两种套件管理的方式来进行在线更新了。

但 RPM 与 dpkg 不是有所谓的相依属性吗? 这倒不需要担心呐!因为我们的 RPM 与 dpkg 套件文件都有一些套件的基本信息, 并同时记录了套件的相依属性 (记得使用 rpm -q 的查找吗), 所以当分析这些基本信息并使用一些机制将这些相依信息记录下来后, 再通过一些额外的网络功能,就能够自动的分析你的系统与修补套件之间的差异, 并可进一步帮你分析所需要升级与相依属性的套件,就可达成自动升级的理想啦!

由于各家 distributions 在管理系统上都有自己独特的想法,所以在分析 RPM 或 dpkg 套件与方式上面就有所不同, 也就有底下这些不同的在线升级机制啦:
  • yum
    CentOS 与 Fedora 所常用的自动升级机制,通过 FTP 或 WWW 来进行在线升级以及在线直接安装套件;

  • up2date
    这是 Red Hat 所使用的自动升级机制,需要注册才能使用,并且依据付费与否而管制其流量;

  • apt
    最早由 debian 这个 distribution 所发展,现在 B2D 也是使用 apt ,同时由于 apt 的可移植性, 所以只要你的 RPM 可以使用 apt 来管理的话,就可以自行创建 apt 服务器来提供其他用户进行在线安装与升级。

  • you
    所谓的 Yast Online Update (YOU) 是由 SuSE 所自行开发出来的在线安装升级方式, 经过注册取得一组帐号密码后,就能够使用 you 的机制来进行在线升级。不过如果是免费的版本, 则仅有 60 天的试用期!

  • urpmi
    这个则是 Mandriva 所提供的在线升级机制!
讲了这些升级机制并且与 distribution 作了对应,你就该了解到:『每个 distribution 可以使用的在线升级机制都不相同』的啊!所以请参考你的 distribution 所提供的文档来进行在线升级的设置喔!否则就得要自行手动下载安装了! @_@

底下鸟哥以 CentOS 4.3 提供的 yum 在线升级架构来进行说明,同时亦简单的介绍一下 B2D 这个 distribution 的 APT 来说明说明! ^_^!那为什么不选择其他的版本来介绍呢? 就如同局域网路那个章节里面的 distribution 选择提到的, 越稳定的版本就不容易发生程序臭虫,不断升级的情况就比较不会发生,所以,鸟哥这里再次的说明一下, 如果要做为主机服务器之用的话,尽量选择较稳定且支持较多的版本,例如 CentOS, SuSE, Red Hat, B2D 及 debian 等 distribution 啊!

CentOS 的 yum 自动升级

我们知道 CentOS 主要是以 RPM 来作为套件的管理机制,那么 RPM 本身就有一些表头数据记录了这个套件本身的信息, 包括了相依属性之类的消息等等, yum 这个咚咚就是借由分析这些 RPM 套件的表头数据,并且将这些表头数据事先记录下来, 当用户要求升级或者是安装的时候, yum 就会通过分析这些表头数据来决定下载的文件, 这些下载的文件当然包括了相依属性的套件了,所以说,yum 已经主动克服了套件之间的属性相依问题啰!很棒吧!

那么 yum 是如何动作的呢?基本上是这样的:
  • 先由设置档判断 yum server 所在处;
  • 连接到 yum server 后,先下载新的 RPM 文件的表头数据;
  • 分析比较用户所欲安装/升级的文件,并提供用户确认;
  • 下载用户选择的文件到系统中的 /var/cache/yum ,并进行实际安装;
所以说,找到合适的 yum server 是挺重要的一件事啊!

yum 的设置档

基本上,在你一安装完 CentOS 之后,系统就主动的帮你创建好 CentOS 的 yum server 设置了, 他的设置档在:
  • /etc/yum.conf
  • /etc/yum.repos.d/CentOS-Base.repo
其中,那个 yum.conf 是主要设置档,可以设置一些环境参数之类的,至于 CentOS-Base.repo 则是主要的 yum server 选择的数据,你可以直接修改 CentOS-Base.repo 这个文件即可。 另外,台湾地区的 CentOS 镜像站台 (mirror) 可以选择义守大学的 FTP 网站, 例如底下的链接:
截至目前为止 (2006/09/xx),最新的 CentOS 是 4.4 版,所以上头这个链接你可以进入 4.4 那个目录, 就能够看到很多 CentOS 提供的各项套件数据了。其中比较重要的两个目录是:『 o s』以及『 update 』 ,分别是基础套件以及修补过后的套件啦!既然知道了台湾地区的 FTP 网站后,自然就不需要连接到美国去下载文件, 那么连接下载的速度当然就会比较快啦!不过,你就得要自行修改修改设置档了!

不过 CentOS 官方网站则是建议使用国码来作为镜相网站的选择依据, 如此一来在大版本相同的环境下 (4.3 -> 4.4) 咱们的 CentOS 是可以自动升级到不同版本中的! 所以,鸟哥的设置档是改成这个样子的:
[root@linux ~]# vi /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch
&repo=os&cc=tw
# 注意!上面两行是同一行!
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#released updates
[update]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch
&repo=updates&cc=tw
# 注意!上面两行是同一行!
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
......(底下省略).....
主要是将 mirrorlist 那个变量的最后面加上国码『&cc=tw』就可以了!如果未来有较新的版本时, 那么你的 yum 就能够自动升级啰!另外,除了 [base] 与 [update] 之外,其实 CentOS 还提供很多的额外套件, 这包括了: addons, extras, centosplus, contrib 等等,这些数据你也可以加入到设置档当中, 来帮助你容易安装某些非正规支持的套件数据啊! ^_^

另外最要注意的是,在设置档当中所指定的镜像站台 (mirror) 离你越近越好,而且带宽越大越好, 这样你就可以比较方便快速的下载啊!而且,你必须已经成功的链接到该镜像站台才行, 否则在运行 yum 时会发生某些问题喔!另外,你必须是 root 的身份才能使用 yum 啊! 也就是说:
  • 你必须使用 root 的身份来运行 yum ;
  • 设置档内指定的镜像站台必须能与你进行网络连接;
  • 镜像站台带宽越大越好,所以选择离你越近的镜像站越好!

yum 的安装、升级、移除、查找等功能

yum 可不止能够在线自动升级而已,他还可以作查找、套件群组的安装、整体版本的升级等等,好用的哩! 先来谈论一下 yum 这个 client 端的指令用法吧:
[root@linux ~]# yum [option] [工作项目] [套件]
参数:
option:主要的参数,包括有:
   -y :当 yum 询问用户的意见时,主动回答 yes 而不需要由键盘输入;
   --installroot=/some/path :安装在其他的路径,而不在目前目录树的架构中;
        对于创建虚拟机相当有帮助!不过,一般用户应该用不到。
[工作项目]:由于不同的使用条件,而有一些选择的项目,包括:
   install :指定安装的套件名称,所以后面需接『 套件名称 』
   update  :进行整体升级的行为;当然也可以接某个套件,仅升级一个套件;
   remove  :移除某个套件,后面需接套件名称;
   search  :搜索某个套件或者是重要关键字;
   list    :列出目前 yum 所管理的所有的套件名称与版本,有点类似 rpm -qa;
   info    :同上,不过有点类似 rpm -qai 的运行结果;
   clean   :下载的文件被放到 /var/cache/yum ,可使用 clean 将他移除,
             可清除的项目:packages | headers | metadata | cache 等;
另外,在[工作项目]部分还可以具有整个群组套件的安装方式,如下所示:
   grouplist   :列出所有可使用的『套件组』,例如 Development Tools 之类的;
   groupinfo   :后面接 group_name,则可了解该 group 内含的所有套件名;
   groupinstall:这个好用!可以安装一整组的套件群组,相当的不错用!
                 更常与 --installroot=/some/path 共用来安装新系统
   groupupdate :升级整个套件群组;
   groupremove :移除某个套件群组;

范例一:搜索 CentOS 的更新主机上是否有 RAID 磁盘数组相关套件?
[root@linux ~]# yum search raid
.....前面省略.....
mdadm.i386                               1.6.0-3                base
Matched from:
mdadm controls Linux md devices (software RAID arrays)
mdadm is used to create, manage, and monitor Linux MD (software RAID)
.....后面省略.....
# 看到否?输出数据的特殊字体那一行就显示了你可以安装的套件名称然后你可以这样:

[root@linux ~]# yum info mdadm
Name   : mdadm
Arch   : i386
Version: 1.6.0
Release: 3
Size   : 84 k
Repo   : base
Summary: mdadm controls Linux md devices (software RAID arrays)
Description:
.....后面省略.....
# 瞧一瞧啊!套件的版本名称、数据大小、还有该套件出处 (base)!
# 需要注意看的是 Summary 与 Description 这两个注意事项内容!
yum 真是个很好用的东西,他可以直接查找是否有某些特殊的套件, 你可以利用『 yum search "一些关键字" 』或者是『 yum list 』列出所有的套件名称, 然后再以正规表示法取得关键字,或者是『 yum list "套件名称" 』 就能够知道该套件的用途, 最后再决定要不要安装啊!上面的范例一就是在找出磁盘数组的管理软件, 如果确定要安装时,那就可以这样处理:
范例二:安装某个套件吧!以 mdadm 为例:
[root@linux ~]# rpm -q mdadm
package mdadm is not installed
# 鸟哥的主机并没有安装这个玩意儿~所以底下开始安装先!

[root@linux ~]# yum install mdadm
Setting up Install Process
Setting up repositories
update                    100% |=========================|  951 B    00:00
base                      100% |=========================| 1.1 kB    00:00
addons                    100% |=========================|  951 B    00:00
extras                    100% |=========================| 1.1 kB    00:00
# 上面这个阶段在读取 RPM 文件的档头数据;

--> Populating transaction set with selected packages. Please wait.
---> Downloading header for mdadm to pack into transaction set.
mdadm-1.6.0-3.i386.rpm    100% |=========================| 8.2 kB    00:00
---> Package mdadm.i386 0:1.6.0-3 set to be updated
--> Running transaction check
# 上面这个阶段则是在下载文件以及准备更新的阶段

Dependencies Resolved
=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mdadm                   i386       1.6.0-3          base               84 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 84 k
Is this ok [y/N]: y
# 至于这个阶段则在分析相依属性,并且让用户确认下载开始

wnloading Packages:
(1/1): mdadm-1.6.0-3.i386 100% |=========================|  84 kB    00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing: mdadm                        ######################### [1/1]

Installed: mdadm.i386 0:1.6.0-3
Complete!
# 最终则下载与安装的结果!
瞧!经过 yum 我们可以很轻松的就安装好一个软件,并且这个软件已经主动的帮我们做好相依属性的克服了, 真是方便到爆!另外,你必须要知道,刚刚那个被下载安装的 mdadm 文件被放置到 /var/cache/yum 里面去了, 如果你要节省硬盘空间的话那么可以在安装完毕后将该文件移除,就用:
[root@linux ~]# yum clean packages
Cleaning up Packages
2 packages removed
这样就能够清除掉已下载的文件啰~节省一下硬盘空间啊!OK~那如何进行整体的更新呢? 比如说鸟哥刚刚装完了 CentOS 4.3 ,但这个版本已经推出若干时间,所以也已经作了很多更新了, 那鸟哥如何整体更新啊?很简单,就用如下的指令:
[root@linux ~]# yum -y update
加一个『 -y 』的参数可以让系统自动帮你回答『 yes 』,在背景处理时会比较方便一点。 如果你是第一次运行,那就会发现:哇!怎么下载的数据量到达数百 MB 之谱!没错啊! 所以记得 /var/ 这个目录的容量要给大一点才行! 否则就会出现无法完整下载所有更新文件的问题啊! @_@


  • 安装套件群组的功能
    什么是『套件群组』呢?还记得在安装的时候有出现套件选择的地方吧? 在那个时候你选择的数据可不是『套件名称』喔,而是一堆『套件群组』,举例来说, 你会看到『KDE 桌面环境』之类的,而不是每个 KDE 桌面的各项套件名称,对吧!那个咚咚就是『套件群组』啦! 由于各大 distributions 缺省都没有选择发展工具 (Development Tools), 这些工具包含了 gcc, kernel-devel 等等,那么你如何使用 yum 一口气安装呢? 看看底下的范例:
    范例三:查找与安装『套件群组』
    [root@linux ~]# yum grouplist
    Installed Groups:
       Administration Tools
       Authoring and Publishing
       Compatibility Arch Support
    .....中间省略.....
    Available Groups:
       Development Tools
       XFCE-4.2
    .....中间省略.....
    Done
    # 看到没!上面就列出来你已经安装的套件群组,还有尚可安装的其他套件群组,
    # 真是非常的方便!那么如何知道 Development Tools 里面有啥咚咚?
    
    [root@linux ~]# yum groupinfo "Development Tools"
    Group: Development Tools
     Required Groups:         <==所需要的相依属性数据
       Development Libraries
     Default Metapkgs:        <==缺省内部所需要的中继套件
       Emacs
     Optional Metapkgs:       <==最好还含有这些套件较佳
       Ruby
       XEmacs
    .....中间省略.....
     Mandatory Packages:      <==一些所需要的套件数据
       pkgconfig
       gcc-ppc32
       make
       gcc
       autoconf
    .....中间省略.....
     Default Packages:
       gcc-g77
       cscope
    .....中间省略.....
     Optional Packages
       dejagnu
       ElectricFence
       gcc-gnat
    .....中间省略.....
    # 总共会列出来这个『套件群组』内含有的各项数据,如果你需要安装的话,就可以:
    
    [root@linux ~]# yum groupinstall "Development Tools"
    
    利用这个『 yum groupinstall "套件群组名" 』可以让你一口气安装很多的套件, 而不必担心某个套件忘记装了!实在是很不错啦~而且利用 groupinfo 的功能你也可以发现一些不错的套件数据, 如此一来,你就可以更方便的管理你的 Linux 系统了,很不错吧!

    例题:请设置一下工作调度,让你的 centOS 可以每天自动更新系统

    答:
      可以使用『 crontab -e 』来动作,也可以编辑『 vi /etc/crontab 』来动作, 由于这个更新是系统方面的,所以鸟哥习惯使用 vi /etc/crontab 来进行指令的说明。 其实内容很简单:
      40 5 * * * root yum -y update && yum clean packages
      这样就可以自动更新了, 时间订在每天的凌晨 5:40 ,并且更新完成后会主动的将下载的套件数据移除喔!

  • 不同版本间的升级

    什么!不同的版本之间可以直接『网络』升级了喔?没错!而且整个流程还挺简单的, 升级完成之后,绝大部分的服务都还不会有困扰!真是很不错啊!那什么是『不同版本?』举例来说, CentOS 4.2 升级到 CentOS 4.3 算是一种,而 Fedora Core 1 升级到 CentOS 4.3 则又是另外一种, 同样是 CentOS 的升级比较容易,尤其 4.3 本来就是架构在 4.2 上面持续发展的结果; 不过如果是 Fedora Core 的话,可能就比较麻烦一点点。底下我们分别谈一谈这两种方式的升级吧!


  • CentOS 4.2 升级到 CentOS 4.3
    在 CentOS 的发展理念当中,如果推出了 4.3 ,那么 4.2 以前的 4.x 版本就不会继续发展, 所以用户必须要将原本的 4.2 直接提升到 4.3 才行。那么需要作些什么动作呢? 不需要啊!只要修改一下 yum 的设置档就好了。首先,同样需要找到最近的镜像站台, 我们依旧以义守大学的 FTP 网站来提供所需要的套件数据,修改成这样:
    1. 先修改 /etc/yum.conf
    [root@linux ~]# vi /etc/yum.conf
    .....前面省略.....
    # 直接在文件的最底下加入这一行来增加一些额外的功能:
    plugins=1
    
    2. 再修改 /etc/yum.repos.d/CentOS-Base.repo
    [root@linux ~]# vi /etc/yum.repos.d/CentOS-Base.repo
    # 内容与『 yum 的设置档』说明相同,请回到本小节的最前面查阅该设置
    
    因为 /etc/yum.repos.d/CentOS-Base.repo 的内容与前面相同, 所以鸟哥在这里不再浪费篇幅,请往前翻阅吧!设置好了之后,接下来给他进行:
    [root@linux ~]# yum upgrade
    
    记得是『 upgrade 』而不是『 update 』喔!两者用法不同啊! 然后接下来就是一段时间的等待啊!没办法,因为从网络上面捉数据下来是需要时间的! 还好鸟哥的环境是在学术网络内,所以链接同样是学术网络的义守大学还挺快的就是了! ^_^! 整个升级的时间大约花费 20 分钟以内,升级完毕之后,重新开机瞧一瞧登录画面!哇!变成 CentOS 4.3 了, 真是快速又方便!而且原本有启动的服务几乎没有任何问题,同样可以正常的启动呐!^_^

    上面的动作你可以参考底下这一篇官方说明文档:

  • Fedora Core Release 1 升级到 CentOS 4.3
    如果你使用的是旧版的 Linux distributions ,例如 Fedora core release 1, Red Hat 9 等等的系统, 这些系统已经旧到没有什么更新的软件出来,所以如果套件有臭虫而需要更新时, 你可能就得要使用 Tarball 的方式手动的给他『 configure, make, make install 』等等的, 好累啊~那如果我安装 CentOS 呢?如果需要主动重新安装的话,那旧的数据不是会不见吗? 又得要备份,重新处理等等的,还是很累啊!

    没关系!有 yum 就搞定了!你可以将你的 FC1 升级到 CentOS 4.3 了,而且是『在线更新』喔! 厉害吧!不过,因为 FC1 使用的内核是 2.4 版,但 CentOS 4.3 使用的是新的 2.6.x , 这两种内核可不能互相更新啊!所以啰,我们还需要一些额外的动作来进行升级,而不像前面 CentOS 4.2 升级到 4.3 那么简单!鸟哥底下的动作是参考这几篇:
    鸟哥底下以 FC1 为例来进行整个升级的动作,不过你得要了解的是,每个人的 Linux 都不相同, 因此虽然鸟哥实作是成功的,不过不代表你的环境一定会成功, 所以,重点是....『请做好备份!』 以免升级不成功时,导致整个数据的损毁,那就得不偿失了!
    0. 前处理:先准备好你的数据,以及删除不需要的数据
    [root@linux ~]# yum clean packages headers
    # 先删除原本的 yum  数据,因为 FC1 使用的也是 yum ,
    # 所以最好先将之前 FC1 的 yum 数据删除,比较不会有问题;
    
    在这个步骤当中,你最好先将一些重要数据备份起来,包括 /etc 与 /home 整个目录, 还有其他你有打开的服务的数据,包括 MySQL 或者是 WWW 的网页数据等,请自行备份喔。 另外,我们的 yum 缺省是将下载的套件通通放置到 /var/cache/yum 当中,所以你的 /var 目录所在 partition 的容量也需要至少 1GB 以上的容量,而且安装软件所在目录 /usr 所在的 partition 最好也能够有 2GB 以上的空间,否则容易出现空间不足的错误消息而无法继续。

    那如果真的空间不足怎么办?你可以将一些不需要的套件先移除啊!举例来说, 你可以利用『 yum groupremove "Development Tools" 』之类的指令先将这些不是必备的套件群组移除, 以及其他 X 相关的套件也可以先移除,等到升级完毕后再以 yum 来重新安装即可, 这样可以节省很多升级时分析相依属性所花费掉的时间喔!

    同时你得要确认你的镜像站台,以及 CentOS 的数字签章文件已经安装到 RPM 数据库当中才行, 同样的,鸟哥还是以义守大学的 FTP 站为主要的来源镜像站,但是你必须要先取得一些 RPM 相关的文件, 这些文件由于会与 FC1 原本的套件产生不相符合的特性,所以需要先捉下来并且强制安装才行! 请你自行连上:
    然后选择最新的版本,例如鸟哥使用 4.3 (2006/08/10 以前) 这个版本,所以直接点击他, 然后依序选择『os』->『i386』->『CentOS』->『RPMS』,然后下载底下这些文件 (注:套件的版本号码可能会有些不同喔!):
    • centos-release-4-3.2.i386.rpm
    • centos-yumconf-4-4.5.noarch.rpm
    • kernel-2.6.9-34.EL.i686.rpm
    • udev-039-10.12.EL4.i386.rpm
    假设我的这些文件捉下来后放到 /root 下,那接下来的动作是:
    1. 安装升级所需要的 RPM 文件:
    [root@linux ~]# rpm --import  \
    > http://ftp.isu.edu.tw/pub/Linux/CentOS/4.3/os/i386/RPM-GPG-KEY-centos4
    [root@linux ~]# rpm -Uvh centos-release-4-3.2.i386.rpm
    [root@linux ~]# rpm -Uvh centos-yumconf-4-4.5.noarch.rpm
    [root@linux ~]# rpm -ivh --force --nodeps kernel-2.6.9-34.EL.i686.rpm
    # 在这个动作时,由于我们的内核并非是 CentOS ,所以这个动作会发生一些错误,
    # 先不要理他,待会儿的动作再重新处理即可。
    [root@linux ~]# rpm -ivh --force --nodeps udev-039-10.12.EL4.i386.rpm
    
    由于 kernel 2.6 使用的设备管理是以 udev 这个套件来处理的,与原本的 kernel 2.4 并不相同, 为了避免用户进行错误的安装,所以 yum 会主动的分析内核与设备管理套件的差异, 如果两者无法配合就产生错误消息且强制中断 yum ,那结果就是导致无法以 yum 进行升级啦! 要躲过这个困扰,你就得要先手动的安装上头那几个 RPM 文件。同时安装 kernel 的过程当中会发生错误消息, 先不要理他,等到后续步骤再来重新处理即可! 既然 kernel 2.6 会与 2.4 版冲突,而鸟哥的原本的 FC1 本来就有 2.4 版的内核嘛! 那即使安装了新的 kernel-2.6.9-34.EL.i686.rpm 内核,但内核版本冲突的问题还是没有解决的, 所以啊,你就得要这样做了:
    2. 移除会有冲突的 2.4 版内核,连同其原代码
    [root@linux ~]# rpm -qa | grep kernel
    kernel-2.4.22-1.2197.nptl
    kernel-2.4.22-1.2115.nptl
    kernel-2.4.22-1.2199.nptl
    kernel-source-2.4.22-1.2197.nptl
    kernel-source-2.4.22-1.2199.nptl
    .....其他省略.....
    [root@linux ~]# rpm -e kernel-source-2.4.22-1.2199.nptl
    [root@linux ~]# rpm -e kernel-source-2.4.22-1.2197.nptl
    [root@linux ~]# rpm -e kernel-2.4.22-1.2115.nptl
    [root@linux ~]# rpm -e kernel-2.4.22-1.2197.nptl
    [root@linux ~]# rpm -e kernel-2.4.22-1.2199.nptl
    # 反正就是找到内核与内核原代码的套件后,就将他移除!记得套件名为:
    # kernel 与 kernel-source  ,其他的不用动!
    [root@linux ~]# rpm --rebuilddb
    
    将一些旧版本的内核给他移除后,你的系统就只有剩下刚刚安装的那个 CentOS 的新内核, 所以内核版本的冲突当然就不存在了。要注意的是,你现在绝不可重新开机,否则你的系统就挂了! 因为没有内核了喔!切记切记!然后开始要设置好升级时要使用的 yum 设置档了!
    3. 规范设置档
    [root@linux ~]# vi /etc/yum.upgrade
    [main]
    cachedir=/var/cache/yum
    debuglevel=2
    logfile=/var/log/yum.log
    pkgpolicy=newest
    distroverpkg=fedora-release
    installonlypkgs=kernel kernel-smp kernel-hugemem kernel-unsupported
    tolerant=1
    exactarch=1
    plugins=1
    
    [upgrade]
    name=CentOS-4.3 - upgrade
    baseurl=http://ftp.isu.edu.tw/pub/Linux/CentOS/4.3/os/i386/
    
    [update]
    name=CentOS-4.3 - Updates
    baseurl=http://ftp.isu.edu.tw/pub/Linux/CentOS/4.3/updates/i386/
    
    设置档里面先只要有这两个项目即可,因为我们仅注视在整体版本的升级, 所以其他的额外功能部分先不要理他!以后再来处理即可啊!接下来就准备要升级了!这样做吧:
    4. 开始升级的动作:
    [root@linux ~]# yum -y -t -c /etc/yum.upgrade upgrade
    
    理论上,如果你的 FC1 没有安装什么奇怪的软件,而且『硬盘空间也足够』 ,那么 yum 应该会开始帮你一个一个的下载软件并且分析属性相依问题后,就开始进行安装的步骤。 不过,如果发现一些软件冲突的问题时,那么你就得要先以 rpm -e 将旧的软件先移除, 等到升级完毕后再安装回来即可。只不过这个动作将依你的环境而有所不同。 鸟哥的 FC1 实在是旧的可以,所以很多软件都有冲突,因此事先移除了很多的套件, 忙了快要半小时后,系统才顺利的开始进行安装。由于鸟哥主机所在环境的网络下载的速度尚可而已, 所以由开始下载到升级完毕,大概花了一个半小时左右! @_@
    5. 重新安装内核,并处理 RPM 数据库与更新其他套件
    [root@linux ~]# rpm -ivh --force --nodeps kernel-2.6.9-34.EL.i686.rpm
    [root@linux ~]# rpm --rebuilddb
    [root@linux ~]# yum update
    
    通过这三个指令我们可以再将刚刚没有完成的内核安装一遍,同时再以新的 yum 来进行升级, 这个时候我们的系统应该是很 OK 的啦!不过,有的小问题,那就是『开机的设置档还没有更新』喔! 所以你还得要这样做:
    6. 设置开机设置档
    [root@linux ~]# vi /boot/grub/menu.lst
    default=0
    timeout=10
    splashimage=(hd0,0)/boot/grub/splash.xpm.gz
    title CentOS (2.6.9-34.0.2)
            root (hd0,0)
            kernel /boot/vmlinuz-2.6.9-34.0.2.EL ro root=/dev/hda1 hdd=ide-scsi rhgb
            initrd /boot/initrd-2.6.9-34.0.2.EL.img
    title CentOS (2.6.9-34.EL)
            root (hd0,0)
            kernel /boot/vmlinuz-2.6.9-34.EL ro root=/dev/hda1 hdd=ide-scsi rhgb
            initrd /boot/initrd-2.6.9-34.EL.img
    
    在今日 (2006/08/10) 能够安装的最新内核版本是 2.6.9-34.0.2.EL ,所以上面的第一个 title 才会是这样的设置数据,要记得与你的环境符合啊(如果你不是使用 4.3 来升级)!如果忘记上面各项数据的意义, 请参考『鸟哥的 Linux 私房菜 基础篇 boot loader 』的介绍啊! 如果设置好了这个开机信息,嘿嘿!请重新开机试看看吧! ^_^

    基本上这样已经处理完毕了!也就是说,你的系统应该是由 FC1 顺利的转成 CentOS 4.3 才对! 不过,有些小细节你依旧需要注意喔:
    • 观察您的系统是否有启动原有的服务,亦可利用 chkconfig --list;
    • 如果你的旧系统曾有使用 tarball 的方式来安装软件,则升级完毕后你必须要重新安装一次该软件;
    • 系统可能会产生很多的 .rpmnew 的文件,请使用 locate 搜索,并且重新处理设置档。
    毕竟之前的版本太旧了,所以 RPM 升级时会将新套件的设置档存成 *.rpmnew , 你最好不要使用旧的设置档,而是以新的设置档来重新修改比较好!这样服务的运作应该会比较顺畅一些啊! 到此为止,恭喜您啊! ^_^
  • Debian 的 apt 自动升级:以 B2D 为例

    APT 最早是 debian 这个社群的 Linux distribution 用来作为套件管理的一项机制, 后来实在很方便又好用,所以就被利用来做为其他 distributions 的在线升级管理机制了! 所以你会在很多地方看到有 FC 系列的 APT 服务器、或者是自订的 APT 服务器等等的。 这个 APT 的使用与 yum 很类似呐!同样也是通过套件的表头分析后,然后与系统本身数据比对, 因此同样也克服了属性相依的困扰了,非常方便!底下我们就分别来谈一谈吧!

    APT 的设置档

    如同前面提到的 yum 一样,既然是在线升级,那么我们自然得要找到相对应的服务器啰! 而一般有提供 apt 服务的 distributions 事实上他们都已经做好设置档内相关的服务器选择了, 例如 B2D 就是一个例子。不过, 如果你是使用类似 Red Hat 9, Fedora Core Release 等版本的话, 可能由于种种原因让你不能将该主机升级到类似 CentOS 等较新的版本时,那你就可以尝试到底下的网站找找看 APT 主机了
    找到属于你的 Linux 版本后,安装 apt 就可以使用 apt 服务器所提供的套件升级机制啰! 底下赶紧谈一谈,那么如何处理 APT 的设置档呢? APT 的设置档都放在 /etc/apt 目录下,而在该目录下,规范 APT 主机的设置则放到 /etc/apt/sources.list 当中。 以 B2D 为例,他的 sources.list 是这样的:
    1. 先处理 APT 服务器来源的设置数据:
    [root@linux ~]# vi /etc/apt/sources.list
    deb ftp://debian.tnc.edu.tw/pub/debian/ stable main non-free contrib
    deb http://security.debian.org/ sarge/updates main contrib non-free
    deb ftp://debian.tnc.edu.tw/pub1 b2d/
    deb http://ftp2.de.debian.org/debian-volatile sarge/volatile main
    # 上面的格式是这样的:
    # <deb 的标头格式> <APT服务器网址> <相对网址路径> <目录一> <目录二> ...
    
    其实设置档的内容很简单,第一个字段指的是『用哪一种套件管理员』的意思,主要有 deb 以及 rpm 还有 rpm-src 等,deb 是 debian 专属的套件管理方式啦! ^_^!第二栏以后就得要一起看才行! 以上表的第一行为例,其实他是说,提供 deb 的网址有三个,分别是:
    • ftp://debian.tnc.edu.tw/pub/debian/stable/main
    • ftp://debian.tnc.edu.tw/pub/debian/stable/non-free
    • ftp://debian.tnc.edu.tw/pub/debian/stable/contrib
    这样看懂了吗?第二栏与第三栏要加在一起,那就是个完整的服务器网址! 后面接的几个数据则是在该网址底下的数个目录,那就很容易看懂了吧! ^_^ 应该是不难啦~如果您是使用 b2d 的话,那恭喜你!不用修改就能用 apt 啰! ^_^
    Tips 鸟哥 事实上, /etc/apt/apt.conf 还可以提供其他额外的设置喔,例如使用 Proxy 以及规范下载后的套件在安装完毕后应该进行的处理步骤,举例来说,是否需要将该套件移除! 你应该要使用 man apt.conf 查找一下该文件的用法喔!

    实际使用 APT

    APT 的使用也实在是很简单!只要利用 apt-get 即可!不过,不同于 yum 每次都会进行 RPM 文件表头的分析, APT 则是将套件表头的下载与实际的安装分成两个动作分别运行,先来谈一谈 apt-get 这个指令的用法吧!
    [root@linux ~]# apt-get [-qy] [-c config_file] [更新项目] [套件名称]
    参数:
    -q :不要在屏幕上输出消息,常用在背景环境的运行当中喔!
    -y :自动在进行 apt-get 时回答 y 的回应;
    -c :后面接的是设置档,一般系统会主动的以 /etc/apt 内的设置档为依据。
    [更新项目]:要 apt-get 进行的工作,主要有这几项:
       update      :就是更新服务器与用户端的套件表头清单,这个动作务必要进行!
       install     :后面需要加上要安装的套件名称才行!
       upgrade     :进行『已安装套件』的完整升级,不过未安装套件则不予安装;
       dist-upgrade:以 upgrade 相似,但是当新版本的套件有其他相依属性的套件加入时,
                     单纯的 upgrade 将无法进行安装,此时就得要使用 dist-upgrade 了!
       clean       :清除已经下载到 /var/cache/apt/archives/ 的套件文件。
       remove      :移除某个套件啊!
    
    范例一:进行套件标头更新后,进行整体套件的更新动作
    [root@linux ~]# apt-get update
    下载:1 ftp://debian.tnc.edu.tw stable/main Packages [3349kB]
    下载:2 http://ftp2.de.debian.org sarge/volatile/main Packages [3893B]
    .....中间省略.....
    读取 3868kB 用了 24s (159kB/s)
    读取套件清单中... 完成
    
    [root@linux ~]# apt-get dist-upgrade
    读取套件清单中... 完成
    了解套件依存关系中... 完成
    筹划升级套件中...完成
    下列的套件都将被【删除】:
      blt-common ettercap-plugins libgdbmg1-dev
    下列的【新】套件都将被安装:
      dictionaries-common ettercap-common .....后面省略.....
    下列的套件都将维持旧版本:
      fontconfig libxft-dev libxft2 libxft2-dbg .....后面省略.....
    下列的套件都将更新:
      apache apache-common apache-utils apache2 .....后面省略.....
    更新 105 个套件,新安装 32 个套件,删除 3 个套件,另不更新 7 个套件。
    需要下载 122MB 的文件。
    解压缩后将消耗 39.6MB 的空间。
    继续运行吗? 是按 [Y] 键,否按 [n] 键 y
    下载:1 ftp://debian.tnc.edu.tw stable/main libc6-dev 2.3.2.ds1-22sarge3 [2535kB]
    下载:2 http://security.debian.org sarge/updates/main login 1:4.0.3-31sarge8 [576kB]
    .....中间省略.....
    读取 122MB 用了 11m47s (172kB/s)
    正在预先设置套件 ...
    (正在读取数据库 ... 系统目前总共安装有 112550 个文件和目录。)
    正预备替换 libc6-dev 2.3.2.ds1-22 (使用 .../libc6-dev_2.3.2.ds1-22sarge3_i386.deb)
    正在解压缩替换的套件档 libc6-dev ...
    .....中间省略.....
    Please *restart* your Apache2 !
    Y/N ?
    y
    .....中间省略.....
    
    [root@linux ~]# apt-get clean
    # 这个动作会将刚刚下载的几个 deb 的套件给他移除!节省硬盘空间!
    
    请记得,那个 update 的参数并不是在进行更新, 而是在进行服务器与用户端的套件表头清单更新而已, 但这个动作相当重要,如果你没有作这个动作的话,你的套件就不会更新了! 在 apt-get update 后,再使用 apt-get dist-upgrade 这样就能够将整个系统给他升级了!很快乐吧!不过,由于我们没有加上『-y』这个参数, 所以在上表当中,我们会老是需要输入一些有的没有的指令, 这样的话,就不适合作为背景的自动升级了!所以,如果你想要在背景以 crontab 的方法自动的帮你升级的话,在 B2D 的环境下使用:
    [root@linux ~]# vi /etc/crontab
    40 5 * * * root /usr/bin/apt-get update && /usr/bin/apt-get -y dist-upgrade
    
    这样每天的凌晨 5:40 就会自动的进行整体升级,而且会主动的克服相依属性的问题喔! 另外,除了完整的将套件给他全部升级之外,我们还可以利用 apt 服务器的功能来进行查找的动作喔! 这个时候就得要 apt-cache 来帮忙了!
    [root@linux ~]# apt-cache [搜索项目]
    参数:
    [搜索项目]:apt-cache 可以搜索 apt 所列出的套件标头数据喔!可用项目有:
    pkgnames:列出本系统上面的所有套件名称!!有点类似 (rpm -qa);
    dump    :列出所有的套件标头以及其相关的相依属性套件!
    search  :后面可接要搜索的字符串,例如 apt-cache search postfix
    show    :后面接套件名称,可以显示出该套件的主要内容的描述!
    showpkg :列出后面所接套件的相依属性以该其套件提供的相关功能!
    depends :可以列出与后面所接套件有相依属性或者是冲突的相关数据!
    
    范例一:找出与 grep  有关的套件
    [root@linux ~]# apt-cache search grep
    .....前面省略.....
    grep - GNU grep, egrep and fgrep
    grep-dctrl - Grep Debian package information
    .....后面省略.....
    
    [root@linux ~]# apt-cache show grep
    Package: grep
    Essential: yes
    Priority: required
    Section: base
    Installed-Size: 660
    Maintainer: Ryan M. Golbeck <rmgolbeck@debian.org>
    Architecture: i386
    Version: 2.5.1.ds1-4
    Provides: rgrep
    Pre-Depends: libc6 (>= 2.3.2.ds1-4)
    Conflicts: rgrep
    Filename: pool/main/g/grep/grep_2.5.1.ds1-4_i386.deb
    Size: 170290
    MD5sum: 68196ad14b098b0eb4b91f4a7cfa8ff2
    Description: GNU grep, egrep and fgrep
     'grep' is a utility to search for text in files; it can be used from the
     command line or in scripts.  Even if you don't want to use it, other packages
     on your system probably will.
    
    [root@linux ~]# apt-cache depends grep
    grep
      特别依存关系: libc6
      冲突: <rgrep>
    
    瞧!利用 apt-cache 就能够找到很多有用的信息!包括利用 show 这个参数也能够将该套件重要的项目给他列出来! 以上面的 grep 这个套件为例, apt-cache 就列出很多例如版本信息、冲突信息 (conflicts) 等等, 尤其是描述 (Description) 的部分,就更可以让用户了解该套件的用途了! ^_^!另外, 那个 depends 则可以特别列出与该套件有冲突或者是相依属性的文件名称!也是个很有帮助的参数喔! 至于如果你想要安装一个套件的话,例如 zlibc 这个套件时,就可以这样做:
    [root@linux ~]# apt-get install zlibc
    
    如同前面提到的,如果你原本的系统并不是使用 apt 来进行在线升级的机制,而你想要使用 apt 的话, 目前很多服务器都有提供相对应版本的升级,其中以 RPM 套件管理的 Red Hat 与 Fedora 最常见! 台湾杨锦昌老师也提供了完整的 APT 教学,您可以看看:
    当然,还是那句老话,除非您的主机上面有专属的软件需要该版本的 distribution 才能运行, 当转成其他版本可能会发生无法运行的困扰时,那你只好使用旧版的 distribution, 并且找到对应的 APT 或 yum 服务器,或者是『你自己创建一个 APT/yum 服务器』来提供自己升级! 比较能够免除一些程序臭虫的困扰。如果没有以上的困扰,那就直接升级到比较新的版本吧! 『比较新的版本不一定比较好,不过,在大部分的情况下, 较新版本对硬件的支持以及安全性方面,都会比较好一些。』但是,如果你的主机明明运作的很好, 短期你也不需要什么新硬件的增加,而且你自己有在注意各个套件的安全性时,那不需要升级也是没有问题的啦!

    重点回顾

    • 由于程序是由人所撰写的,因此程序在运行的过程中难免可能会出现一些安全性的问题或者是程序臭虫的问题。 所以,绝大部分的情况下,将套件保持在最新的版本较能够避免被 cracker 所入侵的问题
    • 绝大部分的自由软件之维护的人员比专属软件还要多,所以程序发生臭虫后的调试与更新时间较快速!!
    • 你不一定要将你的 distribution 更新到最新,不过,更新到最新可以保有较佳的硬件支持与网络安全。
    • 由于 distribution 发展的不同,基本的套件安装可以分为 rpm, dpkg 及 tarball 三种常见模式;
    • 各个 distribution 均有推出自家的在线升级机制,如 CentOS 的 yum, Debian 的 apt, Red Hat 的 up2date 以及 SuSE 的 YOU 等等。各种版本均不可混用。
    • yum 这个升级方案在使用时,会主动的 (1)下载表头数据与 (2)进行用户所需要的更新动作;
    • apt-get 必须要使用 apt-get update 更新表头数据后,才能够进行用户所要求的动作!
    • 在线升级机制常常需要使用到 crontab 的工作调度支持;

    课后练习

    • 请找到您的 distribution 所提供的在线升级机制,立刻进行全部更新的动作。
    • 请前往台湾电脑危机处理小组注册,并取得各项危险通告的电子邮件通知!
    • 在 RPM base 的系统当中,如果升级的套件所含有的设置档在系统当中已经被更动过,则该设置档会如何被安装到系统中?
    • 如果设置档已经被改过,则更新的设置档会被保存成为 *.rpmnew 的扩展名。 并建议用户应该要将旧的设置档备份,然后以新的设置档来进行重新设置。对于该软件的运行稳定性会较佳。
    • 承上题,如何找出系统上面含有被更动过的设置档?以 rpm base 的系统为例?
    • 你可以利用『 locate rpmnew 』来找出已经安装的新版本设置档,并据以处理该数据; 也可以利用 rpm -Va 来观察系统上面所有的已经被更动过的文件数据!
    • 请找出 CentOS 内的 "Development Tools" 相关的数据,如果您尚未安装,请安装他!
    • 利用『 yum grouplist 』找出相关的套件群组,利用『 yum groupinfo "Develop Tools" 』找出该套件是否为您所需要, 最后用『 yum groupinstall "Develop Tools" 』安装即可!
    • 你在进行 CentOS 安装时,选择的是缺省安装,装完毕后才发现没有 gcc 这个编译器。 请问你如何安装 gcc ?
    • 可以使用『 yum search gcc 』找出所需要的套件,然后用『 yum install xxx 』来安装即可!
    修改历史:
    2002/08/02:第一次完成日期!
    2003/06/29:加入自己写的自动更新 RPM 的 bash scripts 功能!
    2003/07/01:重新编写一些内容介绍,此外,由于 Red Hat 6.x 有点老旧了,已经将 up2date 关于 Red Hat 6.x 以前的数据消除了!
    2003/08/22:加入 Mandrake 的 urpmi 以及 APT Client 的设置方法
    2006/08/08:将旧的文章移动到 此处
    2006/08/09:由于已经有这么多的在线升级机制,所以鸟哥自己写的 bash shell 不需要使用的啦!将他取消了!
    2006/08/10:需要付费的 up2date 也取消了,有需要的话请自行前往旧文章处查阅啦!
    2006/08/11:连 Mandriva 所需要的 urpmi 也拿掉了先! ^_^
    2006/09/10:本来 yum 的设置档当中是以义守大学的 FTP 设置为主,改为 CentOS 建议的国码为主!
    2002/08/02以来统计人数

    https://vbird.org.cn is designed by VBird during 2001~2022.