GO
0. RPM和DPKG两大阵营
在 GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和 DPKG 为最常见的两类软件包管理工具,他们分别应用于基于 RPM 软件包的 Linux 发行版本和 DEB 软件包的 Linux 发行版本。软件包管理工具的作用是提供在操作系统中安装,升级,卸载需要的软件的方法,并提供对系统中所有软件状态信息的查询。
RPM 全称为 Redhat Package Manager,最早由 Red Hat 公司制定实施,随后被 GNU 开源操作系统接受并成为很多 Linux 系统 (RHEL) 的既定软件标准。与 RPM 进行竞争的是基于 Debian 操作系统 (UBUNTU) 的 DEB 软件包管理工具- DPKG,全称为 Debian Package,功能方面与 RPM 相似。
1. CentOS软件管理
学习CentOS的软件管理方式,包括RPM包的安装更新查询卸载等,还有源码包的安装方式。
1.1. RPM
一个 RPM 包包含了已压缩的软件文件集以及该软件的内容信息(在头文件中保存),通常表现为以 .rpm 扩展名结尾的文件,例如 package.rpm 。对其操作,需要使用 rpm 命令。下面介绍 rpm 工具的参数和使用方法。
1.1.1. RPM 介绍
RPM是Red Hat Package Manager的缩写,由RedHat公司开发。它是以一种数据库记录的方式将我们所需要的套件安装到Linux主机的一套管理程序。也就是说,在Linux系统中存在着一个关于RPM的数据库,它记录了安装的包以及包与包之间的依赖关系。RPM包是预先在Linux机器上编译并打包的文件,安装非常快捷。但是它也有一些缺点,比如安装环境必须与编译时一致或相当,包与包之间存在着相互依赖的情况,卸载包时需要先把依赖的包卸载。如果依赖的包是系统所必须的,就不能卸载这个包,否则系统会崩溃。
RPM包的文件名都由-和.分成了若干部分,一般都像这样 abattis-cantarell-fonts-0.0.16-3.el7.noarch.rpm
、abrt-2.1.11-45.el7.centos.x86_64.rpm
。abrt为包名,2.11为版本信息,45.el7.centos为发布版本号,x86_64为运行平台。常见的运行平台有i386、i486、i586、i686(这三个为32位的CPU)和x86_64(64位的CPU)。另外,有些RPM包并没有写具体的平台而是noarch,这是该包没有平台限制的意思。
1.1.2. rpm 命令
常用选项 | 意义 |
---|---|
-i | 表示安装 |
-v | 表示可视化 |
-h | 表示显示安装进度 |
-U | 表示升级 |
-e | 表示卸载 |
-q | 表示查询 |
-p | 表示对RPM包进行查询,通常和其它参数同时使用 |
–force | 表示强制安装,即使覆盖属于其他包的文件也要安装 |
–nodeps | 表示当要安装(或卸载)的RPM包依赖于其它包时,即使其它包没有安装(或卸载),也要安装(或卸载)这个包 |
命令 | 功能 |
---|---|
rpm -ivh package.rpm | 安装RPM包 |
rpm -Uvh package.rpm | 升级RPM包 |
rpm -ev package | 卸载RPM包(这里的filename是通过RPM的查询功能所查询到的) |
rpm -q package | 查询一个RPM包 |
rpm -qa (package) | 查询当前系统所有已安装的RPM包 |
rpm -qi package | 得到一个已安装的RPM包的相关信息 |
rpm -ql package | 列出一个RPM包的安装文件 |
rpm -qf 文件的绝对路径 | 列出某个文件属于哪个RPM包 |
rpm -qRp package.rpm | 查询RPM包的依赖关系 |
1.1.3. RPM 包管理示例
以下步骤描述了一个普通用户安装 IBM Lotus Notes V85 ( 以下简称 Notes) 的典型操作过程。 Notes 的 RPM 包名为 ibm_lotus_notes-8.5.i586.rpm 。
- 首先查询是否该软件是否已经在系统中存在 :
rpm -qa | grep ibm_lotus_notes
。如果返回信息为空那么说明该软件还未被安装。 查询 Notes 软件包内容:
12345678910111213# rpm -qip ibm_lotus_notes-8.5.i586.rpmName : ibm_lotus_notes Relocations: /opt/ibm/lotus/notesVersion : 8.5 Vendor: IBMRelease : 20081211.1925 Build Date: Sat 13 Dec 2008 09:38:55 AM CSTInstall Date: (not installed) Build Host: dithers.notesdev.ibm.comGroup : Applications/OfficeSource RPM: ibm_lotus_notes-8.5-20081211.1925.src.rpmSize : 603779427 License: CommercialSignature : DSA/SHA1, Sat 13 Dec 2008 09:43:02 AM CST, Key ID 314c8c6534f9ae75Summary : IBM Lotus NotesDescription :IBM Lotus Notes software provides a robust ...安装 Notes:
rpm -ivh ibm_lotus_notes-8.5.i586.rpm
。返回信息如下:12Preparing... ########################################### [100%]1:ibm_lotus_notes ########################################### [100%]升级 Notes:若今后需要基于该版本升级至更高版本的 Notes( 缝 .0 - ibm_lotus_notes-9.0.i586.rpm),则使用 -U 参数:
# rpm -Uvh ibm_lotus_notes-8.5.i586.rpm
- 卸载 Notes:注意卸载软件使用软件名称,而不是包文件名:
# rpm -ev ibm_lotus_notes
1.2. YUM 工具
1.2.1. YUM 介绍
YUM工具是用来集中管理RPM包的,使用它会更加方便的进行安装卸载升级RPM包。YUM工具最大的优势在于可以联网去下载所需要的RPM包,然后自动安装,若是所安装的RPM包有依赖关系,它会依次安装所依赖的包。
YUM 基于 RPM 包管理工具,能够从指定的源空间(服务器,本地目录等)自动下载目标 RPM 包并且安装,可以自动处理依赖性关系并进行下载、安装,无须繁琐地手动下载、安装每一个需要的依赖包。此外,YUM 的另一个功能是进行系统中所有软件的升级。如上所述,YUM 的 RPM 包来源于源空间,在 RHEL 中由 /etc/yum.repos.d/ 目录中的 .repo 文件配置指定,如 rhel-debuginfo.repo 的内容:
rhel-debuginfo.repo
YUM 的系统配置文件位于 /etc/yum.conf,内容如下:
配置文件用来定义用户期望的 yum 行为,比如,gpgcheck 表明安装时不进行 gpg 验证,exclued=firefox gftp 表明进行系统全软件升级时不升级 firefox 和 gftp 。
1.2.2. YUM 命令
命令 | 功能 |
---|---|
yum repolist all | 列出所有仓库 |
yum list all | 列出仓库中所有软件包 |
yum list | 列出所有可用的RPM包资源。(已安装可未安装的都显示出来,yum list会先列出已经安装的包(Installed Packages) 然后再列出可以安装的包(Available Packages)) |
yum clean all | 清除所有仓库缓存 |
yum info 软件包名称 | 查看软件包信息 |
yum search [关键字] | 搜索RPM包(还可以利用 grep 来过滤) |
yum install [-y] RPM包名 | 安装RPM包。加上-y选项,表示自动安装,跳过交互的程序 |
yum reinstall 软件包名称 | 重新安装软件包 |
yum remove [-y] RPM包名 | 卸载RPM包(注意,卸载时最好不要加-y选项,以免重要的RPM包被卸载掉) |
yum check-update | 列出系统中可升级的所有软件 |
yum update [-y] RPM包名 | 升级RPM包 |
yum -y update | 升级所有包,改变软件设置和系统设置,系统版本内核都升级 |
yum -y upgrade | 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变 |
yum provides 命令名 | 查询该命令是由那个包安装的 |
yum grouplist | 列出所有安装过和未安装过的套件 |
yum groupinfo 软件包组 | 查询指定的软件包组信息 |
yum groupinstall 套件名 | 安装该组件套件 |
yum groupremove 套件名 | 卸载该组件套件 |
1.2.3. 安装YUM扩展源
- 我们使用 yum 安装 rpm 包时,经常遇到一些包没有,这时候你可以尝试安装 epel 的扩展源,这里有很多系统不自带的 rpm 包。
yum install -y epel-release
yum list
- 你会发现最右侧出现很多 epel 的 rpm 包。
- 下载一个扩展源的rpm包,用yum安装。然后用
yum clean all
或yum makecache
清除缓存,用yum list
检查是否成功。
1.2.4. 使用本地光盘制作YUN源
有时候,Linux系统不能联网,此时当然就不能很便捷地使用联网的yum源了,这时就需要我们自己在Linux系统下使用光盘制作yum源。具体操作步骤如下:
- 挂载光盘
mount /dev/cdrom /mnt
- 删除/etc/yum.repos.d目录下所有的repo文件(删除之前,最好先做一下备份)。
cp -r /etc/yum.repos.d /etc/yum.repos.d_bak
rm -rf /etc/yum.repos.d/*
创建新文件dvd.repo,并添加如下内容:
123456# vim /etc/yum.repos.d/dvd.repo[dvd]name=install dvdbaseurl=file:///mntenabled=1gpgcheck=0刷新repos生成缓存,如下所示:
yum makecache
- 然后就可以用yum了。若需要恢复之前的yum源,则进行如下操作:123rm -rf /etc/yum.repos.dmv /etc/yum.repos.d_bak /etc/yum.repos.dyum list //这一步是必须要执行的,这样就可以生成缓存,方便下次使用
1.2.5. 利用YUM工具下载RPM包
有时我们需要下载RPM包但不安装,而仅仅是复制给其它机器使用。我们可以用YUM工具来完成这个任务,做到只下载而不安装。命令如下:
- 安装 yum-downloadonly(首先需要安装一个插件来支持只下载不安装)
yum install -y yum-plugin-downloadonly.noarch
(如果你的 CentOS 是 5.x 版本,则需要安装 yum-downloadonly.noarch 这个包。) - 只下载而不安装RPM包
yum install 包名 -y --downloadonly
(这样虽然下载了,但是并没有保存到我们想要的目录下,它默认保存到了/var/cache/yum/后面还有好几层子目录,根据你系统的版本决定。) - 把RPM包下载到指定目录
yum install 包名 -y --downloadonly --downloaddir=绝对路径
- 下载一个已安装过的RPM包
yum reinstall 包名 -y --downloaonly [--downloddir=绝对路径]
2. Ubuntu软件管理
2.1. DEB
2.1.1. DEB 介绍
一个 DEB 包包含了已压缩的软件文件集以及该软件的内容信息(在头文件中保存),通常表现为以 .deb 扩展名结尾的文件,例如 package.deb 。对其操作,需要使用 dpkg 命令。下面介绍 dpkg 工具的参数和使用方法。
2.1.2. dpkg 命令
DPKG 的常规使用方法为 dpkg -? Package(.rpm)
, 其中 -?
为安装参数 ( 更多信息,请查阅帮助 $man rpm)。
参数 | 意义 |
---|---|
-l | 在系统中查询软件内容信息 |
–info | 在系统中查询软件或查询指定rpm包的内容信息 |
-i | 在系统中安装/升级软件 |
-r | 在系统中卸载软件,不删除配置文件 |
-P(大) | 在系统中卸载软件以及其配置文件 |
depk命令参数使用方法
命令 | 意义 |
---|---|
dpkg -i package.deb | 安装或升级DEB包命令 |
dpkg -r package.deb | 卸载DEB包,但是不删除其配置文件 |
dpkg -P package.deb | 卸载DEB包,并且删除其配置文件 |
dpkg-deb -c package.deb | 查询DEB包中包含的文件列表命令 |
dpkg –info package.deb | 查询DEB包中包含的内容信息命令 |
dpkg -l package | 查询系统中所有已安装DEB |
2.1.3. DEB 包管理示例
以下步骤描述了一个普通用户安装 IBM Lotus Notes V85 ( 以下简称 Notes) 的典型操作过程。 Notes 的 DEB 包名为 ibm_lotus_notes-8.5.i586.deb。
- 首先查询是否该软件是否已经在系统中存在:
dpkg -l ibm-lotus-*
- 如果系统中从未安装过 Lotus 产品,那么返回信息为 :
No pakcages found matching ibm-lotus-*
- 如果系统安装过 Lotus 产品,但已被删除,那么返回信息为 :
pn ibm-lotus-notes none (no description available)
- 如果系统中从未安装过 Lotus 产品,那么返回信息为 :
查询 Notes 软件包内容:
dpkg --info ibm_lotus_notes-8.5-i586.deb
。返回信息如下:123456789101112new debian package, version 2.0.size 335012296 bytes: control archive= 231821 bytes....Package: ibm-lotus-notesVersion: 8.5-20081211.1925Section: IBMPriority: extraArchitecture: i386Installed-Size: 619444Maintainer: IBM Lotus ProductDescription: IBM Lotus NotesIBM Lotus Notes software provides a robust ... ...安装 Notes :
dpkg -i ibm_lotus_notes-8.5.i586.deb
。返回信息如下:12345(Reading database ... 151150 files and directories currently installed.)Preparing to replace ibm-lotus-notes 8.5-20081211.1925(using ibm-lotus-notes-higher-version.i586.deb) ...Unpacking replacement ibm-lotus-notes ...Setting up ibm-lotus-notes (higher-version) ...升级 Notes:
dpkg -i ibm_lotus_notes-8.5.i586.deb
。返回信息如下:12345(Reading database ... 151150 files and directories currently installed.)Preparing to replace ibm-lotus-notes 8.5-20081211.1925(using ibm-lotus-notes-higher-version.i586.deb) ...Unpacking replacement ibm-lotus-notes ...Setting up ibm-lotus-notes (higher-version) ...卸载 Notes : 注意卸载软件使用软件名称,而不是包文件名:
dpkg -P ibm-lotus-notes
2.2. APT工具
2.2.1. APT 介绍
APT 的全称为 Advanced Packaging Tools 。与 YUM 对应,它最早被设计成 DPKG 的前端软件,现在通过 apt-rpm 也支持 rpm 管理。而本节本节将介绍 APT 作为 DPKG 前端的使用。 APT 的主要包管理工具为 APT-GET,通过此工具可满足和上述 YUM 相似的功能要求。
APT 的软件源定义来自 /etc/apt/sources.list 文件:
注意每次手动修改上述文件后,需要使用 sudo apt-get update
来更新系统的源使新的源数据被当前系统识别。
Ubuntu 中 APT 的配置文件位于 /etc/apt/apt.conf.d,其中的多个配置文件依功能分类。
2.2.2. APT 命令
命令 | 意义 |
---|---|
apt-get update | 更新源索引 |
apt-get install package-name | 安装指定软件 |
apt-get source package-name | 下载指定软件的源文件 |
apt-get upgrade | 将系统中所有软件升级到最新版本 |
apt-get dist-upgrade | 将操作系统连同所有软件升级到最新版本 |
apt-get remove package-name | 卸载指定软件 |
3. RPM与DEB的一些常见问题
3.1. 查询软件包依赖关系
查询 RPM 包的依赖关系,使用 rpm -qRp
:
表明 package_a.rpm 依赖于 version_info 版的 package_b,或者任何高于并包括 version_info 版的 package_b,亦或低于或包括 version_info 版的 package_b 。所以 package_b.rpm 必须在 package_a 之前安装于系统中。
查询 DEB 包的依赖关系,可解读 dpkg –info 结果中的 Pre-Depends 字段:
表明 package_a.deb 依赖于 version_info 版的 package_b 或者任何高于并包括 version_info 版的 package_b 亦或低于或包括 version_info 版的 package_b. 所以 package_b.deb 必须在 package_a 之前安装于系统中。
所以正确的安装方法如下所示:
对于 package_a,正确的安装方法应该是:
如上示例为最理想的依赖关系,实际应用中往往最令用户头疼的是 package_a 依赖于 package_b/c/d/e/f 等多个包 , 而 package_b/c/d/e/f 等包又依赖于 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 … … 为保证软件的正常使用,必须找到所有依赖包以及子依赖包并且安装。过多的依赖关系大大降低了 Linux 软件安装的用户友好性。所以针对此类问题,使用了更高级的包管理策略去解决 - yum/apt 。
3.2. RPM 与 DEB 的兼容 - Alien
Alien 工具可以将 RPM 软件包转换成 DEB 软件包,或把 DEB 软件包转换成 RPM 软件包,以此适应兼容性的需要。注意首先请在系统中安装 alien 。
在 UBUNTU 中使用 alien 将 rpm 转换为 deb 并安装 :
在 RHEL 中使用 alien 将 deb 转换为 rpm 并安装 :
3.3. 常见的一些问题
3.3.1. 可以手动强制不进行 RPM/DEB 的依赖性关系检查吗?
- RPM:可以。使用 –nodeps 辅助参数,则安装过程将不理会依赖性关系限制,强制安装目标包,如:
rpm -i --nodeps package_a.rpm
- DEB:可以。使用— force-depends 辅助参数,如:
dpkg -i --force-depends package_a.deb
3.3.2. RPM 中的 –force 是干什么用的?
RPM 中的默认安装规则是不允许同一个包多次安装的,也不允许降级安装。使用 –force 辅助参数将不考虑以上因素,强制安装 RPM 包。但是,–force 无法强制安装一个不满足系统依赖性关系的包 ( 此时需要用到 –nodeps 参数 ) 。使用方法如:rpm -i --force package_a.rpm
3.3.3. RPM/DPKG 支持远程安装吗?
- RPM:是。 RPM 支持 HTTP 和 FTP 协议,如:
rpm -Uvh ftp://user:pass@ftpserver/package.rpm
- DEB:最新的基于 DEB 包的系统中,远程安装通常被更先进的 APT 代替。
3.3.4. 可以从 RPM/DPKG 中抽取个别文件吗?
- RPM:是。可以使用 rpm2cpio 工具来提取文件
- DEB:是。可以使用 dpkg-deb 工具来提取文件:
dpkg-deb --extract ibm_lotus_notes-8.5.i586.deb $dir( 目标目录 )
3.3.5. RPM/DPKG 提供包安装成功的验证机制吗?
- RPM:是。可以使用 -V 参数进行验证。
- DEB:Debian 系统通常使用 debsums 工具参数进行验证。
3.3.6. RPM/DPKG 提供包安全签名吗?
RPM:是。可以使用 –import 导入与软件同时发布的 GPG KEY, 接着使用 -K 命令来验证包的安全性,如:
1234# rpm --import pub_ibm_lotus_notes.gpg# rpm -K ibm_lotus_notes-8.5.i586.rpm返回信息 :ibm_lotus_notes-8.5.i586.rpm: (sha1) dsa sha1 md5 gpg OKDEB:DPKG 不提供原生的 Key 验证机制。可以使用 debsigs 和 debsigs-verify
3.3.7. 如果 RPM 的底层数据库损坏,RPM 还能使用吗?
- RPM:如果底层数据库损坏,RPM 将无法正常使用。此时最常用的解决方法是重构数据库:
rm -f /var/lib/rpm/__* ; rpm -vv --rebuilddb
- DEB:DPKG 本身不提供底层数据库恢复机制。它的数据库以文件形式保存在 /var/lib/dpkg 目录中。及时地备份这个目录是最好的预防数据库损坏措施。
3.3.8. 可以查询系统中已经安装的某个文件属于哪个 RPM 包吗?
- RPM:可以。使用 -qf 参数 , 如在安装了 Notes8.5 的系统中:
rpm -qf /opt/ibm/lotus/notes/notes
;返回信息 :Ibm_lotus_notes-8.5-20081211.1920
- DEB:可以。使用— search 参数 , 如在安装了 Notes8.5 的系统中:
dpkg --search /opt/ibm/lotus/notes/notes
;返回信息 :ibm-lotus-notes: /opt/ibm/lotus/notes/notes
3.3.9. 可以查询 RPM 包的安装时间吗?
- RPM:可以。可使用 –last 查询。如:
rpm -qa --last
;返回信息 : 系统中所有软件的安装时间。 - DEB:DPKG 不提供直接的查询参数,但是可以用过查询 dpkg 的日志文件实现这个功能。如:
cat /var/log/dpkg.log | grep "\ install\ "
4. 源码包安装
在Linux下安装源码包是最常用的。安装源码包,需要我们把源代码编译成可执行的二进制文件。如果你能读懂这些源代码,就可以修改这些源代码的自定义功能,然后按你的需求编译。使用源码包除了可以自定义修改源代码外,还可以定制相关的功能,因为源码包在编译时可以附加额外的选项。
源码包的编译用到了Linux系统里的编译器。常见的源码包一般都是用C语言开发的,因为C语言是Linux上最标准的程序语言。Linux上的C语言编译器称为gcc。利用它可以把C语言编译成可执行的二进制文件。所有,如果Linux上没有安装gcc,就无法编译源码。可以使用命令yum install -y gcc
来完成安装。
4.1. 源码包安装的一般步骤
安装源码包通常需要以下三个步骤:
./configure
。这一步可以定制功能,加上相应的选项即可,具体有什么选项可以通过命令./configure --help
来查看。(一般常用的有–prefix=PREFIX这个选项的意思是定义软件包安装到哪里)这一步会自动检测你的Linux系统与相关的套件是否有编译该源代码包时所需要的库,因为一旦缺少某个库,就不能完成编译,所以若是遇到这种情况,要先安装这些库。只有检测通过后,才会生成Makefile文件。make
。使用这个命令,会根据Makefile文件中预设的参数进行编译,这一步其实就是gcc在工作了。make install
。这一步是安装步骤,用于创建相关软件的存放目录和配置文件。
注意,对于以上这3个步骤,并不是所有的源代码包软件都一样,也就是说,源码包的安装并没有标准的安装步骤。这就需要你在拿到源码包解压后,进入目录,找到相关的帮助文档(通常,会以INSTALL或README为文件名)。
通常,源码包都会放置在/usr/local/src目录下,方便对源码包的统一管理。
4.2. 一个源码包安装的实例(安装Apache)
- 下载源码包
cd /usr/local/src/
#约定目录wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.2.27.tar.bz2
- 解压
tar jxvf httpd-2.2.27.tar.bz2
//查看README或者INSTALL说明文件
- 指定编译参数
./configure --help
./configure --prefix 安装路径 ……
echo $?
验证是否成功make
echo $?
验证是否成功make install
OK