在前面介绍如何进行套件的升级c;这是很重要的喔!那假如我是以 Tarball 来进行某个套件的安装c;那么是否当我要升级这个套件时c;就得要下载这个套件的完整全新的 Tarball 呢?举个例子来说c;鸟哥有个讨论区在 http://phorum.vbird.org 这个网址c;这个讨论区是以 phpBB 这个套件来架设的c;而鸟哥的讨论区版本为 phpbb2.0.1.tar.gz c;目前( 2004/04/10 )最新释出的版本则是phpbb2.0.8.tar.gz 。那我是否需要下载全新的 phpbb2.0.8.tar.gz 这个档案来更新原本的旧程序呢?
事实上c;当我们发现一些套件的漏洞c;通常是某一段程序代码写的不好所致。因此c;所谓的『更新原始码』常常是只有更改部分档案的小部分内容而已。既然 如此的话c;那么我们是否可以就那些被更动的档案来进行修改可以咯?也就是说c;旧版本到新版本间没有更动过的档案就不要理他c;仅将有修订过的档案部分来处 理即可。这有什么好处呢?首先c;没有更动过的档案的目标文件( objectclass="tags" href="/tags/FILE.html" title=file>file )根本就不需要重新编译c;而且有更动过的档案又可以利用 make 来自动 update ( 更新 )c;如此一来c;呵呵!我们原先的设定( makeclass="tags" href="/tags/FILE.html" title=file>file 档案里面的规则 )将需要重新改写或侦测!呵呵!可以节省很多宝贵的时间呢( 例如后续章节会提到的核心的编译! )
从上面的说明当中c;我们可以发现c;如果可以将旧版的原始码数据改写成新版的版本c;那么就能直接编译了c;而不需要将全部的新版 Tarball 重新下载一次呢!可以节省频宽与时间说!那么如何改写原始码?难道要我们一个档案一个档案去参考然后修订吗?当然没有这么没人性!我们在正规表示法的时候有提到一个比对两个档案的指令c;那就是 diff c;这个指令可以将『两个档案之间的差异性列出来』呢!那我们也知道新旧版本的档案之间c;其实只有修改一些程序而已c;那么我们可以透过diff 比对出新旧版本之间的文字差异c;然后再以相关的指令来将旧版的档案更新吗?!呵呵!当然可以啦!那就是 class="tags" href="/tags/PATCH.html" title=patch>patch 这个指令啦!很多的套件开发商在更新了原始码之后c;几乎都会释出所谓的class="tags" href="/tags/PATCH.html" title=patch>patch class="tags" href="/tags/FILE.html" title=file>filec;也就是直接将原始码 update 而已的一个方式喔!我们底下以一个简单的范例来说明给您了解喔!
假设我们有两个档案c;分别是 exclass="tags" href="/tags/PATCH.html" title=patch>patch.old 与 exclass="tags" href="/tags/PATCH.html" title=patch>patch.new c;他们的内容是这样的:
[guest@test guest]# vi exclass="tags" href="/tags/PATCH.html" title=patch>patch.old
echo "check your postfix's body and class="tags" href="/tags/HEADER.html" title=header>header drop settings"
echo "postmap -q - regexp:class="tags" href="/tags/HEADER.html" title=header>header_checks < class="tags" href="/tags/HEADER.html" title=header>header_checks"
postmap -q - regexp:class="tags" href="/tags/HEADER.html" title=header>header_checks < class="tags" href="/tags/HEADER.html" title=header>header_checks
echo "postmap -q - regexp:body_checks < body_checks"
postmap -q - regexp:body_checks < body_checks
[guest@test guest]# vi exclass="tags" href="/tags/PATCH.html" title=patch>patch.new
echo "check your postfix's body and class="tags" href="/tags/HEADER.html" title=header>header drop settings"
echo "postmap -q - regexp:class="tags" href="/tags/HEADER.html" title=header>header_checks < class="tags" href="/tags/HEADER.html" title=header>header_checks This's right"
postmap -q - regexp:class="tags" href="/tags/HEADER.html" title=header>header_checks < class="tags" href="/tags/HEADER.html" title=header>header_checks
echo "postmap -q - regexp:body_checks < body_checks This's right"
postmap -q - regexp:body_checks < body_checks
两个档案的不同点在于:
[guest@test guest]# diff exclass="tags" href="/tags/PATCH.html" title=patch>patch.old exclass="tags" href="/tags/PATCH.html" title=patch>patch.new
2c2
< echo "postmap -q - regexp:class="tags" href="/tags/HEADER.html" title=header>header_checks < class="tags" href="/tags/HEADER.html" title=header>header_checks"
---
> echo "postmap -q - regexp:class="tags" href="/tags/HEADER.html" title=header>header_checks < class="tags" href="/tags/HEADER.html" title=header>header_checks This's right"
4c4
< echo "postmap -q - regexp:body_checks < body_checks"
---
> echo "postmap -q - regexp:body_checks < body_checks This's right"
上面显示出两个档案的不同点c;详细的意义请参考正规表示法那个章节的介绍。 好了c;假如我以『diff -c exclass="tags" href="/tags/PATCH.html" title=patch>patch.old exclass="tags" href="/tags/PATCH.html" title=patch>patch.new 』以及上面显示的信息c;做成一个档案c;内容是这样的:
[guest@test guest]# vi exclass="tags" href="/tags/PATCH.html" title=patch>patch.class="tags" href="/tags/PATCH.html" title=patch>patch
*** exclass="tags" href="/tags/PATCH.html" title=patch>patch.old 2004-04-09 14:22:49.000000000 +0800
--- exclass="tags" href="/tags/PATCH.html" title=patch>patch.new 2004-04-09 14:23:18.000000000 +0800
2c2
< echo "postmap -q - regexp:class="tags" href="/tags/HEADER.html" title=header>header_checks < class="tags" href="/tags/HEADER.html" title=header>header_checks"
---
> echo "postmap -q - regexp:class="tags" href="/tags/HEADER.html" title=header>header_checks < class="tags" href="/tags/HEADER.html" title=header>header_checks This's right"
4c4
< echo "postmap -q - regexp:body_checks < body_checks"
---
> echo "postmap -q - regexp:body_checks < body_checks This's right"
注意到c;这个档案的第一行显示出旧版本的文件名c;而第二行则为新版本的档名与时间c;第三行以后则是两个档案的差异性。那么我们将以 class="tags" href="/tags/PATCH.html" title=patch>patch 来进行更新c;将 exclass="tags" href="/tags/PATCH.html" title=patch>patch.old 更新到 exclass="tags" href="/tags/PATCH.html" title=patch>patch.new 看看。class="tags" href="/tags/PATCH.html" title=patch>patch 的基本语法是这样的:
class="tags" href="/tags/PATCH.html" title=patch>patch -p数字 < class="tags" href="/tags/PATCH.html" title=patch>patch_class="tags" href="/tags/FILE.html" title=file>file
特别留意那个 -p数字c;那是与 class="tags" href="/tags/PATCH.html" title=patch>patch_class="tags" href="/tags/FILE.html" title=file>file 里面列出的文件名有关的信息。假如在 class="tags" href="/tags/PATCH.html" title=patch>patch_class="tags" href="/tags/FILE.html" title=file>file 第一行写的是这样:
*** /home/guest/example/exclass="tags" href="/tags/PATCH.html" title=patch>patch.old
那么当我下达『 class="tags" href="/tags/PATCH.html" title=patch>patch -p0 < class="tags" href="/tags/PATCH.html" title=patch>patch_class="tags" href="/tags/FILE.html" title=file>file 』时c;则更新的档案是『 /home/guest/example/exclass="tags" href="/tags/PATCH.html" title=patch>patch.old
』c;如果『 class="tags" href="/tags/PATCH.html" title=patch>patch -p1 < class="tags" href="/tags/PATCH.html" title=patch>patch_class="tags" href="/tags/FILE.html" title=file>file』c;则更新的档案为『home/guest/example/exclass="tags" href="/tags/PATCH.html" title=patch>patch.od』c;如果
『class="tags" href="/tags/PATCH.html" title=patch>patch -p4 < class="tags" href="/tags/PATCH.html" title=patch>patch_class="tags" href="/tags/FILE.html" title=file>file』则更新『exclass="tags" href="/tags/PATCH.html" title=patch>patch.old』c;也就是说c; -pxx 那个 xx 代表『拿掉几个斜线(/)』
的意思!这样可以理解了吗?!好了c;那么我要开始来更新我的 exclass="tags" href="/tags/PATCH.html" title=patch>patch.old 了c;可以这样搞定:
[guest@test guest]# class="tags" href="/tags/PATCH.html" title=patch>patch -p0 < exclass="tags" href="/tags/PATCH.html" title=patch>patch.class="tags" href="/tags/PATCH.html" title=patch>patch
# 注意喔c;这个时候我的class="tags" href="/tags/GongZuo.html" title=工作>工作目录底下会存在 exclass="tags" href="/tags/PATCH.html" title=patch>patch.old 才对!
# 然后立刻察看一下c;您会发觉c; exclass="tags" href="/tags/PATCH.html" title=patch>patch.new 与 exclass="tags" href="/tags/PATCH.html" title=patch>patch.old 变成一模一样的了!很容易了解吧!上面三个档案您可以在底下的网址取得:
http://linux.vbird.org/download/books/basic/source_code/exclass="tags" href="/tags/PATCH.html" title=patch>patch.tgz加油的啦!另外c;如果您是以 class="tags" href="/tags/PATCH.html" title=patch>patch 更新原始码c;那么记得c;您可能必须要重新编译c;并且重新install 才算成功更新喔!并不是 class="tags" href="/tags/PATCH.html" title=patch>patch 就好了!因为 class="tags" href="/tags/PATCH.html" title=patch>patch 的功能主要仅只是更新原始码档案而已!
切记切记!