您的位置:首页 > 产品设计 > 产品经理

RPM程序包管理以及yum的应用

2015-08-30 21:55 399 查看
在早期我们使用源代码的方式来安装软件时,都需要先把源程序代码编译成可执行的二进制安装程序,然后进行安装。这就意味着每次安装软件都需要经过预处理-->编译-->汇编-->链接-->生成安装文件--> 安装,这个复杂而艰辛的过程。为简化安装步骤,便于广大用户的安装部署程序,程序提供商就在特定的系统上面编译好相关程序的安装文件并进行打包,提供给大家下载,我们只需要根据自己的系统去下载相应的安装包进行安装即可,其类似 Windows 的安装方式,由程序开发者直接在已知的系统上面编译好,再将该程序直接给用户来安装,如此而已。但是,程序包该怎么管理呢,这就是我们程序包管理器的事啦!什么是程序包管理器
用于管理Linux 下软件包的软件,其主要功能为:将编译好的程序打包成一个文件或有限的几个文件,可用于实现安装、卸载、升级、查询等功能。
程序包管理器的两大主流
dpkg:最早是由 Debian Linux 社群所开发出来的, 只要是衍生亍 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的, 包括B2D, Ubuntu 等等,其前端工具有apt-get。
RPM:最早是由Red Hat这家公司开发出来的,后来实在太好用,因此很多distributions 就使用其来作为软件安装的管理方式。包括 Fedora, CentOS, SUSE 等等,其前端工具有yum。
程序包的组成格式与存放路径:
1、二进制程序
主要存放的路径:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /usr/local/APP/{bin,sbin}
注意:有些特殊的应用程序放置于libexec目录中;有些第三方应用默认安装于/opt目录。
2、库文件(开发库、运行库)
主要存放的路径:/lib64, /usr/lib64, /usr/local/lib64, /usr/local/APP/lib
3、配置文件
主要存放的路径:/etc, /usr/local/APP/etc或conf目录
4、帮助文件
主要存放的路径:/usr/share/man, /usr/local/share/man, /usr/local/APP/manRPM程序包管理器使用详解
RPM包的命名格式:


但对于一个程序来说,其可能具有很多功能,其中有些是常用功能,有些是特殊功能,有些是二次开发相关的功能,如果把所有的功能打包在一块,无疑程序包会增大很多,对一些普通用户无需使用的功能都需一并下载安装,无形间就造成了资源的浪费,特此在对程序包的打包就衍生出了分包机制,一般把程序分包成主包与子包。例如一个bash程序有20个功能:常用功能有10个,特殊A:4个,特殊B:3个,二次开发相关功能:3个,那么包的命名方式如下:
核心包,主包:命名与源程序一致
bash-4.2.3-3.centos7.x86_64.rpm
子包:
bash-a-4.2.3-3.centos7.x86_64.rpm
bash-b-4.2.3-3.centos7.x86_64.rpm
bash-devel-4.2.3-3.centos7.x86_64.rpm
CentOS系统上rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护

安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-v: verbose
-vv: 显示更多信息
-h: 以#显示程序包管理执行进度;每个#表示2%的进度

rpm -ivh PACKAGE_FILE ...

[install-options]
--test: 测试安装,但不真正执行安装过程;dry run模式;
--nodeps:忽略依赖关系;
--replacepkgs: 重新安装;
--nosignature: 不检查来源合法性;
--nodigest:不检查包完整性;
--noscipts:不执行程序包脚本片断;
%pre: 安装前脚本; --nopre
%post: 安装后脚本; --nopost
%preun: 卸载前脚本; --nopreun
%postun: 卸载后脚本; --nopostun

在没有网络的前提下,你想要安装一个名为 pam-devel 的软件,你手边只有原版光盘你可以透过挂载原版光盘来进行数据的查询与安装。请将原版光盘放入光驱,底下我们尝试将光盘挂载到 /media 当中, 并据以处理软件的下载罗:
挂载光盘,使用: mount /dev/cdrom /media/cdrom

找出文件的实际路径:find /media -name 'pam-devel*'

测试此软件是否具有相依性: rpm -ivh pam-devel... --test

直接安装: rpm -ivh pam-devel...

卸载光盘: umount /dev/cdrom

[root@localhost Packages]# rpm -ivh python-netaddr-0.7.5-4.el6.noarch.rpm
warning: python-netaddr-0.7.5-4.el6.noarch.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...
########################################### [100%]
package python-netaddr-0.7.5-4.el6.noarch is already installed
[注意]:该命令后面接的是RPM包文件,可以用空格做分割同时安装多个程序,如电脑可以上网的话,也可以直接指定网络上的RPM包,进行安装。
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
rpm {-F|--freshen} [install-options] PACKAGE_FILE ... freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作; rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
--oldpackage:降级;
--force: 强行升级;


注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;

