如果你对新打的补丁不很满意,而你想回复到以前较早的内核版本去,那么我们从上面描述的第6步开始逆顺序操作即可(为什么要采取撤消补丁的方式来回到先前版本的理由很多,我们就不说了):
a) 将内核源代码的版本恢复到先前的名字:
mv linux-2.4.5kh3 linux-2.4.5kh2
b) 执行那条奇妙的patch命令:
patch -RE -p0 < patch-2.4.5kh3
这里,-E选项说明如果发现了空文件,那么就删除它;-R选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本,但是这里是否一定要先更改源代码的目录名我还不明确,需要作实验)。
这里有一个疑问,就是为什么要进行代码目录的改名?
*****************************************************************************
避免make distclean操作
*****************************************************************************
根据文档/usr/src/linux/Documentation/SubmittingPatches所描述的,运行一个没有make distclean的递归diff,使用如下命令:
diff -ruN -X dontdiff linux-2.4.5kh2 linux-2.4.5kh3 > patch.diff
dontdiff是一个可执行文件,它可以从下面这个网址进行下载:
但是,就我而言,我还是不知道为什么要这么做,或者说不进行make distclean的目的是什么。如果有那位朋友知道的话,非常感谢你告诉我一声,或者是把这部分内容补充到这份文档中。
制作一个官方的补丁文件
你已经安装了一个新的Linux,我们称它为Linux-2.4.2。但是差不多每个月,都会有新的Linux补丁推出,这些补丁或者修补了一些问题,或者支持了一些新的硬件或其它新的特性。所以,当你安装了Linux-2.4.2几个月以后,就会有新的稳定发行版推出,我们称它为Linux-2.4.5。
我们将要描述的过程解释了你如何最简便的将自己的Linux从2.4.2升级为最新的2.4.5。
关键的窍门在于使用一系列的补丁文件。
*****************************************************************************
第0步:理解官方的Linux补丁文件是如何制作的。
*****************************************************************************
每一个官方的Linux补丁文件都是一个使用diff工具在两个连续的Linux版本中所有文件间产生的diff文件。
作为一个例子,我们假定这个补丁文件是用来将Linux-2.4.2升级到Linux-2.4.5的,这个补丁文件通过如下方法获得:
cd /usr/src/linux-2.4.2
make distclean
cd /usr/src/linux-2.4.3
make distclean
ln -s linux-2.4.2 linux
diff -ruN linux linux-2.4.3 > patch_2.4.3
gzip patch_2.4.3
这些补丁文件按照顺序使用gzip压缩,以节省Linux发行版本站点的下载时间。例如我们生成的补丁文件——patch_2.4.3.gz,就是一个经过压缩的补丁文件。
Linux官方补丁总是认为缺省的源代码子树名字为“Linux”。这种方法可能有点混淆,但是它允许一些(版本)连续的补丁不用修改源代码子树的名字就可以连续的被修改到源代码子树上。(下面我们可以看到)
这些补丁文件的名字都是标准的:
patch_2.4.3 记录着linux-2.4.3 和 linux-2.4.2之间的版本差异。
patch_2.4.4 记录着linux-2.4.4 and linux-2.4.3之间的版本差异。
patch_2.4.5 记录着linux-2.4.5 and linux-2.4.4之间的版本差异。
在我们的例子中,我们正好需要这3个补丁文件,他们的名字是patch_2.4.3.gz、patch_2.4.4.gz和patch_2.4.5.gz,用来将Linux-2.4.2升级到Linux-2.4.5。
*****************************************************************************
第1步:升级Linux源代码目录的名字和Linux符号连接。
*****************************************************************************
假定内核源代码的路径是:/usr/src/linux-2.4.2/
并且所有需要的压缩补丁文件都已经存放在目录/usr/src 中了。
执行下列命令:
cd /usr/src
mv linux-2.4.2 linux-2.4.5
rm linux
ln -s linux-2.4.5 linux
*****************************************************************************
第2步:清理源代码目录(删除中间目标文件和配置文件)。
*****************************************************************************
执行下列命令:
cd linux
make distclean
*****************************************************************************
第3步:解压缩补丁文件。
*****************************************************************************
in our example, execute:
cd /usr/src
gunzip patch-2.4.3.gz
gunzip patch-2.4.4.gz
gunzip patch-2.4.5.gz
*****************************************************************************
第4步:重复执行patch命令。
*****************************************************************************
执行下列命令:
for i in 3 4 5; do
patch -p0 < patch_2-4.$i
done
其中
patch -p0 < patchfile
命令作用在输入的补丁文件上,并将对应的老版本的内核源代码中所有的文件和子目录升级到对应的新版本(在我们的例子中,老版本的内核源代码目录是/usr/src/linux)。在我们的例子中,旧的内核源代码版本是Linux-2.4.5kh2。这里参数–p0用来保证文件名不被改变(既不被修改,也不被删除)。
目标目录是Linux,就是说旧版本的内核源代码经过patch以后,就被升级成了新版本的内核源代码。