linux源码包升级程序

71 篇文章 4 订阅
27 篇文章 1 订阅

我们的软件如果进行了数据更新,那么是否需要先把整个软件卸载,然后重新安装呢?
当然不需要,我们只需要下载补丁、打上补丁,重新编译和安装就可以了(不用 ./configured 成新的 Makefile 文件,make 命令也只是重新编译数据),速度回比重新安装一次快得多。
补丁的生成与使用
怎么知道两个软件之间的不同呢?难道需要手工比对两个软件吗?当然不是,Linux 有 diff 命令用来比较两个软件的不同,当然也是利用这个命令生成补丁文件的。那么我们先看看这
个命令的格式:
[root@localhost ~]# diff 选项 old new
#比较old和new文件的不同

选项:
-a:将任何文档当作文本文档处理;
-b:忽略空格造成的不同;
-B:忽略空白行造成的不同;
-I: 忽略大小写造成的不同;
-N:当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件;
-r:当比较目录时,递归比较子目录;
-u:使用同一输出格式;

我们举一个简单的例子,来看看补丁是怎么来的,然后应用一下这个补丁,看看有什么效果
,这样就可以说明补丁的作用了。先写两个文件,命令如下:
[root@localhost ~]# mkdir test
#建立测试目录
[root@localhost ~]# cd test
#进入测试目录
[root@localhost test]# vi old.txt
our
school
is
lampbrother
#文件old.txt,为了便于比较,将每行分开
[root@localhost test]# vi new.txt
our
school
is
lampbrother
in
Beijing
#文件new.txt

比较一下两个文件的不同,并生成补丁文件"txt.patch",命令如下:
[root@localhost test]# diff -Naur /root/test/old.txt /root/test/new.txt > txt. patch
#比较两个文件的不同,同时生成txt.patch补丁文件
[root@localhost test]#vi txt.patch
#查看一下这个文件
–/root/test/old.txt 2012-11-23 05:51:14.347954373 +0800
#前一个文件

/root/test/new.txt 2012-11-23 05:50:05.772988210 +0800
#后一个文件
@@-2, 3+2, 5@@
school
is
lampbrother
+in
+beijing
#后一个文件比前一个文件多两行(用+表示)
既然"new.txt"比"old.txf文件多了两行,那么我们能不能让"old.txt"文件按照补丁文件"txt.patch"进行更新呢?当然可以,使用命令 patch 即可。命令格式如下:
[root@localhost test]# patch -pn < 补丁文件
#按照补丁文件进行更新

选项:
-pn:n为数字。代表按照补丁文件中的路径,指定更新文件的位置;

“-pn"不好理解,我们说明一下。补丁文件是要打入旧文件的,但是你当前所在的目录和补丁文件中记录的目录不一定是匹配的,所以就需要”-pn"选项来同步两个目录。

比如,我当前在"/root/test/“目录中(我要打补丁 的旧文件就在当前目录下),补丁文件中记录的文件目录为”/root/test/dd.txt",
这时如果写入"-p1"(在补丁文件目录中取消一级目录),那么补丁文件就会打入"root/test/root/test/old.txt"文件中,这显然是不对的。那如果写入的是"-p2"(在补丁文件目录中取消二级目录),
那么补丁文件就会打入"/root/test/test/old.txt"文件中,这显然也不对。如果写入的是"-p3"(在补丁文件目录中取消三级目录),那么补丁文件就会打入"/root/test/old.txt文件中,
我们的old.txt文件就在这个目录下,所以应该用"-p3"选项。

如果我的当前所在目录是"/root/“目录呢?
因为补丁文件中记录的文件目录为”/root/test/old.txt",所以这里就应该用"-p2"选项,
代表取消两级目录,补丁打在当前目录下的"test/old.txt"文件上。

大家可以这样理解:"-pn"就是想要在补丁文件中所记录的目录中取消几个"/",n就是几。
去掉目录的目的是和当前所在目录匹配。

那么我们更新一下"old.txt"文件,命令如下:
[root@localhost test]# patch -p3 < txt.patch
patching file old.txt
#给old.txt文件打补丁
[root@localhost test]# cat old.txt
#查看一下dd.txt文件的内容
our
school
is
lampbrother
in
Beijing
#多出了in Beijing两行

注意以下两点:
给旧文件打补丁依赖的不是新文件,而是补丁文件,所以即使文件被删除也没有关系。
补丁文件中记录的目录和你当前所在目录是需要通过"-pn"选项来同步的。
给apache打入补丁
我们再举一个实际的例子。前面章节中我们安装了 httpd-2.2.9 这个版本的程序,在官网上有这个版本的一个补丁"mod_proxy_ftp_CVE-2008-2939.diff",
这个补丁修补了 apache 代理 FTP 站点时,模块空指针引用拒绝服务攻击的漏洞。下面我们来看看如何安装这个补丁。

下载补丁文件

把补丁文件复制到 apache 源码包解压目录中
[root@localhost ~]# cp mod_proxy_ftp_CVE-2008-2939.diff httpd-2.2.9

打入补丁
[root@localhost ~]# cd httpd-2.2.9
#进入apache源码目录
[root@localhost httpd-2.2.9]# vi mod_proxy_ftp_CVE-2008-2939.diff
#查看补丁文件
–modules/proxy/mod_proxy_ftp.c (Revision 682869)

modules/proxy/mod_proxy_ftp.c (Revision 682870)
…省略部分输出…
#查看一下补丁文件中记录的目录,以便一会儿和当前所在目录同步
[root@localhost httpd-2.2.9]# patch - p0 < mod_proxy_ftp_CVE-2008-2939.diff
#打入补丁
为什么是"-p0"呢?因为我当前在"/root/httpd-2.2.9"目录中,
但是补丁文件中记录的目录是"modules/proxy/mod_proxy_ftp.c",
这就在我当前所在目录中,一个"/“都不需要去掉,所以是”-p0"。

重新编译
[root@localhost httpd-2.2.9]# make

重新安装
[root@localhost httpd-2.2.9]# make install

打补丁的方法会比重新安装少了"./configure"步骤,而且编译时也只是编译变化的地方,
所以编译速度也更快。但是如果没有安装过 httpd-2.2.9,就需要先打入补丁,再依次执行"./configure" “make” "make install"命令。

如果我不想要补丁中的内容呢?可以恢复吗?当然可以,命令如下:
[root@localhost httpd-2.2.9]# patch -R < modjDroxy_ftp_CVE-2008-2939.diff

选项:
-R:还原补丁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值