Linux中包的管理与程序安装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中包的管理与程序安装相关的知识,希望对你有一定的参考价值。

包是捆绑在一起并准备安装在 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服务,通过命令补全功能,我们看到了许多的包;我们必须要详细了解这些包的具体用途,才能更好的安装我们想要的软件。

[[email protected] ~]# 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服务软件包---#

[[email protected] ~]# rpm -q telnet      # 查询是否安装telnet包
telnet-0.17-48.el6.x86_64
[[email protected] ~]# rpm -q telnet-devel 
package telnet-devel is not installed
[[email protected] ~]# 
[[email protected] ~]# rpm -ivh /misc/cd/Packages/telnet-
telnet-0.17-48.el6.x86_64.rpm         telnet-server-0.17-48.el6.x86_64.rpm  
[[email protected] ~]# rpm -ivh /misc/cd/Packages/telnet-0.17-48.el6.x86_64.rpm  # 安装telnel包;其中/misc/cd/为光盘挂载目录

#--安装后查询--#

[[email protected] ~]# 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
[[email protected] ~]# 
[[email protected] ~]# rpm -ql telnet         # 查询软件包的文件列表
/usr/bin/telnet
/usr/share/man/man1/telnet.1.gz
[[email protected] ~]# rpm -qf `which telnet`  # 查询telnet路径属于哪个rpm包
telnet-0.17-48.el6.x86_64
[[email protected] ~]#


二、使用yum安装包

虽然RPM很好的解决了包的安装、卸载、查询、校验,但是它的管理是对已经安装的软件信息收集的管理,它没有解决软件包安装中最头痛的问题-依赖关系。例如,安装ImageMagick包(一个用于图片处理的包)

[[email protected] ~]# 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
   ...后面省略...
[[email protected] ~]#

由这个例子可以看出: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仓库

[[email protected] ~]# cd /etc/yum.repo.d/  # 切换得到/etc/yum.repo.d/目录
[[email protected] yum.repo.d]# mkdir bak     # 创建备份目录
[[email protected] yum.repo.d]# mv *.repo bak/     # 将系统原有的.repo备份至bak/目录下
[[email protected] yum.repo.d]# touch base.repo     # 创建自己的yum仓库文件
[[email protected] yum.repo.d]# mount /dev/sr0 /mnt     # 挂载光盘
[[email protected] yum.repo.d]# cat > base.repo <<EOF     # 像yum仓库文件写入内容
>[base]
>name=base
>baseurl=     # 采用file:协议 
>gpgcheck=0
>enabled=1
>EOF
[[email protected] yum.repo.d]# yum repolist     # 测试是否安装成功
[[email protected] yum.repo.d]# yum -y install autofs  # 安装自动挂载服务
[[email protected] yum.repo.d]# service autofs start # 启动服务;centos 7上使用systemctl start autofs
[[email protected] yum.repo.d]# service autofs on   #开机自动启动服务;centos 7上使用systermctl enable autofs
[[email protected] yum.repo.d]# vim base.repo     # 再将配置文件中的baseurl修改为系统光盘自动挂载目录
[base]
name=base
baseurl=file:///misc/cd/
gpgcheck=0
enabled=1
[[email protected] yum.repo.d]#

上述例子仅仅实现了本地yum仓库的实现,即采用关盘中自带的yum源。本例中采用的是file协议,如果你的主机能够联网,你可以采用http服务,使用阿里云或者搜狐的镜像站点;但这里面的yum源只是一些基础源,如果你想要获取更多的包,最新的包,你可以配置epel源。具体做法就是在你所创建的yum仓库文件后面添加epel源的路径:

[[email protected] 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
[[email protected] 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的安装为例,简要介绍如何源码编译安装。

[[email protected] ~]# cd app             #  进入目标目录
[[email protected] app]# rpm -q httpd*   # 查看是否安装有httpd服务
[[email protected] app]# yum remove httpd*     # 卸载所有httpd服务
[[email protected] app]# tar xvf httpd-2.4.37.tar.bz2      # 解压httpd源码包
[[email protected] app]# cd httpd-2.4.37                    # 进入httpd-2.4.37目录 
[[email protected] app]# cat README       # 查看README文件与INSTALL文件,里面有详细的说明信息
[[email protected] app]# cat INSTALL
[[email protected] app]# ./configure --prefix=/app/apache24 --sysconfdir=/etc/apache24/ --enable-rewite
[[email protected] app]# make -j 4      # -j 表示多线程编译安装,编译速度快
[[email protected] app]# make install
[[email protected] app]# vim /etc/profile.d/apache24.sh     # 提供PATH路径
export PATH=/app/apache24/bin:$PATH
[[email protected] ~]# vim /etc/man.config         # 添加帮助文档
MANPATH /app/apache24/man

说明:configure 命令又众多的选项:

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

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

  • System types:支持交叉编译



本文出自 “vinsent” 博客,请务必保留此出处http://vinsent.blog.51cto.com/13116656/1962172

以上是关于Linux中包的管理与程序安装的主要内容,如果未能解决你的问题,请参考以下文章

Linux中包管理工具

Linux/Centos7安装与管理程序

Linux/Centos7安装与管理程序

SonarQube代码质量管理平台的安装与配置

linux中应用程序的安装与管理

GitLab安装与汉化-实战