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 程序才能别我们顺利的安装在系统中。

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 获取程序包的途径

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=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
# 版本号从哪里获取
distroverpkg=centos-release
  • 仓库指向的定义
# 仓库ID号,要唯一
[repositoryID]
# 描述信息
name=Some name for this repository
# 仓库地址在哪里,一般为ftp://、http://、nfs://、file:///等
# 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 仓库

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

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

  1. 创建配置文件
[CentOS7]
name=CentOS7 repo
baseurl=file://repo-path-file
gpgcheck=0
enabled=1

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

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

http://mirrors.xxxxx.com/centos/$releasever/$basearch/os

$releasever ==> 当前OS的发行版的主版本号
$arch ==> 平台架构
$basearch ==> 基础平台,如32位的不管是什么,基础平台就是i386
$YUM0-$YUM9 ==> 自定义的10个变量

3.2.5 如何创建 yum 仓库

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

  1. 创建目录/yum/repo,将 rpm 的程序包放在此目录中
  2. 执行createrepo ./,指定当前目录
  3. 即会在当前目录下面生成一个repodate目录,其中有个repomd.xml的文件,用来表示缓存是否需要更新。
  4. 将这个yum源加入仓库,即可被本地访问。如果想被外部使用,可以搭建http服务,之后将这个路径添加到 yum 仓库中,即可完成外部访问。
  5. 使用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.查询指定软件有多少个版本
#   通过网站搜索: https://packages.ubuntu.com/
#   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 包管理器

  1. 为了安装 DNF ,您必须先安装并启用 epel-release 依赖
    yum install -y epel-release
  2. 使用 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 updatednf upgrade
  • 删除软件包
    dnf remove nanodnf 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
  • 代码托管
    • SourceForge
    • Github.com
    • code.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 !
  目录