zoukankan      html  css  js  c++  java
  • Linux yum源码包安装和卸载

    Linux 下的绝大多数源码包都是用 C 语言编写的,还有少部分是用 C++ 等其他程序语言编写的。所以,要想安装源码包,必须安装 C 语言编译器 gcc(如果是用 C++ 编写的程序,则还需要安装 gcc-c++)。

    我们可以先检测一下 gcc 是否已经安装,命令如下:

    [root@localhost ~]# rpm -q gcc
    gcc-4.4.6-4.el6.i686

    如果没有安装 gcc,则推荐大家采用 yum 安装方式安装。因为如果手工使用 rpm 命令安装,那么 gcc 所依赖的包太多了。命令如下:

    [root@localhost yum.repos.d]#yum -y install gcc

    有了编译器,还需要考虑一个问题:刚刚写的"hello.c"只有一个源码文件,所以我们可以利用 gcc 手工编译。但是真正发布的源码包软件内的源码文件可能有成百上千个,而且这些文件之间都是有联系的,编译时有先后顺序。如果这样的源码文件需要手工编译,光想想就是一项难以完成的工作。

    这时就需要 make 命令来帮助我们完成编译,所以make也是必须安装的。我们也需要査看一下 make 是否已经安装,命令如下:

    [root@localhost yum. repos.d]# rpm -q make
    make-3.81-20.el6.i686

    源码包的获取

    RPM 包是保存在 CentOS 6.3 的安装光盘中的,那么源码包从哪里来呢?从官方网站上下载,我们依然以下载和安装 apache 为例。

    源码包安装

    在安装之前,我们先来解释一下源码包的安装注意事项:

    • 软件包是从互联网上下载的。比如 apache 是从北京理工大学开源软件镜像服务网站上下载的。
    • 下载的软件包格式。下载格式一般都是压缩格式,常见的是".tar.gz"或".tar.bz2",选择你习惯的格式下载即可。
    • 下载之后的源代码保存位置。Linux 是一个非常严谨的操作系统,每个目录的作用都是固定而且明确的,作为管理员,养成良好的操作习憤非常重要,在正确的目录中保存正确的数据就是一个约定俗成的习惯。系统中保存源代码的位置主要有两个:"/usr/src"和 "/usr/local/src"。其中,"/usr/src"用来保存内核源代码,"/usr/local/src"用来保存用户下载的源代码。
    • 软件安装位置。我们刚说了 Linux 非常注意每个目录的作用,所以安装软件也有默认目录,即"/usr/local/软件名"。我们需要给安装的软件包单独规划一个安装目录,以便于管理和卸载。想象一下,如果我把每个软件都安装到"/usr/local/"目录下,但是没有给每个软件单独分配安装目录,那么以后还能分清哪 个软件是哪个软件吗?这样一来也就不能正确地卸载软件了。
    • 软件安装报错。源码包如果安装不报错,那么安装还是很方便的。但是报错后的排错对刚学习的人来说还是有难度的,不过我们先要知道什么样的情况是报错。报错有两个典型特点,这两个特点必须都具备才是报错:其一是出现"error"或"warning"字样;其二是安装过程停止。如果没有停止但是出现警告信息,那么软件中的部分功能不能使用,而不是报错。

    安装步骤

    我们来解释一下源码包安装的具体步骤:
    1) 下载软件包。

    2) 解压缩。

    3) 进入解压目录。

    4) ./configure 软件配置与检查。这一步主要有三个作用:

    1. 在安装之前需要检测系统环境是否符合安装要求。
    2. 定义需要的功能选项。"./configure"支持的功能选项较多,可以执行"./configure--help"命令査询其支持的功能。一般都会通过"./configure--prefix=安装路径"来指定安装路径。
    3. 把系统环境的检测结果和定义好的功能选项写入 Makefile 文件,后续的编译和安装需要依赖这个文件的内容。

    需要注意的是,configure 不是系统命令,而是源码包软件自带的一个脚本程序,所以必须采用"./configure"方式执行("./"代表在当前目录下)。

    5) make编译。make 会调用 gcc 编译器,并读取 Makefile 文件中的信息进行系统软件编译。编译的目的就是把源码程序转变为能被 Linux 识别的可执行文件,这些可执行文件保存在当前目录下。编程过程较为耗时,需要有足够的耐心。

    6) make clean:清空编译内容(非必需步骤)。如果在"./configure"或"make"编译中报错,那么我们在重新执行命令前一定要记得执行 make clean 命令,它会清空 Makefile 文件或编译产生的".o"头文 件。

    7) make install:安装。这才是真正的安装过程,一般会写清楚程序的安装位置。如果忘记指定安装目录,则可以把这个命令的执行过程保存下来,以备将来删除使用。

    举例安装apache

    1) 下载。

    2) 解压缩。

    [root@localhost ~]#tar -zxvf httpd-2.2.9.tar.gz|more


    3) 进入解压目录。

    [root@localhost ~]# ls
    anaconda-ks.cfg httpd-2.2.9 httpd-2.2.9.tar.gz install.log install.log.syslog
    [root@localhost ~]# cd httpd-2.2.9


    4) 软件配置。

    [root@localhost httpd-2.2.9]# ./configure --prefix=/usr/local/apache2
    checking for chosen layout...Apache
    checking for working mkdir -p…yes
    checking build system type...i686-pc-linux-gnu
    checking host system type...i686-pc-linux-gnu
    checking target system typa...i686-pc-linux-gnu
    …省略部分输出…

    选项:

    • --prefix: 指定安装目录


    这里的安装选项没有加载其他功能,只是指定安装目录。"/usr/local/apache2"目录不需要手工建立,安装完成后会自动建立,这个目录是否生成也是检测软件是否正确安装的重要标志。

    当然,在配置之前也可以查询一下 apache 支持的选项功能,命令如下:

    [root@localhost httpd-2.2.9]#./configure --help|more
    #查询apache支持的选项功能(不是必需步骤)


    5) 编译。

    [root@localhost httpd-2.2.9]# make

    这一步命令较为简单,醒编译时间账,主要作用是把源码文件转换为二进制文件。

    6)安装。

    [root@localhost httpd-2.2.9]# make install

    如果不报错,这一步完成后就安装成功了。

    源码包卸载

    我们在说源码包卸载之前,先回顾一下 Windows 系列操作系统中的软件卸载。在 Windows 系统中是不能用鼠标右键单击安装之后的软件,选择直接删除的,因为这样做会遗留大量的垃圾文件。这些垃圾文件越多,会导致 Window 系统越不稳定。

    那么, Linux 中删除源码包应该怎样操作呢?太简单了,只要找到软件的安装位置,然后直接删除就可以了。比如删除 apache,只需执行如下命令即可,而且不会遗留任何垃圾文件。

    [root@localhost ~]# rm -rf /usr/local/apache2/

    如果 apache 服务启动了,那么,记得先停止服务再删除。

    Linux源码包升级

    我们的软件如果进行了数据更新,那么是否需要先把整个软件卸载,然后重新安装呢?当然不需要,我们只需要下载补丁、打上补丁,重新编译和安装就可以了(不用 ./configured 成新的 Makefile 文件,make 命令也只是重新编译数据),速度回比重新安装一次快得多。

    补丁的生成与使用

    怎么知道两个软件之间的不同呢?难道需要手工比对两个软件吗?当然不是,Linux 有 diff 命令用来比较两个软件的不同,当然也是利用这个命令生成补丁文件的。那么我们先看看这个命令的格式:

    [root@localhost ~]# diff 选项 old new
    #比较old和new文件的不同

    选项:

    • -a:将任何文档当作文本文档处理;
    • -b:忽略空格造成的不同;
    • -B:忽略空白行造成的不同;
    • -I: 忽略大小写造成的不同;
    • -N:当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件;
    • -r:当比较目录时,递归比较子目录;
    • -u:使用同一输出格式;


    我们举一个简单的例子,来看看补丁是怎么来的,然后应用一下这个补丁,看看有什么效果,这样就可以说明补丁的作用了。先写两个文件,命令如下:

    [root@localhost ~]# mkdir test
    #建立测试目录
    [root@localhost ~]# cd test
    #进入测试目录
    [root@localhost test]# vi old.txt
    our
    school
    is
    lampbrother
    #文件old.txt,为了便于比较,将每行分开
    [root@localhost test]# vi new.txt
    our
    school
    is
    lampbrother
    in
    Beijing
    #文件new.txt

    比较一下两个文件的不同,并生成补丁文件"txt.patch",命令如下:

    [root@localhost test]# diff -Naur /root/test/old.txt /root/test/new.txt > txt. patch
    #比较两个文件的不同,同时生成txt.patch补丁文件
    [root@localhost test]#vi txt.patch
    #查看一下这个文件
    --/root/test/old.txt 2012-11-23 05:51:14.347954373 +0800
    #前一个文件
    + + + /root/test/new.txt 2012-11-23 05:50:05.772988210 +0800
    #后一个文件
    @@-2, 3+2, 5@@
    school
    is
    lampbrother
    +in
    +beijing
    #后一个文件比前一个文件多两行(用+表示)

    既然"new.txt"比"old.txf文件多了两行,那么我们能不能让"old.txt"文件按照补丁文件"txt.patch"进行更新呢?当然可以,使用命令 patch 即可。命令格式如下:

    [root@localhost test]# patch -pn < 补丁文件
    #按照补丁文件进行更新

    选项:

    • -pn:n为数字。代表按照补丁文件中的路径,指定更新文件的位置;


    "-pn"不好理解,我们说明一下。补丁文件是要打入旧文件的,但是你当前所在的目录和补丁文件中记录的目录不一定是匹配的,所以就需要"-pn"选项来同步两个目录。

    比如,我当前在"/root/test/"目录中(我要打补丁 的旧文件就在当前目录下),补丁文件中记录的文件目录为"/root/test/dd.txt",这时如果写入"-p1"(在补丁文件目录中取消一级目录),那么补丁文件就会打入"root/test/root/test/old.txt"文件中,这显然是不对的。那如果写入的是"-p2"(在补丁文件目录中取消二级目录),那么补丁文件就会打入"/root/test/test/old.txt"文件中,这显然也不对。如果写入的是"-p3"(在补丁文件目录中取消三级目录),那么补丁文件就会打入"/root/test/old.txt文件中,我们的old.txt文件就在这个目录下,所以应该用"-p3"选项。

    如果我的当前所在目录是"/root/"目录呢?因为补丁文件中记录的文件目录为"/root/test/old.txt",所以这里就应该用"-p2"选项,代表取消两级目录,补丁打在当前目录下的"test/old.txt"文件上。

    大家可以这样理解:"-pn"就是想要在补丁文件中所记录的目录中取消几个"/",n就是几。去掉目录的目的是和当前所在目录匹配。

    那么我们更新一下"old.txt"文件,命令如下:

    [root@localhost test]# patch -p3 < txt.patch
    patching file old.txt
    #给old.txt文件打补丁
    [root@localhost test]# cat old.txt
    #查看一下dd.txt文件的内容
    our
    school
    is
    lampbrother
    in
    Beijing
    #多出了in Beijing两行

    注意以下两点:

    1. 给旧文件打补丁依赖的不是新文件,而是补丁文件,所以即使文件被删除也没有关系。
    2. 补丁文件中记录的目录和你当前所在目录是需要通过"-pn"选项来同步的。

    给apache打入补丁

    我们再举一个实际的例子。前面章节中我们安装了 httpd-2.2.9 这个版本的程序,在官网上有这个版本的一个补丁"mod_proxy_ftp_CVE-2008-2939.diff",这个补丁修补了 apache 代理 FTP 站点时,模块空指针引用拒绝服务攻击的漏洞。下面我们来看看如何安装这个补丁。

    1) 下载补丁文件

    2) 把补丁文件复制到 apache 源码包解压目录中

    [root@localhost ~]# cp mod_proxy_ftp_CVE-2008-2939.diff httpd-2.2.9


    3) 打入补丁

    [root@localhost ~]# cd httpd-2.2.9
    #进入apache源码目录
    [root@localhost httpd-2.2.9]# vi mod_proxy_ftp_CVE-2008-2939.diff
    #查看补丁文件
    --modules/proxy/mod_proxy_ftp.c (Revision 682869)
    + + + modules/proxy/mod_proxy_ftp.c (Revision 682870)
    …省略部分输出…
    #查看一下补丁文件中记录的目录,以便一会儿和当前所在目录同步
    [root@localhost httpd-2.2.9]# patch - p0 < mod_proxy_ftp_CVE-2008-2939.diff
    #打入补丁


    为什么是"-p0"呢?因为我当前在"/root/httpd-2.2.9"目录中,但是补丁文件中记录的目录是"modules/proxy/mod_proxy_ftp.c",这就在我当前所在目录中,一个"/"都不需要去掉,所以是"-p0"。

    4) 重新编译

    [root@localhost httpd-2.2.9]# make


    5) 重新安装

    [root@localhost httpd-2.2.9]# make install

    打补丁的方法会比重新安装少了"./configure"步骤,而且编译时也只是编译变化的地方,所以编译速度也更快。但是如果没有安装过 httpd-2.2.9,就需要先打入补丁,再依次执行"./configure" "make" "make install"命令。

    如果我不想要补丁中的内容呢?可以恢复吗?当然可以,命令如下:

    [root@localhost httpd-2.2.9]# patch -R < modjDroxy_ftp_CVE-2008-2939.diff

    选项:

      • -R:还原补丁
  • 相关阅读:
    海量数据拆分到nosql系统的一种方案
    软件架构师应该知道的97件事
    【转载】实现软件架构质量属性的战术
    让技术人员看得懂的流程
    【转载】一步步构建大型网站架构
    [转载]从100PV到1亿级PV网站架构演变
    添加和删除hadoop集群中的节点
    windows下JDK环境配置
    如何部署hadoop集群
    android9.0适配HTTPS:not permitted by network security policy'
  • 原文地址:https://www.cnblogs.com/lizhouwei/p/9939975.html
Copyright © 2011-2022 走看看