核心的小幅更新是以修补档的方式发行 例如,如果你的版本是 1.1.45 ,
而且你注意到出现了一个 `patch46.gz
' 可以用来升级它,
这代表你可以藉由使用这个修补档将版本升级到 1.1.46
你也许会想要先备份源程序(`make clean
' 然后 `cd /usr/src; tar zcvf old-tree.tar.gz linux
' 将会为你造出一份 tar 压缩档,里面就是整个源程序与其文档架构)
现在接著继续上面的例子,假设你已经取得了 `patch46.gz
' 并放在 /usr/src
下
cd
到 /usr/src
然后执行 `zcat patch46.gz | patch -p0
' (如果并不是压缩过的修补档,那么就执行 `patch -p0 < patch46
'),
你将会看到许多东西飞逝而过(或是慢慢跳过,如果你的电脑真的很慢的话)告诉你它正试著修补程序,以及是否成功
通常,这个过程快得无法仔细看清楚它的动作,所以你会无法确定它到底有没有成功地执行
所以你可能会想在 patch
指令中加上 -s
选项,告诉 patch
程序只报告错误信息就好
(这样你就不会得到许多``嗨! 我的电脑正在做某些改变!''的感觉,不过你可能宁愿这样…)
那么就得找找看一些可能不是那么顺利的事 cd
到 /usr/src/linux
并找寻档名结尾为 .rej
的文档
某些版本的 patch
(比较旧的版本,它们可能是在比较早期的文档系统上编译的)会把这些没有成功的操作记录在档名有 #
的文档里
你可以用 `find
' 来替你找;
find . -name '*.rej' -print会将现行目录及子目录下所有具
.rej
结尾的档名印到标准输出
如果一切正确无误的话,执行第三节跟第四节所讨论的 `make clean
',`config
' 以及 `dep
'
关于 patch
指令另外还有一些选项 如前所述,patch -s
将会抑制除了错误以外的所有其他信息
如果你把核心源程序放在 /usr/src/linux
以外的地方,在该目录下用 patch -p1
也可以乾净俐落的执行修补任务
其它的 patch
选项在线上手册(man page)里都有很详细的描述
(注意: 本节提到的大部份是指旧版的核心)
通常最常发生的问题是当 patch
修改一个叫做 `config.in
' 的文档时,这个文档看起来不怎么对劲,
因为你修改了一些选项来配合你的机器 这个问题已经小心的注意过了,但还是可能有人会在较旧的版本上遭遇这个问题
要修正这个问题的话,查看 config.in.rej
这个文档里留下些什么信息
有修改过的部份正常来说会在每一行开始的地方标上 `+
' 和 `-
'
查看有标记的附近几行,然后记得它们是设成 `y
' 或是 `n
'
现在编辑 config.in
档,然后在适当的地
方把 `y
' 改成 `n
' 以及 `n
' 改成 `y
' 执行
patch -p0 < config.in.rej如果成功的话(没有错误),那么你就可以继续配置与编译的工作 这个
config.in.rej
档还是会留在那里,但是你可以砍掉它
如果你仍然遭遇其它问题,那么可能是你安装了一份损坏的修补档
如果 patch 显示 `previously applied patch detected: Assume -R?
',
你可能使用了一些比你目前的版本编号还低的修补档; 如果你回答 `y
',它会尝试将你的程序码降级,而且几乎一定会失败;
如此,你就需要重新取得一份新的源程序
要还原到修补前的状态的话,在原先的修补档上执行 `patch -R
'
当修补档真的失败的时候,最好的办法是从一个乾净的源程序(例如从 linux-x.x.x.tar.gz 文档其中之一)开始,再重新执行
只要做过几次修补以后,哪些 .orig
的文档将会开始堆积
例如,我的一个 1.1.51 版的程序码最后一次做清扫是在 1.1.48 版(我想是吧)
删除这些 .orig
文档会节省许多的磁盘空间
find . -name '*.orig' -exec rm -f {} ';'将会替你照料这件事 某些版本的
patch
会用 ~ 来代替 .orig
有其它更好的的办法可砍掉这些 .orig
档,就是利用 GNU 的 xargs
:
find . -name '*.orig' | xargs rm或是更安全但有些啰嗦的方法:
find . -name '*.orig' -print0 | xargs --null rm --
有一些并不是由 Linus 发行的其它修补档出现(我将称之为``非标准的'') 如果你使用了它们,Linus 的修补档可能会而无法正确地执行, 那么你不是得将它们还原就是得因此而去修改源程序或是修补档 这个工作对初学者通常是很讨厌, 所以如果你不想去修改源程序(结果通常不大好),在使用 Linus 的修补档之前先还原这些非标准的修补档,或重新安装新的程序码 然后试试这非标准的修补档能不能用 如果不能的话,那么要不你就继续使用旧的核心, 试著修改修补档使其能用,要不就等待(可能是乞求)新版非标准修补档出现
非标准的修补档有多普遍? 你有可能曾经听过它们 我使用 Bill Paul 的不闪烁修补档来修改我的虚拟控制台,因为我讨厌会闪烁的游标(这个修补档经常为新版核心而更新) 由于大部份较新的设备驱动程序都已经被发展成可载入模块形式,因此许多非标准的修补档的重要性已逐渐降低