Linux总结(十九):linux中yum

一、yum源配置

           yum,全称“Yellow dog Updater, Modified”,是一个专门为了解决包的依赖关系而存在的软件包管理器。就好像 Windows 系统上可以通过 360 软件管家实现软件的一键安装、升级和卸载,Linux 系统也提供有这样的工具,就是 yum。可以这么说,yum 是改进型的 RPM 软件管理器,它很好的解决了 RPM 所面临的软件包依赖问题。yum 在服务器端存有所有的 RPM 包,并将各个包之间的依赖关系记录在文件中,当管理员使用 yum 安装 RPM 包时,yum 会先从服务器端下载包的依赖性文件,通过分析此文件从服务器端一次性下载所有相关的 RPM 包并进行安装

1、安装yum

             yum 软件可以用 rpm 命令安装,安装之前可以通过如下命令查看 yum 是否已安装 :

[root@localhost ~]# rpm -qa | grep yum
yum-metadata-parser-1.1.2-16.el6.i686
yum-3.2.29-30.el6.centos.noarch
yum-utils-1.1.30-14.el6.noarch
yum-plugin-fastestmirror-1.1.30-14.el6.noarch
yum-plugin-security-1.1.30-14.el6.noarch

2、rpm安装yum:

            使用 rpm 命令安装 yum 的具体方式可查看《Linux怎么安装yum》一节。 

3、yum源定义:

            使用 yum 安装软件包之前,需指定好 yum 下载 RPM 包的位置,此位置称为 yum 源。换句话说,yum 源指的就是软件安装包的来源。使用 yum 安装软件时至少需要一个 yum 源。yum 源既可以使用网络 yum 源,也可以将本地光盘作为 yum 源。

二、网络 yum 源搭建

            只要你的主机网络正常,可以直接使用网络 yum 源,不需要对配置文件做任何修改,这里对 yum 源配置文件做一下简单介绍。

1、yum源位置

               网络 yum 源配置文件位于 /etc/yum.repos.d/ 目录下,文件扩展名为"*.repo"(只要扩展名为 "*.repo" 的文件都是 yum 源的配置文件)。

