概述:
众所周知,Linux操作系统本身,必须要借助额外的一些软件,才能完成某些应用的,操作系统如果没有应用程序的填充,就无法创造出生产力,这样即使再完美的操作系统,也毫无用处。那么本章就简要介绍一下Linux系统上对程序包的管理,分为以下三个部分:
1、程序包的基础理论
2、rpm包管理器的使用
3、yum详解
4、源码包编译安装
5、软件包管理实例演示
第一章 程序包的基础理论
1、二进制应用程序的组成部分:
二进制文件、库文件、配置文件、帮助文件
2、程序包的命名:
源码包:name-VERSION.tar.gz
VERSION:major.minor.release
组版本号.次版本号.发行号
RPM包:name-VERSION-release.arch.rpm
VERSION:major.minor.release
release.arch:rpm包的发行号
release.os:例如2.el7.i386.rpm(el7表示支持centos7)
常见的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关: noarch
包:分类和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
3、获取程序包的途径:
<1>系统发行版的光盘或官方的文件服务器(或镜像站点)
<2>项目的官方站点
<3>第三方组织制作的包
EPEL:除发行光盘中的包外,将一些额外的常用的包发布在此
专用来搜索rpm包的站点,如:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
<4>自己制作rpm包
注意:获取到其软件后,要检查其完整性,根据官方提供的校验码进行校验
4、程序包管理器:
源代码–>目标二进制格式(二进制程序、库文件、配置文件、帮助文件)–>组织成为一个或有限几个包文件
程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
1、包文件组成 (每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
2、数据库(公共)
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
….
常见程序包管理器
debian:dpt,dpkg 后缀名为.deb
ubantu属于debian系,包管理工具与debian相同
redhat:rpm 后缀名为.rpm
S.u.S.E:rpm,但是与redhat系列不兼容,后缀为.rpm
Gentoo:ports
5、包的依赖关系:包之间可能存在依赖关系,甚至循环依赖
解决依赖包管理工具:
yum: rpm包管理器的前端工具
apt-get: deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
第二章 rpm包管理器的使用
CentOS系统上使用rpm命令管理程序包:安装、卸载、升级、查询、校验、数据库维护
1、安装 rpm -ivh /PATH/TO/rpm包全名
-i表示安装
-h:以#显示安装过程;每个#表示2%
-v:显示详细过程
-vv:显示更详细的过程
–nodeps:忽略依赖关系(可以装上去,但可能软件没法正常使用)
–replacepkgs:重新安装,替换原有安装
–force:强行安装,可以实现重装或降级
–test:测试是否能够安装,检查并报告依赖关系及冲突消息,实际是没有装的
–nosignature:不检查包的签名信息,即不检查来源合法性
–nodigest:不检查包完整性信息(md5之类的信息)
–noscripts:安装时不运行自带的4类脚本
–nopre:安装时不运行pre脚本
–nopost:安装时不运行post脚本
–nopreun:安装时不运行preun脚本
–nopostun:安装时不运行postun脚本
注意:rpm可以自带脚本,有4类脚本
preinstall:安装之前运行的脚本,标记为%pre
postinstall:安装完成后运行的脚本,标记为%post
preuninstall:卸载之前运行的脚本,标记为%preun
postuninstall:卸载之后运行的脚本,标记为%postun
2、升级:(选项与安装时的选项一样)
rpm -Uvh /PATH/TO/新的包全名 如果装有老版本,则升级;否则,则安装
rpm -Fvh /PATH/TO/新的包全名 如果装有老版本,则升级;否则,退出
–oldpackage 表示降级
–force 强制升级
–test 测试升级
注意:
<1>不要对内核做升级操作,linux支持多内核版本并存,因此,直接安装新版本内核
<2>如果某原程序包的配置文件安装后曾被修改过,升级时,新版本程序提供的同一个配置文件不会覆盖原有配置文件,而是把新版本的配置文件重命名后(类似FILENAME.rpmnew样式)存放
3、卸载:rpm -e 包名 (注意,卸载的包不能被其他包所依赖,不然其他包会不正常)
–nodeps:忽略依赖关系卸载
–almatches:卸载所有匹配指定名称的程序包的各版本
–test 测试卸载
4、查询:
rpm -q 包名 查询指定包名是否已安装
rpm -qa 查询所有已经安装的包
rpm -qi 包名 查询指定包的说明信息
rpm -ql 包名 查询指定包安装后生成的文件列表
rpm -qc 包名 查询指定软件包安装的配置文件
rpm -qd 包名 查询指定包安装的帮助文件
rpm -qf /PATH/TO/SOMEFILE 查询指定的文件是由哪个RPM包安装生成的
rpm -q –scripts 包名 查询指定包中包含的脚本
rpm -q –provides 包名 查询指定包的依赖关系
rpm -q –whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
rpm -q –whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
如果某个rpm包尚未安装,我们需要查询其相关信息:
rpm -qpi /PATH/TO/包全名 查询未安装的指定包的说明信息
rpm -qpl /PATH/TO/包全名 查询未安装的指定包要生成的文件列表
也就是在之前查询已安装的选项中加 -p
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “ *.conf” 释放包内文件
5、校验:检查包安装的文件改变信息
rpm -V 包名
如果没有改动,则不会显示任何信息,如果发生了变化,则显示出9位的一个提示信息,如:
S.5….T.
每一位的意义是:(未变化的显示为.)
S 文件大小发生变化
M 文件权限发生变化
5 文件的MD5值发生变化
D 主、次设备号发生改变
L readlink路径发生改变
U 属主发生改变
G 属组发生改变
T 文件最近一次修改时间发生改变
P 性能发生改变
6、包来源合法性验证和完整性验证:
来源合法性验证
数字签名:利用非对称加密(公钥-私钥),用自己的私钥对文件的校验码(利用单向加密(MD5、SHA)得出文件的特征码)进行加密
包完整性验证
centos的公钥在/etc/pki/rpm-gpg目录下
/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7发行版光盘提供: RPM-GPG-KEY-CentOS-7
rpm -qa gpg-pubkey*
在安装程序包时,可以先导入公钥,然后再安装,就不会再提示包的完整性无法验证的提示信息了,导入方法为:
rpm –import /PATH/TO/公钥路径
导入成功后,安装时会自动验证
如果想手动验证,可以利用 rpm -K 包全名 即可验证
7、重建数据库(rpm管理器数据库路径/var/lib/rpm/):
查询、安装、卸载、校验操作,就是通过此处的数据库进行
如果该数据库坏了,就得进行数据库重建:
rpm –rebuilddb 重建数据库,一定会重新建立
rpm –initdb 初始化数据库,当前无任何数据库才建立,有就不建立
第三章 yum详解
1、rpm程序包管理器的前端工具yum的功能:
yum服务端的功能:能够利用文件服务器(主要是共享rpm包):通过yum支持的文件共享机制,将各rpm包通过文件服务共享,自动解决依赖关系
repository:仓库
<1>各rpm包;
<2>依赖关系、程序包安装后所能够生成的文件等元数据文件(放置于特定目录repodata下);
yum客户端:
<1>配置文件:指定各个可用的yum仓库
<2>缓存元数据:yum客户端会到各可用yum仓库获取元数据,并缓存至本地
<3>分析元数据:分析依赖关系的包的安装和未安装情况,以及具体的操作请求完成元素分析,可能包括检查依赖关系,文件列表等信息
<4>根据元数据的分析结果,执行具体操作(安装、卸载、查看)
2、客户端配置文件指定对应服务器的访问方式:
根据文件服务的协议,指定服务和路径
如果是ftp 则ftp://server/path/to/repo
如果http 则http://server/path/to/repo
如果是本地文件 则file:///path/to/repo
3、yum客户端配置
要使用yum管理应用程序,首先要配置其可用的yum仓库,保存在配置文件中/etc/yum.conf(保存核心配置) /etc/yum.repo.d/*.repo(保存各仓库的信息)
配置文件格式:由两段组成
[main] 主配置段
[repo_name] 仓库配置段
配置repo:
[repo_ID]
name=STRING
baseurl=仓库的访问路径 只需指向repodata目录的上一级目录即可
enabled={1|0} 是否启用该仓库,如果不指定,默认是启用状态
gpgcheck={1|0} 是否启用gpg检查包的完整性
gpgkey=公钥路径 可以在本地,也可以是服务器端路径
enablegroups={1|0} 该仓库是否支持程序包组的安装
cost= 定义此仓库的开销,默认为1000,取值越小,越优先使用
例如:
[TEST]
name=testyum
baseurl=http://10.1.0.1/cobbler/ks_mirror/CentOS-6-x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=1
配置文件中可用的4个宏:
$releasever:程序的版本,对yum而言,指的是centos-release版本;只替换为主版本号,如CentOS 6.8则替换为6
$arch :平台架构
$basearch:基础平台,如i686,i586等的基本架构为i386 64位系统为X86_64
$YUM0-9:在系统中定义的环境变量,可以在yum中使用
利用命令配置客户端repo:
yum-config-manager –add-repo=http://10.1.0.1/cobbler/ks_mirror/CentOS-Xx86_64/
yum-config-manager –disable “仓库名" 禁用仓库
yum-config-manager –enable “仓库名” 启用仓库
4、客户端命令yum:
语法:yum [选项] 子命令
常见选项:
–nogpgcheck 安装时不进行gpg检查
-y 自动回答为yes
-q 静默模式,不输出内容
–disablerepo=REPO_ID 临时禁用此处的repo源
–enablerepo=REPO_ID 临时启用此处的repo源
–noplugins 表示禁用所有插件
yum常见子命令:
install PACKAGE_NAME… 安装指定包,可以同时安装多个
reinstall PACKAGES_NAME… 重新安装指定包,可以同时安装多个
check-update 检查可升级的包
update PACKAGE_NAME… 升级指定的程序包,可多个
技巧:如果检查出来可用升级的版本有多个,例如有X-1.2.1 X-1.2.2 X-1.2.3想要升级到指定的版本,则可以用yum update PACK_NAME X-1.2.2 (也就是指定版本)
downgrade PACKAGE_NAME 降级指定程序包
erase|remove PACKAGE_NAME。。。 卸载指定的包,可以同时卸载多个。
注意,用yum卸载的时候,会同时卸载依赖的包,故一般用rpm命令进行卸载
whatprovides|provides /PATH/TO/SOMEFILE 查询某文件是由哪个包安装生成的(功能类似于rpm -qf)
repolist [all|enabled|disabled] 显示可用的yum仓库列表,all表示所有的仓库信息,enabled表示可用的仓库信息,disabled表示不可用的仓库信息,如果不指定,默认显示可用的仓库信息
clean all|packages|metadata|expire-cache|rpmdb|plugins 可以指定清除本地缓存的all所有缓存信息,packages包的信息,metadate元数据信息,expire-cache过期的包的信息,rpmdb rpm数据的信息,plugins插件信息(访问yum服务器时会缓存一些数据到本地/var/cache/yum下)
list 列出所有已安装,和仓库中所有未安装的包,后面显示为@….或installed表示已经安装了的
list installed 表示只显示已安装的包的信息
list available 表示只显示可用的,未安装的包的信息
list “通配符风格的表达式” 列出满足条件的包
info PACKAGE_NAME 表示显示出指定包的信息
groupinfo "PACKAGE_GROUP_NAME" 表示显示指定包组的信息
三个跟开发相关的常用包组
Desktop Platform Development:桌面平台开发环境
Server Platform Development:服务器平台开发环境
Development Tools:开发工具包
grouplist 列出所有包组信息
groupinstall “PACKAGE_GROUP_NAME” 安装指定包组
groupremove “PACKAGE_GROUP_NAME” 卸载指定包组
history 可以显示yum命令的使用历史,谁、做了什么操作
yum history 表示显示yum历史
yum history info 6 显示yum历史中第6条历史的详细信息
yum history undo 6 撤销yum历史中第6条历史所做出的改变,相当于还原
install /PATH/TO/PACKAGE_FILE 不从yum仓库安装包,而是从本地安装,从本地安装的时候,有时候会安装不上去,因为yum会默认检查包的完整性,要想安装,要在包路径后加上选项–nogpgcheck
makecache 构建缓存
search STRING 根据提供的关键字,搜索程序的包名及summary信息
5、yum日志:/var/log/yum.log
6、创建服务端yum仓库
先下载仓库中诸多的rpm包到某个目录
创建yum仓库:
要创建yum仓库,必须要先安装createrepo程序,该程序能够自动创建repodata目录文件
使用createrepo命令创建repodata目录:
语法:createrepo [OPTIONS] <DIRECTORY>
基本不用加选项,直接后面跟上包的路径,代表直接在包路径里面生成repodata目录
步骤:
1、下载相应的rpm包到某个目录,本实验为/testdir/repotest/目录
2、切换到该rpm包目录
3、利用createrepo命令,针对当前目录创建repo仓库repodate文件
4、验证仓库是否可用
第四章 源码包编译安装
1、源码包的相关介绍
有些包的格式为XXXXX.src.rpm这类包虽然是rpm的格式,但是包里面的内容并没有真正编译,对于这类包,需要利用rpmbuild命令制作成二进制格式的rpm包,而后再安装;
还有些包直接就是src的源码包,这样需要编译安装了,另外有些时候,现有编译过后的rpm包在有些特性上不能满足我们的使用时,也需要手动下载源码包,然后进行编译安装
开源程序源代码的获取:
官方自建站点:appache.org、mariadb.db
代码托管站点:SourceForge、Github.com、code.google.com
2、源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系
C、 C++: make (项目管理器, configure –>Makefile.in –> makefile)
3、C、C++编译安装的三步骤:
<1>./configure:
功能:
<a>通过选项传递参数、指定启用特性、安装路径等、执行时会参考用户指定以及Makefile.in生成makefile;
<b>检查依赖到的外部环境,
<2>make
功能:根据makefile 文件,构建应用程序
<3>make install
功能:将文件利用install命令复制到指定路径
在安装前,应该查看源码包内的INSTALL、README文档
4、编译C源代码:(注意:./configure、make、make install都要cd切换到源码包解压展开后的目录里面进行)
前提:提供开发工具及开发环境
开发工具:make、gcc等
开发环境:开发库、头文件
glibc:标准库
以上的条件在Linux系统上通过安装包组来提供:
centos 6:“Development Tools” “Server Platform Development”
centos 7: “Development Tools
Development” “Creative Workstation”
第一步:./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
5、编译安装完成后的相关操作:(假设编译安装的目录在/usr/local/http2/目录下)
<1>导出二进制程序(bin)目录至PATH环境变量中,否则需要用绝对路径使用编译安装的文件生成的二进制程序
导出方法:
在/etc/profile.d/目录下新建一个该程序的文件名.sh的文件
在文件里面添加二进制程序路径
export PATH=$PATH:/usr/local/http2/bin/
<2>导出库文件路径(lib)
新建文件/etc/ld.so.conf.d/NAME.conf,在文件中添加:/usr/local/http2/lib
让系统重新生成缓存:ldconfig [-v]
<3>导出头文件(include)
可以将安装路径下的include的cp到/usr/include目录下
也可以创建软连接到该目录下
ln -sv /usr/local/http2/include/ /usr/include/http2/
<4>导出帮助手册
编辑/etc/man.conf文件
将安装目录下的man路径添加一个MANPATH条目:
MANPATH /usr/local/http2/man
第五章 软件包管理实例演示
1、删除kernel包后,无法启动,并恢复之
步骤:
<1>删除kernel并重启
<2>插入系统安装光盘,修改BIOS中BOOT启动项为从光盘启动
<3>进入rescue救援模式
<4>在救援模式下,利用光盘自带的微型系统,运行rpm安装命令,安装kernel。因为进入救援模式下的系统为光盘的系统,如果用rpm安装,则默认安装位置是光盘上的系统,而我们希望的是安装到本机的系统,利用df命令可以看到本机的系统被挂载到/mnt/sysimage路径下,因此在利用rpm来安装kernel软件包时,需要利用–root=/mnt/sysimage
<5>安装完成后重启,进入本地系统进行验证
2、源码安装apache
步骤:
<1>下载源码包并解压至某目录
<2>cd切换到解压目录并查看相关编译安装帮助和选项信息
<3>执行./configure
<4>执行make
<5>执行make install
<6>导入二进制程序文件路径到PATH环境变量
<7>导入库文件
<8>导入头文件
<9>导入man帮助文件路径
<10>启动服务,验证是否安装成功
原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/37768