包是捆绑在一起并准备安装在 Linux 系统上的软件,安装和卸载包是任何 Linux 用户和管理员的基本操作。本篇将提供 Red Hat Package Manager(RPM)和 YUM 软件管理工具的用法并配合实例,这对你熟悉linux环境中的包管理以及程序的安装有很大帮助。
一、RPM包管理
RPM,是Red Hat Package Manager的缩写。出现最早是在早期Slackware中的打包文件,就是把文件简单打包压缩,解压时会放置在目标位置,优点类似Windows绿色软件安装。这种安装本质上基于压缩解压缩的简单管理方式,不能解决软件安装中的依赖关系问题,软件卸载也是问题。之后,著名的Linux发行版Debian上率先出现了一种软件包管理器dpkg(Debian Package Management)和其前端工具APT,它很好的解决了二进制包的安装问题。
随后,在Red Hat上也出现了类似的软件包管理器,叫做rpm(Redhat Package Management)。rpm使用了一个以.rmp为扩展名的特殊文件,即软件包文件。rpm提供了叫做rmp的管理程序和其它相关的工具程序,以实现查询、安装、升级、更新和删除rpm软件包文件。 rpm将安装过的软件信息,例如软件的版本号码、作者、发行单位、内容、文件路径等信息,保存在数据库中。数据库使用Berkeley DB,在RHEL中这个数据库放在/var/lib/rpm目录下。 rpm软件包文件,里面封装了软件的二进制程序、配合文件、说明文件、链接库以及源代码等。二进制程序是编译好的文件,它必须与安装目标机器的CPU架构(arch)相兼容。
1、rpm命名格式
name-VERSION-release.arch.rpm
例如:bash-4.2.46-19.el7.x86_64.rpm
关键字含义
name | 软件包的包名 |
VERSION | 软件的版本号 |
release | release:发行版;软件的发行版本号 |
arch | 软件包符合的cpu架构;常见的有noarch(平台无关)、x86、x86_64、ppc |
2、rpm常见的分类
首先我们先通过命令rpm -ivh 试着去装http服务,通过命令补全功能,我们看到了许多的包;我们必须要详细了解这些包的具体用途,才能更好的安装我们想要的软件。
[root@localhost ~]# rpm -ivh /misc/cd/Packages/httpd- httpd-2.2.15-59.el6.centos.x86_64.rpm httpd-manual-2.2.15-59.el6.centos.noarch.rpm httpd-devel-2.2.15-59.el6.centos.x86_64.rpm httpd-tools-2.2.15-59.el6.centos.x86_64.rpm
上述例子中,我们通过tab键补出了4个rpm包,包含devel(development)字样的为开发自包;包名含有tools字样的表示相应的一些工具包;httpd-2.2.15-59.el6.centos.x86_64.rpm 这种以版本号命名的就是服务的主包;当然并不只这些包,下面归类列出常见包分类:
Application-Version-Arch.rpm | 服务主包;也是我们安装服务需要安装的包 |
Application-devl-Version-Arch.rpm | 开发子包; |
Application-utils-Version-Arch.rpm | 其他子包; |
Application-libs-Version-Arch.rpm | 相应的库包; |
3、rpm命令的用法
(1)rpm包安装
命令:rpm { -i | -v|-h } [ install-options ] PACKAGE_FILE...
[install-options]
--test: 测试安装,但不真正执行安装,即dry run模式
--nodeps:忽略依赖关系
--replacepkgs| replacefiles :替代安装,覆盖包(假设只删除了某个文件)
--nosignature: 不检查来源合法性(建议先检查,处于安全考量)
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
(2)rpm包升级
命令:rpm {-U|--upgrade} [install-options] PACKAGE_FILE... #存在旧版本就升级,否则就安装
命令:rpm { -F|--freshen } [ install-options ] PACKAGE_FILE... # 安装有旧版本才升级,否者不做任何操作
上述命令中的[ install-options ]
--oldpackage:降级(注意:降级之后以前的版本还在)
--force: 强制安装
rpm包升级与降级注意事项:
不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核
如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
直接安装软件包时会覆盖原文件
(3)rpm包查询
命令:rpm {-q|--query} [select-options] [query-options]
[select-options]
-c: 只列配置文件
-d:只列帮助文档
-i:列出包的描述信息(软件包的版本、开发组织等)
-a: 查询软件包相关的所有包
-f: 查看指定的文件由哪个程序包安装生成(通常会通过which cmd查询到相应的程序文件)
-l: 文件名,列出文件列表
-p rpmfile:针对尚未安装的"程序包文件"做查询操作(rpm -qpi 包名)
(4)rpm包卸载
命令:rpm { -e | --erase } [options ] PACKAGE_NAME
options
--allmatches : 所有匹配,全部卸载,只要是这个名字的
--nodeps :忽略依赖性
--noscripts :
--notriggers :
--test :测试
4、实例
#---查看是否安装了telnet服务软件包---# [root@localhost ~]# rpm -q telnet # 查询是否安装telnet包 telnet-0.17-48.el6.x86_64 [root@localhost ~]# rpm -q telnet-devel package telnet-devel is not installed [root@localhost ~]# [root@localhost ~]# rpm -ivh /misc/cd/Packages/telnet- telnet-0.17-48.el6.x86_64.rpm telnet-server-0.17-48.el6.x86_64.rpm [root@localhost ~]# rpm -ivh /misc/cd/Packages/telnet-0.17-48.el6.x86_64.rpm # 安装telnel包;其中/misc/cd/为光盘挂载目录 #--安装后查询--# [root@localhost ~]# rpm -qi telnet # rpm -qi 查询telnet包的详细信息 Name : telnet Relocations: (not relocatable) Version : 0.17 Vendor: CentOS Release : 48.el6 Build Date: Thu 10 Jul 2014 04:08:14 PM CST Install Date: Tue 22 Aug 2017 06:45:01 PM CST Build Host: c6b8.bsys.dev.centos.org Group : Applications/Internet Source RPM: telnet-0.17-48.el6.src.rpm Size : 112112 License: BSD Signature : RSA/SHA1, Thu 10 Jul 2014 04:29:36 PM CST, Key ID 0946fca2c105b9de Packager : CentOS BuildSystem <http://bugs.centos.org> Summary : The client program for the Telnet remote login protocol Description : Telnet is a popular protocol for logging into remote systems over the Internet. The package provides a command line Telnet client [root@localhost ~]# [root@localhost ~]# rpm -ql telnet # 查询软件包的文件列表 /usr/bin/telnet /usr/share/man/man1/telnet.1.gz [root@localhost ~]# rpm -qf `which telnet` # 查询telnet路径属于哪个rpm包 telnet-0.17-48.el6.x86_64 [root@localhost ~]#
二、使用yum安装包
虽然RPM很好的解决了包的安装、卸载、查询、校验,但是它的管理是对已经安装的软件信息收集的管理,它没有解决软件包安装中最头痛的问题-依赖关系。例如,安装ImageMagick包(一个用于图片处理的包)
[root@localhost ~]# rpm -ivh /misc/cd/Packages/ImageMagick-6.7.2.7-6.el6.x86_64.rpm warning: /misc/cd/Packages/ImageMagick-6.7.2.7-6.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: libHalf.so.6()(64bit) is needed by ImageMagick-6.7.2.7-6.el6.x86_64 libICE.so.6()(64bit) is needed by ImageMagick-6.7.2.7-6.el6.x86_64 libIex.so.6()(64bit) is needed by ImageMagick-6.7.2.7-6.el6.x86_64 libIlmImf.so.6()(64bit) is needed by ImageMagick-6.7.2.7-6.el6.x86_64 ...后面省略... [root@localhost ~]#
由这个例子可以看出:rpm并不能从根本上解决程序包的依赖性关系。
1、yum的特点
yum是建立在RPM之上,它收集rpm包相关信息,检查依赖性,并将众多的信息保存在repo数据库中,数据库采用轻量级关系型数据库Sqlite,早期使用xml文件。
yum按照目录组织软件rpm包,形成仓库repository,并检查仓库中的软件,收集、分析信息后建立repo数据库。
yum采用了CS(Client/Server)架构。Server端就是一个文件服务器,可以采用HTTP、FTP、File、NFS等协议,但是这些协议的URL路径下必须有repo库文件;客户端通过这些协议,连接到repo Server,获取配置文件中指向的URL路径下的repo库信息,并缓冲至本地,CentOS通常是在/var/cache/yum。
用户可使用YUM客户端,查找所有YUM仓库,下载、安装、升级、卸载软件包或者包组。
2、yum服务端的配置
服务端的配置相对简单,只要找一个yum源即可,可以是本地的光盘也可以是网络上的一些yum源;常见的网络yum源:
CentOS系统yum源(阿里云) | https://mirrors.aliyun.com/centos/$releasever/os/x86_64/ |
EPEL源(阿里云) | https://mirrors.aliyun.com/epel/$releasever/x86_64 |
本地yum源(光盘自带源) | 光盘挂载目录/Packages/ |
说明:$releasever:表示操作系统主版本号,是yum识别的一个变量;$arch:表示cpu架构
3、yum客户端配置(yum仓库)
yum客户端的配置主要是配置指向yum服务器端的一个路径;主配置文件位于/etc/yum.conf,一个或多个相关仓库的配置信息可保存一个文件,文件名都已.repo结尾,并放在/etc/yum.repos.d目录中,该目录下的文件格式如下:
[base] # yum仓库的明字,通常为[base]或[epel] name=base baseurl=http://server1/path/to/repository/ ftp://server2/path/to/repository/ file:///misc/cd enabled=1 gpgcheck=1 gpgkey=URL mirrorlist=URL cost=1000
说明:相关名词含义
参数 | 说明 |
repositoryid | 仓库的唯一标识 |
name | 仓库的描述 |
baseurl | 指向yum仓库的repodata目录的上一级目录。可以一个baseurl指向多个URL,但不能出现多个baseurl=url |
enabled | 0或者1,分别表示停用或者启用此yum源 |
gpgcheck | 0或者1,分别表示停用或者启用GPG签名验证 |
gpgkey | 指向GPGKey文件的URL |
4、实例
手动创建yum仓库
[root@localhost ~]# cd /etc/yum.repo.d/ # 切换得到/etc/yum.repo.d/目录 [root@localhost yum.repo.d]# mkdir bak # 创建备份目录 [root@localhost yum.repo.d]# mv *.repo bak/ # 将系统原有的.repo备份至bak/目录下 [root@localhost yum.repo.d]# touch base.repo # 创建自己的yum仓库文件 [root@localhost yum.repo.d]# mount /dev/sr0 /mnt # 挂载光盘 [root@localhost yum.repo.d]# cat > base.repo <<EOF # 像yum仓库文件写入内容 >[base] >name=base >baseurl= # 采用file:协议 >gpgcheck=0 >enabled=1 >EOF [root@localhost yum.repo.d]# yum repolist # 测试是否安装成功 [root@localhost yum.repo.d]# yum -y install autofs # 安装自动挂载服务 [root@localhost yum.repo.d]# service autofs start # 启动服务;centos 7上使用systemctl start autofs [root@localhost yum.repo.d]# service autofs on #开机自动启动服务;centos 7上使用systermctl enable autofs [root@localhost yum.repo.d]# vim base.repo # 再将配置文件中的baseurl修改为系统光盘自动挂载目录 [base] name=base baseurl=file:///misc/cd/ gpgcheck=0 enabled=1 [root@localhost yum.repo.d]#
上述例子仅仅实现了本地yum仓库的实现,即采用关盘中自带的yum源。本例中采用的是file协议,如果你的主机能够联网,你可以采用http服务,使用阿里云或者搜狐的镜像站点;但这里面的yum源只是一些基础源,如果你想要获取更多的包,最新的包,你可以配置epel源。具体做法就是在你所创建的yum仓库文件后面添加epel源的路径:
[root@localhost yum.repo.d]# vim base.repo [base] name=base baseurl=file:///misc/cd/ gpgcheck=0 enabled=1 [epel] name=epel baseurl= ftp:// gpgcheck=0 enabled=1 [root@localhost yum.repo.d]#
三、源码编译安装
源码编译安装时直接使用编写好的程序实现手动编译并安装,需要程序员自己解决包的依赖性关系,通常是C语言的软件开发包。Linux的设计原则就是由众多单一功能软件组成,所以很多软件,需要依赖系统或者其他第三方软件提供的功能(库)。软件依赖关系简单的还好对付,当软件依赖关系复杂甚至循环依赖时就会很让人头疼。
1、源码编译安装的优点是:(1)一份源码,四处编译:开发者只需要提供一份源代码,就可以在任何具备条件的编译环境下,本地编译安装,完全根据本机自身CPU特性度身定做的。这样编译出来的二进制程序,能最大发挥CPU的指令能力,使程序运行具有更高的效率。(2)定制化安装:安装过程中,可以按照需求,设定选项参数进行安装。
2、源码编译安装的缺点:优点其实也就是缺点(1)源代码编译需要安装者有很多的知识、有很强的技能,甚至很好的耐心才能安装好一个软件。(2)软件升级后,有可能导致依赖库的版本过低,或者依赖库升级,导致软件不能使用较新的库而运行失败。(3)卸载时,如何能将安装时产生的文件删除干净,同时也要解决依赖关系,不能把其它软件正在使用的库卸载。运维时,对于批量安装,源代码编译方法就显得效率低下。
3、C语言源代码编译安装三步骤:
./configure
(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及makefile.in文件生成makefile
(2) 检查依赖到的外部环境,如依赖的软件包,如果本机没有就会加载make 根据makefile文件,构建应用程序
make install 复制文件到相应路径
4、实例
下面以http的安装为例,简要介绍如何源码编译安装。
[root@localhost ~]# cd app # 进入目标目录 [root@localhost app]# rpm -q httpd* # 查看是否安装有httpd服务 [root@localhost app]# yum remove httpd* # 卸载所有httpd服务 [root@localhost app]# tar xvf httpd-2.4.37.tar.bz2 # 解压httpd源码包 [root@localhost app]# cd httpd-2.4.37 # 进入httpd-2.4.37目录 [root@localhost app]# cat README # 查看README文件与INSTALL文件,里面有详细的说明信息 [root@localhost app]# cat INSTALL [root@localhost app]# ./configure --prefix=/app/apache24 --sysconfdir=/etc/apache24/ --enable-rewite [root@localhost app]# make -j 4 # -j 表示多线程编译安装,编译速度快 [root@localhost app]# make install [root@localhost app]# vim /etc/profile.d/apache24.sh # 提供PATH路径 export PATH=/app/apache24/bin:$PATH [root@localhost ~]# vim /etc/man.config # 添加帮助文档 MANPATH /app/apache24/man
说明:configure 命令又众多的选项:
-prefix=/PATH: 指定默认安装位置,默认为/usr/local/
--sysconfdir=/PATH:配置文件安装位置/
System types:支持交叉编译
转载于:https://blog.51cto.com/vinsent/1962172