如何更新FreeBSD系统

-- delphij [2004-08-12 20:40:59]

1. 更新FreeBSD系统

本文主要介绍如何更新已经装好的FreeBSD系统,包括cvsup的使用,简单的make buildworld/kernel/installworld,以及portaudit和portupgade的简单使用。

1.1. 如何更新FreeBSD系统

1.1.1. cvsup介绍

cvsup是John Polstra所编写的用于方便地分发cvs代码库的应用程序。许多BSD系统都采用cvsup来同步代码。本章将介绍 cvsup 的安装和基本使用。

1.1.1.1. cvsup概述

cvs采用一种称作rcs(一种更古老的版本控制系统)格式的文件来保存代码的变更。rcs文件的名字通常是foo.c,v。这些文件中包含了文件的*所有*版本、修改的内容,等等。

cvsup能够高效率地分发这些修改,它包含两种运行模式——checkout模式和镜像模式。前者通常用于一般的客户机更新系统。

cvsup是一种用于分发cvs代码库的工具,它和cvs是两回事。

1.1.1.2. FreeBSD中的版本分支(branch)

FreeBSD的开发过程中,会在代码库中使用不同的branch和tag来标记版本。这里解释如下:

对于src,RELENG_n代表n.x的-STABLE版本,目前,最新的STABLE版本是4.x-STABLE,表示为RELENG_4;HEAD(.)表示最新的-CURRENT版本,目前这个版本是5.2-CURRENT。此外,还有一类分支,类似RELENG_y_z表示y.z.x-releases-pxx称为“安全分支”。它通常只包括自上次releases之后的涉及安全和对可靠性有严重影响的版本。例如,RELENG_4_8表示4.8-releases的最新的“安全”版本。releases版本的维护时间通常是1-2年,目前,FreeBSD官方支持的版本是4.8-releases(RELENG_4_8)、4.9-releases(RELENG_4_9)、4.10-releases(RELENG_4_10)、5.2/5.2.1-releases(RELENG_5_2)。

ports没有严格的分支概念,所有版本的FreeBSD都使用同一版本的ports,即其HEAD(.)。

1.1.1.3. cvsup的collection

有时,cvs代码库本身可能包含了太多的东西,而我们只希望拿到其中的一部分。管理员可以配置被称作“collection”的集合来包括代码库中的某一部分,例如,对于FreeBSD来说,常用的collection包括src-all(基本系统,包括内核以及全部userland的程序的源代码)、src-sys(仅限于内核的部分)、ports-all(全部ports collection)等等。

1.1.1.4. cvsup的支持文件

为了能够高效地完成更新,cvsup需要采用少量(每个collection一个)文件统一地记录更新的文件。这些文件包括了文件的修改时间、校验和等信息,cvsup的检测线程会向服务器提交这些数据,并完成更新。

1.1.1.5. supfile

为了开始使用cvsup,首先需要一个supfile来描述需要同步什么。

*default host=cvsup2.FreeBSDChina.org # cvsup服务器 
*default base=/var/db # cvsup支持文件的位置
*default prefix=/usr # 文件放到哪里
*default releases=cvs tag=. # FreeBSD-CURRENT(branch=.,即HEAD)
*default delete use-rel-suffix # 删除cvsup创建的,业已在cvs中删除掉的文件
src-all # 全部FreeBSD源代码
ports-all tag=. # 全部的ports。这里的tag=.用于取代默认的branch。如果使用RELENG_4请务必保留tag=. !!

1.1.1.6. 使用cvsup

使用cvsup非常简单:

cvsup -gL2 stable-supfile # stable-supfile是我的supfile的名字

-gL2的具体意义请参考cvsup(1)。

1.2. 安装建议

本章将给出安装FreeBSD的建议。

1.2.1. 安装系统时使用最小化安装

最小化安装(minimal)包括了运行FreeBSD所需要的全部文件。这包括完整的编译系统、安全系统(ssh, openssl等等),而不包括类似xorg这样的累赘。需要的时候,类似KDE这样的程序可以用pkg_add -r安装,具体请参考pkg_add(1)。

1.2.2. 只安装源代码,而不安装ports文件

通常运行的系统中的FreeBSD是releases,并按对应的安全分支跟进,因此,代码不会改动很多。但ports tree的修改则几乎是每天都在活跃地进行。安装ports collection的结果是系统将不得不大量地翻新文件,测试证明,这样做要比直接cvsup得到整个ports tree慢。

1.2.3. 安装disc3或手工安装cvsup-without-gui

这样做的好处非常明显。cvsup的图形界面很少用到,而默认的(disc1)附带的版本则需要x11,这在很多时候是不需要的。我通常并不安装它,相反,在安装完成之后,以root身份执行下面的命令:

pkg_add -r cvsup-without-gui && rehash

有时,您使用的FreeBSD可能太旧,此时,可以从pointyhat上下载,网址是:

ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-4-stable/Latest/cvsup-without-gui.tgz 
ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-current/Latest/cvsup-without-gui.tbz

分别对应4.x和5.x版本。下载之后,用pkg_add安装即可。

