学习整理2:CentOs上的软件包管理工具
rpm

RPM软件包的管理工具
补充说明

rpm命令 是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。
语法

rpm(选项)(参数)

选项

-a:查询所有套件;
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
-c:只列出组态配置文件,本参数需配合”-l”参数使用;
-d:只列出文本文件,本参数需配合”-l”参数使用;
-e<套件档>或—erase<套件档>:删除指定的套件;
-f<文件>+:查询拥有指定文件的套件;
-h或—hash:套件安装时列出标记;
-i:显示套件的相关信息;
-i<套件档>或—install<套件档>:安装指定的套件档;
-l:显示套件的文件列表;
-p<套件档>+:查询指定的RPM套件档;
-q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
-R:显示套件的关联性信息;
-s:显示文件状态,本参数需配合”-l”参数使用;
-U<套件档>或—upgrade<套件档>:升级指定的套件档;
-v:显示指令执行过程;
-vv:详细显示指令执行过程,便于排错。

参数

软件包:指定要操纵的rpm软件包。
实例

如何安装rpm软件包

rpm软件包的安装可以使用程序rpm来完成。执行下面的命令:

rpm -ivh your-package.rpm

其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。

安装过程中可能出现下面的警告或者提示:

… conflict with …

可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用rpm —force -i强制安装即可

… is needed by …
… is not installed …

此包需要的一些软件你没有安装可以用rpm —nodeps -i来忽略此信息,也就是说rpm -i —force —nodeps可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。

如何安装.src.rpm软件包

有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法:

方法一:

rpm -i your-package.src.rpm
cd /usr/src/redhat/SPECS
rpmbuild -bp your-package.specs #一个和你的软件包同名的specs文件
cd /usr/src/redhat/BUILD/your-package/ #一个和你的软件包同名的目录
./configure #这一步和编译普通的源码软件一样,可以加上参数
make
make install

方法二:

rpm -i you-package.src.rpm
cd /usr/src/redhat/SPECS

前两步和方法一相同

rpmbuild -bb your-package.specs #一个和你的软件包同名的specs文件

这时在/usr/src/redhat/RPM/i386/(根据具体包的不同,也可能是i686,noarch等等)在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。

执行rpm -i new-package.rpm即可安装完成。

如何卸载rpm软件包

使用命令rpm -e包名,包名可以包含版本号等信息,但是不可以有后缀.rpm,比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:

rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd

不可以是下列格式:

rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1

有时会出现一些错误或者警告:

… is needed by …

这说明这个软件被其他软件需要,不能随便卸载,可以用rpm -e —nodeps强制卸载

如何不安装但是获取rpm包中的文件

使用工具rpm2cpio和cpio

rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio —extract —make-directories

参数i和extract相同,表示提取文件。v表示指示执行进程,d和make-directory相同,表示根据包中文件原来的路径建立目录,m表示保持文件的更新时间。

如何查看与rpm包相关的文件和其他信息

下面所有的例子都假设使用软件包mysql-3.23.54a-11

1、我的系统中安装了那些rpm软件包。

rpm -qa 讲列出所有安装过的包

如果要查找所有安装过的包含某个字符串sql的软件包

rpm -qa | grep sql

2、如何获得某个软件包的文件全名。

rpm -q mysql

可以获得系统中安装的mysql软件包全名,从中可以获得当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11

3、一个rpm包中的文件安装到那里去了?

rpm -ql 包名

注意这里的是不包括.rpm后缀的软件包的名称,也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。如果只是想知道可执行程序放到那里去了,也可以用which,比如:

which mysql

4、一个rpm包中包含那些文件。

  1. 一个没有安装过的软件包,使用rpm -qlp **** .rpm
  2. 一个已经安装过的软件包,还可以使用rpm -ql **** .rpm

5、如何获取关于一个软件包的版本,用途等相关信息?

  1. 一个没有安装过的软件包,使用rpm -qip **** .rpm
  2. 一个已经安装过的软件包,还可以使用rpm -qi **** .rpm

6、某个程序是哪个软件包安装的,或者哪个软件包包含这个程序。

rpm -qf which 程序名 #返回软件包的全名
rpm -qif which 程序名 #返回软件包的有关信息
rpm -qlf which 程序名 #返回软件包的文件列表

