rpm-yum-编译

.1. 安装
语法格式:
rpm {-i|--install} [install-options] PACKAGE_FILE ...

常用命令选项:
-v:verbose,输出详细的过程信息;
-vv:very verbose,输出更为详细的过程信息;

安装选项(install-options):
-h:hash marks输出进度条;hash标记符为#,每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突信息等;相当于dry run;
--nodeps:忽略依赖关系,不建议使用;
--replacepkgs:重新安装;
--noscripts:指定不运行脚本;
--nosignature:不检查包签名信息,即不检查程序包的来源合法性;
--nodigest:不检查包完整性信息;


用法:
rpm -ivh PACKAGE_FILE ...

注意:rpm可以自带脚本

最多有四类脚本:(--noscripts可指定不运行这四类脚本)

preinstall:安装过程开始之前运行的脚本,%pre;--nopre可指定不运行;

postinstall:安装过程完成之后运行的脚本,%post;--nopost可指定不运行;

preuninstall:卸载过程真正开始执行之前运行的脚本,%preun;--nopreun可指定不运行;

postuninstall:卸载过程完成之后运行的脚本,%postun;--nopostun可指定不运行;


命令演示:
安装zsh,首先挂载光盘:

[root@osyunwei ~]# mkdir /media/cdrom
[root@osyunwei ~]# mount /dev/sr0 /media/cdrom

mount: block device /dev/sr0 is write-protected, mounting read-only

用rpm下载zsh:

[root@osyunwei ~]# cd /media/cdrom/Packages/
[root@osyunwei Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]


8.2. 升级
语法格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

常用选项:
-U:升级或安装;
-F:升级;
-v:同“安装”;
-vv:同“安装”.
安装选项(install-options):
--oldpackage:降级 --> 某些程序升级后遇到不兼容的情况,此时需要降级;

--force:强制升级 --> 某些程序升级后会引起依赖性问题,此时可能会用到此选项;

其他安装选项同“安装”。

用法:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...


8.3. 卸载
语法格式:
rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...

卸载选项(erase options):
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系;
--test:测试卸载,dry run模式。

用法:
rpm -e PACKAGE_NAME


8.4. 查询
语法格式:
rpm {-q|--query} [select-options] [query-options]

[select-options]:
PACKAGE_NAME:查询指定的程序包是否安装,及其版本;
-a, --all:查询所有已经安装过的包;
-f, --file FILE:查询指定的文件由哪个程序包安装生成;
-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖。

[query-options]:
--changelog:查询rpm包的changelog;
-i, --info:程序包相关的信息,版本号、大小、所属的包组等
-l, --list:程序包安装生成的所有文件列表;
-c, --configfiles:查询指定的程序包提供的配置文件;
-d, --docfiles:查询指定的程序包提供的文档;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查询指定的程序包的依赖关系;
--scripts:查看程序包自带的脚本片段。


8.5. 校验
用途:可检查程序包中的数据是否被修改过。

语法格式:
rpm {-V|--verify} [select-options] [verify-options]

用法:
rpm -V PACKAGE_NAME


8.6. 数据库重建

默认rpm管理器的数据库路径为/var/lib/rpm,刚才的查询操作正是通过此处的数据库进行。

获取帮助:
CentOS 6:man rpm
CentOS 7:man rpmdb

语法格式:
rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]

常用选项:
--initdb:初始化数据库,当前无任何数据库可初试化创建一个新的数据库;当前有时不执行任何
操作;
--rebuilddb:重新构建,通过遍历读取当前系统上所有已经安装过的程序包进行重新创建;


对于CentOS发行版来说,假设已获取正确的公钥,那么导入信任的包制作者的公钥(或签名密钥)操作如
下:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

 

1. yum概述

之前在上一篇文章里提到的rpm包管理器虽然在数据库中为用户指定了程序包之间的依赖关系,但用
户仍需根据程序包的依赖关系去手动使用rpm命令来安装每个程序包,过程略为繁琐。而yum作为前端管
理工具则为用户解决这一问题。

