Linux下软件包的管理

RPM

什么是rpm

RPM是RedHat Package Manager(RedHat软件包管理工具)。它工作于R e d Hat Linux以及
其它Linux系统,成为了Linux中公认的软件包管理标准。红帽子软件公司鼓励其他厂商来了解R PM并在自己的产品中使用它。R PM的发布基于GPL协议。随着R PM在各种发行版本的广泛使用,如今R PM的全称是R PM Pack age
Manage r。

rpm包管理的用途

1、可以安装、删除、升级和管理软件;当然也支持在线安装和升级软件;
2、通过RPM包管理能知道软件包包含哪些文件,也能知道系统中的某个文件属于哪个软件包;
3、可以在查询系统中的软件包是否安装以及其版本;
4、作为开发者可以把自己的程序打包为RPM 包发布;
5、软件包签名GPG和MD5的导入、验证和签名发布
6、依赖性的检查,查看是否有软件包由于不兼容而扰乱了系统;

RPM 包的命名方式

以 httpd-2.2.15-39.el6.centos.x86_64.rpm 为例,

  • httpd 表示软件名
  • 2.2.15 表示主版本号,次版本号,发行版本号分别是2,2,15
  • 39.el6.centos 表示 RPM 包的修订号和 OS 信息
  • x86_64 表示此软件包适用的平台,常见的有i386,i586,x86_64 等

RPM包管理命令的使用

安装

1
rpm {-i|--install} [install-options] PACKAGE_FILE1..
  • 安装时可以使用 -h 以#的个数显示安装进度,一个#表示2%的进度,使用 -v 显示详细安装信息
  • --test 可以用于测试安装是否能够成功,而不实际安装
  • 在安装过程中,可能遇到软件包的依赖问题,而需要先安装其他软件包,--nodeps 忽略依赖强制安装,但是这样安装的软件包通常也会因为依赖缺失而无法正常工作
  • 如果需要重新安装并覆盖原有的文件,可以使用 --replacepkgs 选项
  • 使用 --force 可以进行强制覆盖安装,它等同于--replacepkgs, --replacefiles, 和 --oldpackage
1
2
rpm -ivh /media/cdrom/CentOS/elinks-0.11.1-5.1.el5.i386.rpm
rpm -ivh http://centos.candishosting.com.cn/5/os/i386/CentOS/elinks-0.11.1-5.1.el5.i386.rpm

升级或安装

  • 如果不知道一个软件包是否已经安装,并希望如果已经安装那么升级次软件包,使用 -U 选项。
1
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
  • 如果仅仅希望升级软件包,使用 -F 选项
1
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
  • 升级软件包和安装软件包一样,可以使用 --test、--nodeps、--force 等选项。
1
2
3
4
5
6
7
# 安装并升级 zsh 软件包
[root@localhost rpm]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
[root@localhost rpm]# rpm -Uvh zsh-4.3.10-9.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
  • 如果想要将软件包降级到旧版本,使用 –oldpackage 选项
1
2
3
[root@localhost rpm]# rpm -Uvh --oldpackage zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
  • 在升级软件包时,原来软件包的配置文件可能已经被修改,升级时,新版本的文件不会将老版本的配置文件覆盖,而是将新版本的配置文件加上 .rpmnew 后缀后保存。

注意:内核也是软件包,但是不建议直接对内核进行升级。多版本内核可以并存,因此建议执行安装操作

卸载

1
rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...
  • 通常使用 rpm -e PACKAGE_ANEM 即可简单卸载一个软件包
  • 使用 --nodeps 忽略依赖关系--test 测试卸载。--allmatches 表示如果一个程序包同时安装多个版本,则次选项一次全部卸载之
  • 如果卸载正常,不会输出任何信息。

注意:如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命名为 .rpmsave 后缀后留存。

查询

  • 查询使用 -q 选项,可以检查安装的所有包,还可以查看某包的详细信息。
1
rpm {-q|--query} [select-options] [query-options]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
rpm -q zsh
# 查询某包是否已经安装

rpm -qa
# 查询安装的所有包

rpm -qp nmap-5.51-4.el6.x86_64
# 查询未安装包信息
# 查询未安装包的信息指定的是 RPM 包的文件名而不是某个包的软件名。

rpm -qi bash
# 查询安装包包的简要说明信息

rpm -ql zsh
# 查询软件包安装的文件列表

rpm -qf /etc/ssh/sshd_config
# 查询某文件是哪个包安装生成的

rpm -qc openssh-server
# 查看软件包安装后生成的所有配置文件

rpm -qd nmap
# 查看软件包安装后生成的所有说明文件和帮助文件

rpm -q --changelog nmap
# 查看软件包制作时随版本变化的 changelog 信息

