Linux 程序包管理
linux系统中的诸多程序都是由源代码编译或者由二次发行商选择性编译分布,其大部分的程序安装得了需要依赖于三方的库文件,甚至很多的程序依赖关系会进入到死循环的情况中。由于直接使用源代码编译安装比较繁,故出现了一系列的安装包管理程序。
各系统包及包管理程序:
Debian
1、软件包后缀
.deb
2、前端管理工具
- apt-get
RHEL系
1、软件包后缀
.rpm
2、前端管理工具
- rpm
- yum(centos5、6)
- dnf(centos 7)
SUSE
1、软件包后缀
.rpm
2、实现工具
- zypper
Fedora
1、软件包后缀
.rpm
2、前端管理工具
- dnf
RHEL Linux软件包命名规范
源代码
- name-major-minor-release
RPM包命名格式
- name-version-release.arch.rpm
- release : 2.el7
* 2 : 编译次数
* el7: 适用于centos7平台
* arch : 架构
* rpm : 以rpm后缀命名
- release : 2.el7
程序包管理器
功能
- 将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便的快捷实现程序包的安装,查询,卸载,升级等功能
组成部分
-
程序包的组成清单
- 文件清单
- 安装或卸载时运行的脚本,有如下四类:
- preinstall : 安装过程开始之前运行的脚本,%pre定义 —nopre
- postinstall: 安装过程完成之后运行的脚本,%post定义 —nopost
- preuninstall : 卸载过程真正开始执行之前运行的脚本,%preun定义 —nopreun
- postuninstall: 卸载过程完成之后运行的脚本,%postun定义 —nopostun
注意:他将程序的多个功能分拆多个安装包,单独实现
-
数据库部分
- 存储程序包的名称和版本
- 包与包的依赖关系
- 各包的功能说明
- 程序安装生成的各文件的文件路径及检验码信息
正确获取安装程序包的途径
1. 系统发行版的光盘或官方的镜像站点
2. 项目的官方站点
3. 第三方的组织制作方
- EPEL:红帽官方社区组织维护
- 搜索引擎
4.明确知道来源的RPM(自已制作等)
注意:建议在使用程序安装包时检查其合法性,针对其做来源合法性
和程序包的完整性
做校验
RPM包管理程序
1. RPM包的安装
synopsis: rpm {-i| —install} [install-options] PACKAGE_FILE
-
options
:-
-i , --install
: 安装 -
-v
: verbos,输出详细信息 -
-vv
: verbos,输出更详细的信息
-
-
install-options
:-
-h
: 以hash marks格式输出进度条,每个#代表2%的进度 -
--test
: 测试安装,只做环境检查,并不真正安装 -
--nodeps
: 忽略程序依赖关系 -
--replacepkgs
: 覆盖安装,如果文件修改错误,需要将其找回,可以使用此方法,但需要把修改错误的文件提前删除 -
--justdb
: 不执行安装操作,只更新数据库 -
--noscripts
: 不执行rpm自带的所有脚本 -
--nosignature
: 不检查包签名信息,即不检查来源合法性 -
--nodigest
:不检查包完整性信息
-
2. RPM包的升级
synopsis:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE …
-
[options]
-
-U
: 升级或安装 -
-F
: 升级但不安装
-
-
[install-options]
-
--oldpackage
: 降级 -
--force
: 强制升级
-
注意:
- 不要对内核做升级操作;4.0之前内核升级需要重启系统,Linux支持多内核版本并存,因此直接安装新版本内核,以防止新的内核出故障,导致系统无法正常启动,或者会中断在线业务
- 如果某源程序包的配置文件安装后曾被修改过, 升级时新版本的程序包提供的同一个配置文件不会覆盖老版本已经修改过的文件,而是把新版本的文件重命名后提供(filename.rpm.new的格式)
3. RPM包的卸载
synopsis:
rpm {-e|--erase} [--allmatches] [--nodeps] [—noscripts]
-
[options]
:-
-e
: 删除指定程序 -
--allmatches
: 卸载所有匹配指定名称的程序包的各版本 -
--nodeps
: 卸载时忽略依赖关系 -
--test
: 测试卸载,dry run模式
-
4. RPM包的查询
synopsis : rpm {-q|--query} [select-options] [query-options]
-
options
-
-qa ,-all
: 查询所有已经安装的包 -
-f , --file FILE
: 查询指定的文件是由哪个包安装生成的 -
-g , --group GROUP
: 查询指定包由哪个包组提供 -
-p, --package PACKAGE_FILE
: 对未安装的程序包执行查询操作 -
--wahtprovides CAPADILITY
: 查询指定的capability由哪个程序包提供 -
—whatrequires CAPABILITY
: 查询指定的capability被哪个包所依赖
-
-
[query-options]
-
--changelog
: 查询rpm包的changelog -
-l ,--list
: 列出程序包安装生成的所有文件列表 -
-i , --info
: 查询程序包想着的infomation.包括其版本号、大小、所属的包组等信息 -
-c --configfiles
: 查询指定的程序包提供的配置文件 -
-d --docfiles
: 列出指定的程序包提供的文档 -
--provides
: 列出指定的程序包提供的所有capability -
-R --requires
: 查询指定程序包的依赖关系 -
--script
: 查看程序包自带的脚本
-
用法
-qi
-qc
-ql
-qd
-qpi
-qpc
-qpl
-qpd
注意:RPM的查询支持正则表达式的格式
5. RPM包的校验
synopsis: rpm {-V|--verify} [select-options] [verify-options]
-
[options]
:-
-V PACKAGE_FILE
: 自动检查其数据的完整性及合法性 -
-K PACKAGE_FILE
: 手动检查其数据的完整性及合法性 -
--import KEY
: 手动导入GPG KEY
-
-
校验程序包后的Format
- 例:
- rpm -V zsh
- S.5....T. d /usr/share/doc/zsh-4.3.11/README
- 例:
S.5....T.
: 说明
S 文件大小改变了
M 文件权限改变了
5 MD5校验码变了
D 主次设备不匹配
L read link变化 了
U 属主改变了
G 属组改变了
T 修改时间变了
P CAPABILITY变了
注意:如果其在某位上有变化,才会显示相应值," . "代表未修改过
程序包来源合法性验证和完整性验证:
1. 取公钥
- 系统路径为:/etc/pki/rpm-gpg/RPM-GPG-KEY-Centos7
- 系统安装盘:镜像文件根目录下RPM-GPG-KEY-CentOS-6
2. 导入公钥
- rpm --import /path/from/keyfile
3.检验方式
- 安装此组织签名的程序时,会自动执行验证
- 手动验证:
rpm -K package_file
4.查看导入的公钥
- rpm -qa gpg-pub*
- 所有被导入的GPG-KEY都会显示出来
5.删除导入的公钥
- rpm -e gpg-pubkey-c105b9de-4e0fd3a3(获取这个公钥需要使用
rpm -qa gpg-pub*
查看)
6.数据库的重建
1. RPM的数据库存放路径
/var/lib/rpm/
2. 获取帮助
- Centos 6
man rpm
- Centos 7
man rpmdb
3. 重建方法
synopsis: rpm {--initdb|—rebuilddb}
-
--initdb
- 初始化数据库,当前无任何数据库时, 可初始化并创建一个新的,当前有时不执行任何操作
-
--rebuilddb
- 重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建
-
--dbpath
- 指明库的路径,一般用于重建
例:
rpm --initdb --dbpath /tmp/rpmdb/
rpm --rebuilddb --dbpath /tmp/rpmdb/
=========
7.RPM检查合法性和完整性原理
1. 作者首先使用非对称加密算法生成一组密钥,即公钥与私钥
2. 作者再使用单身加密算法算出程序包特征码
3. 利用私钥对其特征码进行加密,这个过程叫签名
4. 使用者拿到作者发布的公钥对其特征码解密 ,如果这个过程通过,即能验证其来源的合法性
5. 使用与作者一样的单向加密算法算出已经拥有软件包的特征码,与之前解密后的特征码进行对比,其称之为完整性校验
=============
yum前端程序包管理工具
yum工具的出现
Linux平台中软件的安装都由源码文件编译成二进制文件后再运行,其在很多的制作好的rpm程序包,制作方在制作的过程中把通常不常用的功能去除进行编译打包,或者再将不同功能的包进行单独编译打包,提供多个功能程序包,这个情况安装软件时,一个功能包或者程序会依赖于其他程序的库文件,甚至有的时候会出现死循环依赖,导致软件的安装不正常工作或者根本安装不成功。此yum工具就是为了有效解决程序之间的依赖关系。早期yum工具是由RHEL的程序人员使用perl语言开发,随着长时间的使用后,发现性能比较低下或难于使用,此后再由RHEL官方使用C语言重写。
yum工具的实现原理
将诸多程序的包信息和头文件提取出来,放到一个集中的地方,记录其依赖关系。在下次安装的时候,均于存储的库文件查找相应的对应关系,再安装所依赖的软件程序。
yum的工作机制
其更像C/S架构模式,提供yum源的一方类似服务端,使用yum工具的一方类似客户端。客户端每次下载远程服务器软件包的一个元数据表,存放至本地进行缓存 ,在要安装程序时,查询缓存,如果存在, 就向远程服务器请求软件安装,如果有依赖关系,YUM服务器会检查其软件安装情况并记录本地,把有依赖并没有安装的软件提示用户安装。下载的元数据缓存至本地时,服务器会对元数据进行特征算法,与自己本地进行对比,如果变动了, 就要下载新的元数据
yum工具的传输协议及格式
-
http
- 格式为:
http://mirrors.aliyun.com
- 格式为:
-
ftp
- 格式为:
ftp://mirros.aliyun.com
- 格式为:
-
nfs
- 格式为:
-
file
- 格式为:
file:///media/cdrom
- 格式为:
yum的安装及卸载
- 安装
rpm -i yum-version.rpm
- 卸载
rpm -e yum
yum配置文件及格式:
/etc/yum.conf
- 各仓库文件的公共配置,或者不属于仓库的配置,格式如下:
- [main]:主名称,固定名称
- cachedir= : 缓存目录
- keepcache=0:要不要保存缓存
- exactarch=1:要不要做精确严格的平台匹配
- gpgcheck=1:检查来源法性和完整性
- plugins=1:要不要支持插件
- installonly_limit: 同时安装几个
/etc/yum.repos.d/*.repo
- 为仓库的指向及其配置,格式如下:
- [repository ID] :ID名称,即仓库名称,不可与其他ID重命
- name= : 对ID名称的说明
- baserul=URL1
URL2
URL3 (如果同一个源有多个镜像,可以在此我写几个,但每个URL需换行) - mirrorlist= (有一台服务器在网络上,保存了多个baseurl,如果使用这项,就不使用baseurl项)
- enabled={1|0}
- gpgcheck={1|0}
- repo_gpgcheck= : 检查仓库的元数据的签名信息
- gpgkey=URL (gpg密钥文件)
- enablegroups= {1|0}}是否在此仓库中上使用组来指管理程序包
- failovermethod= roundrobin|priority (对多个baseurl做优先级的,roundrobin为轮循,priority为优先级,默认为轮循,意为随机)
- keepalive= 如果对方是http 1.0是否要保持连接
- username= yum的验证用户
- password= yum的验证用户密码
- cost=默认baseurl都为1000
* 注意:等号左右不能出现空格
yum命令
yum
- yum - Yellowdog Updater Modified
synopsis: yum [options] [command] [package ...]
-
options
:-
—nogpgcheck
: 禁止进行gpg check -
-y
: 自动回答为Yes -
-q
: 静默模式 -
—enablerepo
: 临时启用此处指定的repo -
—disablereop
:临时禁用此处指定的reop -
—noplugins
:禁用所有插件
-
========
yum软件管理
yum的程序安装:
-
install Package1....
: 安装 -
reinstall Package1...
: 重新安装 -
downgrade Package1...
:降级安装 -
localinstall Package1...
: 安装本地程序
yum程序包的升级
-
update soft_name
-
localupdate Package1...
yum检查升级
-
check-update
yum程序卸载
-
remove | erase soft_name
yum显示程序包
-
list {all|available|updates|installed}
- all : 显示所有仓库中的包
- available : 显示可用的软件包
- updates : 显示可用于升级的包
- installed : 显示已经安装的包
yum list php* : 显示想着以php开头的所有软件包
yum查看包的infomation信息
-
info Packages1....
yum查看文件是由哪个包提供
-
provides packages1 | FILE….
yum清理本地缓存
clean [ package ] | metadata | expire-cache| rpmdb | plugins | all ]
yum生成缓存
makecache
yum搜索程序包名及summary信息
search [ string1…]
yum显示程序包的依赖关系:
deplist packages1….
查看yum事务历史(事务只记录安装、升级、卸载的信息)
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
yum显示仓库列表:
-
repolist [all | enabled| |disabled}
- all : 查看全部的仓库
- enabled : 查看地可用的仓库
- disabled : 查看不可用的仓库
此项就是在/etc/yum.repos.d/*.reop中定义了enabled=1或者等于0的
=========
yum组管理
yum组的安装
-
groupinstall
yum组的查看
-
grouplist
yum组的基本信息查看
-
groupinfo
yum组的删除
-
groupremove
yum组的更新
-
groupupdate
==========
YUM的repo配置文件中可用的变量
-
$releasever
:当前os的发行版本的主版本号 -
$arch
:平台 -
$basearch
:基础平台 -
$YUM0-$YUM9
:用户自定义的变量
===========
yum仓库的配置文件示例
[base] #光盘的基本软件,即os代表光盘
name=CentOS $releasever $basearch on local server 172.16.0.1
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.7-$basearch/ #此处如果使用公网公开的repo,这里的地址一定要为repodata目录相同层级地址
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enable=1 #如果此项未写,默认表示启用
[extra] # extra表示额外的程序
name=CentOS $releasever $basearch extras
baseurl=http://172.16.0.1/centos/$releasever/extras/$basearch/
gpgcheck=0
[epel] # 是由公共组织权威维护
name=Fedora EPEL for CentOS$releasever $basearch on local server 172.16.0.1
baseurl=http://172.16.0.1/fedora-epel/$releasever/$basearch/
gpgcheck=0
[cdrom]
name=cdrom
baseurl=file:///media/
gpgcheck=0
=========
创建yum仓库:
-
yum install createrepo
createrepo
- Create repomd (xml-rpm-metadata) repository
-
synosis
: createrepo [options] <directory>- [options]
-
—baseurl : 指定repodate的目录位置
- repodate: 使用sqlite格式存储
-
- [options]