当前位置:首页 > 科技 > 正文

Linux程序包管理工具

Linux程序包管理工具

Linux程序包管理工具

1. 程序包

我已经使用 Linux 已经有很长一段时间了,日常中经常会安装或者卸载一些应用,久而久之很多的命令已经让我的记忆能力不容乐观了,所以今天在这里写一点管理程序包管理的博客。一方面,之后可以帮助我快速的查阅想要试用的命令;另一方面,也可以为各位看官带来一丝丝帮助。

1.1 什么是程序包管理

程序包管理的功能就是将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作。

程序包的组成清单 (各个程序包独有)文件清单安装或卸载时运行的脚本

程序包的数据库(各个程序包共享)程序包名称及版本依赖关系功能说明安装生成的各文件的文件路径及校验码信息

1.2 管理程序包的方式

如果所有的程序包都让我们一个个的自行编译安装显然不切实际,除非我们面对有些问题不得不自己手动编译安装。面对各种各样的程序包,我们应该怎么管理呢?所有就出现了很多的公司和组织开发了面对程序包的管理工具,让我们更加方面的管理我们日常中所使用到了程序。

程序包管理器:

debian:系列的操作系统使用的是dpt程序包管理器,其程序的格式是 deb

redhat:系列的操作系统使用的是rpm程序包管理器,其程序的格式是 rpm

Gentoo

Archlinux

程序包前端工具

yum:rpm 包管理器的前端工具

apt-get:deb 包管理器前端工具

zypper:suse 上的 rpm 前端管理工具

dnf:Fedora22+之后的 rpm 包管理器前端管理工具

1.3 程序包的命令规则

源代码包的命名方式

name-version.tar.gz

version = major.minor.release

rpm 包的命名方式

name-version-release.arch.rpm

version = major.minor.release

release:release.os

# 以下为rpm的zlib实例

zlib-1.2.7-13.el7.i686.rpm

# 常见的arch:

x86 ==> 32位 ==> i386, i486, i586, i686

x86_64 ==> 64位 ==> x64, x86_64, amd64

powerpc ==> 小型机 ==> ppc

跟平台无关 ==> noarch

程序包的拆包

程序包的拆包就是将相同的一个程序包根据用途分为不用的包次,对于不用的包次有其不用的用途。

# 以testapp程序包为例进行演示

testapp:

testapp-VERSION-ARCH.rpm ==> 主包

testapp-devel-VERSION-ARCH.rpm ==> 支包

testapp-testing-VERSION-ARHC.rpm ==> 支包

1.4 程序包之间的依赖管理

当我们在使用CentOS安装应用程序的时候,会遇到一个问题。那就是在我们使用rmp安装 A 程序的时候,会提示我们要安装 A 程序必须要安装 B 和 C 程序。当我们顺利安装之后,A 程序才能别我们顺利的安装在系统中。

Linux程序包管理工具

yum-attack

但是,我们有没有想过要是安装 B、C 程序的时候提示我们还要安装 D、E、F 等程序呢?这样可能会无休止的迭代下去,我们的小心脏怎么会受得了。及时受得了,我们装载一个程序可能会花掉什么多时间。难道就没有方法了吗?有,那就是程序包前端工具。

手动解决依赖的问题,我们可以

查看二进制程序所依赖的库文件

ldd /PATH/TO/BINARY_FILE

管理及查看本机装载的库文件

ldconfig -p

显示本机已经缓存的所有可用库文件名及文件路径映射关系

配置文件为:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

缓存文件:/etc/ld.so.cache

各种的程序包的管理器的实质就是自行对于源码包进行编译,将通常用的参数添加进去,生成对应自己平台的程序包格式。利用各自的程序包管理器进行管理以及依赖的解决。

我们需要自行编译的原因就是,他们自行编译的程序包不能满足我们的需要,比如说我想启用一个新特性,但是他们编译的程序包中没有启用,所以我就需要自己编译。

1.5 获取程序包的途径

(1) 系统发版的光盘或官方的服务器光盘镜像CentOS 镜像

中科大镜像阿里云镜像

(2) 项目官方站点

(3) 第三方组织EPELPKGSRPMRpmfind

(4) 自己制作

Note:检查其合法性、来源合法性、程序包的完整性

2. RPM 程序包管理命令

2.1 通用

参数选项:

-v

verbose

-vv

更详细信息

-h

以#显示程序包管理执行进度

2.2 安装

格式:

rpm {-i|--install} [install-options] PACKAGE_FILE ...