yum的全称为:Yellow dog Updater, Modifier,是通过修改Yellow Dog Linux的Yellow Dog
Updater开发而成。

yum是基于rpm包管理器的前端程序包管理器,可以从指定服务器上自动下载程序包,并自动分析程
序包的元数据、自动处理程序包之间的依赖关系,能一次性安装完所有依赖的包,而无须繁琐地一次次
安装所有依赖包。

需要注意的是,yum前端管理工具是基于rpm管理功能的,因此yum不能脱离rpm而存在。yum只是让程
序包管理起来更为方便,但不意味着可以取代rpm。另外,yum访问文件服务器(仓库)的模式是基于C/S
架构的,而文件服务器(仓库)则需要以某种共享服务方式将其提供的程序包及包相关的元数据提供给
其他主机使用,通常使用到的协议有http、https、ftp、nfs等。此外,还可以使用光盘作为本地仓库或
者自己制作本地仓库,通常使用到的协议是file。

当用户使用yum去请求安装某一个程序包时,yum工具会先去yum配置文件中查找yum仓库指向的路径,根
据该路径去访问远程或本地的文件服务器,这个服务器作为yum仓库并且存储了众多的rpm包以及包相关
的元数据文件。当yum根据仓库路径访问到仓库后,会首先尝试请求获取rpm包的元数据文件并缓存至本
地(/var/cache/yum目录),而这个元数据文件包括了该仓库所有rpm包的程序包名、版本号、依赖性以及
每个程序包所提供的capabilities等。而后,yum根据用户要安装的程序包名去元数据文件里查找,看看
仓库里是否有用户请求下载的程序包文件,如果找到了则根据元数据文件分析该程序包的依赖关系并分
析本地系统上有哪些包已安装、哪些包还没安装,再将所有用户需要安装且本地尚未安装的程序包名列
出来,并以客户端的角色发送至文件服务器(仓库)请求下载之。如果请求成功,则yum将要安装的程序
包文件也缓存至本地并执行安装操作。安装完成之后将缓存的程序包文件删除以节约空间,而缓存中只
留下元数据文件。

为什么只缓存元数据而不缓存程序包呢?因为程序包一般只安装一次即可,很少会再安装第二次,而且
基于节约空间的考虑,因此yum在安装完程序包后会将缓存中的程序包删除。而缓存元数据好处则是当下
一次用户使用yum请求安装程序包时可以节约带宽,无需再次重新请求获取全部的元数据文件,并且可以
提高本地分析程序包的速度。

当用户第二次使用yum请求安装程序包时,基于实时同步更新缓存以及节约带宽的考虑,yum会先请
求下载yum仓库下rpm包元数据的校验码文件至本地,将其与本地缓存上的元数据校验码相比较,如果
相同,说明无须更新;如果不同,则说明仓库中rpm包已经更新,因此yum会重新请求下载仓库上的元数
据文件以更新元数据缓存。接着同样是分析程序包依赖性、请求要安装的全部程序包等。

3. yum客户端配置文件

