Linux程序包管理rpm与yum
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.releasemajor:主版本号:( 有重大更新,比如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.rpmarch:使用的硬件平台x86:i386,i486,i586,i686等;x86_64:amd64:X86_64powerpc:ppcnoarch:跟硬件平台无关;
获取程序包的途径:
1、系统原发行光盘或者官方站点服务器;
2、程序项目官方站点;
如redhat官方网站
3、知名的有信誉的第三方组织或者搜索引擎;
搜索引擎:http://rpmfind.net,http://rpm.pbone.net,http://pkgs.org4、自己制作;建议:包安装之前要合法性验证
来源合法性包的完整性
程序包管理器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卸载:-e,--nodeps
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 # 重新安装软件
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://file:///(本地,最后一斜线是本地根路径)在远程服务器或者指定的本地文件库中获取要安装的软件包,可见软件库的配置在yum的使用中是非常重要的一环。并且yum是基于rpm的一个管理工具,它能自动解决安装rpm包产生的依赖关系。yum repository :yum仓库存储了众多rpm包,以及包的相关元数据的文件(放在repodata目录中)服务器yum客户端:配置文件:指向仓库的位置以及各种配置信息,每个yum客户可以有多个可用的yum仓库:yum的公共配置文件 /etc/yum.confyum repository仓库的配置文件/etc/yum.repos.d/*.repoyum的公共配置文件 /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 @DevelopmentTools ... yum -y install @ServerPlatformDevelopment ... 注:本人在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--150050014882Nov222004 ABOUT_APACHE -rw-r--r--150050018613Jul62012 acinclude.m4 -rw-r--r--150050056952Oct62010Apache.dsw drwxr-xr-x 65005004096Jun292013 build -rw-r--r--15005002644Aug242007BuildAll.dsp -rw-r--r--15005002692Jul302009BuildBin.dsp -rwxr-xr-x 15005005786Sep192012 buildconf -rw-r--r--1500500130367Jun282013 CHANGES -rw-r--r--150050011701Feb282012 config.layout -rwxr-xr-x 1500500572978Jun292013 configure # 检查编译环境的文件 -rw-r--r--150050024665Jun282013 configure.in drwxr-xr-x 95005004096Jun292013 docs -rw-r--r--1500500403Nov222004 emacs-style -rw-r--r--15005001248May72011 httpd.dep -rw-r--r--15005004124Jun122008 httpd.dsp -rw-r--r--15005008994May72011 httpd.mak -rw-r--r--150050012053Jun292013 httpd.spec drwxr-xr-x 25005004096Jun292013 include -rw-r--r--15005004372Jan182012 INSTALL -rw-r--r--15005002909Dec82006InstallBin.dsp -rw-r--r--15005005145Nov292005 LAYOUT -rw-r--r--150050030119May72011 libhttpd.dep -rw-r--r--150050017039Jan122007 libhttpd.dsp -rw-r--r--150050028503May72011 libhttpd.mak -rw-r--r--150050028690Jan192008 LICENSE -rw-r--r--15005008739Nov262008Makefile.in -rw-r--r--150050034725Oct62010Makefile.win drwxr-xr-x 205005004096Jun292013 modules -rw-r--r--1500500828Jan62013 NOTICE -rw-r--r--150050012894Mar162012NWGNUmakefile drwxr-xr-x 95005004096Jun292013 os -rw-r--r--15005005954Jan102007 README -rw-r--r--15005005332Oct142009 README.platforms -rw-r--r--15005002553Dec212010 README-win32.txt -rw-r--r--150050010183Mar142005 ROADMAP drwxr-xr-x 35005004096Jun292013 server drwxr-xr-x 55005004096Jun292013 srclib drwxr-xr-x 45005004096Jun292013 support drwxr-xr-x 25005004096Jun292013 test -rw-r--r--15005008183Oct182005 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