【任务描述】
目标:fdisk -l只输出物理磁盘的分区信息,过滤掉逻辑卷(如果有的话)的信息。
步骤:
1、查看源码包
# rpm -qf `which fdisk` #查看fdisk命令属于哪个安装包。
util-linux-ng-2.17.2-12.4.el6.x86_64
2、下载源码包
去上文提供的站点下载util-linux-ng的源码包
3、安装源码包
# rpm -ivh util-linux-ng-2.17.2-12.4.el6.src.rpm
4、分析
此源码包内包含许多补丁,执行rpmbuild -ba util-linux-ng.spec时,第一步会将这些补丁打上。我以前修改源码包,直接将源代码减压出来,编辑完源代码后打包,最后rpmbuild -ba *.spec搞定的,但是这个源码包不允许这么做,原因就是“打补丁”的过程。不熟悉diff和patch指令及原理的话,请网上搜索一下,或者移步:http://blog.sina.com.cn/s/blog_6ccfa4f30100t6r1.html。
打补丁过程,必须让补丁能识别待升级的文件。如果将待升级文件内容改变,打补丁肯定失败。必须遵守此源码包的规则,通过打补丁的方式需改源代码。
5、打上源代码中的补丁
# rpmbuild -bp util-linux-ng.spec # 打上所有以存在的补丁
打好补丁的源代码都在rpmbuild/BUILD/util-linux-ng-2.17.2中。我只需要fdisk的代码。
6、复制fdisk文件夹
# cd /root
# mkdir a b
# cp -r rpmbuild/BUILD/util-linux-ng-2.17.2/fdisk /root/a
# cp -r rpmbuild/BUILD/util-linux-ng-2.17.2/fdisk /root/b
7、编辑源代码
进入b/fdisk目录,修改其中的fdisk.c,内容略。
8、生成补丁
# diff a b >util-linux-ng-2.17.2-fdisk-show.patch
将此补丁包移到rpmbuild/SOURCES/目录,与其他补丁包放在一起。
9、修改util-linux-ng.spec
贴出spec文件的patch吧:
点击(此处)折叠或打开
-
# diff -Nura util-linux-ng.spec.orig
util-linux-ng.spec.last -
--- util-linux-ng.spec.orig
2011-09-16 02:13:34.000000000 -0400 -
+++ util-linux-ng.spec.last
2012-09-04 11:46:20.903129742 -0400 -
@@ -219,6 +219,8
@@ -
Patch59: util-linux-ng-2.17-mount-mtab.patch
-
# CVE-2011-1677 - umount may fail to remove /etc/mtab~ lock
file [#738789] -
Patch60: util-linux-ng-2.17-umount-mtab.patch
-
+# Custom - don't
show the logical volume's name when execute 'fdisk -l' -
+Patch61: util-linux-ng-2.17-fdisk-show.patch
-
-
-
%description
-
@@ -369,6 +371,7
@@ -
%patch58 -p1
-
%patch59 -p1
-
%patch60 -p1
-
+%patch61 -p1
-
-
%build
- unset LINGUAS || :
10、生成rpm包
rpmbuild -ba util-linux-ng.spec
完成后去rpmbuild/SRPMS路径获取新的源码包,去rpmbuild/RPMS路径获取二进制包。
【补充】
util-linux-ng-2.17.2-fdisk-show.patch补丁的首三行:
点击(此处)折叠或打开
-
diff -Nura a/fdisk/fdisk.c
b/fdisk/fdisk.c -
--- a/fdisk/fdisk.c
2012-09-04 10:30:49.979129304 -0400 -
+++ b/fdisk/fdisk.c
2012-09-04 10:34:15.974133102 -0400
由于spec文件对补丁包提供“-p1”的参数,打补丁的时候忽略第一层路径,即a/路径被忽略,补丁直接查找本目录下fdisk目录中的fdisk.c文件,找到后打上补丁。