rpm -q --requires nmap
# 查看软件包所需的依赖

rpm -q --scripts zsh
# 查看软件包安装或卸载时执行的脚本
# 脚本分四类
# preinstall 安装前脚本
# postinstall 安装后脚本
# preuninstall 卸载前脚本
# postuninstall 卸载后脚本

检验

查询软件包安装之后的文件是否发生了改变

1
rpm {-V|--verify} [select-options] [verify-options]

检验时使用了多个位表示文件的多个属性是否发生了变化:

S 文件大小
M 文件权限
5 文件摘要信息(通常是 MD5 码)
D 设备文件的主/次设备号
L 软链接变化
U 属主
G 属组
T 文件的 mtime
P caPabilities

程序包的合法性验证

  • 在软件包制作时,为了防止软件包被人修改植入后门,制作者可以使用自己私钥对软件包进行数字签名,安装者就可以使用公钥验证软件包的合法性。同时还可以使用摘要算法提取软件包的摘要信息用于验证软件包的完整性。
  • 通常,RHEL 系的安装光盘中包含有用于验证其软件包合法性的公钥文件。

  • 导入公钥

1
rpm --import /path/to/RPM-GPG-KEY-FILE
  • 验证合法性
1
rpm {-K|--checksig} PACKAGE_FILE

RPM 管理器的数据库

每次安装 rpm 包时,rpm 系统会将一些元信息存储在它的数据库中,使用 rpm -q 命令查询软件包的相关信息时将会查询这些数据库,数据库文件位于 /var/lib/rpm 目录中。如果 RPM 的数据库损坏,将会导致一些 RPM 数据丢失,一些功能将无法正常使用。

重建数据库

如果 RPM 的数据库损坏,首先可以尝试重建它,如果无法重建,那么需要重新初始化数据库。

1
rpm --rebuilddb 表示重建数据库
  • 这个命令会从已安装的软件包提取信息重建数据库,它从 /var/lib/rpm/Packages 这个文件中提取信息,其他所有的数据库文件都可以由这个文件重建。如果 RPM 的数据库是完好的,这个命令不会重建,而是对数据库中未使用的条目进行空间回收。
1
rpm --initdb 创建一个新的 RPM 数据
  • 如果已经没有其他别的办法了,–initdb 会创建一个新的空的 RPM 数据库。由于新建的数据库是空的,不要万不得已不要使用这个命令。

yum

为什么使用yum

Linux系统维护中令管理员很头疼的就是软件包之间的依赖性了,往往是你要安装A软件,但是编译的时候告诉你X软件安装之前需要B软件,而当你安装Y软件的时候,又告诉你需要Z库了,好不容易安装好Z库,发现版本还有问题等。由于历史原因,R PM软件包管理系统对软件之间的依存关系没有内部定义,造成安装RPM软件时经常出现令人无法理解的软件依赖问题。其实开源社区早就对这个问题尝试进行解决了,不同的发行版推出了各自的工具,比如Yellow Dog的YUM(Yellowdog Updater, Modified),De bian的APT(Advance d Pack aging Tool)等。开发这些工具的目的都是为了要解决安装RPM时的依赖性问题,而不是额外再建立一套安装模式。

什么是yum

  • yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。
  • 基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
  • YUM基于RPM包管理工具,能够从指定的源(服务器,本地目录等)自动下载目标RPM包并且安装,可以自动处理依赖性关系并进行下载、安装,无须繁琐地手动下载、安装每一个需要的依赖包。

  • yum的特点

    • 自动解决包的倚赖性问题能更方便的添加/删除/更新R PM包
    • 便于管理大量系统的更新问题
    • 可以同时配置多个资源库(Re pository)
    • 简洁的配置文件(/etc/yum .conf)
    • 保持与RPM数据库的一致性
    • 有一个比较详细的log,可以查看何时升级安装了什么软件包等
    • 使用方便

yum客户端

  • 配置文件:指定各可用的yum仓库
  • 缓存元数据:yum会到各可用yum仓库获取元数据,并缓存至本地
  • 分析元数据:根据具体的操作请求完成元数据分析,可能包括依赖关系、文件列表等信息
  • 执行具体操作
  • 客户端配置文件指定对服务器配置文件

