linux软件包管理
简介
在Linux系统中,软件包的安装和管理是很重要的知识,而linux/unix一个麻烦的地方就是软件安装程序比较麻烦和复杂,尤其是当所安装的软件包要处理较多的包依赖关系,这就更让人头疼了,最常见linux软件安装方式有三种:
本文主要介绍Linux中RedHat或CentOS发行版的软件包管理。
一、软件包的表现形式:
(1)、软件的源代码,需要自己动手编译它。这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz)。
源码安装的好处是不会受到平台的限制,而且能够根据自己的系统和平台自己优化一些选项,所以这个是比较推荐的一种安装方式,缺点是对于软件的依赖关系只能靠自己的经验来解决了。
(2)软件的可执行程序,也是二进制软件包。
其实可以细分为rpm包与yum包安装。RPM为最常见的两类软件包管理工具,他们的安装的时候不要需要网络,只要下载下来在系统上安装即可。rpm包的使用容易受平台和系统的限制,所以要根据自己的linux的分支版本以及cpu平台等来决定下载和使用何种软件包。而且需要自己处理软件的依赖关系。
redhat系列软件安装包通常被是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀是.rpm。
二进制更方便的一种安装形式就是yum。这种方式的安装软件的时候需要联网,好处是能自动处理软件间的依赖关系,比较推荐。
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装. [百度百科]
(3)脚本安装,其实就是安装命令的堆积,当然也要对系统比较了解才能写出好的脚本,既可以包含yum这类,也可以使用rpm这类命令。如lnmp一键安装脚本。
二、软件软件安装:
第一部分:搞定rpm
RPM是Red Hat公司随Redhat Linux推出了一个软件包管理器,通过它能够更加轻松容易地实现软件的安装、卸载、升级、查询、校验、数据库维护。
1.安装软件:
命令:rpm {-i|–install} [install-options] PACKAGE_FILE …
选项:-v: verbose表示显示附加信息 [可选]
-h: 以#显示程序包管理执行进度;每个#表示2%的进度 [可选]
-i:install 不能省略,表示安装
[install-options]
–-test: 测试安装,但不真正执行安装过程;dry run模式;
–-nodeps:忽略依赖关系;(这样比较麻烦,而且通常无法使用)
–-replacepkgs: 重新安装;
–-nosignature: 不检查来源合法性;
–-nodigest:不检查包完整性;
–-noscipts:不执行程序包脚本片断;
%pre: 安装前脚本; –nopre
%post: 安装后脚本; –nopost
%preun: 卸载前脚本; –nopreun
%postun: 卸载后脚本; –nopostun
2.软件包升级:
命令:rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
或 rpm {-F|–freshen} [install-options] PACKAGE_FILE …
-U:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
-F:安装有旧版程序包,则“升级”;如果不存在,则不执行升级操作;
–-oldpackage:降级;
–-force: 强行升级;
3.卸载rpm包:
命令:rpm {-e|–-erase} [–-nodeps] [–-noscripts] [–-notriggers] [–-test] PACKAGE_NAME …
选项:-e: earse表示从系统中删除软件,软件包必须是已安装的软件包名称,不是软件包的文件名
4.安装软件:
命令:rpm {-q|–query} [select-options] [query-options]
[select-options]
–a: 所有包;
–f: 查看指定文件是由哪个包安装生成;
–p:不检查包完整性;
–whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
–whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
[query-options]
–c: 查询程序包的配置文件;
–d: 查询程序包的帮助文档;
–i:程序包的详细信息;
–l:指定程序安装完成后生成的所有文件;
-R:查询指定的程序包所依赖的CAPABILITY;
–provides:列出指定程序包所提供的CAPABILITY;
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
包来源合法性验正及完整性验正:
完整性验正:SHA256
来源合法性验正:RSA
导入所需要公钥:
命令:rpm –import /PATH/FROM/GPG-PUBKEY-FILE
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
软件依赖关系:
由于开源的多态性,Linux 操作系统中的软件之间的依赖性关系处理一直令人感到头疼。如果 package_a 依赖于 package_b,那么在一个没有安装 package_b 的系统中,package_a 是不被系统推荐安装的,强制安装很可能会导致软件无法正常工作。基于以上 package_a 和 package_b 的关系,在一个干净的系统中 ( 未安装 package_a 或 package_b),欲安装 package_a,错误通常会表现为:
[root@vm227 Packages]# rpm -ivh php-5.3.3-26.el6.x86_64.rpm
error: Failed dependencies:
httpd is needed by php-5.3.3-26.el6.x86_64
httpd is needed by php-5.3.3-26.el6.x86_64
php-cli(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64
php-common(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64
嵌套的依赖关系:
如上示例为最理想的依赖关系,实际应用中往往最令人头疼的是 package_a 依赖于 package_b/c/d/e/f 等多个包 , 而 package_b/c/d/e/f 等包又依赖于 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 … … 为保证软件的正常使用,必须找到所有依赖包以及子依赖包并且安装。过多的依赖关系大大降低了 Linux 软件安装的用户友好性。所以针对此类问题,使用了更高级的包管理策略去解决 – Yum 。
第二部分:搞定YUM
YUM:RPM包的前端管理工具,解决包依赖性,可以在多个库中定位软件包。
1.YUM命令的使用:
命令:rpm {-i|–install} [install-options] PACKAGE_FILE …
显示仓库列表:repolist [all|enabled|disabled]
list:
# yum list [all | glob_exp1] [glob_exp2] […]
# yum list {available|installed|updates} [glob_exp1] […]
安装程序包:
# yum install package1 [package2] […]
重新安装:
# yum reinstall package1 [package2] […]
升级程序包:
# yum update [package1] [package2] […]
降级程序包:
# yum downgrade package1 [package2] […]
检查可用升级:
# yum check-update
卸载程序包:
# yum remove | erase package1 [package2] […]
查看程序包information:
# yum info […]
查看指定的特性(可以是某文件)是由哪个程序包所提供:
# yum provides | whatprovides feature1 [feature2] […]
清理本地缓存:
# yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
构建缓存:
# yum makecache
搜索:以指定的关键字搜索程序包名及summary信息;
# yum search string1 [string2] […]
查看指定包所依赖的capabilities:
# yum deplist package1 [package2] […]
查看yum事务历史:
# yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
包组管理的相关命令:
* groupinstall group1 [group2] […]
* groupupdate group1 [group2] […]
* grouplist [hidden] [groupwildcard] […]
* groupremove group1 [group2] […]
* groupinfo group1 […]
2、配置额外YUM库(客户端):
方法一:在/etc/yum.repos.d目录下新建.repo结尾的文件或者修改原有的repo文件,更方便的是直接下载第三方的yum源的配置文件,如网易163的源文件。
方法二:用光盘搭建本地yum源,但是你会发现很多光盘包含的软件包都比较旧。
yum客户端:
配置文件:
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
仓库指向的定义:
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
默认为:roundrobin,意为随机挑选;
cost=1000(默认)
第三部分:搞定linux源码安装
程序包编译安装:
源代码 –> 预处理 –> 编译(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
第一步: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
如果遇到错误提示,也别急,通常是十分简单的问题:
1)没有安装C或C++编译器;
确诊方法:执行命令gcc(C++则为g++),提示找不到这个命令。
解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
#rpm -ivh gcc* (哈哈,我们用到了第二种安装方式)
2)没有安装make工具;
确诊方法:执行命令make,提示找不到这个命令。
解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
#rpm -ivh make*
3)没有安装autoconf工具;
确诊方法:执行命令make,提示找不到这个命令。
解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
#rpm -ivh autoconf*
4)缺少某些链接库;
确诊方法:在make时,提示需要某些文件。
解决方法:安装包含这个文件的包,这就需要积累了。
5)软件依赖;
这时候只有安装软件的依赖关系,按照先后顺序安装软件。
第四部分:搞定bin文件安装
1.以bin结尾的安装包,这种包类似于RPM包,安装也比较简单
2.给文件加上可执行属性:chmod +x ******.bin
3.执行命令:./******.bin
4.ok:
总结
本文linux下,程序包的几种形式以及安装方法水平有限, 如果有错误及时指出;
作者:chrony
感谢: MageEdu
原创文章,作者:chrony,如若转载,请注明出处:http://www.178linux.com/15839