查询:
rpm {-q|--query} [select-options] [query-options]
[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;

组合的 用法:
-qi PACKAGE:列出该软件的详细信息,包括开发商,版本与说明
-qf FILE:由后面接的文件名称,找出该文件属于哪一个已经安装的软件
-qc PACKAGE:列出该软件的所有配置文档
-ql PACKAGE:查看指定的程序包安装后生成的所有文件;
-qd PACKAGE:列出该软件的所有说明档
-qpi PACKAGE_FILE:未安装包的描述信息
-qpl PACKAGE_FILE:包安装生成的文本
-qa:列出所有的已经安装的软件

-qR:列出与该软件有关的被需要的其他文件
-qpc:包安装会生成的配置文件
-qpd:包安装会生成的帮助文件

[root@localhost Packages]# rpm -qi zsh
Name : zsh Relocations: (not relocatable)
Version : 4.3.10 Vendor: CentOS
Release : 7.el6 Build Date: 2013年11月25日 星期一 01时40分59秒
Install Date: 2015年08月31日 星期一 04时35分11秒 Build Host: c6b9.bsys.dev.centos.org
Group : System Environment/Shells Source RPM: zsh-4.3.10-7.el6.src.rpm
Size : 5009102 License: BSD
Signature : RSA/SHA1, 2013年11月25日 星期一 03时33分46秒, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : http://zsh.sunsite.dk/ Summary : A powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor. Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements. Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.

[root@localhost bin]# rpm -qf /bin/catcoreutils-8.4-37.el6.x86_64 ###被查询文件的安装包[root@localhost bin]# rpm -qc coreutils-8.4-37.el6.x86_64/etc/DIR_COLORS/etc/DIR_COLORS.256color/etc/DIR_COLORS.lightbgcolor/etc/pam.d/runuser/etc/pam.d/runuser-l/etc/pam.d/su/etc/pam.d/su-l/etc/profile.d/colorls.csh/etc/profile.d/colorls.sh ###/etc/*都是以安装软件包的配置文档[root@localhost bin]#
卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts]
[--notriggers] [--test] PACKAGE_NAME ...

校验:
rpm {-V|--verify} [select-options] [verify-options]
-V :后面加的是程序名称,若该程序属有的文件发生改变就会显示;
-Va :显示目前系统上面所有可能被修改过的文件;
-Vp :后面加的是文件名,显示该程序内可能被更改过的文件;
-Vf :后面加的是文件名,显示某个文件是否被修改过。 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 caP abilities differ:包的能力发生改变

例如:
[root@localhost ~]# rpm -V zsh
S.5....T. /usr/share/zsh/4.3.10/scripts/newuser
[root@localhost ~]#
RPM包的校验主要有来源合法性验证包的完整性验证
数字签名:包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。
验正过程:
前提:必须有可靠机制获取到包制作者的公钥;
1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法;
2、使用与制作者同样的意向加密算法提取原始数据的特征码,并与解密出来的特征作比对,相同,则意味着完整性没问题;
rpm包来源合法性及完整性检验:
在当前系统上导入包的制作者的公钥:
rpm --import /path/to/key_file
显示所有已经导入的gpg格式的公钥:
[root@localhost Packages]# rpm -ivh zip-3.0-1.el6.x86_64.rpm
Preparing... ########################################### [100%]
package zip-3.0-1.el6.x86_64 is already installed
[root@localhost Packages]#
从上面的执行结果中可以看到,导入公钥后就没有警告了 【注意】安装过程中会自动用已经导入的的公钥,对程序包进行检验,一般无需进行手动校验。 手动检查:
rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE
选项说明:
-K :等同于 --checksig ,进行检查并显示结果;
--nodigest:不检查包完整性;
--nosignature:不检查来源合法性。 数据库重建:
rpm {--initdb|--rebuilddb}
initdb: 初始化
如果事先不存在数据库,则新建之;否则,不执行任何操作;
rebuilddb:重建
无论当前存在与否,直接重新创建数据库;

Linux程序包管理(2)
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE、CentOS中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
CentOS: yum:是一个cs架构的工具。
dnf :解决yum不能在网路中断时的分析能力。
yum repository: yum repo:yum仓库
存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata);repodata所在的路径就是yum所指向的仓库的路径
文件服务器: ftp:// http://
nfs://
file:///本地仓库
yum客户端:
配置文件:yum 的配置文件分为两部分:main 和repository
main 部分定义了全局配置选项,整个yum 配置文件应该只有一个main。常位于/etc/yum.conf 中。

repository 部分定义了每个源/服务器的具体配置,可以有一到多个。常位于/etc/yum.repo.d 目录下的各文件中。

yum.conf 文件一般位于/etc目录下,一般其中只包含main部分的配置选项。 /etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置