注意,这里不是引号,而是,就是键盘左上角的那个键。也可以使用rpm -qilf`,同时输出软件包信息和文件列表。

7、某个文件是哪个软件包安装的,或者哪个软件包包含这个文件。

注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:

whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz

rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1

rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1

更多实例

  1. 库依赖: http://rpmfind.net/

源码包 -> 编译 -> 二进制包(rpm 包 / 系统默认包)

rpm 命名规则: 软件(软件名, 软件版本) + 系统(os 版本, os 位数) rpm 校验: SM5DLUGT -> size modified(类型/权限) md5 device L(文件路径) user group time(modified time)

yum: 解决 rpm 依赖的问题

rpm

mysql57-community-release-el6-8.noarch.rpm # 一个 rpm 包的例子
/var/lib/rpm/ # 包全名 -> 包名 的数据库

rpm -Uivh —dodeps xxx # upgrade install verbose hash
rpm -qilpfa|grep xxx # query info list(rpm包安装后的文件位置) package(rpm 包) file(文件属于哪个rpm文件) all
rpm -e # erase
rpm -V # verify
rpm2cpio | cpio -idv

rpm 默认安装位置

/etc/ 配置文件
/usr/bin/ 可执行文件
/urs/lib/ 程序使用的函数库
/usr/share/doc/ 使用手册
/usr/share/man/ manual

yum
一、yum安装使用:

1、Yum:rpm的前端程序,用来解决软件包相关依赖性。

2、yum repository:yum仓库,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)

3、yum客户端配置文件:

/etc/yum.conf:为所有仓库提供公共配置

/etc/yum.repos.d/*.repo:为仓库的指向提供配置

仓库指向的定义:

[repositoryID] 仓库ID

name=Some name for this repository 仓库名

baseurl=url:// 仓库路径

enabled={1|0} 是都启用此仓库,0表示不启用,1表示启用

gpgcheck={1|0} 是否开启包校验,1表示开启,0不开启

gpgkey=URL 校验文件的路径

配置好的文件后,做更新准备

yum clean all 清理本地缓存

yum makecache 构建本地缓存

4、yum-config-manager的使用:

(1)yum-config-manager的安装:

A、该命令在最小化安装的系统上是没有的,需要安装yum-utils-1.1.31-34.el7.noarch.rpm这个RPM包,如果是光盘安装,需要另外安装两个依赖包:python-chardet.noarch 0:2.2.1-1.el7_1 、python-kitchen.noarch 0:1.1.1-5.el7;也可以通过网络安装或者本地的YUM仓库安装,命令为:yum localinstall yum-utils-1.1.31-34.el7.noarch.rpm;

B、如果是yum安装,直接执行# yum install yum-utils -y

(2)yum-config-manager的选项使用:

  1. yum-config-manager add-repo=“仓库路径” #添加仓库
  2. yum-config-manager disable “仓库名" #禁用仓库
  3. yum-config-manager –enable “仓库名” #启用仓库

5、yum的命令使用:

(1) #yum repolist (显示仓库列表)

(2)#yum list (显示仓库的所有程序包)或者yum list all (显示仓库的所有程序包和系统已安装的程序包)

(3) #yum install (程序安装);yum reinstall(程序重新安装)

(4)#yum update (程序升级);yum downgrade (程序降级)

(5)#yum check-update (检查可升级)

(6)#yum remove (卸载程序)

(7)#yum info (查看程序的详细信息)
(8)#yum provides (查看程序包由哪些程序提供)

(9)#yum search (搜索程序包名,属于模糊搜索)

(10)#yum replist (查看程序的依赖程序)

(11)#yum history (查看yum安装的历史)

(12)#yum history info 6

(13)#yum history undo 7 (相当于把历史文件里面的卸载步骤给取消,即为安装。)

yum的命令行选项:只能单一次安装,不能够同时启动多个安装命令

–nogpgcheck:禁止进行gpgcheck

-y: 自动回答为“yes”

-q:静默模式

–disablerepo=repoidglob:临时禁用此处指定的repo

–enablerepo=repoidglob:临时启用此处指定的repo

–noplugins:禁用所有插件

二、本地包和包组的使用:

1、安装及升级本地程序包:

yum localinstall rpmfile1 [rpmfile2] […]

(用install替代)

yum localupdate rpmfile1 [rpmfile2] […]

(用update替代)

2、包组管理的相关命令:

yum groupinstall group1 [group2] […] 安装包组

yum groupupdate group1 [group2] […] 升级包组

yum grouplist [hidden] [groupwildcard] […] 查看包组情况(含安装与未安装)[hidden]为查看隐藏包组

yum groupremove group1 [group2] […] 删除包组

yum groupinfo group1 […] 包组信息页内容查看

三、如何使用本地光盘作为YUM仓库:

1、光盘挂载:

mount /dev/cd0 /mnt/cd0 (手动挂载,机器重启就丢失)

Centos6上autofs自动挂载:/misc/cd (访问即刻挂载上去)

2、创建本地配置文件:

[cd](自己命名)

此处,建议优先使用这路径:baseurl=file:///misc/cd

gpgcheck=0

3、创建yum仓库:

createrepo [options]

程序包编译

一、程序包编译安装:

(1)Application-VERSION-release.src.rpm–> 安装后,
使用rpmbuild命令制作成二进制格式的rpm包,而后再安装

(2)源代码–>预处理–>编译–>汇编–>链接–>执行

?源代码组织格式:

多文件:文件中的代码之间,很可能存在跨文件依赖关系

C、C++:make (项目管理器,configure –>

Makefile.in –> makefile)

c/c++编译器: gcc

java: maven

(3) 开发工具:

  1. 编译C源代码:

准备:提供开发工具及开发环境

开发工具:make, gcc等

开发环境:开发库,头文件

glibc:标准库

实现:通过“包组”提供开发组件
(这里提供的是全部安装,若无需求可自行单个安装)
CentOS 6:

Development Tools

Server Platform Development

CentOS 7:

Development Tools

Development and Creative Workstation

(4)安装步骤:(以下三个步骤必须在解压的源码目录下执行)

第一步:configure脚本

选项:指定安装位置、指定启用的特性
–help: 获取其支持使用的选项

选项分类:

安装路径设定:

–prefix=/PATH: 指定默认安装位置,默认为/usr/local/

–sysconfdir=/PATH:配置文件安装位置

System types:支持交叉编译

Optional Features: 可选特性

–disable-FEATURE

–enable-FEATURE[=ARG]

Optional Packages: 可选包,

–with-PACKAGE[=ARG],依赖包

–without-PACKAGE,禁用依赖关系

  1. 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及makefile.in文件生成makefile

autoconf: 生成configure脚本

automake:生成Makefile.in

注意:安装前查看INSTALL,README

第二步:make 根据makefile文件,构建应用程序

第三步:make install 复制文件到相应路径

安装向导:
(1)先从本地ftp服务器上下载源码包
(2)使用命令#tar xvf httpd-2.2.29.tar.bz2
(3)解压完成后,进入源码解压目录下
(4)执行前,先ls看看/usr/local目录下是否存在同名的目录;执行命令# ./configure
–prefix=/usr/local/httpd –sysconfdir=/etc/httpd,
指定了安装的目录和配置文件存放目录
(5)生成了Makefile文件,并没有报错,这说明前面的步骤正确。
(6)至此,可以开始编译;#make 和 make install 可以分开执行。
(7)完美编译安装完成

dnf

新一代的RPM软件包管理器
补充说明

DNF 是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近,它取代了yum,正式成为 Fedora 22 的包管理器。

DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF 。你可以在这里获得关于 DNF 的更多知识:《 DNF 代替 YUM ,你所不知道的缘由》

DNF 的最新稳定发行版版本号是 1.0,发行日期是2015年5月11日。 这一版本的额 DNF 包管理器(包括在他之前的所有版本) 都大部分采用 Python 编写,发行许可为GPL v2.
安装 DNF 包管理器

DNF 并未默认安装在 RHEL 或 CentOS 7系统中,但是 Fedora 22 已经默认使用 DNF .

1、为了安装 DNF ,您必须先安装并启用 epel-release 依赖。

在系统中执行以下命令:

yum install epel-release

或者

yum install epel-release -y

其实这里并没有强制使用”-y”的理由,相反的,在不使用”-y”的情况下,用户可以在安装过程中查看到底有哪些东西被安装进了系统。但对于没有这个需求的用户,您可以在 YUM 中使用”-y”参数来自动安装所有东西。

2、使用 epel-release 依赖中的 YUM 命令来安装 DNF 包。在系统中执行以下命令:

yum install dnf

然后, DNF 包管理器就被成功的安装到你的系统中了。接下来,是时候开始我们的教程了!在这个教程中,您将会学到27个用于 DNF 包管理器的命令。使用这些命令,你可以方便有效的管理您系统中的 RPM 软件包。现在,让我们开始学习 DNF 包管理器的27条常用命令吧!

查看 DNF 包管理器版本

用处:该命令用于查看安装在您系统中的 DNF 包管理器的版本

dnf –version

!Check-DNF-Version

查看系统中可用的 DNF 软件库

用处:该命令用于显示系统中可用的 DNF 软件库

dnf repolist

查看系统中可用和不可用的所有的 DNF 软件库

用处:该命令用于显示系统中可用和不可用的所有的 DNF 软件库

dnf repolist all

列出所有 RPM 包

用处:该命令用于列出用户系统上的所有来自软件库的可用软件包和所有已经安装在系统上的软件包

dnf list

列出所有安装了的 RPM 包

用处:该命令用于列出所有安装了的 RPM 包

dnf list installed

列出所有可供安装的 RPM 包

用处:该命令用于列出来自所有可用软件库的可供安装的软件包

dnf list available

搜索软件库中的 RPM 包

用处:当你不知道你想要安装的软件的准确名称时,你可以用该命令来搜索软件包。你需要在”search”参数后面键入软件的部分名称来搜索。(在本例中我们使用”nano”)

dnf search nano

查找某一文件的提供者

用处:当你想要查看是哪个软件包提供了系统中的某一文件时,你可以使用这条命令。(在本例中,我们将查找”/bin/bash”这个文件的提供者)

dnf provides /bin/bash

查看软件包详情

用处:当你想在安装某一个软件包之前查看它的详细信息时,这条命令可以帮到你。(在本例中,我们将查看”nano”这一软件包的详细信息)

dnf info nano

安装软件包

用处:使用该命令,系统将会自动安装对应的软件及其所需的所有依赖(在本例中,我们将用该命令安装nano软件)

dnf install nano

升级软件包

用处:该命令用于升级制定软件包(在本例中,我们将用命令升级”systemd”这一软件包)

dnf update systemd

检查系统软件包的更新

用处:该命令用于检查系统中所有软件包的更新

dnf check-update

升级所有系统软件包

用处:该命令用于升级系统中所有有可用升级的软件包

dnf update 或 dnf upgrade

删除软件包

用处:删除系统中指定的软件包(在本例中我们将使用命令删除”nano”这一软件包)

dnf remove nano 或 dnf erase nano

删除无用孤立的软件包

用处:当没有软件再依赖它们时,某一些用于解决特定软件依赖的软件包将会变得没有存在的意义,该命令就是用来自动移除这些没用的孤立软件包。

dnf autoremove

删除缓存的无用软件包

用处:在使用 DNF 的过程中,会因为各种原因在系统中残留各种过时的文件和未完成的编译工程。我们可以使用该命令来删除这些没用的垃圾文件。

dnf clean all

获取有关某条命令的使用帮助

用处:该命令用于获取有关某条命令的使用帮助(包括可用于该命令的参数和该命令的用途说明)(本例中我们将使用命令获取有关命令”clean”的使用帮助)

dnf help clean

查看所有的 DNF 命令及其用途

用处:该命令用于列出所有的 DNF 命令及其用途

dnf help

查看 DNF 命令的执行历史

用处:您可以使用该命令来查看您系统上 DNF 命令的执行历史。通过这个手段您可以知道在自您使用 DNF 开始有什么软件被安装和卸载。

dnf history

查看所有的软件包组

用处:该命令用于列出所有的软件包组

dnf grouplist

安装一个软件包组

用处:该命令用于安装一个软件包组(本例中,我们将用命令安装”Educational Software”这个软件包组)

dnf groupinstall ‘Educational Software’

升级一个软件包组中的软件包

用处:该命令用于升级一个软件包组中的软件包(本例中,我们将用命令升级”Educational Software”这个软件包组中的软件)

dnf groupupdate ‘Educational Software’

删除一个软件包组

用处:该命令用于删除一个软件包组(本例中,我们将用命令删除”Educational Software”这个软件包组)

dnf groupremove ‘Educational Software’

从特定的软件包库安装特定的软件

用处:该命令用于从特定的软件包库安装特定的软件(本例中我们将使用命令从软件包库 epel 中安装 phpmyadmin 软件包)

dnf –enablerepo=epel install phpmyadmin

更新软件包到最新的稳定发行版

用处:该命令可以通过所有可用的软件源将已经安装的所有软件包更新到最新的稳定发行版

dnf distro-sync

重新安装特定软件包

用处:该命令用于重新安装特定软件包(本例中,我们将使用命令重新安装”nano”这个软件包)

dnf reinstall nano

回滚某个特定软件的版本

用处:该命令用于降低特定软件包的版本(如果可能的话)(本例中,我们将使用命令降低”acpid”这个软件包的版本)

dnf downgrade acpid

样例输出:

Using metadata from Wed May 20 12:44:59 2015
No match for available package: acpid-2.0.19-5.el7.x86_64
Error: Nothing to do.

原作者注:在执行这条命令的时候, DNF 并没有按照我期望的那样降级指定的软件(“acpid”)。该问题已经上报。
总结

DNF 包管理器作为 YUM 包管理器的升级替代品,它能自动完成更多的操作。但在我看来,正因如此,所以 DNF 包管理器不会太受那些经验老道的 Linux 系统管理者的欢迎。举例如下:

  1. DNF 中没有 skip-broken 命令,并且没有替代命令供选择。
  2. DNF 中没有判断哪个包提供了指定依赖的 resolvedep 命令。
  3. DNF 中没有用来列出某个软件依赖包的 deplist 命令。
  4. 当你在 DNF 中排除了某个软件库,那么该操作将会影响到你之后所有的操作,不像在 YUM 下那样,你的排除操作只会咋升级和安装软件时才起作用。