## 21.4 Tarball 的管理与建议
在我们知道了源代码的相关信息之后,再来要了解的自然就是如何使用具有源代码的 Tarball 来创建一个属于自己的软件啰!从前面几个小节的说明当中,我们晓得其实 Tarball 的安装是可以跨平台的,因为 C 语言的程序码在各个平台上面是可以共通的, 只是需要的编译器可能并不相同而已。例如 Linux 上面用 gcc 而 Windows 上面也有相关的 C 编译器啊~所以呢,同样的一组源代码,既可以在 CentOS Linux 上面编译,也可以在 SuSE Linux 上面编译,当然,也可以在大部分的 Unix 平台上面编译成功的!
如果万一没有编译成功怎么办?很简单啊,通过修改小部分的程序码 (通常是因为很小部分的异动而已) 就可以进行跨平台的移植了!也就是说,刚刚我们在 Linux 下面写的程序“理论上,是可以在 Windows 上面编译的!”这就是源代码的好处啦!所以说,如果朋友们想要学习程序语言的话, 鸟哥个人是比较建议学习“具有跨平台能力的程序语言”,例如 C 就是很不错的一个!
唉啊!又扯远了~赶紧拉回来继续说明我们的 Tarball 啦!
### 21.4.1 使用源代码管理软件所需要的基础软件
从源代码的说明我们晓得要制作一个 binary program 需要很多咚咚的呢!这包括下面这些基础的软件:
* gcc 或 cc 等 C 语言编译器 (compiler):
没有编译器怎么进行编译的动作?所以 C compiler 是一定要有的。不过 Linux 上面有众多的编译器,其中当然以 GNU 的 gcc 是首选的自由软件编译器啰!事实上很多在 Linux 平台上面发展的软件的源代码,原本就是以 gcc 为底来设计的呢。
* make 及 autoconfig 等软件:
一般来说,以 Tarball 方式释出的软件当中,为了简化编译的流程,通常都是配合前几个小节提到的 make 这个指令来依据目标文件的相依性而进行编译。但是我们也知道说 make 需要 makefile 这个文件的规则,那由于不同的系统里面可能具有的基础软件环境并不相同, 所以就需要侦测使用者的作业环境,好自行创建一个 makefile 文件。这个自行侦测的小程序也必须要借由 autoconfig 这个相关的软件来辅助才行。
* 需要 Kernel 提供的 Library 以及相关的 Include 文件:
从前面的源代码编译过程,我们晓得函数库 (library) 的重要性,同时也晓得有 include 文件的存在。很多的软件在发展的时候都是直接取用系统核心提供的函数库与 include 文件的,这样才可以与这个操作系统相容啊!尤其是在“驱动程序方面的模块 ”,例如网卡、声卡、USB 等驱动程序在安装的时候,常常是需要核心提供的相关信息的。在 Red Hat 的系统当中 (包含 Fedora/CentOS 等系列) ,这个核心相关的功能通常都是被包含在 kernel-source 或 kernel-header 这些软件名称当中,所以记得要安装这些软件喔!
虽然 Tarball 的安装上面相当的简单,如同我们前面几个小节的例子,只要顺着开发商提供的 README 与 INSTALL 文件所载明的步骤来进行,安装是很容易的。但是我们却还是常常会在 BBS 或者是新闻群组当中发现这些留言:“我在执行某个程序的侦测文件时,他都会告诉我没有 gcc 这个软件,这是怎么回事?”还有:“我没有办法使用 make 耶!这是什么问题?”呵呵! 这就是没有安装上面提到的那些基础软件啦!
咦!为什么使用者不安装这些软件啊?这是因为目前的 Linux distribution 大多已经偏向于桌面电脑的使用 (非服务器端),他们希望使用者能够按照厂商自己的希望来安装相关的软件即可, 所以通常“默认”是没有安装 gcc 或者是 make 等软件的。所以啦,如果你希望未来可以自行安装一些以 Tarball 方式释出的软件时,记得请自行挑选想要安装的软件名称喔!例如在 CentOS 或者是 Red Hat 当中记得选择 Development Tools 以及 Kernel Source Development 等相关字眼的软件群集呢。
那万一我已经安装好一部 Linux 主机,但是使用的是默认值所安装的软件,所以没有 make, gcc 等咚咚,该如何是好?呵呵!问题其实不大啦,目前使用最广泛的 CentOS/Fedora 或者是 Red Hat 大多是以 RPM (下一章会介绍) 来安装软件的,所以,你只要拿出当初安装 Linux 时的原版光盘,然后以下一章介绍的 RPM 来一个一个的加入到你的 Linux 主机里面就好啦!很简单的啦! 尤其现在又有 yum 这玩意儿,更方便呐!
在 CentOS 当中,如果你已经有网络可以连上 Internet 的话,那么就可以使用下一章会谈到的 yum 啰! 通过 yum 的软件群组安装功能,你可以这样做:
* 如果是要安装 gcc 等软件发展工具,请使用“ yum groupinstall "Development Tools" ”
* 若待安装的软件需要图形接口支持,一般还需要“ yum groupinstall "X Software Development" ”
* 若安装的软件较旧,可能需要“ yum groupinstall "Legacy Software Development" ”
大概就是这样,更多的信息请参考下一章的介绍喔。
### 21.4.2 Tarball 安装的基本步骤
我们提过以 Tarball 方式释出的软件是需要重新编译可执行的 binary program 的。而 Tarball 是以 tar 这个指令来打包与压缩的文件,所以啦,当然就需要先将 Tarball 解压缩,然后到源代码所在的目录下进行 makefile 的创建,再以 make 来进行编译与安装的动作啊!所以整个安装的基础动作大多是这样的:
1. 取得原始文件:将 tarball 文件在 /usr/local/src 目录下解压缩;
2. 取得步骤流程:进入新创建的目录下面,去查阅 INSTALL 与 README 等相关文件内容 (很重要的步骤!);
3. 相依属性软件安装:根据 INSTALL/README 的内容察看并安装好一些相依的软件 (非必要);
4. 创建 makefile:以自动侦测程序 (configure 或 config) 侦测作业环境,并创建 Makefile 这个文件;
5. 编译:以 make 这个程序并使用该目录下的 Makefile 做为他的参数配置文件,来进行 make (编译或其他) 的动作;
6. 安装:以 make 这个程序,并以 Makefile 这个参数配置文件,依据 install 这个标的 (target) 的指定来安装到正确的路径!
注意到上面的第二个步骤,通常在每个软件在释出的时候,都会附上 INSTALL 或者是 README 这种文件名的说明文档,这些说明文档请“确实详细的” 阅读过一遍,通常这些文件会记录这个软件的安装要求、软件的工作项目、 与软件的安装参数设置及技巧等,只要仔细的读完这些文件,基本上,要安装好 tarball 的文件,都不会有什么大问题啰。
至于 makefile 在制作出来之后,里头会有相当多的标的 (target),最常见的就是 install 与 clean 啰!通常“make clean”代表着将目标文件 (object file) 清除掉,“make”则是将源代码进行编译而已。 注意喔!编译完成的可可执行文件与相关的配置文件还在源代码所在的目录当中喔!因此,最后要进行“make install”来将编译完成的所有咚咚都给他安装到正确的路径去,这样就可以使用该软件啦!
OK!我们下面约略提一下大部分的 tarball 软件之安装的指令下达方式:
1. ./configure
这个步骤就是在创建 Makefile 这个文件啰!通常程序开发者会写一支 scripts 来检查你的 Linux 系统、相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装信息都是这一步骤内完成的!另外,这个步骤的相关信息应该要参考一下该目录下的 README 或 INSTALL 相关的文件!
2. make clean
make 会读取 Makefile 中关于 clean 的工作。这个步骤不一定会有,但是希望执行一下,因为他可以去除目标文件!因为谁也不确定源代码里面到底有没有包含上次编译过的目标文件 (*.o) 存在,所以当然还是清除一下比较妥当的。 至少等一下新编译出来的可执行文件我们可以确定是使用自己的机器所编译完成的嘛!
3. make
make 会依据 Makefile 当中的默认工作进行编译的行为!编译的工作主要是进行 gcc 来将源代码编译成为可以被执行的 object files ,但是这些 object files 通常还需要一些函数库之类的 link 后,才能产生一个完整的可执行文件!使用 make 就是要将源代码编译成为可以被执行的可可执行文件,而这个可可执行文件会放置在目前所在的目录之下, 尚未被安装到预定安装的目录中;
4. make install
通常这就是最后的安装步骤了,make 会依据 Makefile 这个文件里面关于 install 的项目,将上一个步骤所编译完成的数据给他安装到预定的目录中,就完成安装啦!
请注意,上面的步骤是一步一步来进行的,而其中只要一个步骤无法成功,那么后续的步骤就完全没有办法进行的! 因此,要确定每一的步骤都是成功的才可以!举个例子来说,万一今天你在 ./configure 就不成功了,那么就表示 Makefile 无法被创建起来,要知道,后面的步骤都是根据 Makefile 来进行的,既然无法创建 Makefile,后续的步骤当然无法成功啰!
另外,如果在 make 无法成功的话,那就表示原始文件无法被编译成可可执行文件,那么 make install 主要是将编译完成的文件给他放置到文件系统中的,既然都没有可用的可执行文件了,怎么进行安装? 所以啰,要每一个步骤都正确无误才能往下继续做!此外,如果安装成功, 并且是安装在独立的一个目录中,例如 /usr/local/packages 这个目录中好了,那么你就必需手动的将这个软件的 man page 给他写入 /etc/man_db.conf 里面去。
### 21.4.3 一般 Tarball 软件安装的建议事项 (如何移除?升级?)
或许你已经发现了也说不定,那就是为什么前一个小节里面, Tarball 要在 /usr/local/src 里面解压缩呢?基本上,在默认的情况下,原本的 Linux distribution 释出安装的软件大多是在 /usr 里面的,而使用者自行安装的软件则建议放置在 /usr/local 里面。这是考虑到管理使用者所安装软件的便利性。
怎么说呢?我们晓得几乎每个软件都会提供线上说明的服务,那就是 info 与 man 的功能。在默认的情况下, man 会去搜寻 /usr/local/man 里面的说明文档, 因此,如果我们将软件安装在 /usr/local 下面的话,那么自然安装完成之后, 该软件的说明文档就可以被找到了。此外,如果你所管理的主机其实是由多人共同管理的, 或者是如同学校里面,一部主机是由学生管理的,但是学生总会毕业吧? 所以需要进行交接,如果大家都将软件安装在 /usr/local 下面,那么管理上不就显的特别的容易吗!
所以啰,通常我们会建议大家将自己安装的软件放置在 /usr/local 下,至于源代码 (Tarball)则建议放置在 /usr/local/src (src 为 source 的缩写)下面啊。
再来,让我们先来看一看 Linux distribution 默认的安装软件的路径会用到哪些?我们以 apache 这个软件来说明的话 (apache 是 WWW 服务器软件,详细的数据请参考[服务器架设篇](http://linux.vbird.org/linux_server/0360apache.php)。你的系统不见得有装这个软件):
* /etc/httpd
* /usr/lib
* /usr/bin
* /usr/share/man
我们会发现软件的内容大致上是摆在 etc, lib, bin, man 等目录当中,分别代表“配置文件、函数库、可执行文件、线上说明文档”。 好了,那么你是以 tarball 来安装时呢?如果是放在默认的 /usr/local 里面,由于 /usr/local 原本就默认这几个目录了,所以你的数据就会被放在:
* /usr/local/etc
* /usr/local/bin
* /usr/local/lib
* /usr/local/man
但是如果你每个软件都选择在这个默认的路径下安装的话, 那么所有的软件的文件都将放置在这四个目录当中,因此,如果你都安装在这个目录下的话, 那么未来再想要升级或移除的时候,就会比较难以追查文件的来源啰! 而如果你在安装的时候选择的是单独的目录,例如我将 apache 安装在 /usr/local/apache 当中,那么你的文件目录就会变成:
* /usr/local/apache/etc
* /usr/local/apache/bin
* /usr/local/apache/lib
* /usr/local/apache/man
呵呵!单一软件的文件都在同一个目录之下,那么要移除该软件就简单的多了! 只要将该目录移除即可视为该软件已经被移除啰!以上面为例,我想要移除 apache 只要下达“rm -rf /usr/local/apache” 就算移除这个软件啦!当然啰,实际安装的时候还是得视该软件的 Makefile 里头的 install 信息才能知道到底他的安装情况为何的。因为例如 sendmail 的安装就很麻烦......
这个方式虽然有利于软件的移除,但不晓得你有没有发现,我们在执行某些指令的时候,与该指令是否在 PATH 这个环境变量所记录的路径有关,以上面为例,我的 /usr/local/apache/bin 肯定是不在 PATH 里面的,所以执行 apache 的指令就得要利用绝对路径了,否则就得将这个 /usr/local/apache/bin 加入 PATH 里面。另外,那个 /usr/local/apache/man 也需要加入 man page 搜寻的路径当中啊!
除此之外, Tarball 在升级的时候也是挺困扰的,怎么说呢?我们还是以 apache 来说明好了。WWW 服务器为了考虑互动性,所以通常会将 PHP+MySQL+Apache 一起安装起来 (详细的信息请参考服务器架设篇) ,果真如此的话,那么每个软件在安装的时候“都有一定的顺序与程序!” 因为他们三者之间具有相关性,所以安装时必需要三者同时考虑到他们的函数库与相关的编译参数。
假设今天我只要升级 PHP 呢?有的时候因为只有涉及动态函数库的升级,那么我只要升级 PHP 即可!其他的部分或许影响不大。但是如果今天 PHP 需要重新编译的模块比较多,那么可能会连带的,连 Apache 这个程序也需要重新编译过才行!真是有点给他头痛的!没办法啦!使用 tarball 确实有他的优点啦,但是在这方面,确实也有他一定的伤脑筋程度。
由于 Tarball 在升级与安装上面具有这些特色,亦即 Tarball 在反安装上面具有比较高的难度 (如果你没有好好规划的话~),所以,为了方便 Tarball 的管理,通常鸟哥会这样建议使用者:
1. 最好将 tarball 的原始数据解压缩到 /usr/local/src 当中;
2. 安装时,最好安装到 /usr/local 这个默认路径下;
3. 考虑未来的反安装步骤,最好可以将每个软件单独的安装在 /usr/local 下面;
4. 为安装到单独目录的软件之 man page 加入 man path 搜寻:
如果你安装的软件放置到 /usr/local/software/ ,那么 man page 搜寻的设置中,可能就得要在 /etc/man_db.conf 内的 40~50 行左右处,写入如下的一行:
> MANPATH_MAP /usr/local/software/bin /usr/local/software/man
这样才可以使用 man 来查询该软件的线上文件啰!
![鸟哥的图示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鸟哥的图示")
**Tips** 时至今日,老实说,真的不太需要有 tarball 的安装了!CentOS/Fedora 有个 RPM 补遗计划,就是俗称的 EPEL 计划,相关网址说明如下: [https://fedoraproject.org/wiki/EPEL](https://fedoraproject.org/wiki/EPEL)~一般学界会用到的软件都在里头~ 除非你要用的软件是专属软件 (要钱的) 或者是比较冷门的软件,否则都有好心的网友帮我们打包好了啦! ^_^
### 21.4.4 一个简单的范例、利用 ntp 来示范
读万卷书不如行万里路啊!所以当然我们就来给他测试看看,看你是否真的了解了如何利用 Tarball 来安装软件呢?我们利用时间服务器 (network time protocol) ntp 这个软件来测试安装看看。先请到 [http://www.ntp.org/downloads.html](http://www.ntp.org/downloads.html) 这个目录去下载文件,请下载最新版本的文件即可。或者直接到鸟哥的网站下载 2015/06 公告释出的稳定版本:
> [http://linux.vbird.org/linux_basic/0520source/ntp-4.2.8p3.tar.gz](http://linux.vbird.org/linux_basic/0520source/ntp-4.2.8p3.tar.gz)
假设我对这个软件的要求是这样的:
* 假设 ntp-4.*.*.tar.gz 这个文件放置在 /root 这个目录下;
* 源代码请解开在 /usr/local/src 下面;
* 我要安装到 /usr/local/ntp 这个目录中;
那么你可以依照下面的步骤来安装测试看看 (如果可以的话,请你不要参考下面的文件数据, 先自行安装过一遍这个软件,然后再来对照一下鸟哥的步骤喔!)。
* 解压缩下载的 tarball ,并参阅 README/INSTALL 文件
```
[root@study ~]# cd /usr/local/src <==切换目录
[root@study src]# tar -zxvf /root/ntp-4.2.8p3.tar.gz <==解压缩到此目录
ntp-4.2.8p3/ <==会创建这个目录喔!
ntp-4.2.8p3/CommitLog
....(下面省略)....
[root@study src]# cd ntp-4.2.8p3
[root@study ntp-4.2.8p3]# vi INSTALL <==记得 README 也要看一下!
# 特别看一下 28 行到 54 行之间的安装简介!可以了解如何安装的流程喔!
```
* 检查 configure 支持参数,并实际创建 makefile 规则档
```
[root@study ntp*]# ./configure --help | more <==查询可用的参数有哪些
--prefix=PREFIX install architecture-independent files in PREFIX
--enable-all-clocks + include all suitable non-PARSE clocks:
--enable-parse-clocks - include all suitable PARSE clocks:
# 上面列出的是比较重要的,或者是你可能需要的参数功能!
[root@study ntp*]# ./configure --prefix=/usr/local/ntp \
> --enable-all-clocks --enable-parse-clocks <==开始创建makefile
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
....(中间省略)....
checking for gcc... gcc <==也有找到 gcc 编译器了!
....(中间省略)....
config.status: creating Makefile <==现在知道这个重要性了吧?
config.status: creating config.h
config.status: creating evconfig-private.h
config.status: executing depfiles commands
config.status: executing libtool commands
```
一般来说 configure 设置参数较重要的就是那个 --prefix=/path 了,--prefix 后面接的路径就是“这个软件未来要安装到那个目录去?”如果你没有指定 --prefix=/path 这个参数,通常默认参数就是 /usr/local 至于其他的参数意义就得要参考 ./configure --help 了! 这个动作完成之后会产生 makefile 或 Makefile 这个文件。当然啦,这个侦测检查的过程会显示在屏幕上, 特别留意关于 gcc 的检查,还有最重要的是最后需要成功的创建起 Makefile 才行!
* 最后开始编译与安装噜!
```
[root@study ntp*]# make clean; make
[root@study ntp*]# make check
[root@study ntp*]# make install
# 将数据给他安装在 /usr/local/ntp 下面
```
整个动作就这么简单,你完成了吗?完成之后到 /usr/local/ntp 你发现了什么?
### 21.4.5 利用 patch 更新源代码
我们在本章一开始介绍了[为何需要进行软件的升级](../Text/index.html#intro_howto),这是很重要的喔!那假如我是以 Tarball 来进行某个软件的安装,那么是否当我要升级这个软件时,就得要下载这个软件的完整全新的 Tarball 呢?举个例子来说,鸟哥的讨论区 [http://phorum.vbird.org](http://phorum.vbird.org/) 这个网址,这个讨论区是以 [phpBB](http://www.phpbb.com/) 这个软件来架设的,而鸟哥的讨论区版本为 3.1.4 ,目前 (2015/09) 最新释出的版本则是 phpbb 3.1.5 。那我是否需要下载全新的 phpbb3.1.5.tar.gz 这个文件来更新原本的旧程序呢?
事实上,当我们发现一些软件的漏洞,通常是某一段程序码写的不好所致。因此, 所谓的“更新源代码”常常是只有更改部分文件的小部分内容而已。既然如此的话, 那么我们是否可以就那些被更动的文件来进行修改就可以咯?也就是说, 旧版本到新版本间没有更动过的文件就不要理他,仅将有修订过的文件部分来处理即可。
这有什么好处呢?首先,没有更动过的文件的目标文件 (object file) 根本就不需要重新编译,而且有更动过的文件又可以利用 make 来自动 update (更新),如此一来,我们原先的设置 (makefile 文件里面的规则) 将不需要重新改写或侦测!可以节省很多宝贵的时间呢 (例如后续章节会提到的核心的编译!)
从上面的说明当中,我们可以发现,如果可以将旧版的源代码数据改写成新版的版本, 那么就能直接编译了,而不需要将全部的新版 Tarball 重新下载一次呢!可以节省带宽与时间说!那么如何改写源代码? 难道要我们一个文件一个文件去参考然后修订吗?当然没有这么没人性!
我们在[第十一章、正则表达式](../Text/index.html)的时候有提到一个比对文件的指令,那就是 [diff](../Text/index.html#diff),这个指令可以将“两个文件之间的差异性列出来”呢!那我们也知道新旧版本的文件之间, 其实只有修改一些程序码而已,那么我们可以通过 diff 比对出新旧版本之间的文字差异,然后再以相关的指令来将旧版的文件更新吗? 呵呵!当然可以啦!那就是 [patch](../Text/index.html#patch) 这个指令啦!很多的软件开发商在更新了源代码之后,几乎都会释出所谓的 patch file,也就是直接将源代码 update 而已的一个方式喔!我们下面以一个简单的范例来说明给你了解喔!
关于 diff 与 patch 的基本用法我们在第十一章都谈过了,所以这里不再就这两个指令的语法进行介绍, 请回去参阅该章的内容。这里我们来举个案例解释一下好了。假设我们刚刚计算三角函数的程序 (main) 历经多次改版, 0.1 版仅会简单的输出, 0.2 版的输出就会含有角度值,因此这两个版本的内容不相同。如下所示,两个文件的意义为:
* [http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz](http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz) :main 的 0.1 版;
* [http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch](http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch) :main 由 0.1 升级到 0.2 的 patch file;
请您先下载这两个文件,并且解压缩到你的 /root 下面。你会发现系统产生一个名为 main-0.1 的目录。 该目录内含有五个文件,就是刚刚的程序加上一个 Makefile 的规则文件。你可以到该目录下去看看 Makefile 的内容, 在这一版当中含有 main 与 clean 两个标的功能而已。至于 0.2 版则加入了 install 与 uninstall 的规则设置。 接下来,请看一下我们的作法啰:
* 测试旧版程序的功能
```
[root@study ~]# tar -zxvf main-0.1.tgz
[root@study ~]# cd main-0.1
[root@study main-0.1]# make clean main
[root@study main-0.1]# ./main
version 0.1
Please input your name: VBird
Please enter the degree angle (ex> 90): 45
Hi, Dear VBird, nice to meet you.
The Sin is: 0.71
The Cos is: 0.71
```
与之前的结果非常类似,只是鸟哥将 Makefile 直接给您了!但如果你下达 make install 时,系统会告知没有 install 的 target 啊!而且版本是 0.1 也告知了。那么如何更新到 0.2 版呢?通过这个 patch 文件吧!这个文件的内容有点像这样:
* 查阅 patch file 内容
```
[root@study main-0.1]# vim ~/main_0.1_to_0.2.patch
diff -Naur main-0.1/cos_value.c main-0.2/cos_value.c
--- main-0.1/cos_value.c 2015-09-04 14:46:59.200444001 +0800
+++ main-0.2/cos_value.c 2015-09-04 14:47:10.215444000 +0800
@@ -7,5 +7,5 @@
{
float value;
....(下面省略)....
```
上面表格内有个底线的部分,那代表使用 diff 去比较时,被比较的两个文件所在路径,这个路径非常的重要喔! 因为 patch 的基本语法如下:
> patch -p数字 < patch_file
特别留意那个“ -p数字”,那是与 patch_file 里面列出的文件名有关的信息。假如在 patch_file 第一行写的是这样:
> *** /home/guest/example/expatch.old
那么当我下达“ patch -p0 < patch_file ”时,则更新的文件是“ /home/guest/example/expatch.old ”,如果“ patch -p1 < patch_file”,则更新的文件为“home/guest/example/expatch.old”,如果“patch -p4 < patch_file”则更新“expatch.old”,也就是说, -pxx 那个 xx 代表“拿掉几个斜线(/)”的意思!这样可以理解了吗? 好了,根据刚刚上头的数据,我们可以发现比较的文件是在 main-0.1/xxx 与 main-0.2/xxx , 所以说,如果你是在 main-0.1 下面,并且想要处理更新时,就得要拿掉一个目录 (因为并没有 main-0.2 的目录存在, 我们是在当前的目录进行更新的!),因此使用的是 -p1 才对喔!所以:
* 更新源代码,并且重新编译程序!
```
[root@study main-0.1]# patch -p1 < ../main_0.1_to_0.2.patch
patching file cos_value.c
patching file main.c
patching file Makefile
patching file sin_value.c
# 请注意,鸟哥目前所在目录是在 main-0.1 下面喔!注意与 patch 文件的相对路径!
# 虽然有五个文件,但其实只有四个文件有修改过喔!上面显示有改过的文件!
[root@study main-0.1]# make clean main
[root@study main-0.1]# ./main
version 0.2
Please input your name: VBird
Please enter the degree angle (ex> 90): 45
Hi, Dear VBird, nice to meet you.
The sin(45.000000) is: 0.71
The cos(45.000000) is: 0.71
# 你可以发现,输出的结果中版本变了,输出信息多了括号 () 喔!
[root@study main-0.1]# make install <==将他安装到 /usr/local/bin 给大家用
cp -a main /usr/local/bin
[root@study main-0.1]# main <==直接输入指令可执行!
[root@study main-0.1]# make uninstall <==移除此软件!
rm -f /usr/local/bin/main
```
很有趣的练习吧!所以你只要下载 patch file 就能够对你的软件源代码更新了!只不过更新了源代码并非软件就更新!你还是得要将该软件进行编译后,才会是最终正确的软件喔! 因为 patch 的功能主要仅只是更新源代码文件而已!切记切记!此外,如果你 patch 错误呢?没关系的!我们的 patch 是可以还原的啊!通过“ patch -R < ../main_0.1_to_0.2.patch ”就可以还原啦!很有趣吧!
例题:如果我有一个很旧版的软件,这个软件已经更新到很新的版本,例如核心,那么我可以使用 patch file 来更新吗?答:这个问题挺有趣的,首先,你必须要确定旧版本与新版本之间“确实有释出 patch file ”才行,以 kernel 2.2.xx 及 2.4.xx 来说,这两者基本上的架构已经不同了,所以两者间是无法以 patch file 来更新的。不过, 2.4.xx 与 2.4.yy 就可以更新了。不过,因为 kernel 每次推出的 patch 文件都仅针对前一个版本而已,所以假设要由 kernel 2.4.20 升级到 2.4.26 ,就必须要使用 patch 2.4.21, 2.4.22, 2.4.23, 2.4.24, 2.4.25, 2.4.26 六个文件来“**依序更新**”才行喔!当然,如果有朋友帮你比对过 2.4.20 与 2.4.26 ,那你自然就可以使用该 patch file 来直接一次更新啰!
- 鸟哥的Linux私房菜:基础学习篇 第四版
- 目录及概述
- 第零章、计算机概论
- 0.1 电脑:辅助人脑的好工具
- 0.2 个人电脑架构与相关设备元件
- 0.3 数据表示方式
- 0.4 软件程序运行
- 0.5 重点回顾
- 0.6 本章习题
- 0.7 参考资料与延伸阅读
- 第一章、Linux是什么与如何学习
- 1.1 Linux是什么
- 1.2 Torvalds的Linux发展
- 1.3 Linux当前应用的角色
- 1.4 Linux 该如何学习
- 1.5 重点回顾
- 1.6 本章习题
- 1.7 参考资料与延伸阅读
- 第二章、主机规划与磁盘分区
- 2.1 Linux与硬件的搭配
- 2.2 磁盘分区
- 2.3 安装Linux前的规划
- 2.4 重点回顾
- 2.5 本章习题
- 2.6 参考资料与延伸阅读
- 第三章、安装 CentOS7.x
- 3.1 本练习机的规划--尤其是分区参数
- 3.2 开始安装CentOS 7
- 3.3 多重开机安装流程与管理(Option)
- 3.4 重点回顾
- 3.5 本章习题
- 3.6 参考资料与延伸阅读
- 第四章、首次登陆与线上求助
- 4.1 首次登陆系统
- 4.2 文字模式下指令的下达
- 4.3 Linux系统的线上求助man page与info page
- 4.4 超简单文书编辑器: nano
- 4.5 正确的关机方法
- 4.6 重点回顾
- 4.7 本章习题
- 4.8 参考资料与延伸阅读
- 第五章、Linux 的文件权限与目录配置
- 5.1 使用者与群组
- 5.2 Linux 文件权限概念
- 5.3 Linux目录配置
- 5.4 重点回顾
- 5.5 本章练习
- 5.6 参考资料与延伸阅读
- 第六章、Linux 文件与目录管理
- 6.1 目录与路径
- 6.2 文件与目录管理
- 6.3 文件内容查阅
- 6.4 文件与目录的默认权限与隐藏权限
- 6.5 指令与文件的搜寻
- 6.6 极重要的复习!权限与指令间的关系
- 6.7 重点回顾
- 6.8 本章习题:
- 6.9 参考资料与延伸阅读
- 第七章、Linux 磁盘与文件系统管理
- 7.1 认识 Linux 文件系统
- 7.2 文件系统的简单操作
- 7.3 磁盘的分区、格式化、检验与挂载
- 7.4 设置开机挂载
- 7.5 内存交换空间(swap)之创建
- 7.6 文件系统的特殊观察与操作
- 7.7 重点回顾
- 7.8 本章习题 - 第一题一定要做
- 7.9 参考资料与延伸阅读
- 第八章、文件与文件系统的压缩,打包与备份
- 8.1 压缩文件的用途与技术
- 8.2 Linux 系统常见的压缩指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系统的备份与还原
- 8.5 光盘写入工具
- 8.6 其他常见的压缩与备份工具
- 8.7 重点回顾
- 8.8 本章习题
- 8.9 参考资料与延伸阅读
- 第九章、vim 程序编辑器
- 9.1 vi 与 vim
- 9.2 vi 的使用
- 9.3 vim 的额外功能
- 9.4 其他 vim 使用注意事项
- 9.5 重点回顾
- 9.6 本章练习
- 9.7 参考资料与延伸阅读
- 第十章、认识与学习BASH
- 10.1 认识 BASH 这个 Shell
- 10.2 Shell 的变量功能
- 10.3 命令别名与历史命令
- 10.4 Bash Shell 的操作环境:
- 10.5 数据流重导向
- 10.6 管线命令 (pipe)
- 10.7 重点回顾
- 10.8 本章习题
- 10.9 参考资料与延伸阅读
- 第十一章、正则表达式与文件格式化处理
- 11.1 开始之前:什么是正则表达式
- 11.2 基础正则表达式
- 11.3 延伸正则表达式
- 11.4 文件的格式化与相关处理
- 11.5 重点回顾
- 11.6 本章习题
- 11.7 参考资料与延伸阅读
- 第十二章、学习 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 简单的 shell script 练习
- 12.3 善用判断式
- 12.4 条件判断式
- 12.5 循环 (loop)
- 12.6 shell script 的追踪与 debug
- 12.7 重点回顾
- 12.8 本章习题
- 第十三章、Linux 帐号管理与 ACL 权限设置
- 13.1 Linux 的帐号与群组
- 13.2 帐号管理
- 13.3 主机的细部权限规划:ACL 的使用
- 13.4 使用者身份切换
- 13.5 使用者的特殊 shell 与 PAM 模块
- 13.6 Linux 主机上的使用者讯息传递
- 13.7 CentOS 7 环境下大量创建帐号的方法
- 13.8 重点回顾
- 13.9 本章习题
- 13.10 参考资料与延伸阅读
- 第十四章、磁盘配额(Quota)与进阶文件系统管理
- 14.1 磁盘配额 (Quota) 的应用与实作
- 14.2 软件磁盘阵列 (Software RAID)
- 14.3 逻辑卷轴管理员 (Logical Volume Manager)
- 14.4 重点回顾
- 14.5 本章习题
- 14.6 参考资料与延伸阅读
- 第十五章、例行性工作调度(crontab)
- 15.1 什么是例行性工作调度
- 15.2 仅执行一次的工作调度
- 15.3 循环执行的例行性工作调度
- 15.4 可唤醒停机期间的工作任务
- 15.5 重点回顾
- 15.6 本章习题
- 第十六章、程序管理与 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件与程序
- 16.5 SELinux 初探
- 16.6 重点回顾
- 16.7 本章习题
- 16.8 参考资料与延伸阅读
- 第十七章、认识系统服务 (daemons)
- 17.1 什么是 daemon 与服务 (service)
- 17.2 通过 systemctl 管理服务
- 17.3 systemctl 针对 service 类型的配置文件
- 17.4 systemctl 针对 timer 的配置文件
- 17.5 CentOS 7.x 默认启动的服务简易说明
- 17.6 重点回顾
- 17.7 本章习题
- 17.8 参考资料与延伸阅读
- 第十八章、认识与分析登录文件
- 18.1 什么是登录文件
- 18.2 rsyslog.service :记录登录文件的服务
- 18.3 登录文件的轮替(logrotate)
- 18.4 systemd-journald.service 简介
- 18.5 分析登录文件
- 18.6 重点回顾
- 18.7 本章习题
- 18.8 参考资料与延伸阅读
- 第十九章、开机流程、模块管理与 Loader
- 19.1 Linux 的开机流程分析
- 19.2 核心与核心模块
- 19.3 Boot Loader: Grub2
- 19.4 开机过程的问题解决
- 19.5 重点回顾
- 19.6 本章习题
- 19.7 参考资料与延伸阅读
- 第二十章、基础系统设置与备份策略
- 20.1 系统基本设置
- 20.2 服务器硬件数据的收集
- 20.3 备份要点
- 20.4 备份的种类、频率与工具的选择
- 20.5 鸟哥的备份策略
- 20.6 灾难复原的考虑
- 20.7 重点回顾
- 20.8 本章习题
- 20.9 参考资料与延伸阅读
- 第二十一章、软件安装:源代码与 Tarball
- 20.1 开放源码的软件安装与升级简介
- 21.2 使用传统程序语言进行编译的简单范例
- 21.3 用 make 进行宏编译
- 21.4 Tarball 的管理与建议
- 21.5 函数库管理
- 21.6 检验软件正确性
- 21.7 重点回顾
- 21.8 本章习题
- 21.9 参考资料与延伸阅读
- 第二十二章、软件安装 RPM, SRPM 与 YUM
- 22.1 软件管理员简介
- 22.2 RPM 软件管理程序: rpm
- 22.3 YUM 线上升级机制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重点回顾
- 22.6 本章习题
- 22.7 参考资料与延伸阅读
- 第二十三章、X Window 设置介绍
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析与设置
- 23.3 显卡驱动程序安装范例
- 23.4 重点回顾
- 23.5 本章习题
- 23.6 参考资料与延伸阅读
- 第二十四章、Linux 核心编译与管理
- 24.1 编译前的任务:认识核心与取得核心源代码
- 24.2 核心编译的前处理与核心功能选择
- 24.3 核心的编译与安装
- 24.4 额外(单一)核心模块编译
- 24.5 以最新核心版本编译 CentOS 7.x 的核心
- 24.6 重点回顾
- 24.7 本章习题
- 24.8 参考资料与延伸阅读