仓库指向的定义:
[repositoryID]:yum仓库的ID,是用于区别各个不同的repository,必须有一个独一无二的名称。
name=Some name for this repository:对仓库的描述
baseurl=url://path/to/repository/:其中url支持的协议有 http:// ftp:// file://三种。baseurl后可以跟多个url,你可以自己改为速度比较快的镜像站,但baseurl只能有一个,也就是说不能像如下格式:
baseurl=url://server1/path/to/repository/
baseurl=url://server2/path/to/repository/
baseurl=url://server3/path/to/repository/
enabled={1|0}:是否启用此仓库,默认是启用的
gpgcheck={1|0}是否检查其来源合法性和完整性
gpgkey=URL:指明一个URL,里面包括秘钥文件
enablegroups={1|0}:是否基于组的启用,默认启用
failovermethod={roundrobin|priority}:failovermethode 有两个选项roundrobin和priority,意思分别是有多个url可供选择时,yum选择的次序,roundrobin是随机选择,如果连接失 败则使用下一个,依次循环,priority则根据url的次序从第一个开始。如果不指明,默认是roundrobin。
cost=
默认为1000(开销的数字默认的是1000)


yum命令的用法:
yum [options] [command] [package ...]

command is one of:
* install package1 [package2] [...]:安装软件包
* update [package1] [package2] [...]:升级软件包
* check-update:检查可以更新的软件包
* remove | erase package1 [package2] [...]:删除软件包
* list [...]:列出软件包
* info [...]:查看程序包的简要信息
* provides | whatprovides feature1 [feature2] [...]:该特征是哪个软件包所提供
* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]:清楚软件包或者数据,缓存等等
* groupinstall group1 [group2] [...]:安装组中的软件包
* groupupdate group1 [group2] [...]:升级组中的软件包
* grouplist [hidden] [groupwildcard] [...]:列出指定组中的软件包
* groupremove group1 [group2] [...]:移除指定组中的软件包
* groupinfo group1 [...]:组中的软件包的简要说明
* search string1 [string2] [...]:搜索
* reinstall package1 [package2] [...]:重新安装软件包
* downgrade package1 [package2] [...]:重新升级软件包
* deplist package1 [package2] [...]:显示软件包的依赖信息
* repolist [all|enabled|disabled]:显示仓库列表
* history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
* help [command]:帮助信息

显示仓库列表:
repolist [all|enabled|disabled]

显示程序包:
list
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates} [glob_exp1] [...]

安装程序包:
install package1 [package2] [...]

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

升级程序包:
update [package1] [package2] [...]

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

检查可用升级:
check-update

卸载程序包:
remove | erase package1 [package2] [...]

查看程序包information:
info [...]

查看指定的特性(可以是某文件)是由哪个程序包所提供:
provides | whatprovides feature1 [feature2] [...]

清理本地缓存:
clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

构建缓存:
makecache

搜索:
search string1 [string2] [...]

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

查看指定包所依赖的capabilities:
deplist package1 [package2] [...]

查看yum事务历史:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

安装及升级本地程序包:
* localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
* localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)

包组管理的相关命令:
* groupinstall group1 [group2] [...]
* groupupdate group1 [group2] [...]
* grouplist [hidden] [groupwildcard] [...]
* groupremove group1 [group2] [...]
* groupinfo group1 [...]

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

1、挂载系统安装光盘
# mount /dev/cdrom /mnt/cdrom/
2、配置本地yum源
# cd /etc/yum.repos.d/# ls会看到四个repo 文件CentOS-Base.repo 是yum 网络源的配置文件CentOS-Media.repo 是yum 本地源的配置文件修改CentOS-Media.repo关于repo 文件的格式 yum的命令行选项:
--nogpgcheck:禁止进行gpg check;
-y: 自动回答为“yes”;
-q:静默模式;
--disablerepo=repoidglob:临时禁用此处指定的repo;
--enablerepo=repoidglob:临时启用此处指定的repo;
--noplugins:禁用所有插件;

yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号;
$arch: cpu体系,如i686,athlon等
$basearch:cup的基本体系组,如i686和athlon同属于i386。
$YUM0-$YUM9 http://mirrors.magedu.com/centos/$releasever/$basearch/os
程序包编译安装:
testapp-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装;

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

源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系;

C、C++: make (configure --> Makefile.in --> makefile)
java: maven

C代码编译安装三步骤:
./configure:
(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;
(2) 检查依赖到的外部环境;
make:
根据makefile文件,构建应用程序;
make install

开发工具:
autoconf: 生成configure脚本
automake:生成Makefile.in

建议:安装前查看INSTALL,README

开源程序源代码的获取:
官方自建站点:
apache.org (ASF)
mariadb.org
...

代码托管:
SourceForge
Github.com
code.google.com

c/c++: gcc (GNU C Complier)

编译C源代码:
前提:提供开发工具及开发环境
开发工具:make, gcc等
开发环境:开发库,头文件
glibc:标准库

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

第一步: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

第二步:make

第三步:make install

安装后的配置:
(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

本文出自 “空白格” 博客,请务必保留此出处http://lirui213.blog.51cto.com/4449582/1689964
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: