Pages

Wednesday, 18 January 2012

更新OpenBSD Current版本的系统核心和已安装软件包的方法



开始之前,先说下OpenBSD的几个版本以及他们之间的关系。

-release:OpenBSD开发团队每隔六个月推出的版本,通俗意义上的“正式版”。

-stable:稳定版,在“正式版”的基础上打上补丁和进行部分修正的版本。受限于人力和精力,此版本的支持时间为一年,一年后不再进行新的修正。

-current:开发版,“正式版”+补丁+修订+新功能等等,会在几个月后变成新的”正式版“。

可以用下面的图表来形象的表示三个版本之间的关系:

       ,------o-----------o----X                    4.1 Stable
       |      .           .
       |      .    ,------o---------o----X          4.2 Stable
       |      .    |      .         .
       |      .    |      .    ,----o----------o--> 4.3 Stable
       |      .    |      .    |    .          .
       |      .    |      .    |    .    ,-----o--> 4.4 Stable
       |      .    |      .    |    .    |     .
       |      .    |      .    |    .    |     .
 -->4.1Rel----->4.2Rel----->4.3Rel----->4.4Rel---·-> Current

          Time --->



从 上面的版本关系看,使用current版本可以得到最全面的支持和安全保证。但是缺点也很明显,就是要不停的cvs源码,不停的wget软件源 码,make && make install......确保跟踪系统各个部分的变化。另外,使用current版本是得不到”官方“技术支持的,这意味着你要自己解决所有可能出现的 问题。

那么,有没有一种办法可以既跟上官方的步伐,不至于落得太远,又能够保证和官方方向一致,不至于自己一个人落进代码的”黑洞“?最简单的办法是使用OpenBSD FTP里面的snapshots。

再来说说snapshots。其实官方FTP的这个目录里面保存的是current版本某个时间点的”快照“,上图用个红点表示出来了。而且snapshots的更新是比较快的,通常系统核心是3~5天更新一次,packages半月左右更新一次。

当snapshots更新时,该如何跟进呢?

一、系统核心更新

方 法一:你可以只下载bsd.rd这个文件,放在根目录,用它启动,然后选择upgrade,到定位OpenBSD的位置时选择snapshots目录,它 会去下载最新的系统核心文件到你的机器上,然后halt重启即可。这个方法应该是最”官方“的方法,不过如果你管理着几十上百台机器,还不等你这次 upgraded,新的核心又来了。。。那么请你接着往下看。

方法二:

先说思路

其实snapshots中保存的已经是编译好的核心,直接wget下来,覆盖旧的核心文件不就行了吗?就算有几十上百台机器,用其中一台开通FTP或HTTP服务,wget下来,其他机器再来这里wget,速度会更快!

具体步骤这里就不详细讨论了,因为涉及到系统各个部分的更新。原则上更新过的文件需要覆盖,未更新过的则不需要覆盖。OpenBSD从4.4版开始,提供了一个sysmerge工具可以帮助确定/etc目录系统文件的修改,一个示例在:http://www.openbsd.org/faq/upgrade44.html。

另外,一定记得备份/etc目录,因为这个目录太重要了!下面贴段偶自己用的脚本(最近几个月在用):

#!/bin/sh
cd /
rm /bsd.*
rm /*.tgz
wget ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/bsd.*
wget ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/base*.tgz
#此处请加入你自己的备份命令,通常情况下是备份/etc目录。视情况下载etc*.tgz这个文件。若有文件修改则下载,无则不下载。
#wget ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/etc*.tgz
#misc*.tgz貌似没有什么作用,可以不下载。
#wget ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/misc*.tgz
wget ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/man*.tgz
mv /bsd /obsd
mv /bsd.mp /bsd
#备份/etc目录中的所有文件以及你自己手动修改过的文件(软件包中的文件除外)!!!重要!!!
mkdir /var/bakup
cp -rf /etc/* /var/bakup/
tar xzvphf /base*.tgz
# etc*.tgz和misc*.tgz文件若无更新则无须下载,不用解压。
#tar xzvphf /etc*.tgz
#tar xzvphf /misc*.tgz
tar xzvphf /man*.tgz
#这里只是简单的把备份的/etc目录拷贝回去,实际应用中应该考虑此目录中文件更新的情况,对应拷贝。
#cp -rf /var/bakup/* /etc/
/dev/MAKEDEV all
rm /*.tgz
reboot

好了,等系统重启完毕,已经是最新的核心了。几十上百台机器的管理员们,请把上面脚本的地址换成你某个FTP或HTTP服务器的地址,更新会是非常的快!

需要说明的一点是,因为snapshots中的系统核心未经过大范围的验证,所以可能会有各个方面的问题(偶就在一个月中遇到过两次更新后无法启动的情况),请一定在测试系统中验证后再大批量更新!

二、软件包的更新

这个比较简单了,理论上是删掉旧的,安装新的。命令在下面:

export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/packages/i386/
pkg_add -u -F installed -F update -F updatedepends

你可以把上面这两行命令加入/etc/rc.local文件的最前面,系统需要启动的程序放在后面。

这样,系统重启后就会进行update的工作,完成后再启动各个程序,保证系统所有的部分都是最新的!

例如:偶的O.N.M.P.环境,需要开机启动MySQL、PHP-Fastcgi、Nginx,那么/etc/rc.local文件就如同下示:

rdate -n 210.72.145.44
rdate -n 210.72.145.44 >> /var/run/pkgupdate
export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/packages/i386/
pkg_add -u -F installed -F update -F updatedepends >> /var/run/pkgupdate
# Start MySQL
if [ -x /usr/local/bin/mysqld_safe ] ; then
   echo -n 'Starting MySQL...'
   su -c mysql root -c '/usr/local/bin/mysqld_safe >/dev/null 2>&1 &'
   echo "DONE"
fi
# Start php-fastcgi
if [ -x /usr/local/bin/spawn-fcgi ] ; then
   echo -n 'Starting php-fastcgi...'
   /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u www -f /usr/local/bin/php-fastcgi > /var/run/fcgi.pid
   echo "DONE"
fi
# Start nginx
if [ -x /usr/local/sbin/nginx ] ; then
   echo -n 'Starting nginx...'
   /usr/local/sbin/nginx
   echo "DONE"
fi

同理,即便你管理着几十上百台机器,把PKG_PATH设成你某个FTP或HTTP服务器的地址,预先把要用到的packages down下来,从这个机器上进行软件包的update,速度绝对是非常快!

写在最后

其实,偶是因为在虚拟机中无法正常的make userland才逼出这么一个办法,不清楚是否已经有高人使用更好的方法来进行系统的更新了。

说几点需要注意的:

一、 当系统核心更新后,你可以在测试系统上把bsd、bsd.rd、bsd.mp、base*.tgz、etc*.tgz、misc*.tgz、 man*.tgz等文件down下来,在临时目录中解压后和较旧的文件进行对比(主要是文件的MD5值),把有更新的文件找出来,在系统核心更新的脚本文 件中进行处理,以加快批量更新的速度。

二、如果你仔细一些,其实没必要备份整个/etc目录,查找一下,把有单独”印记“的文件备份即可(例如master.passwd文件,hostname.*文件等等),这样可以减少出错的几率。

三、一定一定要在测试系统中测试无误后,再去应用到生产系统!

No comments:

Post a Comment