我是一个老实人从来不说实话,我是一个好人从来不说真话,学习linux有段时间了,太高深的东西还不懂,就写一下最近学习的程序包管理吧。
大家都知道在我们学习linux主要是搞运维的,那么我们每天上班的时候就避免不了跟程序包打交道,你不信啊?反正我上班的时候领导总是在我不经意的抬头瞬间给我抛一个媚眼,我立马就领悟了领导的意思,有活要干了,最好不是服务器挂了老天保佑。
有时候我们需要在系统上安装某个软件或者服务(就是程序包),可能需要现在本地磁盘上查一下有没有这些程序包,有的话我们可以直接使用rpm 命令来执行安装,没有的话我们需要去自己的小仓库或者公司提供的程序仓库当中查找安装。还是没有的话,就需要我们去天之涯海之角很远很远的地方取经了,好比网上活雷锋提供的云仓库。我知道的好用安全的云仓库有:
搜狐的:mirrors.sohu.com
网易的:mirrors.163.com
马云的:mirrors.aliyun.com
第三方程序包提供者:epel
(http://www.loveyun.net/centos修改镜像为国内的阿里云源或者163源等国内源/)这里可以参考一下
基本的程序包(软件包)管理命令有两个(其实有多个,这里我们只介绍两个):rpm与yum
rpm 与 yum 的区别主要是yum执行安装时会一并安装所有存在依赖关系的安装包,rpm安装时若遇到存在依赖关系的安装包,必须手动下载此安装包先进行安装才能进行接下来的步骤。
centos上rpm程序包的管理:
一.安装
rpm {-i|--install} [install-options] PACKAGE_FILE1...
-i或者--install后面跟程序包名表示静默安装程序包
-h:以#组成的排列表示安装进度
-v:显示安装过程中的详细信息,v越多越详细,如-vv,-vvv...
--nodeps:安装时忽略依赖关系,直接安装(装完了有可能无法正常使用)
--replacepkgs:覆盖安装,重新安装并覆盖原有文件
--force:强制安装
--test:不是真的安装,仅报告依赖关系以及冲突信息
安装时常用组合-ivh,-ivvh
例如:我们要安装wireless-tools-29-5.1.1.el6.x86_64.rpm这个程序包用来实现linux的无线网功能。
1.下载程序包wireless-tools-29-5.1.1.el6.x86_64.rpm到本地目录~/local/rpmmanagertest
2.使用rpm -ivh wireless-tools-29-5.1.1.el6.x86_64.rpm安装这个程序包
二.查询
rpm {-q|--query} [select-options] [query-options]
[select-options]:
1、查询某包或某些包是否安装:
rpm -q PACKAGE_NAME...
2、查询已经安装的所有包:
rpm -qa
3、查询某文件是由哪个包安装生成:
rpm -qf /PATH/TO/SOMEFILE
4、查询尚未安装的包文件的相关信息
-p
# rpm -qpi PACKAGE_FILE
[query-options]:
1、查询某包的简要说明信息:
rpm -qi PACKAGE_NAME
2、查询某包安装生成的文件列表:
rpm -ql PACKAGE_NAME
3、查询某包安装完成后生成的所有配置文件:
rpm -qc PACKAGE_NAME
4、查询某包安装完成后生成的所有帮助文件:
rpm -qd PACKAGE_NAME
5、查看某包制作时随版本变化的changelog信息:
rpm -q --changelog PACKAGE_NAME
6、查询某包提供的capabilities:
rpm -q --provides PACKAGE_NAME
7、查询某包所依赖的capabilities:
rpm -q --requires PACKAGE_NAME
8、查询某包安装或卸载时执行脚本:
rpm -q --scripts PACKAGE_NAME
脚本有四类:
preinstall: 安装过程开始之前执行的脚本;
postinstall: 安装过程完成之后执行的脚本;
preuninstall: 卸载开始之前执行的脚本 ;
postuninstall: 卸载过程完成之后执行的脚本;
三、升级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
-U: 升级或安装
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-F:升级
组合:-Uvh, -Fvh
--nodeps:忽略依赖关系升级
--force:强制升级
--oldpackage:降级到旧版本;
注意:一定不要对内核执行升级;Linux允许多内核共存,所以,可以直接安装多个不同版本内核;
注意:如果程序包的配置文件安装后曾被修改,升级时,新版本的文件不会覆盖老版本的配置文件,而把新版本的配置文件重命名(加后缀.rpmnew)后保存;
四、卸载
rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...
--nodeps:忽略依赖关系;
--test: 测试卸载;dry-run模式;
--allmatches: 如果一个程序包同时安装多个版本,则此选项一次全部卸载之;
简单用法:rpm -e PACKAGE_NAME...
注意:如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命名(加后缀.rpmsave)后留存;
五、程序包的校验
查看程序包安装之后生成的文件是否遭到改动过
rpm {-V|--verify} [select-options] [verify-options]
-V可以验证程序包安装后有哪些内容遭改动
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 caPabilities differ
没有信息显示说明php程序安装之后并没有遭到改变
因为linux安全等级并不是很高,如果装载了来源不明或者内容遭到恶意修改留有漏洞和后门的程序包,对系统安全来说是极大的隐患,尤其在生产环境中更是如此,绝对不能装载来源不明的程序包。那么我们怎么检测一个程序包是不是遭遇修改,是不是来源与信得过的发布者呢?
程序包的合法性验正:
来源合法:
由我们信任的制作者提供
依赖于:制作者的数字签名;签名是作者使用自己的私钥加密程序包的特性码进行的;
内容合法:
包未被二次修改;完整性校验成功
依赖于:制作者提供的程序特征码;
验正方式:安装者用同样的特征码提取算法提取程序包的特征码,并与原作者提供的相比较;
验正其光盘中程序包的来源合法性及完整性:
因为光盘中会附带验证码文件,我们要验证光盘里某个程序包的完整性合法性,首先要提取这个文件,例如:我系统光盘挂载到/media/dvd
其中RPM-GPG-KEY-CentOS-6文件就是验证centos上程序包的合法及完整性的文件,我们使用rpm --import命令将文件导入到内存
rpm --import /path/to/RPM-GPG-KEY-FILE
例如:# rpm --import RPM-GPG-KEY-CentOS-6
验正:rpm {-K|--checksig} PACKAGE_FILE
--nosignature: 不检查来源合法性
--nodigest: 不检查完整性
例如:#cd Packages
#rpm -K php-5.3.3-38.el6.x86_64.rpm
rsa sha1 (md5) pgp md5 OK说明程序包的合法性OK完整性OK啊,哈哈,好不容易啊,注意所有操作都要在当前目录下操作。导入KEY文件在文件坐在当前目录执行--import,验证rpm包在rom包所在目录下执行-K。
rpm管理器数据库:/var/lib/rpm
我们知道rpm实现查找一个程序包生成哪些文件和配置文件,这些相关的信息为什么可以生成呢?那是因为安装rpm工具的时候给它创建了一个数据库,这个数据库在/var/lib/rpm中,当我们安装一个程序包时,rpm会自动将所有相关信息存储到/var/lib/rpm中,这样当我们回头或查找或卸载软件包时,就会直接从此数据库中读取信息。
在时期的linux运行过程中,由于各种不确定因素会导致此数据库文件丢失或者损坏(可能人为误删,可能磁盘坏了导致文件丢失),那么我们就需要重新建立此数据库(工作环境中不允许重装系统)。
重建数据库:
rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY]
--initdb: 初始化数据库,即数据库完全不存时,可新建之;
--rebuilddb: 无论当前数据存在与否,都会直接重建此库;
yum程序包管理
下面是某度对yum的解释
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
我们要使用yum命令对程序包执行安装、卸载、升级、查询的工作,首先要配置好yum所指向的各种仓库(仓库里藏着很多程序包)才能自动下载它们为我所用。
yum的配置文件有两个
主配置文件:
/etc/yum.conf为个仓库指向提供公共默认规则,比如定义调用仓库资源时默认是不是要检测程序包合法性的gpgcheck。
各个分仓库文件的定义:
分仓库一般是在/etc/yum.repos.d/*.repo中定义的。每个分仓库文件必须用.repo命名才能生效,且每个文件中可以定义多个库指向。
文件中通常需要定义以下几项内容(较常用的,不常用的不说了):
[repositoryid]:此ID唯一标识此分库的指向,必须是整个单词,不能与别的库相同;
name=描述信息
mirrorlist=url指向镜像站点地址列表(就是所有的指向仓库路径的列表,因为路径太多一个一个使用baseurl指定太麻烦,我们就生成个地址列表,用mirrorlist指向这个列表文件就行了)
baseurl=url指向镜像站点(就是指向仓库的路径)
url分为:
本地:file:///生成了repodata目录仓库;
ftp路径:ftp://生成了repodata目录仓库;
http路径:http://生成了repodata目录的仓库;
gpgcheck={1|0}:1表示启用检测,0表示关闭
enabled={1|0}:1表示启用该分库,0表示关闭
由于使用yum命令必须有可用的仓库,所以我们先来创建一个本地仓库
1.我们建立一个http指向的本地仓库,首先要开启httpd服务(如果无法开启则需要安装httpd包),还要关闭防火墙service iptables stop;
2.我们使用cp命令到挂载的光盘中下载一些程序包到/var/www/html/xen4中,然后使用createrepo命令在此目录下创建repodata(此命令需要提前安装createrepo程序包)
3.cd到/etc/yum.repos.d/下创建一个仓库配置文件
4.使用yum clean命令清理缓存,使用yum makecache命令创建新缓存,使用yum repolist查看可以使用的仓库
我们已经创建了一个包含许多PHP程序包的本地仓库,使用http可以访问,下面我们介绍一下yum对仓库内程序包的管理。
yum [options] [command] [package ...]
可用选项:
-y: 自动回答为“yes”
--disablerepo=: 临时禁用在配置文件中配置并启用的某repository;
--enablerepo=:临时启用指定的某repo;
--nogpgcheck: 禁止做包校验;
一、查看所有以创建的仓库配置文件.repo
yum listrepo
二、清理缓存文件
yum clean all
三、创建新的缓存
yum makecache
四、程序包查找
yum list [all | glob_exp1] [glob_exp2] [...]
查找所有的程序包文件,后面可以使用glob表达式给定查看条件
yum list {available|updates|installed|extras|obsoletes} [glob_exp1] [...]
查找 可用的/可升级的/已安装的/更新的/过时的程序包
yum grouplist [hidden] [groupwildcard] [...]
查找包组文件
五、程序包安装
yum install package1 [package2] [...]
注意: 只需要提供包名;如果某包有在不同仓库中有多个不同版本,默认会安装最新版本;如果要安装指定版本:install PACKAGE-VERSION ...
重新安装(覆盖安装)
yum reinstall package1 [package2] [...]
六、程序包升级
update [package1] [package2] [...]
程序包降级:
downgrade package1 [package2] [...]
检查有哪些升级可用:
check-update
七、程序包卸载
yum remove|erase package
所有依赖于此程序包的其他程序包都会被卸载
八、程序包信息查询
查询程序的相关简要信息:info PACKAGE ...
在包名和sumary信息中搜索指定的关键字:search KEYWORD ...
查询指定文件由哪个程序包安装生成:provides|whatprovides /PATH/TO/SOMEFILE
九、安装或升级本地程序包
localinstall rpmfile1 [rpmfile2] [...]
用于安装仓库中并不存在的程序包文件,这些程序包有可能又依赖于仓库中的某些程序包;我们可以从其他途径获取一些程序包下载到本地目录,使用此命令安装。
localupdate rpmfile1 [rpmfile2] [...]
用本地下载的程序包对已安装的一些包进行升级
十、包组管理:
列出所有包组:grouplist
显示指定包组详情:groupinfo group1 [...]
安装:groupinstall group1 [group2] [...]
卸载:groupremove group1 [group2] [...]
升级:groupupdate group1 [group2] [...]
Note: 可直接用install、remove或update来管理包组:
@GROUP_NAME
例如:# yum install @"Server Platform Development"
写完这篇博客真是头大啊,开始还不太熟悉的一些命令,现在全都能熟练使用了,这就是写博客的好处,写的不仅仅是rpm/yum,我在家里写没有环境,自己搭的,下载到win上的程序包怎么加载linux虚拟机上让我费劲脑汁,最终博客写完了我又学会了好几项技能。我先去万达喝杯coffee,看看美女提高下肾上腺,晚上要好好休息下。