您的位置:首页 > 运维架构 > Linux

Linux中包的管理与程序安装

2017-09-02 19:20 507 查看
包是捆绑在一起并准备安装在 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
enabled0或者1,分别表示停用或者启用此yum源
gpgcheck0或者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:支持交叉编译
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息