参数选项:

[install-options]

--test

测试安装,但不真正执行安装过程;dry run模式

--nodeps

忽略依赖关系

--replacepkg

重新安装

--nosignature

不检查来源合法性

--force

忽略软件包及文件的冲突

--ignoreos

不检查软件包运行的操作系统

--nodigest

不检查包完整性

--noscipts

不执行程序包脚本片断,程序包的脚本分为以下四类--nopre %pre: 安装前脚本

--nopost %post: 安装后脚本

--nopreun %preun: 卸载前脚本

--nopostun %postun: 卸载后脚本

2.3 卸载

格式:

rpm {-e|--erase} [install-options] PACKAGE_NAME ...

参数选项:

[install-options]

--test

只执行删除的测

--noscripts

不运行预安装和后安装脚本程序

--nodeps

不检查依赖性

2.4 升级

格式:

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作

参数选项:

[install-options]

--oldpackage

降级

--force

强行

--test

测试安装,但不真正执行安装过程;dry run模式

Note:

(1) 不要对内核做升级操作,因为有可能因为升级操作导致很多服务不能使用,而且 Linux 支持多内核版本并存。

(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留。

(3) 通常和-vh一起使用,更加直观。

2.5 查询

格式:

rpm {-q|--query} [select-options] [query-options] PACKAGE_FILE ...

参数选项:

[select-options]

-a

所有包

-f

查看指定的文件由哪个程序包安装生成

-p /PATH/TO/PACKAGE_FILE

针对尚未安装的程序包文件做查询操作

--whatprovides CAPABILITY

查询指定的 CAPABILITY 由哪个包所提供

--whatrequires CAPABILITY

查询指定的 CAPABILITY 被哪个包所依赖

[query-options]

--changelog

查询 rpm 包的 changlog

-c

查询程序的配置文件

-d

查询程序的文档

-i

information

-l

查看指定的程序包安装后生成的所有文件

--scripts

程序包自带的脚本片断

-R

查询指定的程序包所依赖的 CAPABILITY

--provides

列出指定程序包所提供的 CAPABILITY

2.6 校验

格式:

rpm {-V|--verify} [select-options] PACKAGE_FILE ...

参数选项:

[select-options]

-f

校验所属的软件包

-a

Verify 校验所有的软件包

-g

校验所有属于组 的软件包

修改类型:

S file Size differs

M Mode differs (includes permissions and file type)

5 digest (formerly MD5 sum) differs

D Device major/minor number mismatch

L readLink(2) path mismatch

U User ownership differs

G Group ownership differs

T mTime differs

P caPabilities differ

Note:包来源合法性验正及完整性验正,完整性验正使用SHA256,来源合法性验正使用RSA。

2.7 其他

导入所需要公钥

rpm --import

/PATH/FROM/GPG-PUBKEY-FILE

Note:CentOS 7 发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7

数据库重建

rpm {--initdb|--rebuilddb}

--initdb

初始化,如果事先不存在数据库,则新建之;否则,不执行任何操作。

--rebuilddb

重建,无论当前存在与否,直接重新创建数据库。

3. YUM 程序包管理命令

3.1 yum 命令用法

格式:

yum [options] [command] [package ...]

用法:

yum 的命令行选项

yum 的命令行参数高于配置文件中指定的参数

--nogpgcheck

禁止进行 gpg check

-y

自动回答为“yes”

-q

静默模式

--disablerepo=repoidglob

临时禁用此处指定的 repo

--enablerepo=repoidglob

临时启用此处指定的 repo

--noplugins

禁用所有插件

显示仓库列表

yum repolist [all|enabled|disabled]

显示程序包

yum list [all | glob_exp1] [glob_exp2] [...]

yum list {available | installed | updates} [glob_exp1] [...]

安装程序包

yum install package1 [package2] [...]

yum reinstall package1 [package2] [...] (重新安装)

升级程序包

yum update [package1] [package2] [...]

yum downgrade package1 [package2] [...] (降级)

检查可用升级

yum check-update

卸载程序包

yum remove | erase package1 [package2] [...]

查看程序包 information

yum info [...]

查看指定的特性(可以是某文件)是由哪个程序包所提供

yum provides | whatprovides feature1 [feature2] [...]

清理本地缓存

yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

构建缓存

yum makecache

搜索

yum search string1 [string2] [...]

以指定的关键字搜索程序包名及 summary 信息

查看指定包所依赖的 capabilities

yum deplist package1 [package2] [...]

查看 yum 事务历史

yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

安装及升级本地程序包

yum localinstall rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use install)

