由于学习的需求,我在一台FreeBSD服务器上做着各种的尝试。之前FreeBSD的版本升级都需要重新编译内核源代码,那是一个我认为并不繁琐而且很有乐趣的过程,但是最大的缺陷在于最终的更新文件需要跑到机房在服务器连接的显示器跟前进行,无法通过SSH远程来完成。自从有了freebsd-update这个实用的工具之后,我就可以在自己的电脑跟前完成这些操作了。
FreeBSD最新的手册(适用于6.4-RELEASE 和 FreeBSD 7.2-RELEASE)第24章 更新与升级 FreeBSD,已经给出了关于使用freebsd-update进行升级的指导。
记得 7.0-RELEASE 刚发布时,官方的文档说明了freebsd-update不适用于修改过内核的系统升级,这台服务器的系统是从6.1-RELEASE一路编译升级到7.0-RELEASE,修改过内核,为了使用freebsd-update工具,我又使用GENERIC(默认)内核重新编译了一次系统,从7.0-RELEASE开始的安全更新全部是使用的freebsd-update工具进行。7.1-RELEASE发布时,我也尝试过”#freebsd-update -r 7.1-RELEASE upgrade“,一直是到fetch第二部分文件时失败,一直没有找到原因。到09年8月份,我试着再次更新。
我更喜欢用portsnap来更新ports,并且设定好了root用户cron:
0 2 * * * portsnap -I cron update && pkg_version - vIL=
每两小时更新一次,但操作升级系统前我还是执行了一次:
portsnap fetch update
#接着执行系统的更新:
freebsd-update -r 7.2-RELEASE upgrade
对于定制过内核的系统,会收到类似下面的警告:
WARNING: This system is running a “MYKERNEL” kernel, which is not a
kernel configuration distributed as part of FreeBSD 7.0-RELEASE.
This kernel will not be updated: you MUST update the kernel manually
before running “/usr/sbin/freebsd-update install”
看来我当初做的使用默认内核重新编译系统内核并没有成功地让系统”认为“我使用的是默认内核。
暂时安全地无视这个警告。 更新的 GENERIC 内核将在升级过程的中间步骤中使用。
在下载完针对本地系统的补丁之后, 这些补丁会被应用到系统上。这个过程需要消耗的时间取决于机器的速度和其负载。这个过程中将会对配置文件所做的变动进行自动合并 ── 不能自动合并的部分需要用户的参与,屏幕上会给出一个编辑器, 用于手工编辑配置文件以完成合并操作。在处理过程中,合并成功的结果会显示给用户。 失败或被忽略的合并, 则会导致这一过程的终止。
The following file could not be merged automatically: /etc/mail/freebsd.cf
Press Enter to edit this file in vi and resolve the conflicts
manually…
看到这个消息后直接进入了vi 编辑器,如果不需要修改这些文件,直接保存退出即可;如需改动则改动后保存退出。
一旦这个步骤完成后,使用如下的命令将升级后的文件安装到磁盘上。
freebsd-update install
内核和内核模块会首先被打上补丁。 此时必须重新启动计算机。如果您使用的是定制的内核, 请使用 nextboot 命令来将下一次用于引导系统的内核 /boot/GENERIC (它会被更新):
nextboot -k GENERIC
警告: 在使用 GENERIC 内核启动之前,请确信它包含了用于引导系统所需的全部驱动程序 (如果您是在远程进行升级操作,还应确信网卡驱动也是存在的)。 特别要注意的情形是,如果之前的内核中静态联编了通常以内核模块形式存在的驱动程序, 一定要通过 /boot/loader.conf 机制来将这些模块加载到 GENERIC 内核的基础上。 此外, 您可能也希望临时取消不重要的服务、磁盘和网络挂载等等, 直到升级过程完成为止。
现在可以用更新后的内核引导系统了:
shutdown -r now
在系统重新上线后,需要再次运行 freebsd-update。升级的状态被保存着,这样 freebsd-update 就无需重头开始,但是会删除所有旧的共享库和目标文件。 执行如下命令继续这个阶段的升级:
freebsd-update install
对于次版本升级,如7.0-RELEASE升级到7.2-RELEASE,是不需要重新编译和安装第三方软件。但对于主版本升级,交互界面一般会给出提示让你重新编译升级所有的第三方软件。于是执行以下命令:
screen
# 由于编译升级全部软件的过程比较长,用screen工具执行命令,确保在突然断线等问题后重新连接并恢复到控制台,如果断开后重新连接,输入 screen -r 可恢复。
portupgrade -f ruby
rm /var/db/pkg/pkgdb.db
portupgrade -f ruby18-bdb
rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db
portupgrade -af
完成以后,再最后一次运行 freebsd-update 来结束升级过程。
freebsd-update install
”如果您临时用过 GENERIC 内核来引导系统,现在是按照通常的方法重新联编并安装新的定制内核的时候了。“
由于手册上没有详细说明定制内核该如何安装,因此我按手册的操作步骤来执行。
”重新启动机器进入新版本的 FreeBSD 升级过程至此就完成了。“
重启后发发现版本号还是 FreeBSD 7.0-RELEASE p7。无奈之余我从”freebsd-update -r 7.2-RELEASE upgrade“开始重新执行了一次,到”# nextboot -k GENERIC“的步骤直接使用”shutdown -r now“重启服务器,接着执行下面的步骤,这才得到了下面的结果:
uname -a
FreeBSD phpstone.com 7.2-RELEASE-p2 FreeBSD 7.2-RELEASE-p2 #0: Wed Jun 24 00:57:44 UTC 2009 root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386