1、linux程序包的基础概念
2、RPM包管理详解
3、yum及yum使用方式
4、yum使用进阶及源代码编译安装
一、linux程序包的基础概念
1、linux OS上的安装包都遵循GPL/BSD/Apache开源协定,并在互联网以源代码形式公开,这些源代码是由C\C++\Perl开发的。使用源代码安装过程需经(预处理--编译--汇编--链接)。程序员在开发某程序时很难基于硬件来实现,所以在程序员和硬件之间添加了操作系统(内核kernel)对硬件接口统一封装,而内核也是有程序员来开发的,故有一部分人开发内核,一分部人开发应用程序;程序员在开发内核时还需要调用库文件及相关的功能模块来实现。
硬件--内核--库(功能模块(函数名、参数类型))--程序员
库也是一个程序,无执行入口,不能独立运行,只能被能独立运行的程序调用时执行。库也是程序员开发出来的源代码,源代码是不能用来执行的,需要编译成二进制格式才能被调用。
应用程序员:开发环境API(依赖于头文件、库文件(开发库、运行库)),
终端用户:应用程序(编译完成)依赖于:静态编译、动态编译(dll、so(共享库))、库(运行库)
源代码:终端用户安装源程序需要编译(x86_64上编译不能再i386上运行反过来可以,编译环境不同)
2、程序包的组成格式:
二进制程序 :/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
库文件(开发库和运行库):/lib64 /usr/lib64 ,/usr/local/lib64
配置文件:/etc,/usr/local/APP/etc或conf目录
帮助文件:/usr/share/man,/usr/local/share/man,/usr/local/APP/man
帮助文件:man,info,doc:README,INSTALL,Changelog
ldd:(print shared library dependencies)显示共享库的依赖关系 如:ldd /bin/ls 查看ls 依赖那些库,
3、程序包管理器包含:
1、数据库 (程序名及版本号、依赖关系、功能性说明、安装生成的各文件路劲及校验码)
2、程序的组成清单(文件清单、安装卸载时运行的脚本)
功能:将编译好的程序打包成一个或几个文件,可用来实现安装、升级、卸载查询等功能。
4、应用程序的命名格式:
源代码:name-version.tar.{gz|bz2|xz} ;version:major.minor,release
name-maior.minjor.release.tar.gz 如:bash-4.2.3.tar.gz
5、程序包管理器
Debian:dpkg,后缀为.deb
RedHat:rpm (redhat package manager),后缀.rpm
包管理器的功能:打包,安装,卸载,升级,校验,数据库管理
程序包间的依赖关系非常复杂:dpkg--->apt-get,rpm--->yum 基于RPM解决依赖关系。
二、RPM包的安装和使用
1、RPM包的命名格式:name-version-relase.arch.rpm (version:major.minor.release同源代码)release:指RPM包自身的发行号,与程序的修订号无关,仅指RPM包不同制作的修订,同时还包含适用的OS,比如:bash-4.2.3-3.centos5,arch:适用于的硬件平台,x86,i386,i486,,i586,i686;x86_64等,noarch于硬件平台无关,依赖于虚拟机运行,如:bash-4.2.3-3.centos5.x86_64.rpm.
2、打包功能分包机制:
核心包(主包):bash-4.2.3-3.centos7.x86_64.rpm
子包:bash-a-4.2.3-3.centos7.x86_64.rpm,bash-devel-4.2.3-3.centos7.x86_64.rpm
3、获取RPM包的途径
(1、发行商(OS Vendor)的光盘或站点服务器
镜像:http://mirrors.163.com ,http://mirrors.sohu.com
(2、项目的官网:源代码、RPM包
(3、第三方机构或个人 http//:rpmfind.net ,http://rpm.pbone.net
4、RPM包的合法性验证:包制作者制作完成之后会在包上附加数字签名。
来源合法性:
包的完整性:
包的制作者使用单向加密提取原始数据的特征码,而后使用自己的私钥加密这段特性码,附加原始数据后面。
验正过程:
前提:必须有可靠机制获取到包制作者的公钥;
1、使用制作者的公钥解密加密的特征码,能解密则意味着来源合法;
2、使用与制作者同样的意向加密算法提取原始数据的特征码,并与解密出来的特征作比对,相同,则意味着完整性没问题;
5、RPM包管理器的常用使用场景:
(1) 安装程序包:rpm [option] /path/to/package_file(包名)
-i安装,-v显示过程,-h显示安装进度,组合使用-ivh,--test:仅测试是否可以安装,-vv
如果依赖其他包:1、解决依赖关系 2、忽略依赖关系--nodeps(能装上,但无法运行)
重新安装:--replacepkgs,如果原有的配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重命名为.rpmnew。
(2)卸载程序包:rpm [option] package_name,-e:erase
如果被其他包所依赖:1、将依赖于此包的所有包一并卸载,2、忽略依赖关系,能卸载但依赖此包的程序包会运行不正常。如果包的配置文件安装后被修改过,卸载时此文件不会被卸载,而是重命名并保留,如:warning: /etc/zprofile saved as /etc/zprofile.rpmsave
(3)升级程序包:新版本替换老版本 rpm [option] /path/to/package_file (包名)
1、升级或安装( -U 组合-Uvh) 2、纯升级( -F 组合 -Fvh),升级后版本冲突等,--force强制升级,注意:不应该对内核执行升级操作,而安装;系统允许多内核并存。
6、查询操作
(1、查询某包是否安装: rpm -q package_name… ,如:rpm -q php sql
(2、查询所有已经安装的包:rpm -qa ,按条件过滤 如:rpm -qa |grep "^php"
(3、查询包的描述信息:rpm -qi package_name 如:rpm -qi zsh
(4、查询包生成了哪些文件:rpm -ql package_name 如:rpm -ql zsh | less
查询生成哪些配置文件 rpm -qc package_name
查询生成哪些帮助文件 rpm -qd package_name
查询生成哪些脚本文件 rpm -q --scripts package_name
(脚本有4类:安装前脚本preinstall,安装后脚本postinstall,
卸载前脚本preuninstall, 卸载后脚本postuninstall)
(5、查询某文件是由哪个包安装生成的:rpm -qf /path/to/some_file(文件路劲)
(6、对尚未安装的包执行查询 rpm [-qpl|-qpd|-qpi|-qpc] /path/to/package_file(包名)
(7、rpm -V zsh 校验:用于检查包安装后生成的文件属性是否发生变化,某属性无变化显示.
例如:rpm -V vim-common 结果为:S.5....T. c /etc/vimrc,表示/etc/vimrc发生变化。变化说明:S表示文件大小变化、M权限或文件类型发生变化、5表示md5发生变化、D版本号发生变化、L路径变化、U用户发生变化、G组发生变化、T时间变化、P能力发生变化。
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
7、rpm包来源合法性及完整性检验:前提:在当前系统上导入包的制作者的公钥
导入:rpm --import /path/to/key_file
# rpm -qa gpg-pubkey* 显示所有已经导入的gpg格式的公钥
# rpm -qi gpg-pubkey-NAME 显示密钥的详细信息
检查包:安装过程中会自动执行
手动检查:rpm -K /path/to/package_file或rpm --checksig /path/to/package_file 不检查包完整性:rpm -K --nodigest
不检查来源合法性:rpm -K --nosignature
8、数据库重建:数据库目录:/var/lib/rpm
重建:rpm --initdb:初始化,如果事先没有库,会新建一个;如果有,则不重建
rpm --rebuilddb:重建,直接重建,覆盖原有的数据库。
三、YUM (Yellowdog update Modifier)
1、yum是C/S架构,yum repository(yum仓库)包含数据(rpm包)和元数据(包名、版本信息、各包所包含的文件列表、依赖关系、包分组信息),centos5:xml,centos6\7:sqlite
2、createrepo:制作yum仓库元数据的工具,
3、yum客户端安装过程:
第一步:从服务器获取仓库元数据,缓存于本地:/var/cach/yum
第二步:安装程序包,yum客户端程序在本地分析元数据文件,并结合本地系统环境(已安 装文件)做出要安装程序包的决策。
第三步:获取程序包:根据决策联系yum仓库,下载各程序包缓存于本地后,一并进行安装。
4、yum仓库:
base库:通常为系统发行版光盘所提供的程序包
updates库:
extra库:
epel库:
5、使用yum机制:
(1)确保有yum repo可用,文件服务器,repodata目录所在的父目录就是一个可用的仓库
ftp://server/path/to/repository
http://server/path/to/repository
nfs://server/nfs_path
file:///path/to/repository 如:file:///media/cdrom
(2)yum客户端 提供repo配置文件,指明仓库访问路径及各种属性信息,一个或几个相关的仓库配置信息可保存为一个文件,文件名都以.repo结尾:/etc/repos.d
主配置文件(中心配置文件):/etc/yum.conf
在.repo定义一个yum repo格式:
【repoID】
name=some name for this repos
baseurl=file:///media/cdrom (必须是一个路径,repodata所在的父目录)
enabled={0|1}
gpgcheck={0|1} 如果是1需要个gpgkey这项来验证
gpgkey=URL(指向key文件 如:/dev/cdrom/gpg-key-centos-6)
mirrorlist=URL to a file(可以取代baseurl,yum仓库列表)
cost{1..n}访问某仓库的开销,默认1000,越小越优先。
(3)yum客户端命令的使用:
1、列出所有可用的repo:yum repolist {enabled|disabled|all}
2、列出rpm包:yum list {all|installed|available} ,yum list 包名(支持通配)
3、查看包的描述信息:yum info 包名。如:yum info php-zts
4、列出所有包组信息:yum grouplist
5、显示包组的信息:组中包含的程序包列表:yum groupinfo "包组名"如:yum groupinfo "backup server",
CentOS6 跟开发相关的包组: "ServerPlatformDevelopment"、"Development Tool"、"Desktop Platform Development"
6、清除缓存:yum clean {all|packages|metadate|expire-cache|rpmdp|plugins}
7、安装程序包:yum install packages_name
重新安装:yum reinstall packages_name
8、升级程序包:yum check-update:检查可用的升级包;
yum update package_name,可以指定版本号升级为指定的版本
9、降级程序包:yum downgrade package_name 如高版本的不稳定,可以降级
10、卸载:yum remove|erase package_name
11、查询某文件是由哪个包安装生成的:yum whatprovides|provides /path/to/some
12、安装包组:yum groupinstall “group name”
13、卸载包组:yum groupremove "group name"
假设:从其他处获得一个rpm包,如果此包依赖于其他包(在仓库中)如何安装?
yum install /path/to/package_file
练习:development tool组中有gcc,安装开发环境包组,确保如下命令能执行 #gcc --version
四、yum配置文件进阶及编译安装
1、 解析:mirrors.sohu.com/centos/6/os/x86_64(6是一个连接,指向最新版本的链接如:6.5;利用主版本号(单数字)是为了在定义yum客户端配置文件时,能实现更好的通用效果,指定一个路径,无论以后如何更新都获取最新的)
baseurl=http://mirrors.sohu.com/centos/$releasever/os/$basearch
2、yum配置文件中可用的四个变量:
$releasever: 程序的版本,对Yum而言指的是redhat-release版本;只替换为主 版本号,如RedHat 6.5,则替换为6;
$arch: 系统架构
$basearch: 系统基本架构,如i686,i586等的基本架构为i386;
$uuid:
$YUM0-9: 在系统中定义的环境变量,可以在yum中使用;
3、获取当前系统相应变量替换结果的办法:
# python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yum,pprint
>>> yb = yum.YumBase()
>>> pprint.pprint(yb.conf.yumvar,width=1)
Loaded plugins: fastestmirror, refresh-packagekit
{'arch': 'ia32e',
'basearch': 'x86_64',
'releasever': '6',
'uuid': 'ea249181-2f82-4c40-8c42-d51b3fce319a'}
>>> quit()
yum支持插件
4、如何自建yum仓库:
1、如何自建基于光盘镜像的yum repo
2、自建提供yum仓库的中心服务器ftp, http, nfs
以http为例,步骤:
(1) 安装httpd程序,并启动服务
# rpm -ivh httpd- 或者 # yum install httpd
启动服务# service httpd start # chkconfig httpd on
(2) httpd的文档根目录为/var/www/html:创建子目录,存放某相关的所有rpm包
(3) 为仓库生成元数据文件,以使能够作为仓库使用
# rpm -ivh createrepo- 或者# yum install createrepo
# createrepo /path/to/rpm_repo/(createrepo不能使用时需要先安装此命令)
#ss -tnl 或者 #netstat -tnl 确保80端口listen状态
(4) 配置yum客户端使用此仓库即可,在html下创建不同的目录,就是不同的仓库。
如:[base]
name=server repo
baseurl=http://192.168.100.1/zbbix(默认网站路径/var/www/html)
enable=1,gpgcheck=0
5、编译安装源代码包:依赖于开发环境
(1)程序源码:可能由c/c++、perl、python开发,他们的编译安装都一样,每个制作好的rpm包都是编译过的。假如一个程序有20个功能,编译的时候由分包机制分成不同的包,主包6个功能,分包A2个功能,分包B4个功能,那剩下的8个功能编译者认为没用就没有编程成二进制格式打包成rpm格式,如果我们恰好要用到,就不得不自己编译安装源代码。编译安装完了卸载的时候很繁琐,不知道生成了哪些配置文件,所有在编译安装的时候最好指定一个预先设置好的目录。
开源应用程序:自建站点 apache, ASF、mysql、drbd
代码托管:SourceForge、github.com、code.google.com
编译工具:gcc、gnu c complier、gcc-c++
(2)源代码的组织格式:通常是多文件形式方便管理源代码,但是编译的时候比较困难,因为文件中的代码有依赖关系很难确定先编译哪个,所以为了简化使用项目管理工具--make.(项目管理工具make(gcc))
例如:项目有50个文件,项目的制作者利用make工具为项目梳理,为make提供一个配置文件,这个文件中保存了make如何去调用gcc,以什么顺序去编译这50个文件;而项目梳理也是一个很繁琐的过程,于是出现一个工具能帮助make动态生成一个配置文件(aotomake对代码分析后生成一个配置文件)
autoconf: 生成编译环境检查及编译功能配置脚本,生成configure
automake: Makefile.in --> makefile
(3)编译源程序的步骤:
# tar xf testapp-version.tar.{xz|bz2|gz}
# cd testapp-version
# ./configure 检查环境 (还需通过许多选项指定编译特性)
# make 编译源程序
# make install 将编译好的源程序安装到指定的目录
编译示例:#yum grouplist 确保Development tools,Server Platform Developmen已经安装
#yum install pcre-devel
#tar xf nginx-1.4.7.tar.gz
#cd /nginx-1.4.7(有configure脚本)
#./configure
(4) ./configure脚本的使用:
1、获取帮助 ./configure --help
2、较通用的一些选项
安装路径相关:
--prefix=/path/to/somewhere: 指定安装路径
--sysconfdir=/path/to/somewhere: 指定配置文件安装路径
指定启用/禁用的特性
--enable-FEATURE: 例如--enable-fpm
--disable-FEATURE: 例如--disable-socket
指定所依赖的功能、程序或文件
--with-FUNCTION[=/path/to/somewhere]
--without-FUNCTION
(5)安装后的配置:
程序运行:
1、让二进制程序直接,而无须输入路径
# vim /etc/profile.d/APPNAME.sh
export PATH=$PATH:/path/to/somewhere
2、导出手册页:
编辑/etc/man.config配置文件,添加一项MANPATH,路径为新安装的程序的man目录;
# man -M /path/to/somewhere KEYWORD
程序开发:如果其它应用程序依赖此程序的开发环境,或针对此程序做二次开发
1、导出库文件
第一步:指定让系统搜索定制的路径
编辑/etc/ld.so.conf.d/APPNAME.conf
一行一个库文件路径
第二步:触发系统重新搜索所有的库文件并生成缓存
# ldconfig -v
2、导出头文件
/usr/local/nginx/include
系统找头文件的路径是:/usr/include
导出方式:创建链接进行
ln -sv /usr/local/nginx/include /usr/include/nginx