yum的配置文件主要有/etc/yum.conf和/etc/yum.repos.d/*.repo,
其中/etc/yum.conf为主配置文件,为所有yum仓库提供公共配置;

而/etc/yum.repos.d目录下以.repo结尾的文件则为各yum仓库的指向提供配置信息。

需要注意的是,在CentOS发行版中,/etc/yum.repos.d目录下使用多个以.repo结尾的
仓库配置文件是为了方便管理,既可以用多个以.repo结尾的文件分别配置多个不同的仓库指向,又可以
在一个.repo文件中配置多个仓库指向。而且,当同时存在多个同一类的仓库时,每个仓库称为镜像,
yum支持镜像列表插件并且只使用其中的一个仓库指向即可,因为同一类仓库中的程序包是相同的。这时
应该使用离用户较近的镜像站点,在repo选项中可通过开销(cost)指定具体使用哪一个仓库。当同时存
在多个不同类的仓库时,每个仓库中的程序包各不相同,yum也可同时分析、使用这些仓库。

我们通常在/etc/yum.repos.d目录下配置yum的指向路径相关信息,而在这个配置文件中的仓库指向
的定义选项主要有以下几项:

[repositoryID] //仓库名
name=Some name for this repository //对repo作功能性说明;
baseurl=url://path/to/repository/ //仓库指向的路径,可指向多个路径;
enabled={1|0} //是否启用该仓库,默认为1(启用);
gpgcheck={1|0} //是否要对程序包数据的来源合法性和数据完整性做校验;

gpgkey=URL //指定GPG密钥文件的访问路径,可由仓库提供;

enablegroups={1|0} //是否允许以组的方式管理仓库;

failovermethod={roundrobin|priority}


yum的子命令用法:
(1)显示仓库列表:

# yum repolist [all|enabled|disabled]

(2)显示程序包:

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

(3)安装程序包:

# yum install package1 [package2] [...]
(4)重新安装:

# yum reinstall package1 [package2] [...]
相当于:rpm -ivh --replacepkgs

(5)升级程序包:

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

(6)降级程序包:

# yum downgrade package1 [package2] [...]
相当于:rpm -Uvh --oldpackage

7)检查可用升级:

# yum check-update

(8)卸载程序包:

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

注意:依赖于此包的程序会一同被卸载。

(9)查看程序包information:

# yum info [...]

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

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

相当于rpm -qf FILE;

(11)清理本地缓存:

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

(12)构建缓存:

# yum makecache [fast]

(13)搜索:

# yum search string1 [string2] [...]

以指定的关键字搜索程序包名及summary信息;匹配方式为模糊匹配;

(14)查看指定包所依赖的capabilities:

# yum deplist package1 [package2] [...]

(15)查看yum事务历史:

# yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollbac
k|new|sync|stats]
仅能查到有改动的历史,例如安装、升级、卸载等。

(16)安装及升级本地程序包:

# yum localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)

# yum localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
注意:本地程序包指非仓库的程序包,可以是从互联网上下载的程序包。当本地程序包的安装存在依赖
关系并且该包依赖于仓库里的程序包时,使用此选项可借助yum安装这个本地程序包。但从CentOS 6/7后
,直接install选项指定本地rpm程序包即可,即:# yum install local_rpmfile.

17)包组管理的相关命令:

# yum groupinstall group1 [group2] [...]
# yum groupupdate group1 [group2] [...]
# yum grouplist [hidden] [groupwildcard] [...]
# yum groupremove group1 [group2] [...]
# yum groupinfo group1 [...]

 

 

1. 编译安装概述

前面两篇关于程序包管理器的文章谈到,无论是使用rpm命令还是yum命令安装的都是已编译好的程
序包,在整个安装过程中用户只需执行一条命令即可完成安装。这样带来的好处是方便,但因为是安装
的是已编译好的包,所以用户的系统平台环境必须与rpm包制作者的系统平台环境相同。此外,如果用户
要安装使用某程序上的某个功能,而rpm包制作者在编译过程中默认没有指定该功能的实现,这时候该怎
么办呢?更何况如果某程序只是提供源码而没有现成的rpm包。这时就需要用户手动编译安装了,而编译
安装就是将程序源代码编译成完全适合自己平台类型的程序包。

因此,用户首先得获得程序源码包(SRPM, Source RPM)。RPM包的命名格式为:name-VERSION-
release.arch.rpm,而程序源码包(SRPM)的命名格式为:name-VERSION-release.src.rpm。可以发现,
SRPM与RPM相比,将arch替换为src,说明SRPM包去掉了arch这一平台类型限制,因此经过用户自己编译
安装可以编译成适合自己平台的程序包。

以下为编译过程图解(以C源代码为例):

我们知道,程序源代码一般为多文件组织格式,因此文件中的代码文件之间很有可能存在跨文件的依赖
关系,这将给用户自行编译安装带来了极大麻烦,因为对先编译哪些文件、后编译哪些文件根本无从知
晓,因此这就需要项目管理器(或者项目构建器)了。

C/C++的项目管理器为make,make工具可以在编译过程中指定使用哪个预处理器进行预处理、使用哪个编
译器进行编译以及先编译什么程序文件、后编译什么程序文件,甚至完成更为复杂的操作等,能帮助用
户快速地编译安装。

make工具的执行依赖于makefile配置文档,因此make执行的所有操作皆由makefile指定。makefile可由
执行configure脚本生成。而在执行configure脚本时,configure会结合用户通过命令行指定的选项以及
各个Makefile.in模板文件来生成makefile文件。编译完成之后即可使用make install命令将编译好的程
序包复制到用户指定的各个目录下。


2. C代码编译安装三步骤

(1) 执行configure脚本(# ./configure [option...])
常用选项:

--help:获得其支持使用的选项
--prefix=/PATH/TO/SOMEWHERE:指定默认安装位置;默认为/usr/local/;
--sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;
--enable-FEATURE[=ARG]:开启指定特性以及安装路径;默认开启时无须指定;
--disable-FEATURE:关闭指定特性;默认关闭时无须指定;
--with-PACKAGE[=ARG]:安装指定依赖包以及其安装路径;
--without-PACKAGE:不安装指定依赖包;

执行configure脚本的作用:
①用户可以通过选项传递参数给configure脚本,以指定启用的功能特性、安装路径等;而configure脚
本在执行的过程中会参考用户的指定以及Makefile.in文件生成makefile文件;
②检查程序指定要启用的功能特性所依赖到的外部环境。

(2) 执行make程序
作用:
make会执行真正的编译操作,但make本身并不是编译器,它只是一个项目构建工具

make程序会根据执行configure脚本所生成的makefile文件,并调用所需要用到的编译器来构建应用程序

(3) 执行make install安装操作
作用:
在前面的make程序执行之后,在当前目录下会创建出已编译完成的目标二进制格式的应用程序(包括二
进制程序、库文件、配置文件及帮助文档等),而make install则会执行安装操作,即把当前目录下已
编译好的程序包(二进制程序、库文件、配置文件及帮助文档等)复制到用户指定的各个目录下。

注意:各个程序在编译安装过程中可能不尽相同,因此建议安装前查看INSTALL, README。


3. 编译安装后的配置

(1) 导出目标二进制程序目录至PATH环境变量中
方法:
在生产环境中如果该二进制程序作为全局变量,可以在/etc/profile.d/目录下创
建/etc/profile.d/NAME.d文件,其中'NAME'可定义设置名称。在该文件中写入下面一行:

export PATH=PATH:/PATH/TO/BIN
这里的/PATH/TO/BIN即为目标二进制程序所在目录。

(2) 导出库文件路径
方法:
①在/etc/ld.so.conf.d/目录下创建/etc/ld/so.conf.d/NAME.conf,其中NAME为自定义设置名称。而后
,添加新的库文件所在目录至此文件中即可。
②做完这一步之后,需要让系统重新生成缓存:

# ldconfig [-v]

3) 导出头文件(位于include目录)
程序编译安装完成之后,一般在安装路径中会有include目录,这个include目录就是头文件,头文件的
功能是把外部文件的内容包含到源文件中,例如外部函数等。在程序开始编译之前,会执行一段预处理
指令,而预处理指令则把头文件的内容包含到源文件中。
如果要导出头文件,可基于软链接的方式来实现:

# ln -sv 头文件目录 链接头文件目录

(4) 导出帮助手册
方法:
在CentOS 6上:
编辑/etc/man.config文件,添加一个MANPATH:

# MANPATH /PATH/TO/MAN
这里'/PATH/TO/MAN'为目标程序的安装路径下的帮助手册目录。

在CentOS 7上:
编辑/etc/man_db.conf文件,添加一个MANPATH:

# MANPATH_MAP /PATH/TO/BIN /PATH/TO/MAN
这里/PATH/TO/BIN是目标二进制程序所在目录,/PATH/TO/MAN则是该程序的帮助手册所在目录。

posted @ 2018-04-05 13:30  恢恢恢恢  阅读(133)  评论(0编辑  收藏  举报