首页 > 代码库 > yum

yum

软件包管理

一.本章内容

            软件运行环境

              软件包基础

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

http://mirrors.163.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

 

 

 


本文出自 “linux” 博客,请务必保留此出处http://fodaa.blog.51cto.com/8670908/1934322

yum