仓库配置

  • 要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中。
  • 配置文件格式:由两段组成。

    • /etc/yum.conf: [main],主配置段
    • /etc/yum.repo.d/*.repo: [repo],仓库配置段
  • 配置repo

1
2
3
4
5
6
7
8
9
[repositoryid]
name=Some name for this repository
baseurl=url://server1/path/to/repository/
url://server2/path/to/repository/
url://server3/path/to/repository/
mirrorlist=url://path/to/mirrorlist/repository/
enabled=0/1
gpgcheck=0/1
gpgkey=A URL pointing to the ASCII-armoured GPG key file for the repository
1
2
3
4
5
6
7
8
9
10
repositoryid    # 指定一个仓库
name # 指定易读的仓库名称
baseurl # 指定本仓库的URL,可以是如下的几种类型#
http # 指定远程HTTP协议的源
ftp # 指定远程FTP协议的源
file # 本地镜像或NFS挂装文件系统
enabled # 指定是否使用本仓库,默认值为1,即可用
gpgcheck # 指定是否检查软件包的GPG签名
gpgkey # 公钥地址,可以是本地,也可以是服务器端路径
cost # 定义此仓库开销,默认为1000

常用命令

  • 安装
1
2
3
4
yum install             # 全部安装
yum install package1 # 安装指定的安装包package1,手动禁止检查来源及完整性:--nogpgcheck
yum reinstall package1 # 重新安装指定的安装包package1
yum groupinsall group1 # 安装程序组group1
  • 更新和升级
1
2
3
4
5
6
yum check-update        # 检查可升级的包
yum update # 全部更新
yum update package1 # 更新指定程序包package1,要升级到指定版本要带版本号如nmap-5.51
yum upgrade package1 # 升级指定程序包package1
yum groupupdate group1 # 升级程序组group1
yum downgrade package1 # 降级指定程序包package1
  • 查找和显示
1
2
3
4
5
6
7
8
9
10
11
yum info package1       # 显示安装包信息package1
yum list # [all|installed(已安装过的)|available(可用)];显示所有已经安装和可以安装的程序包
yum list package1 # 显示指定程序包安装情况package1
yum info # 显示包的详细信息
yum grouplist # 列出所有的包组
yum groupinfo group1 # 显示程序组group1信息
yum search string # 根据关键字string查找安装包
yum deplist package1 # 查看程序package1依赖情况
yum whatprovides /etc/shadow # 查看/etc/shadow是由哪个包提供的
yum provides /etc/shadow # 查看/etc/shadow是由哪个包提供的
yum history # 查看yum的命令历史
  • 删除和卸载
1
2
yum remove|erase package1   # 移除|卸载程序包package1,依赖的包也会被卸载
yum groupremove group1 # 删除程序组group1
  • 清除缓存
1
2
3
4
yum clean packages      # 清除缓存目录/var/cache/yum 下的软件包
yum clean headers # 清除缓存目录/var/cache/yum 下的 headers
yum clean oldheaders # 清除缓存目录/var/cache/yum 下旧的 headers
yum clean;yum clean all # = yum clean packages; yum clean oldheaders)

yum配置文件中可用的宏

  • $releasever:程序的版本
    • 对Yum而言指的是redhat-relrase版本。
    • 只替换为主版本号,如Redhat6.5 则替换为6
  • $arch:系统架构
  • $basharch:系统基本架构,如i686,i586等的基本架构为i386
  • $YUM0-9:在系统定义的环境变量,可以在yum中使用

CentOS的镜像站点

镜像站点的第一级目录是发行版本号,如 3、4、5 等

源码包

linux源码包与RPM包的区别

  • 安装之前
    • 源码包是开源的,比RPM包安装更自由,但是它安装更慢,更容易报错
    • RPM包是经过编译的,不能看到源代码,但是它安装更快,报错更容易解决,只有依赖性问题
  • 安装之后
    • RPM包不需要指定安装位置,它会安装到系统默认位置
    • 源码包是人为手工设置

源码包编译安装基本步骤

注意:源码包编译安装前提是准备开发环境(编译环境)

  • 若系统为Centos 5,开发包组为”Development Tools“和”DeveLopment Libraries“
  • 若系统为centos 6,常用的开发包为”Development tools“和”Server Platform Development”
  1. 拿到源代码,并解压
    tar -xf package-version.tar.{gz|bz2|xz}
    注意:展开后的目录通常为package-version
  2. 切换至源码目录中
    cd package-version
  3. 执行configure脚本
    ./configure
  4. 编译
    make
  5. 安装
    make install
  6. 头文件输出给系统、创建库文件链接、二进制可执行文件环境变量、导出man文件

configure脚本的通用功能(需要定义的配置)

  • 指定安装路径
    • --prefix=前缀,用于指定安装路径
    • --sysconfdir=/etc/package_name
  • 指定启动/禁用的特性
    • --enable-feature
    • --disable-fecture
  • 指定所依赖功能、程序或文件
    • --with-function:启用某功能
    • --without-function: 禁用某功能

不同的程序,其configure不尽相同,应获取帮助信息

1
./configure --help
有钱任性,请我吃包辣条
0%