yum localupdate rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use update)

包组管理的相关命令

yum groupinstall group1 [group2] [...]

yum groupupdate group1 [group2] [...]

yum grouplist [hidden] [groupwildcard] [...]

yum groupremove group1 [group2] [...]

yum groupinfo group1 [...]

3.2 yum 客户端配置

3.2.1 什么是yum repository

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

3.2.2 配置文件

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

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

配置文件

# 可以使用man `whatis yum.conf`来查看主配置文件中各个参数的含义

[escape@localhost ~]$ cat /etc/yum.conf

[main]

cachedir=/var/cache/yum/$basearch/$releasever

# 是否保存安装缓存

keepcache=0

# 调试等级

debuglevel=2

# 安装日志

logfile=/var/log/yum.log

# 是否进行平台匹配

exactarch=1

obsoletes=1

# 是否检测合法性

gpgcheck=1

# 是否支持插件

plugins=1

# 可以同时安装几个程序包

installonly_limit=5

# 追踪bug时候的url

bugtracker_url=

# 版本号从哪里获取

distroverpkg=centos-release

仓库指向的定义

# 仓库ID号,要唯一

[repositoryID]

# 描述信息

name=Some name for this repository

# 仓库地址在哪里,一般为ftp://、:///等

# baseurl还可以指向多个url,以此查找

baseurl=url://path/to/repository/

# 使用镜像站点中使用,不能和baseurl一起使用

mirrorlist=

# 仓库是否启用,默认为启用

enabled={1|0}

# 对程序包是否校验,来源合法性和完整性

gpgcheck={1|0}

# 校验的key在哪里

gpgkey=URL

# 是否可以基于组进行管理,默认启用

enablegroups={1|0}

# 默认为roundrobin,意为随机挑选;priority,自上而下优先级

failovermethod={roundrobin|priority}

# 开销,默认为1000

cost=

yum可以指定多个仓库,当安装程序包的时候分析多个仓库,并从这些仓库之中找到一个版本最新的在本地安装。同一类仓库使用镜像管理,不同仓库可以同时使用。如果一个同程序同版本存在于各仓库之中,可以使用距离最近者,用来节省开销。

3.2.3 如何使用光盘当作本地 yum 仓库

挂载光盘至某目录,例如/media/cdrom

mount -r -t iso9660 /dev/cdrom /media/cdrom

创建配置文件

[CentOS7]

name=CentOS7 repo

baseurl=file://repo-path-file

gpgcheck=0

enabled=1

3.2.4 yum 的 repo 配置文件中可用的变量

使用变量可以节省我们的成本,使用同一个配置文件,即可管理所有的仓库。

$releasever ==> 当前OS的发行版的主版本号

$arch ==> 平台架构

$basearch ==> 基础平台,如32位的不管是什么,基础平台就是i386

$YUM0-$YUM9 ==> 自定义的10个变量

3.2.5 如何创建 yum 仓库

createrepo [options] <directory>其中的[options]可以使用man createrepo命令来查看其参数选项。其中-baseurl来指定其程序包目录的父目录,使其下的子目录都可以使用。

创建目录/yum/repo,将 rpm 的程序包放在此目录中

执行createrepo ./,指定当前目录

即会在当前目录下面生成一个repodate目录,其中有个repomd.xml的文件,用来表示缓存是否需要更新。

将这个yum源加入仓库,即可被本地访问。如果想被外部使用,可以搭建 仓库中,即可完成外部访问。

使用yum makecache或者yum repolist即可使用

# yum仓库配置

[newrepo]

name=newrepo test

baseurl=file:///yum/repo/

gpgcheck=0

3.3 apt 和 apt-get 的区别

Let’s see which apt command replaces which apt-get and apt-cache command options.

apt command

the command it replaces

function of the command

apt install

apt-get install

Installs a package

apt remove

apt-get remove

Removes a package

apt purge

apt-get purge

Removes package with configuration

apt update

apt-get update

Refreshes repository index

apt upgrade

apt-get upgrade

Upgrades all upgradable packages

apt autoremove

apt-get autoremove

Removes unwanted packages

apt full-upgrade

apt-get dist-upgrade

Upgrades packages with auto-handling of dependencies

apt search

apt-cache search

Searches for the program

apt show

apt-cache show

Shows package details

apt has a few commands of its own as well.

new apt command

