Linux程序包管理
Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装。
程序的组成部分:
二进制程序:程序的主体文件,比如我们运行一个ls命令就是一个二进制程序。
库文件:程序的公用功能模块,比如A程序需要用一个打印机,B程序也需要一个打印机就可以公用这一个模块了。在window下库文件为.dll格式,linux下为/lib/*so格式的文件。
配置文件:通过设置配置文件来改变程序启动时的运行特征。
帮助手册:使用的帮助文档。
软件的默认安装路径:
除了自行下载源码编译安装的软件可以自定义安装路径之外,rpm包的安装都是按照自身预设的安装路径进行安装,主要有以下几类
1./:系统根目录,在此安装的文件通常是os在运行时需要调用到的程序
2./usr:此目录下一般情况下是提供基本服务的软件
3./usr/local:此目录下一般情况下是用户自行安装的第三方软件
1、系统相关:
配置文件路径:/etc
二进制文件路径:/bin 、/sbin
库文件路径:/lib
2、系统提供功能服务相关
配置文件路径:/etc
二进制文件路径:/usr/bin /usr/sbin
库文件:/usr/lib
3、第三方软件:
配置文件路径/usr/local/etc
二进制文件路径:/usr/local/bin /usr/local/sbin
库文件:/usr/local/lib
4、帮助手册
主要都存放在/usr/share/man和/usr/local/share/man
在生产环境下:usr可以单独分区或者放到另一块硬盘上,软件和相关文件放在usr下重做系统或者换到另一台主机时可以直接运行。
注意:有些特殊的应用程序放置于libexec目录下
有些第三方程序安装在/opt目录中。
程序包管理器的功能:
在linux系统下安装程序时,需要将程序的不同文件放置在以上路径里面,或者更改相关系统配置文件指定到程序的目录下,如果有很多程序,配置文件有很多就大大降低了系统效率。手动安装到系统指定的目录下,就会很麻烦。所以程序包管理器的功能就是将编译好的程序打包成一个文件或有限的几个文件,可用于实现便捷地安装、卸载、升级、查询、校验等程序管理功能;
现在程序包管理器主要有2种:rpm和deb。
程序包管理器也必须有以下功能:
1、程序的组成清单(每个程序包独有):例如windows下很多软件管理器里面的程序列表。
文件清单:例如程序的安装有哪些文件。
安装卸载时运行的脚本:例如在windows下的软件卸载程序。
2、数据库(公共)
程序名及版本
程序包之间依赖关系:程序间少了一个都运行不了。
功能说明:对应包基本功用是什么。例如windows下,QQ程序是聊天(功用)的,酷狗是听音乐的。
安装生产的各文件的文件路径及校验码信息:效验码信息是提示某某文件已经改变,防止文件给莫名篡改。
程序包命名:
程序包的版本命名:
testapp-VERSION
程序包-版本号
VERSION:major.minor.release
major:主版本号:( 有重大更新,比如win xp ,win 7,win 8等等)
minor:次版本号:(修复一些漏洞,功能等等)
release:发行号,修订号 (修复小BUG,修订一些小小的东西)
rpm包的命名:name-Major.Minor.Release-release.arch.rpm
例:bash-4.3.2-1.X86_64.rpm
-Release:rpm包自己的发行号,与源代码的发行号无关;仅用于标识对rpm自身的修订,有时候,此release可能还会包含适用的OS,例如bash-4.3.2-1.centos6.X86_64.rpm
arch:使用的硬件平台
x86:i386,i486,i586,i686等;
x86_64:amd64:X86_64
powerpc:ppc
noarch:跟硬件平台无关;
获取程序包的途径:
1、系统原发行光盘或者官方站点服务器;
2、程序项目官方站点;
如redhat官方网站
3、知名的有信誉的第三方组织或者搜索引擎;
搜索引擎:http://rpmfind.net,http://rpm.pbone.net,http://pkgs.org
4、自己制作;
建议:包安装之前要合法性验证
来源合法性
包的完整性
程序包管理器RPM和Yum的关系:
RPM(全称为 RedhatPackage Manager)是由redhat公司提供的软件包管理器 ,可以实现软件包的安装、查询、卸载、升级以及校验等但是rpm不能很好的解决软件之间的依赖关系
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
系统程序包管理rpm的应用:
安装:-ivh,--nodeps,--replacepkgs
卸载:-e,--nodeps
升级:-Uvh,-Fvh,--nodeps,--oldpackage
查询:-q,-qa,-ql,-qf,-qi,-qc,-qd,-q --changelogs,-q --provides,-q --requires
校验:-v来源合法性、完整性:--import,-K,--nodigest,--nosignature
数据库重建:--initdb,--rebuilddb
安装:-ivh,--nodeps,--replacepkgs
rpm {-i|--install} [install-options] PACKAGE_FILE ...
{-i|--install} # -i或者长选项--install 安装
[install-options] # 安装选项,可省略的,需要用到就调用
PACKAGE_FILE: # rpm包文件
.... # 可以为多个
[install-options]:
--replacepkgs: # 重新安装
--nodeps: # 忽略依赖关系
--test: # 测试安装,而不执行真正的安装过程;dry run模式;
安装:-ivh,--nodeps,--replacepkgs
-ivh # 以进度条显示详细的安装信息
-v # 显示详细信息,可以用vv表示,多个v表示越多的详细信息
-h # 以进度条显示安装过程。
--nodeps # 忽略依赖关系。
--replacepsgs # 重新安装软件
卸载:-e,--nodeps
rpm {-e|--erase} [--nodeps] [--test] PACKAGE_NAME ...
rpm -e PACKAGE_NAME... # 直接卸载操作会卸载相应的依赖程序。
--nodeps # 忽略依赖关系
--test # 卸载测试 可以先测试下会卸载哪些东西
注意:如果包的配置文件安装后曾被改动过,卸载时,此文件将不会删除,而是被重命名(源文件加.rpmsave后缀)并保留;
升级:-Uvh,-Fvh,--nodeps,--oldpackage
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... # 直接升级安装,系统没有这软件也会安装
rpm {-F|--freshen} [install-options] PACKAGE_FILE ... # 升级安装,如果系统没有这软件就不会安装,只升级时一般用这个命令
[install-options]
--oldpackage # 降级安装
--force # 忽略冲突,强制执行过程;
注意:不要对内核包执行升级操作,可能重启导致不兼容而挂掉;linux支持多版本内核并存,因此,建议对新版本内核可直接安装;有些程序在升级时会有冲突。
注意:如果原程序包的配置文件安装后曾被改动,升级时,新版本的文件并不会直接覆盖老版本的文件,而是把新版本的文件重命(加后缀.rpmnew)名后保留;
查询:-q,-qa,-ql,-qf,-qi,-qc,-qd,-q --changelogs,-q --provides,-q --requires
rpm {-q|--query} [select-options] [query-options]
[select-options]
1、rpm -q PACKAGE_NAME # 查询某包(程序)是否安装:
2、rpm -qa # 查询已安装的所有包
3、rpm -qf /path/to/somefile # 查询某文件是由哪个包安装生成
4、rmp -qpl PACKAGE_NAME # 查询尚未安装包的相关信息:
rmp -qpi PACKAGE_NAME # 查询尚未安装包的相关信息:
.....
[query-options]
1、rpm -qi PACKAGE_NAME # 查询某包的简要说明信息
2、rpm -ql PACKAGE_NAME # 查询某包安装后生成的所有文件的列表
3、rpm -qc PACKAGE_NAME # 查询某包安装后生成的所有配置文件的列表
4、rpm -qd PACKAGE_NAME # 查询某包安装后生成的所有帮助文件的列表
5、rpm -q --changelog PACKAGE_NAME # 查询某rpm包制作时随版本变化的changelog列表信息
6、rpm -q --provides PACKAGE_NAME # 查询某包提供的capabilities
7、rpm -q --requires PACKAGE_NAME # 查询某包所依赖的capabilities
8、rpm -q --scripts # 查询某包安装卸载时的脚本
安装卸载脚本有四种:
preinstall: 安装前执行的脚本
postinstall: 安装后执行的脚本
preuninstall: 卸载前执行的脚本
postuninstall: 卸载后执行的脚本
校验:-v来源合法性、完整性:--import,-K,--nodigest,--nosignature
检查包安装之后生成的文件是否发生了改变
rpm {-V|--verify} [select-options] [verify-options]
常用用法:rpm -V PACKAGE_NAME
显示信息:
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 # caPabilities发生改变
包来源合法性及完整性验证(安装或卸载时常用):
rpm --import PUBKEY ... # 导入公钥文件,必须先导入公钥文件才能完成校验
rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...
--nosignature:不检查来源合法性
--nodigest:不检查完整性
数据库重建:--initdb,--rebuilddb
rpm {--initdb|--rebuilddb}
--initdb # 初始化:如果事先不存在数据,则会更新,否则,不执行任何操作
--rebuilddb # 重建构建:无论当前是否已经存在的数据库,都会直接重建并覆盖现有数据库
系统程序包管理yum的应用:
yum是YellowdogUpdater Modified的缩写,它是一种基于自身软件库的安装,它可以通过查询软件库的连接ftp:// http://
yum repository :yum仓库
存储了众多rpm包,以及包的相关元数据的文件(放在repodata目录中)服务器
yum客户端:
配置文件:指向仓库的位置以及各种配置信息,每个yum客户可以有多个可用的yum仓库:
yum的公共配置文件 /etc/yum.conf
yum repository仓库的配置文件/etc/yum.repos.d/*.repo
yum的公共配置文件 /etc/yum.conf 描述:参考http://www.cnblogs.com/mchina/archive/2013/01/04/2842275.html
vim /etc/yum.conf
[main]
#[]表示对哪一段生效,main表示对所有的生效
cachedir=/var/cache/yum/$basearch/$releasever
#cachedir:yum缓存的目录,yum在此存储下载的rpm包和数据库,一般是/var/cache/yum/$basearch/$releasever
keepcache=0
#保存缓存,为0不保存,为1就会保存
debuglevel=2
#debuglevel:除错级别,0──10,默认是2 貌似只记录安装和删除记录
logfile=/var/log/yum.log
#日志文件
exactarch=1
#exactarch,有两个选项1和0,代表是否只升级和你安装软件包cpu体系一致的包,如果设为1,则如你安装了一个i386的rpm,则yum不会用1686的包来升级。
obsoletes=1
#这是一个update 的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新陈旧的RPM包。
gpgcheck=1
#gpgchkeck= 有1和0两个选择,分别代表是否是否进行gpg校验,如果没有这一项,默认是检查的。
plugins=1
#是否启用插件,默认1为允许,0表示不允许。我们一般会用yum-fastestmirror这个插件。
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
# PUT YOUR REPOS HERE OR IN separate files named file.repo
#如果需要自定义仓库,可以添加在本配置文件中
# in /etc/yum.repos.d
#或者放在/etc/yum.repos.d/目录下后缀名为.repo的文件
yum repository仓库的配置文件/etc/yum.repos.d/*.repo描述:
[base-debuginfo] # 仓库名
name=CentOS-6 - Debuginfo # 描述信息
baseurl=http://debuginfo.centos.org/6/$basearch/ # 访问路径,可以指向多个
gpgcheck=1 # 检查此仓库文件完整性和来源合法性
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-6 # 指向密钥路径
enabled=0 # 是否启用此仓库
yum仓库相关的命令:
仓库查看:repolist(所有仓库),list(程序包),grouplist(所有包组)
yum repolist # 列出所有可用仓库
yum list {all|installed|available} # 列出所有程序包:可以使用通配符globbing
yum grouplist # 列出所有包组
缓存管理:
缓存文件:var/cache/yum
yum clean {all|packages}
yum makecache 生成缓存
yum 命令
yum [options] [command] [package(包) ...]
安装:install,reinstall
卸载:erase|remove(都可以使用)
升级:update,downgrade(卸载),check-update(可用升级)
查询:list,info,search(模糊匹配),provides(指定路径)
包组:grouplist(所有包组),groupinfo "包组名称",groupinstall(安装)"GROUP_NAME",yum install @GROUP_NAME,remove@(卸载),groupremove(卸载)
选项:--enablerepo=,--disablerepo=,-y:自动回答为yes,--nogpgcheck
构建仓库:createrepo
安装:install,reinstall
yum install PACKAGE_NAME # 安装语法
yum install PUBKEY_VERSION # 如果要安装指定版本的程序
yum reinstall PACKAGE_NAME # 重装指定的程序包
卸载:erase|remove(都可以使用)
yum erase | remove PACKAGE_NAME #依赖于指定程序包的其他包,会被一并卸载;
升级:update,downgrade(卸载),check-update(可用升级)
yum update PACKAGE_NAME # 默认格式,直接升级
yum update PUBKEY_VERSION # 如果有多个版本的升级包可用,可以升级到指定版本
yum downgrade PACKAGE_NAME # 可以降级到指定版本
yum check-update # 检查可用升级
查询:list,info,search(模糊匹配),provides(指定路径)
yum list # yum仓库内所有可安装程序包,可以使用通配符globbing
yum info PACKAGE_NAME # 显示指定程序包的摘要信息
yum search KEYWORD # 根据关键字模糊查询报名或包的sumary信息包含此KEYWORD的相关列表
yum provides|whatprovides /path/to/somefile # 查看文件是由哪个包生成的。
包组:grouplist,groupinfo,groupinstall,remove,groupremove
yum grouplist # 显示所有的包组
yum groupinfo "GROUP_NAME" # 显示某包组的相关信息:
安装包组:
yum groupinstall "GROUP_NAME"
yum install @GROUP_NAME
卸载包组:
yum groupremove "GROUP_NAME"
yum remove @GROUP_NAME
yum 命令安装本地rpm包文件,也可以自动解决包的依赖关系。
yum localinstall /path/to/rpm_package_file...
yum install /path/to/rpm_package_file...
选项:--enablerepo=,--disablerepo=,-y:自动回答为yes,--nogpgcheck
--enablerepo= # 启用指定的yum仓库
--disablerepo= # 禁用指定的yum仓库
注意:优先级高于/etc/yum.repos.d/*.repo配置文件中定义的属性;
-y # 自动回答为yes,
--nogpgcheck # 不要检查包来源性和合法性
构建仓库:createrepo
createrepo [options] <directory>
-g:给创建的包分组
createrepo <directory> 可以直接安装
yum客户端配置的高级用法:
1、在yum客户定义仓库时可使用cost定义仓库的使用开销,默认为1000;
2、baseurl中指定路劲时可使用变量
$releaserver:基于OS发行版的主版本号
$arch:平台
$basearch:基础平台,例如i686,i586,i486,i386i系列的基础平台都是i386:
$YUM0-YUM9
例如:http://mirrors.sohu.com/centos/$releaserver/os/$basearch
3、可以使用mirrorlist指定替换baseurl;
指向一个url,此url是一个文本文件,其中保存了大量镜像服务器列表;用户使用yum仓库时,会获取此列表文件,而后通过fastestmirror插件判断哪一个镜像为访问速度最快的服务器,并以之作为本次访问的baserul;
软件包安装之tar源码包编译安装
这里以C源程序为例:
编译安装源程序的前提:
提供开发环境:开发工具和开发库
包组:Development Tools、Server Platform Development、Desktop Platform Development、Debug Tools
yum -y install @Development Tools
...
yum -y install @Server Platform Development
...
注:本人在centos6.6测试,如这命令不行可以使用yum groupinstall "GROUP_NAME"
编译C源程序的步骤:
1、./configure 检查编译环境,并根据指定的选项确定编译特性、安装路径等;
2、make:调用所需要的编译器根据makefile配置文件定义执行编译过程。
3、make install:安装程序
以编译安装httpd-2.2.25.tar.bz为例
首先解压缩
[root@localhost ~]# tar -jxf httpd-2.2.25.tar.bz2 # 解压缩源码包文件到当前目录下
[root@localhost ~]# cd httpd-2.2.25 # 进入到该目录下
[root@localhost httpd-2.2.25]# ll # 列出改文件目录
total 1152
-rw-r--r-- 1 500 500 14882 Nov 22 2004 ABOUT_APACHE
-rw-r--r-- 1 500 500 18613 Jul 6 2012 acinclude.m4
-rw-r--r-- 1 500 500 56952 Oct 6 2010 Apache.dsw
drwxr-xr-x 6 500 500 4096 Jun 29 2013 build
-rw-r--r-- 1 500 500 2644 Aug 24 2007 BuildAll.dsp
-rw-r--r-- 1 500 500 2692 Jul 30 2009 BuildBin.dsp
-rwxr-xr-x 1 500 500 5786 Sep 19 2012 buildconf
-rw-r--r-- 1 500 500 130367 Jun 28 2013 CHANGES
-rw-r--r-- 1 500 500 11701 Feb 28 2012 config.layout
-rwxr-xr-x 1 500 500 572978 Jun 29 2013 configure # 检查编译环境的文件
-rw-r--r-- 1 500 500 24665 Jun 28 2013 configure.in
drwxr-xr-x 9 500 500 4096 Jun 29 2013 docs
-rw-r--r-- 1 500 500 403 Nov 22 2004 emacs-style
-rw-r--r-- 1 500 500 1248 May 7 2011 httpd.dep
-rw-r--r-- 1 500 500 4124 Jun 12 2008 httpd.dsp
-rw-r--r-- 1 500 500 8994 May 7 2011 httpd.mak
-rw-r--r-- 1 500 500 12053 Jun 29 2013 httpd.spec
drwxr-xr-x 2 500 500 4096 Jun 29 2013 include
-rw-r--r-- 1 500 500 4372 Jan 18 2012 INSTALL
-rw-r--r-- 1 500 500 2909 Dec 8 2006 InstallBin.dsp
-rw-r--r-- 1 500 500 5145 Nov 29 2005 LAYOUT
-rw-r--r-- 1 500 500 30119 May 7 2011 libhttpd.dep
-rw-r--r-- 1 500 500 17039 Jan 12 2007 libhttpd.dsp
-rw-r--r-- 1 500 500 28503 May 7 2011 libhttpd.mak
-rw-r--r-- 1 500 500 28690 Jan 19 2008 LICENSE
-rw-r--r-- 1 500 500 8739 Nov 26 2008 Makefile.in
-rw-r--r-- 1 500 500 34725 Oct 6 2010 Makefile.win
drwxr-xr-x 20 500 500 4096 Jun 29 2013 modules
-rw-r--r-- 1 500 500 828 Jan 6 2013 NOTICE
-rw-r--r-- 1 500 500 12894 Mar 16 2012 NWGNUmakefile
drwxr-xr-x 9 500 500 4096 Jun 29 2013 os
-rw-r--r-- 1 500 500 5954 Jan 10 2007 README
-rw-r--r-- 1 500 500 5332 Oct 14 2009 README.platforms
-rw-r--r-- 1 500 500 2553 Dec 21 2010 README-win32.txt
-rw-r--r-- 1 500 500 10183 Mar 14 2005 ROADMAP
drwxr-xr-x 3 500 500 4096 Jun 29 2013 server
drwxr-xr-x 5 500 500 4096 Jun 29 2013 srclib
drwxr-xr-x 4 500 500 4096 Jun 29 2013 support
drwxr-xr-x 2 500 500 4096 Jun 29 2013 test
-rw-r--r-- 1 500 500 8183 Oct 18 2005 VERSIONING
[root@localhost httpd-2.2.25]# ./configure # 检查编译环境
./configure --help #脚本获取帮助
常用的选项:
--prefix= # 指定安装路径,多数程序都有默认安装路径;
--sysconfdir= # 指定配置文件安装路径;
[root@localhost httpd-2.2.25]# ./configure --prefix=/opt/httpd --sysconfdir=/etc/httpd.conf
# 指定安装路径为/opt/httpd 配置文件路径为/etc/httpd.conf
checking for ANSI C header files... yes # 编译环境检测成功
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
.....
config.status: creating build/pkg/pkginfo
config.status: creating build/config_vars.sh
config.status: creating include/ap_config_auto.h
config.status: executing default commands
[root@localhost httpd-2.2.25]#make # 在当前目录开始编译
.....
[root@localhost httpd-2.2.25]#make install # 编译成功后开始安装
.....
[root@localhost httpd-2.2.25]# cd /opt/httpd/bin # 进入到安装好了的目录下
[root@localhost ~]# ./httpd # 运行该进程,因为没有将该路径导入到PATH环境中,所以是这样子运行。
输入本地IP,已经安装好了。
如果源程序下不存在脚本文件可以参考下列方法
编译安装源程序方法:
1、展开源代码,找INSTALL、README:不存在此类文件时,找项目官方文档;
2、根据安全说明执行安装操作;
程序安装于专用目录时,安装后的配置:
1、导出二进制程序所在路径至PATH环境中
export PATH=/usr/local/niginx/sbin:$PATH
实现永久有效的办法:
/etc/profile.d/*.sh