对于Linux系统而言,其能执行的程序为二进制格式,而对于程序开发者而言,直接利用二进制开发程序是不太现实的,所以一般都是利用高级语言来进行软件开发,其程序也即称为源代码;那么我们在对一个程序进行安装、升级、卸载、 查询、校验等操作时,需要对每个源代码进行编译成为二进制程序,那么显然是不太现实的。所以在各Linux发行版中一般都带有程序包管理器。
所谓程序包管理器就是将源代码编译成为目标二进制格式后,组织成为一个或有限几个“包”文件,这些包文件能够完成安装、升级、卸载、查询、校验等的操作。对于不同发行版,其所采用的程序包管理器也各不相同。我们以应用面较广的RPM(redhat package manager)为例来对程序包管理器做一下了解。
一、RPM程序包管理
1、命名规则
对于RPM程序包而言,其命名也有相应的规则,比如我们以tree为例
[root@luolmcentos7 testdir]# ll /run/media/root/CentOS\ 7\ x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm -r--r--r--. 2 root root 47508 Jul 4 2014 /run/media/root/CentOS 7 x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm
我们看到tree程序包的完整名称为tree-1.6.0-10.el7.x86_64.rpm,其命名规则一般为:
name-version-release.distribution.arch.rpm
软件名称–软件版本–发布版本.系统发行版本.硬件平台.扩展名
2、依赖关系
我们知道,Linux的哲学思想中很重要的一部分为:程序为小型、单一用途,通过链接程序,共同完成复杂的任务。所以,当我们在安装某一个程序时,可能往往其会依赖一些其他程序提供的功能才能够运行或实现相应的功能。比如我们在安装httpd-devel-2.4.6-40.el7.centos.x86_64.rpm时,其提示信息如下:
[root@luolmcentos7 testdir]# rpm -ivhf /run/media/root/CentOS\ 7\ x86_64/Packages/httpd-devel-2.4.6-40.el7.centos.x86_64.rpm error: Failed dependencies: apr-devel is needed by httpd-devel-2.4.6-40.el7.centos.x86_64 apr-util-devel is needed by httpd-devel-2.4.6-40.el7.centos.x86_64
可以看出,软件包之间可能存在相互之间的依赖关系,所以对于rpm而言,其同样能够提示我们软件之间的这种关系。
了解了这些,下面我们来具体看一下rpm命令。
3、rpm命令
rpm [options] [package_file]
–dbpath DIRECTORY:指定数据库目录,不使用默认值(/var/lib/rpm/)
-v:显示命令执行过程中的详细信息;
-vv:显示命令执行过程中的更加详细的信息;
对于程序具体的安装、升级、查询、卸载校验等的操作,rpm分别有对应的命令格式与选项,下面分别来看一下。
Ø RPM安装(install)
rpm {-i|–install} [install-options] PACKAGE_FILE …
-i:安装RPM
-h,–hash:hash marks输出进度条;每个#号表示2%的进度;
–nodeps:忽略依赖关系;
–replacefiles:允许安装过程中覆盖已存在的文件;
–replacepkgs:允许重新安装已安装的程序;
–force:强制执行操作
–test:测试安装,检查并报告依赖关系及冲突信息等;
–justdb:仅更新程序数据库,不更新文件;
–nosignature:不检查包签名信息,不检查来源合法性;
–nodigest:不检查包完整性信息;
–noscript:不安装程序中的脚本
preinstall:安装过程开始之前运行的脚本,%pre;–nopre
posinstall:安装过程完成之后运行的脚本,%post;–nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun;–nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun;–nopostun
Ø RPM升级与更新(upgrate/freshen)
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
rpm升级与更新的选项与rpm安装的选项相同,但以下几个选项需特别说明一下:
-U:升级或安装;系统中若未安装后面接的程序,则将予以安装;
-F:升级;系统中若未安装后面接的程序,则不会予以安装;
–oldpackage:允许对程序进行降级;
对于rpm升级与更新,需要注意一下两点:
1) 不要对内核做升级操作;Linux支持多内核版本共存,因此,可直接安装新版本内核;
2) 如果某程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
Ø RPM查询(query)
rpm {-q|–query} [select-options] [query-options]
-q:仅查询,后面接的程序包是否已安装,及其版本
对于rpm命令的查询选项,我们按照其命令语法分为两个部分来说明:
[select-options]:
-a,–all:查询所有已经安装过的包
-f FILE:查询指定的文件是由哪个程序包安装生成;
-p,–package PACKAGE_FILE:用于实现对程序包执行查询操作,而非已安装的软件;
–whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
–whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
[query-options]:
–changelog:查询rpm包的changelog;
-l, –list:查询已安装程序包生成的所有文件的列表
-i, –info:程序包相关的信息,版本号、大小、所属的包组等
-c, –configfiles:查询指定的程序提供的配置文件;
-d, –docfiles:查询指定的程序包提供的文档;
–provides:列出指定的程序包提供的所有CAPABILITY;
-R, –requires:查询指定的程序包的依赖关系
–scripts:查看程序包自带的脚本片段;
对于rpm的查询命令,我们需要注意的是:
1) 只要是对程序包进行的查询(而非已安装的程序),就需要增加-p选项;
2) 在查询本机上面RPM软件的相关信息时,不需要加上版本的名称,只要加上软件名称即可;其会由/var/lib/rpm数据库查询;但查询某个RPM程序包就不同了,我们必须要列出整个文件的完整文件名;
Ø rpm验证与数字证书
对于开源程序来说,其程序来源对于系统安全而言就比较重要了。所以,我们对程序包及其产生的文件通常要做校验。其具体命令如下:
rpm {-V|–verify} [select-options] [verify-options]
-V:后面加程序名称,若该软件所含的文件被改动过,才会列出来;
-Va:列出目前系统上所有可能被改动过的文件
-Vp:后面加RPM文件,列出该文件内可能被改动过的文件;
-Vf:列出某个文件是否被修改过
[root@luolmcentos7 testdir]# rpm -Va .M....... /run/svnserve S.5....T. c /etc/cups/cups-browsed.conf
如上图所示,对于文件前面的代码分别代表不同的含义,各代码意义如下所示:
S file Size differs 文件的容量大小是否被改变
M Mode differs (includes permissions and file type) 文件的类型或文件的属性是否被改变
5 digest (formerly MD5 sum) differs MD5码的内容是否已经不同
D Device major/minor number mismatch 设备的主/次代码是否已经改变
L readLink(2) path mismatch Link路径已被改变
U User ownership differs 文件的所有者是否已经改变
G Group ownership differs 文件的所属用户组是否已经改变
T mTime differs 文件的修改时间是否已经改变
P caPabilities differ 功能是否已经改变
上述基本上是对已安装文件的完整性进行的验证,而要对程序包进行来源合法性与完整性验证时,我们需要首先导入密钥,其命令为(对于CentOS7发行版而言):
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
安装完成密钥后,当我们安装此组织签名的程序时,会自动执行验证,我们也可以手动验证,其命令为:
rpm -K PACKAGE_FILE
Ø rpm卸载
rpm {-e|–erase} [–allmatches][–nodeps][–noscripts][–notriggers] [–test] PACKAGE_NAME …
–allmatches:卸载所有匹配指定名称的程序包的各版本;
–nodeps:忽略依赖关系;
–test:测试卸载,dry run模式;
Ø rpm数据库重建
当我们利用rpm命令去进行查询等操作时,其通过rpm管理器的数据库(/var/lib/rpm)来进行查询。那么对于数据库,我们同样可以进行初始化、创建等操作。
rpm {–initdb|–rebuilddb} [-v] [–dbpath DIRECTORY] [–root DIRECTORY]
–initdb:初始化数据库,当前无任何数据库时,可初始化创建一个新数据库;若当前 有数据库时,不执行任何操作;
–rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
以上,就是对于rpm程序包管理器的相关介绍,下面我们利用rpm来安装tree程序。
[root@luolmcentos7 testdir]# rpm -q tree package tree is not installed [root@luolmcentos7 testdir]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [root@luolmcentos7 testdir]# rpm -K /run/media/root/CentOS\ 7\ x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm /run/media/root/CentOS 7 x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK [root@luolmcentos7 testdir]# rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:tree-1.6.0-10.el7 ################################# [100%]
在以上介绍中,我们知道各软件间可能会存在相互依赖关系,且在利用rpm安装程序时需要给定程序包的路径,那么能不能解决这些问题,从而使得程序安装更加简单呢?这时,我们就需要用到程序包管理的前端工具了。对于CentOS而言,其前端管理工具为yum。
二、yum
yum是一个rpm包的前端管理工具,在rpm包的依赖关系已经被建成数据库的前提下,它能够实现自动查找相互依赖的rpm包,并从repository中下载互相依赖的rpm包到本地。其工作原理如下:
我们看到,若想yum自动解决依赖关系,就需要配置yum,建立yum repository,即yum仓库,我们先看一下如何建立yum仓库。
1、yum仓库的建立
yum的有两类配置文件,分别为:
Ø /etc/yum.conf:为所有仓库提供公共配置及yum命令自身的配置;
Ø /etc/yum.repos.d/*.repo:为仓库的指向提供配置;
如果要新建yum仓库,那么就要配置yum的/etc/yum.repos.d/下的配置文件,其常用的配置选项有以下几种。
1) [repositoryID] 代表仓库的ID,中括号一定要存在,里面的名称则可以随意取,但是不能有两个相同的容器名称;
2) name= 只是说明一下这个仓库的意义而已,重要性不是很高,可以不进行定义;
3) mirrorlist= 只是一个保存列表的网站,centos 将从中选着一个链接来下载更新;
4) baseurl= 仓库的实际地址,其地址内必须要有repodata文件夹;baseurl支持http://,ftp://,file:///三种格式;可以有多个baseurl;
5) enabled={1|0} 为1代表仓库可以使用,为0代表仓库不可使用;默认为1;
6) gpgcheck={1|0} 为1代表需要进行gpg校验,为0代表不需要进行gpg校验;默认为1;
7) gpgkey=URL 指定gpgkey的路径;一般使用默认值即可
8) enablegroups={1|0} 为1代表在本仓库启用包组,为0代表在本仓库禁用包组;
9) failovermethod={roundrobin|priority} 失败后启用的优先级,roundrobin为随机挑选,priority为优先选择,即失败后优先选择本仓库;默认为:roundrobin;
10) cost= 默认为1000;花费值,值越低,优先级越高;
在这些配置选项中,baseurl指向的是仓库的实际地址,那么假如我们要对批量主机配置yum仓库,且各主机的版本与平台并不相同,那么若一个个的配置,是相当复杂的。为了解决这些问题,在路径中我们可以使用一些变量来简化操作,其常用变量有以下几种:
l $releasever:当前OS发行版的主版本号;
l $arch:平台类型
l $basearch:基础平台类型
l $YUM0~$YUM9:用户自定义的10个变量;
有了这些变量,我们在配置路径时就可以像下面这样配置了。
http://10.1.0.1/cobbler/ks_mirror/$releasever/$basearch/
在配置好配置文件后,那么对于各个程序包的元数据及依赖关系又存放在哪里呢?这些程序都存在与yum配置文件中baseurl指向的路径的repodata文件夹中,所以,对于仓库中的所有程序包,我们需要生成repodata文件。这里,我们就要用到createrepo程序了。
了解了以上这些,我们就可以动手配置yum仓库了,假如我们以CentOS7的安装光盘作为yum源,将其程序包复制至本地来进行配置,其步骤如下:
a) 复制光盘中的程序包至本地
[root@luolmcentos7 testdir]# mkdir yum [root@luolmcentos7 testdir]# cp /run/media/root/CentOS\ 7\ x86_64/Packages/* /testdir/yum/
b) 利用createrepo命令来生成repodata文件夹
[root@luolmcentos7 testdir]# cd /testdir/yum/ [root@luolmcentos7 yum]# createrepo . Spawning worker 0 with 162 pkgs Spawning worker 1 with 162 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@luolmcentos7 yum]# ll | grep "repodata" drwxr-xr-x. 2 root root 4096 Aug 24 20:05 repodata
c) 配置配置文件
[root@luolmcentos7 testdir]# cd /etc/yum.repos.d/ [root@luolmcentos7 yum.repos.d]# vim centosrom.repo [root@luolmcentos7 yum.repos.d]# cat centosrom.repo [centosrom] name=centosrom baseurl=file:///testdir/yum gpgcheck=0 enabled=1
现在,我们就可以使用刚刚配置完成的yum仓库了。
2、yum命令
配置完成yum仓库后,我们来看一下yum命令的具体应用。
yum [options] [command] [package …]
-y:当yum要等待用户输入时,此选项可自动提供yes相应
–installroot=/path/to/somewhere:将该软件安装在/path/to/somewhere中而不使用默认路径
–nogpgcheck:禁止进行gpg check
-q,–quiet:静默模式
–disablerepo=repoidglob:临时禁用此处指定的repo
–enablerepo=repoidglob:临时启用此处指定的repo
–noplugins:禁用所有插件
Ø yum list {all|available|installed|updates} [glob_exp1] […] 列出目前yum所管理的所有的软件名称与版本,有点类似于rpm -qa;支持通配符;
all:列出所有软件名称与版本;
available:列出yum仓库中所有可安装的软件名称与版本;
installed:列出yum仓库中所有已安装的软件名称与版本;
updates:列出在yum仓库中可供本机升级的软件的名称与版本;
Ø yum repolist [all|enabled|disabled] 列出所有yum仓库的列表
Ø yum info […] 列出目前yum所管理的所有的软件的相关信息,有点类似于rpm -qai;后面可跟某程序名称,查询此程序的相关信息;
Ø yum search string1 [string2] […] 以指定的关键字搜索程序包名及summary信息;模糊搜索;
Ø yum provides | whatprovides feature1 [feature2] […] 查看某些文件或特性是由哪些软件提供的,类似于rpm -qf的功能;
Ø yum install package1 [package2] […]
install:后面接要安装的软件
Ø yum update [package1] [package2] […]
update:后面接要升级的软件,若要整个系统都升级,就直接update即可;
Ø yum check-update 检查可用升级
Ø yum remove | erase package1 [package2] […] 删除功能
注:卸载程序时,所有依赖于此程序的程序也会被卸载
Ø yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
清理本地缓存
Ø yum makecache
构建缓存
Ø yum reinstall package1 [package2] […]
重新安装
Ø yum downgrade package1 [package2] […]
降级
Ø yum deplist package1 [package2] […]
查看指定包所依赖的capabillities
Ø yum version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
查看rpmdb的版本信息
Ø 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)
localupdate rpmfile1 [rpmfile2] […]
(maintained for legacy reasons only – use update)
Ø 包组管理的相关命令:
* groupinstall group1 [group2] […] 安装包组
* groupupdate group1 [group2] […] 升级包组
* grouplist [hidden] [groupwildcard] […] 列出yum仓库中的包组
* groupremove group1 [group2] […] 删除包组
* groupinfo group1 […] 查看包组的相关信息
3、编译安装
在很多情况下,封装好的程序包并不能够满足我们的使用要求,这时候,我们就需要自己进行编译安装。对于C代码进行编译安装一般分为三个步骤。
1) ./configure:
主要作用是通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile并检查依赖到的外部环境;
2) make:根据makefile文件,构建应用程序;
3) make install
在进行编译安装时,首先会检查所依赖的外部环境,我们需要需要提供开发工具及开发环境。我们可以通过“包组”来提供所需环境。在CentOS6中,我们需要安装”Development Tools”与"Server Platform Development"包组,在CentOS7中,我们需要安装”Development and Creative Workstation”与”Development Tools”包组。下面我们来看一下各步骤中的一些配置。
在第一步运行configure脚本时,我们一般可以使用以下一些选项:
./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
configure完成后,在源程序文件夹下已经有makefile文件
而在第二步make与第三步make install,我们一般不需要进行特定配置。
在安装完成后,我们还需要进行一些选项的配置。
l 导出二进制程序目录至PATH环境变量中;
编辑文件/etc/profile.d/NAME.sh,添加内容:export PATH=/PATH/TO/BIN:$PATH
l 导出库文件路径:
编辑/etc/ld.so.conf.d/NAME.conf,添加新的库文件所在目录至此文件中;并通过ldconfig [-v]命令让系统重新生成缓存:
l 导出头文件
基于链接的方式实现,链接至/usr/includeb
l 导出帮助手册
编辑/etc/man_db.conf,添加一个MANPATH
原创文章,作者:luoliumeng,如若转载,请注明出处:http://www.178linux.com/39923