1.3. 你说那么多,我就想知道怎么更新系统

1.3.1. cvsup

1.3.1.1. 初次安装cvsup

pkg_delete cvsup\* && pkg_add -r cvsup-without-gui && rehash 警告:上述命令将删除任何已经存在的cvsup安装。

1.3.1.2. 建立一个合适的supfile

如果只更新ports,可以直接使用下面的supfile

*default host=cvsup2.FreeBSDChina.org 
*default base=/var/db
*default prefix=/usr
*default releases=cvs tag=.
*default delete use-rel-suffix
ports-all

如果只更新src,可以直接使用下面的supfile

*default host=cvsup2.FreeBSDChina.org 
*default base=/var/db
*default prefix=/usr
*default releases=cvs tag= # 希望使用的branch名字,例如RELENG_4_10, RELENG_4_8, RELENG_5_2
*default delete use-rel-suffix
src-all

假如想同时更新两个,那就改下面的supfile:

*default host=cvsup2.FreeBSDChina.org 
*default base=/var/db
*default prefix=/usr
*default releases=cvs tag= # 希望使用的branch名字,例如RELENG_4_10, RELENG_4_8, RELENG_5_2
*default delete use-rel-suffix
src-all
ports-all tag=.

1.3.1.3. 运行cvsup

将supfile保存成一个文件,例如,my-supfile,然后执行:

cvsup -gL2 my-supfile

  • 多加的参数意思是:

如果您没有运行 X11 或者不喜欢 GUI, 当您运行 cvsup 的时候需要在命令行添加 两个选项:

# cvsup -g -L 2 supfile

-g 告诉 CVSup 不要使用 GUI。如果您 没在运行 X11 这个是自动的,否则您必须指定它。

-L 2 告诉 CVSup 输出所有正在升级的文件的细节。 有三个等级可以选择,从 -L 0 到 -L 2。默认是 0,意味着除了错误消息 什么都不输出。

  • 更多参数意义找 cvsup 的手册吧
  • 不过值得注意的是 # cvsup -sgL2 supfile

    • 多的 s 参数是要求 cvsup 进行增量同步,以减少网路压力

    • 所以第一次进行时不能加哪!

在中国的网络中升级ports树,使用cvsup 的技巧:

  1. 当然要先安装 cvsup 本身
  2. 创立干净的支持文件

    #/usr/share/examples/cvsup/ports-supfile-cn
    *default host=CHANGE_THIS.FreeBSD.org
    *default base=/var/db
    *default prefix=/usr
    *default release=cvs tag=.
    *default delete use-rel-suffix
    ports-all
    
  3. 运行!

    cvsup -gL2 /usr/share/examples/cvsup/ports-supfile-cn -h cvsup{,2-6}.cn.freebsd.org
    

注意:: 不用加-s,要求全部下载!

1.3.2. 升级基本系统

同步了src-all之后,如果发现自己的系统的patch版本和/usr/src/sys/conf/newvers.conf中的不同,应考虑立即升级。由于采用的是同一版本的安全分支,可以非常大胆地用make buildworld kernel installworld升级;如果releases不同,请务必阅读/usr/src/UPDATING;如果用的是STABLE或CURRENT……那个,你还需要这个作弊条么……

在/usr/src中执行下面的命令: make buildworld kernel installworld

然后重新启动。如果你定制了内核,例如它的配置名为MYKERNEL,则: make KERNCONF=MYKERNEL buildworld kernel installworld

1.3.3. 关于ports的升级

升级 ports 树:

cvsup -sgL2 /usr/share/examples/cvsup/ports-supfile -h cvsup{,2-6}.cn.freebsd.org

  • FreeBSD 6.0 中,可以使用 portsnap 工具!

1.3.3.1. Best Practice: 用portaudit监控系统的ports漏洞情况

所有的事情都会由portaudit搞定,你要做的只是安装portaudit和收信,首先同步ports tree,然后

cd /usr/ports/security/portaudit && make all install clean && rehash 
portaudit -Fda

注意:如果系统中的OpenSSL版本太旧,portaudit会拒绝安装。发生此种情况时,请考虑升级基本系统。尽管在同步代码之后采用下面的命令 cd /usr/src/secure && make depend all install 足以让portaudit继续安装,但升级整个系统通常更为保险。

portaudit每天夜间会自动执行一次,更新其漏洞数据库,检查系统,并作为安全报告发送给root。

1.3.3.2. 推荐采用 portupgrade

portupgrade是一个用ruby写的小程序,用于简化port升级。 cd /usr/ports/sysutils && make all install clean && rehash

通常的用法有两个,一个是portupgrade port名字,另一个是portupgrade -iar。前者升级某个具体的port,后者会提示并更新所有的port。当然,做之前要先升级ports tree,也是通过cvsup来完成。

1.3.4. 关于升级的注意事项

新手往往喜欢升级来尝试新功能,但对于服务器来说,这样做往往是不可行,因为升级可能会引入新问题。通常,在没有经过测试的情况下,使用portaudit监视并接收其邮件是一个不错的注意,一旦portaudit开始抱怨,则应立即升级相应的port。