|
楼主 |
发表于 2009-6-6 13:10:26
|
显示全部楼层
为什么说changelog不是用来获得当前需要更新包的好参照呢,请看下面这一段从changelog中截取的片段:
- a/kernel-modules-2.6.29.4-i486-1.tgz: Upgraded to Linux 2.6.29.4 modules.
- a/kernel-modules-smp-2.6.29.4_smp-i686-1.tgz:
- Upgraded to Linux 2.6.29.4 modules.
- ap/vim-7.2.191-i486-1.txz: Patched vimrc to add the option
- 'set backupskip+=/var/spool/cron/*', which should fix the problems with
- using vim with "crontab -e". Note that if a global vimrc already exists
- the new one will be installed as vimrc.new and must be moved into place.
- Thanks to Rodrigo Bistolfi for the patch.
- d/gettext-tools-0.17-i486-3.txz: Recompiled against libgcj.
- d/kernel-headers-2.6.29.4_smp-x86-1.tgz: Upgraded to Linux 2.6.29.4 headers.
- k/kernel-source-2.6.29.4_smp-noarch-1.tgz: Upgraded to Linux 2.6.29.4 source.
- xap/MPlayer-r29328-i486-1.txz: Upgraded to MPlayer-r29328.
- xap/vim-gvim-7.2.191-i486-1.txz: Recompiled.
- xap/xine-lib-1.1.16.3-i486-3.txz: Recompiled.
- extra/linux-2.6.29.4-nosmp-sdk/: Regenerated SMP to no-SMP kernel source patch.
- isolinux/initrd.img: Rebuilt with newly compiled kernel modules.
- kernels/*: Rebuilt.
复制代码
当然,它是有模式的,而且我们可以用这种模式来过滤出自己需要的东西,只是你要考虑太多的东西,比如关键词有“Recompiled”、“Patched”、“Upgraded”等等,甚至冒号后它还换行!
再让我们搜索一下“xap/vim-gvim”,嗯,有四个地方都有,所以你不仅在过滤时要考虑位置,关键词,还有次数或时间。
事情还可以变得更奇怪,当我是在2008年底安装current的话,changlog要怎样过滤呢?是整个文件都过滤,还是过滤到2008年底为止?我相信应该是没什么关系的,可是电脑不是用来从事这种有技巧的工作的,它更喜欢的是格式化,重复化。
让我们来看看FILE_LIST,我认为它是“ls -lR”命令的输出,所以这里的格式是很清楚的,
- -rw-r--r-- 1 root root 197 2008-12-03 01:13 ./a/aaa_base-12.2.0-noarch-1.txz.asc
- -rw-r--r-- 1 root root 568 2009-04-02 00:24 ./a/aaa_elflibs-12.34-i486-1.txt
- -rw-r--r-- 1 root root 3697036 2009-04-02 00:24 ./a/aaa_elflibs-12.34-i486-1.txz
- -rw-r--r-- 1 root root 197 2009-04-02 00:24 ./a/aaa_elflibs-12.34-i486-1.txz.asc
- -rw-r--r-- 1 root root 505 2009-02-21 23:24 ./a/aaa_terminfo-5.7-noarch-1.txt
- -rw-r--r-- 1 root root 42164 2009-02-21 23:24 ./a/aaa_terminfo-5.7-noarch-1.txz
- -rw-r--r-- 1 root root 197 2009-02-21 23:24 ./a/aaa_terminfo-5.7-noarch-1.txz.asc
- -rw-r--r-- 1 root root 365 2008-04-01 04:59 ./a/acl-2.2.47_1-i486-1.txt
- -rw-r--r-- 1 root root 128964 2008-04-01 04:59 ./a/acl-2.2.47_1-i486-1.txz
- -rw-r--r-- 1 root root 197 2008-04-01 04:59 ./a/acl-2.2.47_1-i486-1.txz.asc
复制代码
所有的文件名都在行的第8个域结尾是txz的,并且每个包的名字只出现一次,这个包的版本只要和自己机器上的不一样,就是需要更新的包,逻辑就是这么简单,而且其原理同rsync是一模一样的。
rsync的问题是它要有硬盘上放了所有的包之后才能工作,占地方太多,当然现在的硬盘不缺这点空间,但要是我想在随便什么地方的电脑上都来同步下载更新的包呢?比如我要是有几十台机器组成的网络,其中有的机器还不是一直开机的,这样就无法与别的机器一起更新,比方说a1-a5已经更新到最新的包,但是a6请病假,一周没来,a8出差半个月,等他们回来开机,怎么知道到底该向这些机器提供哪些被他们错过的更新?
所以下次难道我要在这些机器上每台都搞个current树的副本?
因此我提供这样的解决方案,下载当前服务器上的文件列表,和本地机器上的文件列表对照,这个过程现在一眨眼就完成,输出所有有待更新的包的下载地址,然后随便在什么系统,什么地方,用随便什么下载软件都可以下载。
当然,changelog还是有用的,毕竟我的机器上还有许多自己编译的包,所以要移除官方的包,还是过滤changelog最有效,那个“Removed.”还是够独一无二的。 |
|