[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo
CentOS-Media.repo
CentOS-Debuginfo.repo.bak
CentOS-Vault.repo

           可以看到,该目录下有 4 个 yum 配置文件,通常情况下 CentOS-Base.repo 文件生效。我们可以尝试打开此文件,命令如下:

[root@localhost yum.repos.d]# vim /etc/yum.repos.d/ CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/? 
release= $releasever&arch=$basearch&repo=os
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
…省略部分输出…

此文件中含有 5 个 yum 源容器,这里只列出了 base 容器,其他容器和 base 容器类似。base 容器中各参数的含义分别为:

      (1)[base]:容器名称,一定要放在[]中。

      (2)name:容器说明,可以自己随便写。

      (3)mirrorlist:镜像站点,这个可以注释掉。

      (4)baseurl:我们的 yum 源服务器的地址。默认是 CentOS 官方的 yum 源服务器,是可以使用的。如果你觉得慢,则可以改   成你喜欢的 yum 源地址。

      (5)enabled:此容器是否生效,如果不写或写成 enabled 则表示此容器生效,写成 enable=0 则表示此容器不生效。

      (6)gpgcheck:如果为 1 则表示 RPM 的数字证书生效;如果为 0 则表示 RPM 的数字证书不生效。

      (7)gpgkey:数字证书的公钥文件保存位置。不用修改。

三、本地yum源 

         在无法联网的情况下,yum 可以考虑用本地光盘(或安装映像文件)作为 yum 源。

               Linux 系统安装映像文件中就含有常用的 RPM 包,我们可以使用压缩文件打开映像文件(iso文件),进入其 Packages 子目录,如图 1 所示:可以看到,该子目录下含有几乎所有常用的 RPM 包,因此使用系统安装映像作为本地 yum 源没有任何问题。                                     

安装映像文件的 Packages 子目录


                                                                    图 1 安装映像文件的 Packages 子目录

               在 /etc/yum.repos.d/ 目录下有一个 CentOS-Media.repo 文件,此文件就是以本地光盘作为 yum 源的模板文件,只需进行简单的修改即可,步骤如下:

            (1)放入 CentOS 安装光盘,并挂载光盘到指定位置。命令如下:

[root@localhost ~]# mkdir /mnt/cdrom
#创建cdrom目录,作为光盘的挂载点
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
mount: block device/dev/srO is write-protected, mounting read-only
#挂载光盘到/mnt/cdrom目录下

          (2)修改其他几个 yum 源配置文件的扩展名,让它们失效,因为只有扩展名是"*.repo"的文件才能作为 yum 源配置文件。当也可以删除其他几个 yum 源配置文件,但是如果删除了,当又想用网络作为 yum 源时,就没有了参考文件,所以最好还是修改扩展名。 命令如下:

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mv CentOS-Base, repo CentOS-Base.repo.bak
[root@localhost yum.repos.d]#mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak
[root@localhost yum.repos.d]# mv CentOS-Vault.repo CentOS-Vault.repo.bak

         (3)修改光盘 yum 源配置文件 CentOS-Media.repo,参照以下方修改:

[root@localhost yum.repos.d]# vim CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
#地址为你自己的光盘挂载地址
#file:///media/cdrom/
#file:///media/cdrecorder/
#注释这两个的不存在地址
gpgcheck=1
enabled=1
#把enabled=0改为enabled=1, 让这个yum源配置文件生效
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

          如此,本地 yum 源就配置完成了。

四、yum命令

1、yum查询命令

            (1)yum list:查询所有已安装和可安装的软件包

[root@localhost yum.repos.d]# yum list
#查询所有可用软件包列表
Installed Packages
#已经安装的软件包
ConsdeKit.i686 0.4.1-3.el6
@anaconda-CentOS-201207051201 J386/6.3
ConsdeKit-libs.i686 0.4.1-3.el6 @anaconda-CentOS-201207051201 J386/6.3
…省略部分输出…
Available Packages
#还可以安装的软件包
389-ds-base.i686 1.2.10.2-15.el6 c6-media
389-ds-base-devel.i686 1.2.10.2-15.el6 c6-media
#软件名 版本 所在位置(光盘)
…省略部分输出…

           (2)yum list 包名:查询执行软件包的安装情况。 

[root@localhost yum.repos.d]# yum list samba
Available Packages samba.i686 3.5.10-125.el6 c6-media
#查询 samba 软件包的安装情况

           (3) yum search 关键字:从 yum 源服务器上查找与关键字相关的所有软件包。

[root@localhost yum.repos.d]# yum search samba
#搜索服务器上所有和samba相关的软件包
========================N/S Matched:
samba =============================
samba-client.i686:Samba client programs
samba-common.i686:Files used by both Samba servers and clients
samba-doc.i686: Documentation for the Samba suite
…省略部分输出…
Name and summary matches only, use"search all" for everything.

          (4)yum info 包名:查询执行软件包的详细信息。

[root@localhost yum.repos.d]# yum info samba
#查询samba软件包的信息
Available Packages <-没有安装
Name : samba <-包名
Arch : i686 <-适合的硬件平台
Version : 3.5.10 <―版本
Release : 125.el6 <—发布版本
Size : 4.9M <—大小
Repo : c6-media <-在光盘上
…省略部分输出…

2、yum安装命令

          (1)yum 安装软件包的命令基本格式

            其中:

                    install:表示安装软件包。

                    -y:自动回答 yes。如果不加 -y,那么每个安装的软件都需要手工回答 yes;

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

         (2)例如使用此 yum 命令安装 gcc:

[root@localhost yum jepos.d]#yum -y install gcc
#使用yum自动安装gcc

                   gcc 是 C 语言的编译器,鉴于该软件包涉及到的依赖包较多,建议使用 yum 命令安装。

3、yum 升级命令

            使用 yum 升级软件包,需确保 yum 源服务器中软件包的版本比本机安装的软件包版本高。yum 升级软件包常用命令如下:

     (1)yum -y update:升级所有软件包。不过考虑到服务器强调稳定性,因此该命令并不常用。

     (2)yum -y update 包名:升级特定的软件包。

4、yum 卸载命令

          使用 yum 卸载软件包时,会同时卸载所有与该包有依赖关系的其他软件包,即便有依赖包属于系统运行必备文件,也会被 yum 无情卸载,带来的直接后果就是使系统崩溃。除非你能确定卸载此包以及它的所有依赖包不会对系统产生影响,否则不要使用 yum 卸载软件包。

              yum 卸载命令的基本格式如下:

[root@localhost yum.repos.d]# yum remove 包名
#卸载指定的软件包

            例如,使用 yum 卸载 samba 软件包的命令如下:

[root@localhost yum.repos.d]# yum remove samba
#卸载samba软件包

五、yum管理软件组

         yum 命令除了可以对软件包进行查询、安装、升级和卸载外,还可完成对软件包组的查询、安装和卸载操作。

 1、yum查询软件组包含的软件

             既然是软件包组,说明包含不只一个软件包,通过 yum 命令可以查询某软件包组中具体包含的软件包,命令格式如下:

[root@localhost ~]#yum groupinfo 软件组名
#查询软件组中包含的软件

           例如,查询 Web Server 软件包组中包含的软件包,可使用如下命令:

[root@localhost ~]#yum groupinfo "Web Server"
#查询软件组"Webserver"中包含的软件

 2、yum安装软件组

           使用 yum 安装软件包组的命令格式如下:

[root@localhost ~]#yum groupinstall 软件组名
#安装指定软件组,组名可以由grouplist查询出来

           例如,安装 Web Server 软件包组可使用如下命令:

[root@localhost ~]#yum groupinstall "Web Server"
#安装网页服务软件组

3、yum命令卸载软件组

          yum 卸载软件包组的命令格式如下:

[root@localhost ~]# yum groupremove 软件组名
#卸载指定软件组

         yum 软件包组管理命令更适合安装功能相对集中的软件包集合。例如,在初始安装 Linux 时没有安装图形界面,但后来发现需要图形界面的支持,这时可以手工安装图形界面软件组(X Window System 和 Desktop),就可以使用图形界面了。

六、linux源码包

        由于 Linux 操作系统开放源代码,因此在其上安装的软件大部分也都是开源软件,例如 Apache、Tomcat 和 PHP 等。开源软件基本都提供源码下载,可采用源码安装的方式安装软件。

        注意,本节使用的源码包,指的是软件所有源代码的压缩包,其后缀名为 ".tar.gz" 或 ".tar.bz2";而 SRPM 源码包本质上属于 RPM 包,也就是源码的RPM包,其文件后缀为 ".src.rpm"。虽然都叫源码包,但不是一码事。

 1、软件源代码

        软件的源代码,也就是软件的原始数据,任何人都可以通过源代码查看该软件的设计架构和实现方法,但软件源代码无法再计算机中直接运行安装,需要将源代码通过编译转换为计算机可以识别的机器语言,然后才可以安装。
        Linux 系统中,绝大多数软件的源代码都是用 C 语言编写的,少部分用 C++(或其他语言)编写。因此要想安装源码包,必须安装 gcc 编译器(如果涉及 C++ 源码程序,还需要安装 gcc-c++)。

2、安装gcc

        安装 gcc 之前,可先使用如下命令看看是否已经安装。如果未安装,考虑到安装 gcc 所依赖的软件包太多,推荐使用 yum 安装 gcc。

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

3、安装make

        除了安装编译器,还需要安装 make 编译命令。要知道,编译源码包可不像编译一个 hello.c 文件那样轻松,包中含大量的源码文件,且文件之间有着非常复杂的关联,直接决定着各文件编译的先后顺序,因此手动编译费时费力,而使用 make 命令可以完成对源码包的自动编译。 

        同样,在安装 make 命令之前,可使用如下命令查看其是否已经安装:

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

       如果未安装,可使用 yum -y install make 命令直接安装 make。安装好了 gcc 编译器和 make 编译工具,接下来学习使用源码包安装软件。

七、Linux源码包安装软件

       本节仍然以安装 apache 为例,安装过程分为如下几步:

         (1)下载 apache 源码包。该软件的源码包可通过官方网站 http://httpd.apache.org/download.cgi#apache24 下载,得到的源码包格式为压缩包( ".tar.gz" 或 ".tar.bz2" )。将各种文件分门别类保存在对应的目录中,应该成为合格 Linux 管理员约定俗成的习惯。Linux 系统中用于保存源代码的位置主要有 2 个,分别是 "/usr/src" 和 "/usr/local/src",其中 "/usr/src" 用来保存内核源代码,"/usr/local/src" 用来保存用户下载的源代码。

         (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)./configure 软件配置与检查。这一步主要完成以下 3 项任务:

                    检测系统环境是否符合安装要求。

                    定义需要的功能选项。通过 "./configure--prefix=安装路径" 可以指定安装路径。注意,configure 不是系统命令,而是源码包软件自带的一个脚本程序,所以必须采用 "./configure" 方式执行("./" 代表在当前目录下)。"./configure" 支持的功能选项较多,可执行 "./configure--help" 命令查询其支持的功能,例如:

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

                    把系统环境的检测结果和定义好的功能选项写入 Makefile 文件,因为后续的编译和安装需要依赖这个文件的内容。                      此步具体执行代码如下:

[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" 目录不需要手工建立,安装完成后会自动建立(这个目录是否生成也是检测软件是否正确安装的重要标志)。

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

                   执行的编译命令如下:

[root@localhost httpd-2.2.9]# make

                   编程过程较为耗时,需要有足够的耐心。

             (6)正式开始安装软件,这里通常会写清程序的安装位置,如果没有,则建议读者把安装的执行过程保存下来,以备将来删除软件时使用。安装指令如下:

[root@localhost httpd-2.2.9]# make install

                       安装源码包过程中,如果出现“error”(或“warning”)且安装过程停止,表示安装失败;反之,如果仅出现警告信息,但安装过程还在继续,这并不是安装失败,顶多使软件部分功能无法使用。
                       注意,如果在 "./configure" 或 "make" 编译中报错,则在重新执行命令前一定要执行 make clean 命令,它会清空 Makefile 文件或编译产生的 ".o" 头文件。

八、Linux源码包卸载

          通过源码包方式安装的各个软件,其安装文件独自保存在 /usr/local/ 目录下的各子目录中。例如,apache 所有的安装文件都保存在 /usr/local/apache2 目录下。这就为源码包的卸载提供了便利。
           源码包的卸载,只需要找到软件的安装位置,直接删除所在目录即可,不会遗留任何垃圾文件。需要读者注意的是,在删除软件之前,应先将软件停止服务。
           以删除 apache 为例,只需关闭 apache 服务后执行如下命令即可:

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

九、linux补丁 

            Linux 系统中更新用源码包安装的软件,除了卸载重装这种简单粗暴的方法外,还可以下载补丁文件更新源码包,用新的源码包重新编译安装软件。比较两种方式,后者更新软件的速度更快。

             使用补丁文件更新源码包,省去了用 ./configured 生成新的 Makefile 文件,还省去了大量的编译工作,因此效率更高。学完本节会对比有更深入的理解。

十、Linux补丁文件的生成和使用

             Linux 系统中可以使用 diff 命令对比出新旧软件的不同,并生成补丁文件。

1、diff 命令基本格式为:

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

               此命令中可使用如下几个选项:

             (1)-a:将任何文档当作文本文档处理;

             (2)-b:忽略空格造成的不同;

             (3)-B:忽略空白行造成的不同;

             (4)-I:忽略大小写造成的不同;

             (5)-N:当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件;

             (6)-r:当比较目录时,递归比较子目录;

             (7)-u:使用同一输出格式;

2、 从生成补丁文件,到使用其实现更新软件的目的,为了让读者清楚地了解整个过程的来龙去脉,下面我们自己创建两个文件(分别模拟旧软件和新软件),通过对比新旧文件生成补丁文件,最后利用补丁文件更新旧文件,具体步骤如下:

             (1)创建两文件

创建两个文件,执行如下命令:
[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

           (2)比较两个文件,生成补丁

利用 diff 命令,比较两个文件(old.txt 和 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
#后一个文件比前一个文件多两行(用+表示)

          (3)补丁升级文件

利用补丁文件 txt.patch 更新 old.txt 旧文件,实现此步操作需利用 patch 命令,
该命令基本格式如下:
[root@localhost test]# patch -pn < 补丁文件
#按照补丁文件进行更新

-pn 选项中,n 为数字(例如 p1、p2、p3 等),
pn 表示按照补丁文件中的路径,指定更新文件的位置。
这里对 -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两行

可以看到,通过使用补丁文件 txt.patch 对旧文件进行更新,使得旧文件和新文件完全相同。

(3)总结:

       通过这个例子,大家要明白以下两点:

           给旧文件打补丁依赖的不是新文件,而是补丁文件,所以即使新文件被删除也没有关系。

           补丁文件中记录的目录和当前所在目录需要通过 "-pn" 选项实现同步,否则更新可能失败。

十一、给apache打入补丁

         本节仍以 apache 为例,通过从官网上下载的补丁文件 "mod_proxy_ftp_CVE-2008-2939.diff",更新 httpd-2.2.9 版本的 apache。这里使用的补丁文件,修补了 apache 代理 FTP 站点时,模块空指针引用拒绝服务攻击的漏洞(了解即可,不用深究)。

        具体更新步骤如下:

从 apache 官网上下载补丁文件;
复制补丁文件到 apache 源码包解压目录中,执行命令如下:
[root@localhost ~]# cp mod_proxy_ftp_CVE-2008-2939.diff httpd-2.2.9
给旧 apache 打入补丁,具体执行命令如下:
[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"。
重新编译 apache 源码包,执行如下命令:
[root@localhost httpd-2.2.9]# make
安装 apache,执行如下命令:
[root@localhost httpd-2.2.9]# make install

          不难发现,打补丁更新软件的过程比安装软件少了 "./configure" 步骤,且编译时也只是编译变化的位置,编译速度更快。

         注意,如果未安装过 httpd-2.2.9,就需要先打入补丁,再依次执行 "./configure"、"make"、"make install" 命令。patch 命令不仅可以给就文件打入补丁,还可以执行反操作,即恢复用补丁文件修改过的源文件,例如:[root@localhost httpd-2.2.9]# patch -R < modjDroxy_ftp_CVE-2008-2939.diff    -R(大写)选项表示还原补丁。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值