Linux软件包管理之--rpm
网络操作系统都是架构在底层硬件之上的,目前内核有Linux系列,UNIX系类,Windows系列等,再向上是程序库调用,程序的实现方式在不同的操作系统中实现的方式也不尽相同。操作系统向外输出供用户使用的接口称之为API(Application Programming Interface),向用户输出统一的调用接口,这样当一个文件使用调用接口后就可以在不同的操作系统中按照统一的格式输入输出了。(如下图)
ABI(Application Binary Interface)即应用二进制接口,我们知道Windows和Linux系统是不兼容的,但是如果我们想实现不同系统的相同应用,就需要使用库级别的虚拟化,在Linux操作系统中有WINE系统,在Windows操作系统中有Cywin系统,都可以实现在各自的操作系统中运行非各自操作系统原生的应用程序,从而实现了操作系统应用的扩展。
系统级的开发语言有C、C++,而应用级的开发语言有Java、Python、php、perl以及ruby等。其中二进制应用程序的组成部分包含:(1)二进制文件(2)库文件(3)配置文件(4)帮助文件。
在程序包的管理器中现行的有Debian发行版下的deb、dpt管理器等,RedHat发行版下有rpm管理器。
RPM是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放的,现在包括OpenLinux、SUSE以及Turbo Linux等的Linux发行版都有采用,可以算是公认的行业标准了。RPM是一种用于互联网下载包的打包及安装工具,它包含在某些Linux发行版中。它生成具有.RPM扩展名的文件。
RPM主要功能:
*安装、卸载、升级和管理软件
*组件查询功能
*验证功能
*软件包GPG(来源合法性)和MD5数字签名(完整性)的倒入、验证和发布
*软件包依赖处理
*选择安装
*网络远程安装功能
什么是程序包管理器:
将编译好的应用程序的各个组成文件打包称一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作。主要包含两个部分,首先是程序包的组成清单,这是每个包独有的,包含文件清单,安装或卸载时运行的脚本;其次是公共的数据库,主要有程序包的名称及版本,依赖关系,功能说明和安装生成的各文件的文件路径及校验码信息。
由于程序包之间会存在依赖关系(例如三个文件:X,Y,Z),所以程序包管理器需要前端管理工具来解决关联文件之间的依赖关系。
yum:是rpm包管理器的前端管理工具
apt-get:deb包管理器的前端管理工具
zypper:suse上的rpm前端管理工具
dnf:Fedora 22+rpm包管理器前端管理工具
软件源代码命名格式:
源代码:name-VERSION.tar.gz
VERSION:major.minor.release
major:主版本号
minor:次版本号
release:发行号
RPM包的命名格式:
RPM包的命名格式是依赖并延续软件源代码的命名格式的,格式如下
RPM包:name-VERSION-ARCH.rpm
VERSION:major.minor.release
ARCH:release.os.arch
示例:
zlib-1.2.7-13.el7.i686.rpm
RPM包的文件组织结构:
由于一个应用程序可能包含数十种不同的功能,这个时候如果对所有功能都进行RPM包统一格式的制作,对大部分的用户来说都是不合适的,这个时候需要将应用程序的功能进行分类,制作成可以由用户自由定制的拆包模式来进行软件的安装,如下所示。
testapp:拆包
testapp-VERSION-ARCH.rpm:主包
testapp-devel-VERSION-ARCH.rpm:支包1
testapp-testing-VERSION-ARCH.rpm:支包2
示例:
yum-langpacks-0.4.2-3.el.noarch.rpm:主包
yum-plugin-aliases-1.1.31-29.el7.noarch.rpm:支包
获取程序包的途径:
(1)系统发行版的光盘或官方服务器:
CentOS镜像:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2)项目官方站点
(3)第三方组织:
Fedora-EPEL社区
专业搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
CentOS系统上rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护。
(1)安装:
rpm {-i|--install} [install-options] PACKAGE_FILE
-v:verbose
-vv:显示更详细的安装信息
-h:以“#”显示程序包管理执行进度,每个“#”表示2%的进度
rpm -ivh PACKAGE_FILE
--test:测试安装,但不真正执行安装过程,属于dry run模式
--nodeps:忽略依赖关系
--replacepkgs:重新安装
--nosignature:不检查来源合法性
--nodigest:不检查包完整性
--noscipts:不执行程序包脚本片段
%pre:安装前脚本:--nopre
%post:安装后脚本:--nopost
%preun:卸载前脚本:--nopreun
%postun:卸载后脚本:--nopostun
示例:
#rpm -ivh --nodeps php-fpm-5.4.16-23.el7_0.3.x86_64.rpm
解释:忽略依赖关系安装软件php-fpm
#rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86.64.rpm
解释:重新安装一次软件zsh
#rpm -ivh --replacepkgs --nodigest --nosignature zsh-5.0.2-7.el7.x86.64.rpm
解释:digest即完整性,signature即来源合法性,表示安装时不检查zsh安装包的完整性和来源合法性
(2)升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE
rpm {-F|--freshen} [install-options] PACKAGE_FILE
upgrade:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作
rpm -Uvh PACKAGE_FILE
rpm -Fvh PACKAGE_FILE
--oldpackage:降级
--force:强行升级
注意:
(1)不要对内核做升级操作,Linux支持多内核版本并存,因此直接安装新版本内核即可
(2)如果原程序包的配置文件安装后曾被修改,升级时新版本提供的同一个配置文件并不会直接覆盖老版本的配置文件,而是把新版本的文件重命名(FILENAME.rpmnew)后保留
(3)查询:
rpm {-q|--query} [select-options] [query-options]
[select-options]
-q:查询包
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件查询其安装文件信息
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
[query-options]
--changelog:查询rpm包的更新日志
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-L:列出许可证信息
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本片段
-R:查询指定的程序包所依赖的CAPABILITY
--provides:列出指定程序包所提供的CAPABILITY
用法小结:
(1)-qi PACKAGE,-qf FILE,-qc PACKAGE,-ql PACKAGE,-qd PACKAGE
(2)-qpi PACKAGE_FILE,-qpl PACKAGE_FILE
(3)-qa
示例:
#rpm -qa | grep "php"
解释:查询所有rpm包,并找出“php”开头的软件包
#rpm -qf /etc/issue
解释:查询/etc/issue文件是由哪个程序包安装生成
#rpm -q --whatrequires /bin/cat
解释:查询/bin/cat被哪些程序包依赖
#rpm -q --whatprovides /bin/cat
解释:查询/bin/cat是由哪个包所提供
#rpm -q --changelog zsh
解释:查询zsh的安装更新日志
#rpm -q -c zsh
解释:查询zsh包含的配置文件
#rpm -q --conflicts zsh
解释:列出zsh包和哪些文件会发生冲突
#rpm -q -d zsh
解释:列出zsh包下的所有的手册文档
#rpm -qi zsh
解释:列出包的相关简要信息,包含名称,版本和描述信息
#rpm -ql zsh
解释:列出zsh安装后生成的所有文件的列表
#rpm -q --scripts zsh
解释:列出所有程序包含的脚本
#rpm -q -R zsh
解释:列出zsh程序包所依赖的CAPABILITY
#rpm -ql -p php-common-5.4.16-23.el7_0.3.x86_64.rpm
解释:如果程序php-common没有安装,那么使用-p可以查询其安装后可以生成的文件的信息
(4)卸载:
rpm {e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME
示例:
#rpm -e zsh
解释:卸载zsh
(5)校验:
rpm {-V|--verify} [select-options] [verify-options]
校验信息含义:
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
示例:
#rpm -V zsh
解释:校验zsh哪些地方有发生改变。
包来源合法性验正及完整性验正:
完整性验正:SHA256
来源合法性验正:RSA
公钥加密:
对称加密:加密,解密使用同一个密钥
非对称加密:密钥是成对的
public key:公钥,公开所有人
secret key:私钥,不能公开
导入所需要的公钥:
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
#rpm --import RPM-GPG-KEY-CentOS-7
(6)数据库重建:
rpm {--initdb|--rebuilddb}
initdb:初始化,如果事先不存在数据库,则新建之;否则,不执行任何操作
rebuilddb:重建,无论当前存在与否,直接重新创建数据库
总结:
以上这些命令就是RPM包管理器的所有基础的管理功能,后面的所有服务的配置过程,首先都需要创建用户并安装程序包,这是两个经常用到的操作,其中安装程序包部分比重会更大,所以这部分的知识大家一定要做到熟练运用。
Linux程序包管理之--yum
rpm是Linux的一种软件包名称,以.rpm结尾,安装的时候语法为:rpm -ivh,rpm报道安装有一个很大的缺点就是文件的关联性太大,有时候装一个软件要安装很多其他的软件包,很麻烦,所以就有了yum前端管理工具的诞生,它可以彻底解决这个软件依赖的关联性问题,很方便,只要配置两个文件即可安装。简单的说,rpm只能安装已经下载到本地机器上的rpm包,yum能在线下载并安装rpm包,能更新系统,并且还能自动处理包与包之间的依赖问题,这是yum前端管理工具解决的重要问题。
yum是rpm软件包管理器的前端管理工具。yum是一个在Fedora和RedHat以及CentOS的shell前端软件包管理器。基于rpm包管理,能够从指定的服务器自动下载rpm包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无需繁琐地一次次下载、安装。
在网络中会有一些文件服务器,在服务器上会有一块存储空间,用来存放用户所需的所有rpm包文件,然后这个文件服务系统会通过一个文件共享服务的接口输出到外部主机,这个文件服务我们称之为yum仓库。我们一般用户所使用的是Linux主机,本身支持rpm包管理器的基本功能,同时还支持yum工具的使用。本地的yum通过一个配置文件决定自己要到网络中哪个服务器去下载哪些软件包,配置文件会告诉我们主机上的yum工具通过哪个地址能找到所需的文件服务器,yum在接收到安装程序的指令后会尝试着通过配置指令去找远端的服务器主机。远程服务器会提供一个自身数据仓库的元数据描述信息,用来大体记录自身信息,这时Linux主机只会将容量较小的元数据下载至本地的缓存cache当中,yum客户端就会分析安装的指令中是否有用户请求安装的包名,如果有话就会像yum仓库尝试读取下载这个包,同时还会通过配置文件去分析软件包之间的依赖关系,会分析得出需要但尚未安装的软件包的名称,并罗列出来,然后再去向yum仓库请求连接下载所需的程序包。下载完成后会将软件包缓存在本地cache当中,在本地会去执行类似rpm的命令操作,安装时会自动先去安装有依赖关系的文件,安装完成后会自动清除缓存中的文件以节约空间,但是元数据不会删除,因为安装包文件在一个系统中很少会多次安装,但是元数据文件会多次的用来对比分析等操作,所以会留下元数据文件。有时候我们的客户端在进行yum命令安装的时候,连接不上网络上的yum仓库服务器,这个时候就需要我们自己定义策略来判断是否使用已过期或者无法判断是否过期的rpm包文件。所以说yum客户端需要连接一个远程的yum仓库,到仓库中下载元数据文件,在本地支持yum完成程序包的安装或者升级操作,如果还需要其他依赖的程序包时,yum还需要启动一个文件服务器的客户端到文件服务器去下载所需要的文件,所以我们说yum是C/S架构,它需要一个文件访问的服务器,完成对软件包的提供和安装管理。
YUM:Yellowdog Udatte Modifier
存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata)
文件服务器:
ftp://(ftp服务器提供文件服务)
http://(http服务器提供文件服务)
nfs://(Linux系统中nfs文件系统提供服务)
file:///(本地计算机提供文件服务)
yum客户端:
配置文件:
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
仓库指向的定义:
[repositoryID]
name=Some name for this repository(仓库功能的完整的描述)
baseurl=url://path/to/repository/(指向了仓库的访问路径)
enabled={1|0}(是否启用此仓库,默认为1,启用此仓库)
gpgcheck={1|0}(程序包安装前校验其完整性和来源合法性)
gpgkey=URL(指明能访问密钥文件的访问路径)
enablegroup={1|0}(是否使用基于组来批量管理程序包)
failovermethod={roundrobin|priority}(轮询|优先级)
默认为:roundrobin,意为随机挑选
cost=1000
默认为1000
示例:
#vim centos-local.repo
[base]
name=Base Repo on 172.16.0.1
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.6-x86_64/
gpgcheck=0
[epel]
name=Fedora EPEL for EL6 x86_64
baseurl=http://172.16.0.1/frdora-epel/6/x86_64
gpgcheck=0
yum命令的用法:yum [options] [command] [package]
显示仓库列表:
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]
查看程序包的简要信息:(类似于rpm -qi)
info package
查看指定的特性(可以是某文件)是由哪个程序包所提供:
provides | whatprovides feature1 [feature2]
清理本地缓存:
clean [ package | metadata | expire-cache | rpmdb | plugins | all ]
(程序包|元数据|过期缓存|rpm数据库数据|插件|所有)
构建缓存:
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源的配置文件要求指明了做版本精确匹配的,yum源仓库的指向必须升级,不能降级,所有CentOS 6.0可以指向CentOS6.1的源,反之不行。
示例:
#less CentOS-Base.repo
解释:CentOS自行提供的定义repo仓库的文件
#rpm -q yum
解释:查询yum的安装信息
#rpm -qc yum
解释:查询yum的配置文件的信息
#yum repolist
解释:列出系统中所有可用的仓库
#yum install php-common
解释:安装php-common文件
#yum remove cpp
解释:删除cpp程序包
#yum provides gcc
解释:查看gcc程序是由哪个程序包所提供
#yum search bash
解释:搜索包含bash的信息有哪些
#yum deplist gcc
解释:查看gcc包所依赖的capabilities能力
#yum history
解释:查询过去安装、升级、卸载等事务的操作历史记录
#yum history summary
解释:查看安装历史的摘要信息
#yum grouplist
解释:显示包组信息
#yum groupinstall "Development Tools"
解释:安装程序开发工具的包组“Development Tools”
#yum whatprovides */pxelinux.0
解释:查询pxelinux.0命令在哪个安装包中
安装实例:
#mount -r /dev/cdrom /media/cdrom
#cd /etc/yum.repos.d/
#vim local.repo
[base]
name=CentOS 7 Release 7.1.1503
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
#yum repolist
解释:查看系统中所有可用的yum仓库
#yum list all
解释:查看所有的程序包
#yum grouplist
解释:查看包组信息
yum命令的用法之yum仓库:
如何使用光盘当作本地yum仓库:
(1)挂载光盘至某目录,例如/media/cdrom
#mount -r -t iso9660 /dev/cdrom /media/cdrom
(2)创建配置文件
[CentOS7]
name=CentOS 7 Release 7.1.1503
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1
yum的命令行选项:
--nogpgcheck:禁止进行gpg的检查
-y:自动回答为“yes”
-q:静默模式
--disablerepo=repoidglob:临时禁用此处指定的repo
--enablerepo=repoidglob:临时启用此处指定的repo
--noplugins:禁用所有插件
yum的repo配置文件中可用的变量:
$releasever:当前OS的发行版的主版本号
$arch:平台
$basearch:基础平台
$YUM0-$YUM9
http://mirrors.magedu.com/centos/$releasever/$basearch/os
创建yum仓库:
createrepo [options]
-u --baseurl:表示可选的,指明baseurl
-o --outputdir:表示输出数据到什么地方去
-x --excludes:表示把哪些包排除了
-i --pkglist:指明对哪些包创建
-g --groupfile:指明有哪些包组的
--basedir:能获取repodata的basedir,默认是当前的工作目录
Linux软件包管理之--编译安装
testapp-VERSION-release.src.rpm(源代码格式的rpm包文件)-->安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装:
源代码-->预处理-->编译(gcc)-->汇编-->链接-->执行
源代码组织格式:(如果是程序的开发者很好理解编译安装程序的顺序,但是对于一般的用户来说并不能够直接理解编译程序的具体步骤)
多文件:文件中的代码之间,很可能存在跨文件依赖关系
C,C++:有一个非常著名的项目管理工具make,其配置文件为makefile,Makefile.in文件是构建模板,configure是文件生成工具(configure-->Makefile.in-->makefile)
java:maven
编译安装三部曲:
【1】./configure
(1)通过选项传递参数,指定启用特性、安装路径等,执行时会参考用户的指定以及Makefile.in文件生成makefile
(2)检查各启用特性所依赖到的外部环境
【2】make
根据makefile文件,构建应用程序
【3】make install
将编译完成的文件copy到对应的目录文件当中
开发工具:
autoconf:用来生成configure文件
automake:用来生成Makefile.in文件
建议:安装前先查看INSTALL文档,如果没有就找README文件
开源程序源代码的获取路径:
官方自建站点:
Apache.org(ASF)
mariadb.org
代码托管站点:
SourceForge
Github.com
code.google.com
工具C/C++:gcc(GNU C Complier)
【A】编译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:默认启用的,我们不想启用,可以使用disable选项
--enable-FEATURE[=ARG]:默认没有启用,我们把它启用,那么使用的是enable选项
Optioal Packages:可选包
--with-PACKAGE[=ARG](依赖于某包)
--without-PACKAGE(不依赖于某包)
第二步:make
第三步:make install
【B】安装后的配置:
(1)导出二进制程序目录至PATH环境变量中,修改PATH环境变量,以能够识别此程序的二进制文件路径
编辑文件/etc/profile.d/NAME.sh:
export PATH=/PATH/TO/BIN:$PATH
(2)导出库文件路径:
编辑/etc/ld.so.conf.d/NAME.conf:
添加新的库文件所在目录至此文件中,在默认情况下系统搜索文件的路径/lib、/usr/lib;
想增添额外搜寻路径,在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件
让系统重新生成缓存:
ldconfig [-v]
(3)导出头文件,输出给系统:
默认:/usr/include/
基于连接的方式实现:
ln -sv:创建软连接,并且显示创建过程
eg.#ln -s /usr/local/tengine/include/ /usr/include/tengine
(4)导出帮助手册:
编辑/etc/man.config文件,添加一个MANPATH:
#vim /etc/man.config
MANPATH /usr/local/apache2/man
示例:
#yum install createrepo
解释:可以创建出系统所需的repodata的文件
#yum repolist
解释:会自动获取新的yum源
#yum install xen
解释:安装xen程序包
#gcc --version
解释:查询本机的gcc的版本
yum仓库创建实例:
#!mkdir -p /yum/repo
解释:“!”表示在本地创建一个目录/yum/repo
#lcd /yum/repo
解释:进入到本地的yum目录当中
#mget *.rpm
解释:从网络的yum仓库中获取所有以rpm结尾的文件
#createrepo ./
解释:创建当前目录的repodata
#vim centos-local.repo
[xen4centos]
name=Xen 4 CentOS 6
baseurl=file:///yum/repo/
gpgcheck=0
使用yum安装httpd服务:
#yum groupinstall "Server Platform Development" -y
解释:安装包组“Server Platform Development”,并且安装时自动回答为yes
#cd httpd-2.2.29
解释:进入到httpd的目录
#./configure --prefix=/usr/local/apache2 --sysconfdir=/etc/httpd2
解释:程序的安装路径是/usr/local/apache2,配置文件的安装路径是/etc/httpd2
#make
解释:执行编译操作
#make install
解释:执行install复制安装的操作
#cd /usr/local/apache2/
解释:进入到apache2的目录
#ls bin
解释:显示bin目录下的信息
#bin/apachectl start
解释:启动apache服务器
#netstat -tan
解释:查看系统中有哪些监听端口是打开的,其中-t是建立tcp连接,-n表示以数字的方式显示,-a (all)显示所有选项
#apachectl stop
解释:将apache服务器停止