软件包管理
一.本章内容 :
软件运行环境
软件包基础
rpm包管理
yum管理
定制yum仓库
编译安装
二.软件运行和编译 :
ABI:ApplicationBinary Interface Windows与Linux不兼容
ELF(Executableand Linkable Format)
PE(PortableExecutable)
库级别的虚拟化:
Linux: WINE Windows: Cywin
API:ApplicationProgramming Interface
POSIX:Portable OS
程序源代码 --> 预处理 --> 编译 --> 汇编--> 链接
静态编译:.a
动态编译:.so
静态和动态链接
链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态链接和动态链接
静态链接:
把程序对应的依赖库复制一份到包
libxxx.a
嵌入程序包
升级难,需重新编译
占用较多空间,迁移容易
动态链接
只把依赖加做一个动态链接
libxxx.so
连接指向”
占用较少空间,升级方便
C程序静态链接:
JAVA程序运行:
Java 一次编译到处运行,因为是两次编译,先用java编译器转成字节码,后缀是class文件(属于中间代码),可以再win用也可以再linux 用
开发语言
系统级开发 :C , C++
应用级开发:java ,delphi ,Python ,go ,php ,perl ,ruby
一.包管 理器
(1)二进制应用程序的组成部分:二进制文件、库文件、配置文件、帮助文件
(2)程序包管理器:
debian :deb 文件, dpkg 包管理器
redhat: rpm 文件, rpm 包管理器
rpm: Redhat Package Manager
RPM Package Manager
(3)包命名
3.1 源代码:
name-VERSION.tar.gz|bz2|xz
例:linux -4.11.4.tar.xz
名字-(大版本号.次版本号.小版本号)-压缩后缀
大版本号不变的话 架构是没有什么变化的,此版本号主要是一些小功能的微调,小版本号一般是用来调bug的。一般此版本号是偶数是稳定版,奇数版是测试版
VERSION: major.minor.release
3.2 rpm 包命名方式:
name-VERSION-release.arch.rpm
例: :bash-4.2.46-19.el7.x86_64.rpm
包名称-版本号-编译者加的版本号-CPU架构-后缀(cpu架构是noarch 就是不限制的意思)
VERSION: major.minor.release
release :release.OS
常见的arch:
x86:i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关:noarch
(4) 包: 分类 和 拆包
对一个稍微复杂点的程序,他会把不同类别的功能模块分开放在各自的子包里面
例:
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它 子包
包之间:可能存在依赖关系,甚至循环依赖
解决依赖包管理工具:
yum :rpm 包管理器的前端工具(rpm不能解决包的依赖性的)
apt-get :deb 包管理器前端工具
zypper: suse 上的rpm 前端管理工具
dnf: Fedora 18+ rpm 包管理器前端管理工具 (dnf是yum的下一代)
(4)库文件
4.1 查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
例:ldd /bin/ls 查看ls的库文件
管理及查看本机装载的库文件: ldconfig
显示本机已经缓存的所有可用库文件:/sbin/ldconfig–p
(如果库文件损坏了,那么依赖库的命令都不能用,内部命令可以用)
4.2 名及文件路径映射关系
配置文件:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf
(编译安装完成以后需要在配置文件里面自己创建一个以.conf结尾的文件,文件里面写安装的目录,写好以后需要用 ldconfig命令,读下这个文件,把对应的库文件加载到内存里 ldconfig –p 可以查看已经加载到内存中的库文件路径信息)
缓存文件:/etc/ld.so.cache包管理器
(5)程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
1 包文件组成 ( 每个包独有)
RPM 包内的文件(各种各样的文件列表)
RPM 的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本(安装前脚本,安装后脚本 ,卸载前脚本,卸载后脚本)
2 、数据库( 公共) :/var/lib/rpm(存放的安装好的)
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息
程序包的来源
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf
获取程序包的途径:
(1) 系统发版的光盘或官方的服务器;
CentOS 镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
md5sum 路径 查看”haxi”值
(2)项目官方站点
(3)第三方组织:
Fedora-EPEL:
Extra Packages for Enterprise LinuxRpmforge:RHEL推荐,包很全
搜索引擎 :
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4)自己制作 rpmbuild ,FPM 可以制作rpm包
注意:第三方包建议要检查其合法性
来源 合法性,
rpm 包管理
CentOS 系统上使用rpm 命令管理程序包:安装、卸载、升级、查询、校验、数据库维护
安装:
Rpm {-i|--install}[install-options] PACKAGE_FILE…
-v:verbose 可以显示安装过程
-vv: 更详细的显示安装过程
-h: 以# 显示程序包管理执行进度
rpm -ivhPACKAGE_FILE ...
例:安装vsftpd 显示安装详情并且显示包执行进度
rpm 包安装
[install-options]
--test: 测试安装,但不真正 执行安装,即dry run 模式
--nodeps :忽略依赖关系
--replacepkgs覆盖安装 替换整个包| replacefilesi
--replacefiles 替换文件 替换包里的某些文件
--nosignature: 不检查来源合法性
--nodigest :不检查包完整性
--noscripts :不执行 程序包脚本
--force q :强制安装(只能在安装升级的时候用,不能在卸载的时候用)于—replacepkgs 同样效果
%pre: ; 安装前脚本; --nopre
%post: ; 安装后脚本; --nopost
%preun: ; 卸载前脚本; --nopreun
%postun: 卸载后脚本; --nopostun
包卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--
noscripts][--notriggers] [--test] PACKAGE_NAME ...
--nodeps :忽略依赖关系
-e :
--erase :
--allmatches:卸载所有 同名的包
--noscripts :卸载不运行脚本
--notriggers :不运行触发器
--test : 测试卸载
例:卸载 vsftpd
卸载包的时候可以不写路径直接写包名
rpm 包升级
升级:升级会删除旧 版本
rpm {-U|--upgrade}[install-options] PACKAGE_FILE ...
rpm {-F|--freshen}[install-options] PACKAGE_FILE ...
upgrade :安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装”
freshen :安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
rpm -UvhPACKAGE_FILE ...
rpm -FvhPACKAGE_FILE ...
--oldpackage:降级(实际上是新老版本共存)
--force:强制安装
升级注意项
注意:
(1)不要对内核做升级操作;Linux 支持多内核版本并存,因此,对直接安装新版本内核
如果安装了两个内核,需要选择一个内核作为默认启动内核,/boot/rub/grub.conf
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew) 后保留
包查询
rpm {-q|--query} [select-options][query-options]
[select-options]
-q: 查询包是否安装过了 不要写错否则就查不出来了
判断是包是否安装
-a: 所有包(支持模糊查找)
-f: 查看指定的文件由哪个程序包安装生成(查看文件来自于哪个包)
-prpmfile :针对尚未安装的程序包文件做查询操作
P后面要跟文件名,不能是包名
--whatprovidesCAPABILITY :查询指定的 CAPABILITY
由哪个包所提供
--whatrequiresCAPABILITY :查询指定的 CAPABILITY 被哪个包所依赖
rpm2cpio 包文件|cpio–itv 预览包内文件
rpm2cpio 包文件|cpio–id “*.conf” 释放包内文件
[query-options]
--changelog :查询rpm 包的changelog
-c: 查询程序的配置文件
-d: 查询程序的文档
-i: information 包的描述信息
如果查没有安装包的描述信息需要加“P”
-l: 查看指定的程序包安装后生成的所有文件(不能查脚本文件)
--scripts :程序包自带的脚本
--provides: 列出指定程序包所提供的CAPABILITY
-R: 查询指定的程序包所依赖的CAPABILITY
常用查询用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -qlPACKAGE, -qd PACKAGE
-qpiPACKAGE_FILE, -qpl PACKAGE_FILE, ...
-qa
包校验:
包在安装时候会把我们在每个在磁盘生成的文件,这些文件的权限(大小,权限等),都放在数据库里面
rpm {-V|--verify} [select-options][verify-options]
-v 可以查询比对
S file Size differs 文件大小
M Modediffers (includes permissions and file type)
5 digest(formerly MD5 sum) differs 哈希值
D Device major/minornumber mismatch
LreadLink(2) path mismatch
U Userownership differs
G Groupownership differs
T mTimediffers 时间
Pcapabilities differ
包来源合法性验正及完整性验正
完整性验正:SHA256
来源合法性验正:RSA
公钥加密
对称加密:加密、解密使用同一密钥
非对称加密:密钥是成对儿的
publickey: 公钥,公开所有人
secret key: 私钥, 不能公开
导入所需要公钥
rpm -K|checksig rpmfile 检查包的完整性和签名
检查包是否是合法来源,是否做过修改
1.正常情况刚装好的系统检查任何包显示都是notok,是因为先装好的系统欠缺检查的手段,欠缺检查的文件
2.需要导入一个钥匙,在光盘里有一个秘钥,需要导入下
下图为秘钥内容
然后执行导入秘钥
然后就可以正常查询包
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7 发行版光盘提供: RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*” 查询装好的秘钥
rpm -qi 上面命令查出来的结果 就可以查询安装好的秘钥内容
卸载导入的秘钥
安装的时候有报错需要先导入下秘钥,然后在安装
注:装好的操作系统 操作系统默认会把这个秘钥放在磁盘上
rpm 数据库
数据库重建:
/var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb: 初始化
如果 事先不存在数据库,则新建之
否则 ,不执行任何操作
rebuilddb :重建已 安装的包头的数据库 索引目录
yum
!以repodata的父目录作为yum 源的路径 !
CentOS : yum, dnf
YUM: Yellowdog UpdateModifier ,rpm 的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
yum repository: yum repo ,存储了众多rpm 包,以及
包的相关的元数据文件(放置于特定目录repodata 下)
文件服务器:
http://
https://
ftp://
本机 file://
yum 配置文件
yum 客户端配置文件:
/etc/yum.conf :为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
仓库指向的定义:(只需要记下加点的 三项)
[repositoryID] [ ]是固定格式不能加空格,中括号中的名字可以自定义
name=Somename for this repository (是一个描述,也可以不加,不加会有一个报警)
baseurl=url://path/to/repository/仓库的路径
enabled={1|0} 启用或禁用
gpgcheck={1|0}检查秘钥(不写这一行,默认是1)
gpgkey=URL秘钥路径
enablegroups={1|0} 启用组
failovermethod={roundrobin|priority}(就是baseurl 可以写很多个
roundrobin: : 意为随机挑选,默认值
priority:按顺序访问
cost= 默认为1000 优先级
例如:
也可以在地址后面加上$releasever变量
yum 仓库
yum 的repo 配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号
$arch: 平台,i386,i486,i586,x86_64等等
$basearch :基础平台;i386, x86_64
$YUM0-$YUM9: 自定义变量
实例:
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384
也可以禁用yum 仓库 enableed=0
yum源 源
阿里云 云repo 文件:http://mirrors.aliyun.com/repo/
CentOS 系统yum源
阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
教学 环境:http://172.16.0.1/cobbler/ks_mirror/$releasever/
Epel 的yum源:
阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64
教学环境:
http://172.16.0.1/fedora-epel/$releasever/x86_64/
yum-config-manager 自动生成.repo
生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
yum-config-manager--add-repo=http://172.16.0.1/cobbler/ks_mirror/7/
yum-config-manager --disable “ 仓库名" 禁用仓库
yum-config-manager --enable “仓库名”
yum 命令
yum 命令的用法:
yum [options] [command] [package ...]
显示仓库列表:
yum repolist [all|enabled|disabled]
所有|启用 | 禁用
Yum repolist all 可以显示所有的yum仓库(禁用,启用)
显示程序包:
yum list 查看包列表
输入 yum list 命令以后就会显示yum 所有的包
其中@anaconda 表示安装操作系统时通过安装操作系统安装的包 其中显示os7 表示可用包但是没有装 显示installed 表示通过rpm 命令安装的包
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1]
没有装过的|已经装好的|更新的包
[...]
安装程序包:
yum install package1 [package2] [...]
例如:
yum reinstall package1 [package2] [...] ( 重新安装)
yum 命令
升级程序包:
yum update [package1] [package2] [...]
yum downgrade package1 [package2] [...] ( 降级)
检查可用升级:
yum check-update
卸载程序包:
yum remove | erase package1 [package2] [...]
查看程序包information: :
yum info [...]
查看指定的特性( 可以是某文件) 是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2][...]
清理本地缓存:
清除/var/cache/yum/$basearch/$releasever 缓存
yum clean [ packages | metadata |expire-cache |rpmdb | plugins | all ]
构建缓存:
yum makecache
搜索:yumsearch string1 [string2] [...]
以指定的关键字搜索程序包名及summary 信息
查看指定包所依赖的capabilities: :
yum deplist package1 [package2] [...]
查看yum事务历史:
yum history [info|list|packages-list|packages-info|
summary|addon-info|redo|undo|
rollback|new|sync|stats]
yum history
yum history info 6
yum history redo 可以重做
yum historyundo 6 取消历史yum安装(yum 卸载命令,卸载安装包时不会卸载安装时一起安装的依赖包,所以可以用yumhistory 查看历史安装记录 用历史取消命令卸载安装软件可以一起把一起安装的依赖包也给卸载掉。同样也可以取消卸载
志 日志 : :/var/log/yum.log
安装及升级本地程序包:
yum localinstall rpmfile1 [rpmfile2] [...]
( 用install 替代)
yum localupdate rpmfile1 [rpmfile2] [...]
( 用update 替代)
包组管理的相关命令:
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...] 列包组
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...] 查看包信息,没有符号表示已经安装到系统了,但是安装时候不是通过包租安装的,或许是通过系统安装或者通过rpm,。“-”表示没有安装,但是也会通过包组安装,因为之前通过包组安装过后又单独卸载了,这种情况包组不会再次安装“+”表示没有安装但会通过包组安装
yum 的命令行选项:
--nogpgcheck :禁止进行gpg check
-y: 自动回答为“yes”
-q :静默模式
--disablerepo=repoidglob :临时禁用此处指定的repo
--enablerepo=repoidglob :临时启用此处指定的repo
--noplugins
系统光盘yum 仓库
系统安装光盘作为本地yum 仓库:
(1) 挂载光盘至某目录,例如/media/cdrom
# mount /dev/cdrom /media/cdrom
例:光盘挂在路径为/misc/cd/Packages
那么配置文件yum仓库里面写的路径是/misc/cd 因为这个目录下面有一个repodata. Repodata的父目录就可以做yum源的路径
(2) 创建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=
创建yum 仓库:
createrepo [options] <directory>
程序包编译
程序包编译安装:
Application-VERSION-release.src.rpm --> 安装后,使用rpmbuild 命令制作成二进制格式的rpm 包,而后再安装
源代码--> 预处理--> 编译--> 汇编-->链接--> 执行
源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系
C 、C++ :make 项目管理器
configure --> Makefile.in --> makefile
java:maven
编译安装
C 语言源代码编译安装三步骤:
1 、./configure
(1) 通过选项传递参数,指定启用特性、安装路径等;行时会参考用户的指定以及makefile.in 文件生成makefile
(2) 检查依赖到的外部环境,如依赖的软件包
2 、make 根据makefile 文件,构建应用程序
3 、make install 复制文件到相应路径
开发工具:
autoconf: 生成configure脚本
automake :生成Makefile.in
注意:安装前查看INSTALL ,README
开源程序源代码的获取:
官方自建站点:
apache.org (ASF :Apache Software Foundation)
mariadb.org
...
代码托管:
SourceForge.net
Github.com
code.google.com
c/c++ 编译器: gcc (GNU C Complier)
编译C 源代码:
准备:提供开发工具及开发环境
开发工具:make, gcc等 等
开发环境:开发库,头文件
glibc :标准库
实现:通过“包组”提供开发组件
Development Tools
Server Platform Development
库文件
查看二进制程序所依赖的库文件:
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件:
ldconfig
/sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件
名及文件路径映射关系:
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件:/etc/ld.so.cache
本文转自 佛哒 51CTO博客,原文链接:http://blog.51cto.com/fodaa/1934322,如需转载请自行联系原作者