function of the command

apt list

Lists packages with criteria (installed, upgradable etc)

apt edit-sources

Edits sources list

安装指定版本和查询指定软件有多少个版本

# 1.通过apt-get安装指定版本

# apt-get install [package name]=[version]

$ apt-get install vim=7.3.547

# 2.查询指定软件有多少个版本

# 通过网站搜索: /

# apt-cache madison [package name]

# apt-cache policy [package name]

$ apt-cache madison vim

$ apt-cache policy vim

# 3.查询后面带上一些参数来实现筛选

$ apt-cache show package | grep Version

$ apt-show-versions | more

4. dnf 程序包管理命令

DNF 新一代的 RPM 软件包管理器,首先出现在 Fedora 18 这个发行版中。而最近,他取代了 YUM,正式成为 Fedora 22 的包管理器。DNF 包管理器克服了 YUM 包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。DNF 使用 RPM, libsolv 和 hawkey 库进行包管理操作。尽管它没有预装在 CentOS 和 RHEL 7 中,但你可以在使用 YUM 的同时使用 DNF 。

4.1 安装 DNF 包管理器

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

yum install -y epel-release

使用 epel-release 依赖中的 YUM 命令来安装 DNF 包

yum install -y dnf

4.2 常用命令

查看 DNF 包管理器版本

dnf –version

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

dnf repolist

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

dnf repolist all

列出所有 RPM 包

dnf list

列出所有安装了的 RPM 包

dnf list installed

列出所有可供安装的 RPM 包

dnf list available

搜索软件库中的 RPM 包

dnf search nano

查找某一文件的提供者

dnf provides /bin/bash

查看软件包详情

dnf info nano

安装软件包

dnf install nano

升级软件包

dnf update nano

检查系统软件包的更新

dnf check-update

升级所有系统软件包

dnf update 或 dnf upgrade

删除软件包

dnf remove nano 或 dnf erase nano

删除无用孤立的软件包

dnf autoremove

删除缓存的无用软件包

dnf clean all

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

dnf help clean

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

dnf help

查看 DNF 命令的执行历史

dnf history

查看所有的软件包组

dnf grouplist

安装一个软件包组

dnf groupinstall ‘Educational Software’

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

dnf groupupdate ‘Educational Software’

删除一个软件包组

dnf groupremove ‘Educational Software’

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

dnf –enablerepo=epel install nano

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

dnf distro-sync

重新安装特定软件包

dnf reinstall nano

回滚某个特定软件的版本

dnf downgrade nano

获取更多使用信息,请点击这里

5. 源码编译

5.1 源码编译基础

执行过程

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

源代码组织格式

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

C 代码编译安装三步骤

./configure通过选项传递参数,指定启用特性、安装路径等执行时会参考用户的指定以及 Makefile.in 文件生成 makefile检查依赖到的外部环境autoconf ==> 生成 configure 脚本automake ==> 生成 Makefile.in

make

根据 makefile 文件,构建应用程序

make install

安装

开源程序源代码的获取

官方自建站点apache.org (ASF)mariadb.org

代码托管SourceForgeGithub.comcode.google.com

5.2 手动编译

5.2.1 前提:提供开发工具及开发环境

通过“包组”提供开发组件 ==> CentOS 6: "Development Tools", "Server Platform Development"

开发工具:make, gcc 等

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

glibc:标准库

5.2.2 第一步:configure 脚本

选项:指定安装位置、指定启用的特性

--help: 获取其支持使用的选项

选项分类:

安装路径设定:--prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置,默认为/usr/local/--sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置

System types

optional features: 可选特性--disable-FEATURE--enable-FEATURE[=ARG]

optional packages: 可选包--with-PACKAGE[=ARG]--without-PACKAGE

5.2.3 第二步:make

make

5.2.4 第三步:make install

make install

5.2.5 安装后的配置

(1) 导出二进制程序目录至 PATH 环境变量中

编辑文件/etc/profile.d/NAME.sh

export PATH=/PATH/TO/BIN:$PATH

(2) 导出库文件路径

编辑/etc/ld.so.conf.d/NAME.conf

添加新的库文件所在目录至此文件中让系统重新生成缓存 ==> ldconfig [-v]

(3) 导出头文件

基于链接的方式实现 ==> ln -sv

(4) 导出帮助手册

编辑/etc/man.config文件

添加一个 MANPATH

文章作者: Escape

文章链接:

版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !

有话要说...

取消
扫码支持 支付码