本文来自
http://onmp.cublog.cn,欢迎转载!
开始之前,先说下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目录系统文件的修改,一个示例在:。
另外,一定记得备份/etc目录,因为这个目录太重要了!下面贴段偶自己用的脚本(最近几个月在用):
#!/bin/shcd /rm /bsd.*rm /*.tgzwget 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*.tgzwget ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/man*.tgzmv /bsd /obsdmv /bsd.mp /bsd#备份/etc目录中的所有文件以及你自己手动修改过的文件(软件包中的文件除外)!!!重要!!!mkdir /var/bakupcp -rf /etc/* /var/bakup/tar xzvphf /base*.tgz# etc*.tgz和misc*.tgz文件若无更新则无须下载,不用解压。
#tar xzvphf /etc*.tgz#tar xzvphf /misc*.tgztar xzvphf /man*.tgz#这里只是简单的把备份的/etc目录拷贝回去,实际应用中应该考虑此目录中文件更新的情况,对应拷贝。
#cp -rf /var/bakup/* /etc//dev/MAKEDEV allrm /*.tgzreboot
好了,等系统重启完毕,已经是最新的核心了。几十上百台机器的管理员们,请把上面脚本的地址换成你某个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.*文件等等),这样可以减少出错的几率。
三、一定一定要在测试系统中测试无误后再去应用到生产系统!
参考资料:
OpenBSD FAQ:
OpenBSD Upgrade Guide:
阅读(30460) | 评论(4) | 转发(0) |