kk Blog —— 通用基础

date [-d @int|str] [+%s|"+%F %T"]

patch / git patch

1、diff

1
diff [options] from-file to-file  

简单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。语法格式:diff 【选项】 源文件(夹) 目的文件(夹),就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。下面介绍三个最为常用选项:

-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。
-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。
-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些

2、patch

1
2
3
patch [options] [originalfile [patchfile]]
but usually just
patch -pnum <patchfile>

简单的说,patch就是利用diff制作的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下面介绍几个最常用选项:

-p0 选项要从当前目录查找目的文件(夹)
-p1 选项要忽略掉第一层目录,从当前目录开始查找。


在这里以实例说明:

1
2
--- old/modules/pcitable       Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable       Tue Dec 19 20:05:41 2000

如果使用参数-p0,那就表示从当前目录找一个叫做old的文件夹,在它下面寻找modules下的pcitable文件来执行patch操作。
如果使用参数-p1, 那就表示忽略第一层目录(即不管old),从当前目录寻找modules的文件夹,在它下面找pcitable。这样的前提是当前目 录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝 对路径。不过我一般习惯用相对路径。

-E 选项说明如果发现了空文件,那么就删除它
-R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

单个文件

1
2
3
diff –uN from-file to-file >to-file.patch
patch –p0 < to-file.patch
patch –RE –p0 < to-file.patch

目录

1
2
3
diff –uNr from-docu to-docu >to-docu.patch
patch –p1 < to-docu.patch
patch –R –p1 <to-docu.patch

git diff或者其他UNIX的diff命令生成patch的过程:

1
2
3
git diff  > patch
git diff  --cached > patch
git diff  branchname --cached > patch

这个时候当前目录下就会有一个patch文件,这是一个非git环境也可以使用的patch。对于这种patch,在git上使用要用git apply命令,如下:

1
git apply patch

由于这是一个类似UNIX下更新文件的操作,所以执行完上述操作之后,实际上是等于手动修改了文件,还要做一些git commit之类的操作。git apply 是一个事务性操作的命令,也就是说,要么所有补丁都打上去,要么全部放弃。可以先用git apply –check 查看补丁是否能够干净顺利地应用到当前分支中:git apply –check patch,如果执行完该命令之后没有任何输出,表示我们可以顺利采纳该补丁,接下来就是git上的提交了。

git format-patch生成的补丁,这是git专用的。常用命令如下:
1. 两个节点之间的提交: git format-patch 节点A 节点B
2. 单个节点: git format-patch -1 节点A (-n就表示要生成几个节点的提交)
3. 最近一次提交节点的patch :git format-patch HEAD^ 依次类推……

使用git format-patch命令生成的patch文件,包含了提交的附加信息:比如作者,时间等。再次基础上使用git am命令即可将此补丁应用到当前分支。注意应用完之后,你会发现当前分支多了一次提交记录,并且有完整的信息,而不是简单的修改文件。在对比一下,git diff 和git format-patch生成的patch一个重要不同之处,实际使用中会发现git diff一次只会生成一个patch文件,不管差别了多少个提交,都是一个;而git format-patch是根据提交的节点来的,一个节点一个patch。

git两种patch的比较:

兼容性:很明显,git diff生成的Patch兼容性强。如果你在修改的代码的官方版本库不是Git管理的版本库,那么你必须使用git diff生成的patch才能让你的代码被项目的维护人接受。

除错功能:对于git diff生成的patch,你可以用git apply –check 查看补丁是否能够干净顺利地应用到当前分支中;如果git format-patch 生成的补丁不能打到当前分支,git am会给出提示,并协助你完成打补丁工作,你也可以使用git am -3进行三方合并,详细的做法可以参考git手册或者《Progit》。从这一点上看,两者除错功能都很强。

版本库信息:由于git format-patch生成的补丁中含有这个补丁开发者的名字,因此在应用补丁时,这个名字会被记录进版本库,显然,这样做是恰当的。因此,目前使用Git的开源社区往往建议大家使用format-patch生成补丁。

修改、重新生成和安装src.rpm源码包

RHEL/CentOS/Fedora/Suse等Linux发行版都使用rpm包作为软件包格式。另外还有一个相关的格式srpm包(后缀是.src.rpm),它包含了源代码,可以用它重新生成rpm包。
当前最新发行的RHEL/CentOS是6.X版本。目前最新版是RHEL6.5/CentOS6.5。(CentOS是RHEL的免费版本,与RHEL对应版本完全等价,除了去掉了Redhat的LOGO。)
在如下地址,可以找到RHEL6的所有rpm包的源码包:.src.rpm。
http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/
CentOS就是使用这些
src.rpm源码包构建出所有RPM包,生成CentOS操作系统的。
*src.rpm源码包解压出来后,可以看到有该软件的源代码压缩包和一些patch文件。
如果rpm包有问题,我们可以去http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/下载对应的src.rpm包,然后把它解开后修改源代码,重新编译和生成rpm包,进行分发和安装。

直接安装*src.rpm源码包

有时,我们没有找到可用的rpm包,但找到了其对应的src.rpm源码包,此时我们可以安装这个src.rpm源码包。步骤与直接安装rpm包很不相同。

1
rpm -i /tmp/mypackage-1.0.0-1.src.rpm

此时还没有安装完成。只是在~/rpmbuild/ 目录下准备了该src.rpm源码包的资源,可用于进一步生成rpm包。

1
2
[user@host ~]$ cd ~/rpmbuild/SPECS
[user@host SPECS]$ rpmbuild -ba mypackage.spec

你也可以直接使用如下命令:

1
rpmbuild --rebuild /tmp/mypackage-1.0.0-1.src.rpm

这个命令一步即可在~/rpmbuild/RPMS/目录下重新生成rpm包。
基于*src.rpm源码包修改代码后生成rpm包并安装
rpmbuild命令基于.spec文件和源码tar.gz及patch文件生成src.rpm和rpm包。
因此,我们只需要修改.spec文件,或者对应的源码和patch文件,然后再执行

1
rpmbuild -ba mypackage.spec

命令,就可以生成更新后的src.rpm包和rpm包。rpm包在~/rpmbuild/RPMS目录下,
src.rpm包在~/rpmbuild/SRPMS目录下。注意,要修改~/rpmbuild/SOURCES/目录下的文件:
1. 你可以重新打包~/rpmbuild/SOURCES/目录下的tar.gz源文件。
2. 你可以修改.spec文件,增加或者减少对patch的应用。

grubby edit centos grub args

In Debian/Ubuntu, grub.cfg is fully generated by scripts and any manual changes made to it will be clobbered. In RHEL/CentOS however, grub.cfg is modified by scripts but manual changes are persisted, and is actually the canonical location for certain settings.

The tool which manages grub.cfg is grubby, which is called by /sbin/new-kernel-pkg when kernels are installed or removed. The –copy-default parameter is passed to grubby when a new kernel is installed, which causes it to copy the kernel parameters from the current default kernel. Setting the default kernel parameters for future-installed kernels is therefore done by editing the entry for the default kernel in grub.cfg.

If you weren’t automating this you could simply edit grub.cfg manually and change all the current kernel entries. However, you can use grubby to modify grub.cfg in order to avoid parsing it or writing regular expressions. For example, this will remove the rhgb and quiet parameters from the specified kernel version.

1
$ grubby --update-kernel=/boot/vmlinuz-2.6.32-220.13.1.el6.x86_64 --remove-args="rhgb quiet"

There doesn’t seem to be an option to list the currently configured kernels however, so you’ll have to discover these another way. One option is to just look for vmlinuz files in /boot/:

1
2
3
4
#!/bin/sh
for KERNEL in /boot/vmlinuz-*; do
	grubby --update-kernel="$KERNEL" --remove-args="rhgb quiet"
done

grub

在命令行状态,可以根据需要加载或移除相应模块,也可用来启动在菜单没有显现的的系统。 比如,在第一硬盘的第一分区上装有windows xp系统,但在菜单上没显示出来,我们可以命令行状态下输入命令启动:

1
2
3
grub>set root=(hd0,1)
grub>chainloader +1
grub>boot

又比如启动第二硬盘第一逻辑分区上的ubuntu系统:

1
2
3
4
grub>set root=(hd1,5)
grub>linux /boot/vmlinuz-xxx-xxx root=/dev/sdb5
grub>initrd /boot/initrd.img-xxx-xxx
grub>boot

其中内核vmlinuz和initrd.img的版本号可用按Tab键自动查看。

\r\n,\n,\r简介

‘\r'是回车,前者使光标到行首,(carriage return)
’\n'是换行,后者使光标下移一格,(line feed)

\r 是回车,return
\n 是换行,newline

^M 是ascii中的'\r', 回车符,是16进制的0x0D,八进制的015,十进制的13
^M在vi编辑器中可以使用Ctrl+ v + m三个键打出来

对于换行这个动作,unix下一般只有一个0x0A表示换行(“\n”),windows下一般都是0x0D和0x0A两个字符(“\r\n”),苹果机(MAC OS系统)则采用回车符CR表示下一行(\r)

Unix系统里,每行结尾只有“<换行>”,即“\n”;
Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;
Mac系统里,每行结尾是“<回车>”,即“\r”。

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾会多车一个M字符。 Dos和windows采用回车+换行CR/LF表示下一行,即M$($不是换行符的表示,换行符没有表示出来,$是文本结束EOF的表示) 而UNIX/Linux采用换行符LF表示下一行,即\n
苹果机(MAC OS系统)则采用回车符CR表示下一行,即\r

CR用符号'\r'表示, 十进制ASCII代码是13, 十六进制代码为0x0D;
LF使用'\n'符号表示, ASCII代码是10, 十六制为0x0A. 所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.

由于dos风格的换行使用\r\n,把这样的文件上传到unix,有些版本的vi不能识别\r,所以vi显示时在行尾会出现M出来,但是有些就能识别\r\n,正常显示回车换行。

dos to unix,去掉M

1
2
tr -d "\015" <myfile.txt > myfile_new.txt
tr -d "\r" <myfile.txt > myfile_new.txt