【linux基础】16、软件包管理

  1. 云栖社区>
  2. 博客>
  3. 正文

【linux基础】16、软件包管理

技术小甜 2017-11-07 19:51:00 浏览686
展开阅读全文

一、软件包概述

1、相关概念

源码安装操作系统方式:通过宿主机安装

GPL:公布源码(c,c++)

POSIX规范:Portable Operatin System (原代码)移植性

API应用编程接口,兼容,意味开发库兼容,因此源代码可夸平台

ABI应用二进制接口,兼容,编译后的程序可夸平台

就是函数\功能,可执行程序,本身不能作为程序执行的入口,但可以被调用

  编译好的二进制格式

  glibc:linux标准的C库

程序开发完成后要使用得经过的步骤:

预编译,编译,汇编,链接(把库文件链接到软件可以找到的路径)

编译分为两种:

  静态编译:程序包含依赖库,程序体积变大

  动态编译:dll(windows),so(shared object) 调用系统共享库

   

注意:应用程序(编译好的)的可移植要求

1)OS平台:应用程序必须为特定平台所支持的版本,库

2)硬件平台:应用程序必须为特定的cpu所支持,指令集不一样,内核也不一样


2、程序包组成部分

二进制程序

  系统二进制程序默认存放路径:

    /bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin

  程序包提供的二进制程序路径:

    /usr/local/apache/bin,/usr/local/apache/sbin

库文件:程序自身提供自身各组件依赖的共享库,和对该程序进行二次开发就要调用程序的共享库

(对程序库的使用格式头文件的包含,库的头文件,linux上头文件都保存在/usr/include目录下)

  系统二进制程序默认存放路径:

    /lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64   

  系统头文件(文本格式)存放路径:

    /usr/include

  指定系统查找库文件的路径的配置文件/etc/ld.so.conf/etc/ld.so.conf.d/*.conf

  也可以使用ldd命令查看程序所依赖的共享库:

    ldd [options] FILE...

1
2
3
4
[root@Node3 ~]# ldd /bin/cat
    linux-vdso.so.1 =>  (0x00007fff357ff000)               #调用动态库的入口
    libc.so.6 => /lib64/libc.so.6 (0x00007fdebbd52000)     #库名=>库文件地址
    /lib64/ld-linux-x86-64.so.2 (0x00007fdebc0f6000)       #直接写了库文件地址

配置文件:/etc

帮助文档:/usr/share/man/,/usr/share/info

   man COMMAND 是到某路径下查找与命令同名的通常以.gz结尾的压缩文件

     man命令查找路径可以在/etc/man.conf中配置,也可以用选项直接指定:

   man -M /usr/local/nginx/man.nginx

  

二、包管理器

1、程序包管理器

功能:

   维护数据库

      包含软件名和版本

      安装生成的各文件路径、名称、效验码

      软件之间依赖关系

      提供功能性说明

   提供程序组成格式

      文件清单

      安装卸载时运行的脚本


Debian:.deb,dpkg

Redhat:.rpm,rpm(RedHat Package Manage,RPM is Package Manager)  #包管理器的标准

包管理器的基本功能: 

制作程序包,安装,查询,升级,卸载,效验,数据库管理

依赖关系:循环依赖,版本依赖


3、前端管理器     

能自动解决依赖关系

apt-get:Debian系

yum: redhat系


4、应用程序的安装方式

源代码编译

简单打包的二进制格式,就是通用二进制,                    

使用包管理器:便捷,易用

包管理器的前端工具

.src.rpm  源码格式的rpm包,可以在不同平台上自行在开发环境下自行编译,安装


三、rpm包的使用

1、包命名格式

源程序:  

   name-version.tar.gz

     version:major.minor.release

   name-major.minor.release.tar.gz  #这里release是指原程序的发行号

rpm包:

   name-version-release.ARCH.rpm   

            #这里的release:是用过程序源码制作成rpm包的发行号,还包含使用的OS

            #ARCH:x86_64,x86,i386,i586,i686,noarch

例: bash-4.2.4-1.el6.x86.rpm   #el6:redhat enterprise linux 6

   nginx-1.4.16-5.rpm      #没指明硬件平台,就是平台通用

   

分包:把一个大的程序打包制作成多个rpm包

   主包:bash-4.2.4-1.el7.x86.rpm

   支包:bash-devel-4.2.4-1.el7.x86.rpm


2、如何获取程序包

1)发行商提供的程序包

2)Fedora-EPEL

3)项目的官方站点

4)搜索引擎

  http://rpmfind.net

  http://rpm.phome.net

  http://pkgs.org

程序包合法性验证:

验证包完整性:

  通过md5或sha1效验码验证

验证来源合法

  公钥


四、基于rpm命令实现程序包管理

1、安装

使用包全名

格式:

rpm -i /PATH/TO/RPM_PACKAGE ... 

  -i,--install:安装    

  -v:显示详细信息;-vv:更详细

  -h,--hash: 以#的个数显示安装进度

     --test:仅测试,不真正安装,可以看到该包的依赖关系

     --nodeps:忽略依赖关系

重装:rpm -ivh --replacepkgs RPM_PACKAGE

降级:rpm -ivh --oldpackage RPM_PACKAGE


如果存在依赖关系:

  解决依赖关系

   忽略依赖关系:--nodeps    #虽然能安装上这个包,但觉大多数不能用

注意:

   重装或升级时,原来的配置文件不会被覆盖,新安装的配置文件将会重命名为以.rpmnew为后缀的文件


2、升级

格式:

 rpm -Uvh package_name  如果有旧版程序包,则升级,如果没有,则安装

    -Fvh:如果有旧版程序包,则升级,如果没有,则无操作             

       --force:强制升级

       --nodeps:忽略依赖关系

注意:不要对内核执行升级操作,多版本内核可并存,因此,建议执行安装操作


3、卸载

指定包名即可

格式:

  rpm -e package_name

    -evh

如果卸载被其它程序所依赖的包:

1、把依赖者一同卸载

2、忽略依赖关系

3、不再卸载


4、查询

格式:

  rpm -q package_name(包名)  查询该rpm包是否安装

     -qa    查询系统所有已经安装的rpm包

     -qi    查询rpm包的描述信息

     -ql    查询rpm包安装之后在当前系统生成的文件列表

     -qc    查询rpm包安装之后在当前系统中生成的配置文件

     -qd    查询rpm包安装之后在当前系统中生成的帮助文件

     -qf    查询文件是所有哪个rpm包安装生成的

     -q --scripts    查询rpm包相关的脚本

脚本有四类:

    preinstall:安装前脚本

    postinstall:安装后脚本

    preuninstall:卸载前脚本

    postuninstall:卸载后脚本

rpm  -qp  包全名  查询当前系统中尚未安装的rpm包文件的相关信息

    -qpl   查询安装后生成的文件列表

    -qpi,-qpc,-qpd   #上面-q可以使用选项这里都可以使用  

注意这里说的尚未安装是需要有安装包存在才可以查询

1
2
[root@Node3 ~]# rpm -qpl zsh-4.3.10.-7.el6.x86_64.rpm
error: open of zsh-4.3.10.-7.el6.x86_64.rpm failed: 没有那个文件或目录


5、效验

    检查包安装后生成的文件是否被修改过

rpm -V 包名   

  S file Size differs  大小发生改变

  M Mode differs (includes permissions and file type)  权限

  5 digest (formerly MD5 sum) differs   MD5效验码

  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       能力

1
2
3
4
[root@Node3 ~]# rpm -V bash      #没有信息返回,说明没有被改变
[root@Node3 ~]
[root@xxj Packages]# rpm -V wget #改变了的显示对应信息,没改变的是.
S.5....T.    /usr/share/locale/zh_TW/LC_MESSAGES/wget.mo


6、rpm包校验

    检验来源合法性和软件包完整性

验证包完整性:通过单向加密(md5|sha1)效验码

验证来源合法:通过公钥加密(RSA)

验证命令:gpg   #是pgp(加密规范)的实现

但不手动使用gpg命令,使用的是:rpm -K 包全名

导入制作者的公钥:CentOS发行商的公钥在ISO文件 “RPM-GPG-KEY-CentOS-6”

rpm --import 公钥           #导入公钥

rpm -K /PATH/TO/PACKAGE_FILE   #验证包完整来源合法性 

rpm --checksig /PATH/TO/PACK_FILE  #--checksig相当于-K

      --nosignature:不检查来源合法性

      --nodigest:不检查完整性

1
2
[root@xxj Packages]# rpm -K zsh-4.3.11-4.el6.centos.x86_64.rpm  
zsh-4.3.11-4.el6.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK


7、rpm包数据库重建

rpm包数据库路径: /var/lib/rpm

重建:

  rpm --initdb     初始化

      如果事先不存在一个数据库,则新建之

  rpm --rebuilddb   重建

      直接重建数据库,会覆盖原有的库

      

五、YUM管理

1、yum简介

YUM: Yellowdog Updater Modified

    能自动解决依赖关系

    

文件服务器(repository:仓库) #共享rpm包,ftp,http,nfs,file都可以作文件服务器

   通过yum所支持的文件共享机制将各rpm包通过文件服务器共享

repository包含:

   1)各rpm包

   2)依赖关系、程序包安装后所能生成的文件列表等元数据文件


yum客户端工作机制:

 1、配置文件:指定各可用的yum仓库

 2、缓存元数据:yum会到各可用yum仓库获取元数据,并缓存至本地

 3、分析元数据:根据具体操作请求完成元数据分析:可能包括检查依赖关系,文件列表等信息

 4、执行具体操作


2、yum配置

  要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中

yum的配置文件:

       /etc/yum.conf           #全局配置,一般默认即可不用更改

       /etc/yum.repos.d/*.repo           

配置文件格式/etc/yum.conf:由两段组成,类似windows的ini配置文件

[main]:主配置段     #全局配置,对所有仓库有效

[repo]:仓库配置段    #只对指定的仓库有效


配置repo:

  [repo_ID]

  name=NAME

  baseurl=仓库的访问路径

  enabled=[1|0]   1表示启用,0表示不启用,如果不存在该配置,则默认启用

  gpgcheck=[1|0]   是否检查包来源合法性和完整性,默认不启用

  gpgkey=公钥文件  (可以在本地,也可以是远程服务器端路径)

  cost=定义此仓库的开销,默认为1000    #数值小的优先使用          


yum程序的配置文件指定对应服务器访问方式:

ftp    ftp://server/path/to/repo

http   http://server/path/to/repo

nfs    nfs://server/nfs_path

file   file:///path/to/repo


六、yum的使用

1、yum命令的使用

yum repolist [all|enabled|disabled]  默认列出所有启用的repo   启用,禁用

yum的缓存路径/var/cache/yum 

yum clean [all|package|metadata|expire-cache|rpmdb|plugins]  清除所有缓存

yum makecache   生成缓存 

yum list [all|installed|available]  默认列出所有仓库的rpm包  已安装,可安装

yum grouplist          默认列出所有仓库的rpm组包

yum info 包名           可以是当前系统中未安装的程序

yum groupinfo “包组名”   包组名称可能有空格,此时一定得用引用

   三个跟开发相关的包组:  #建议安装系统时要安装,后面经常需要用到

      Desktop Platform Development:

      Server Platform Development

      Development Tools

安装:yum installyum groupinstal

重装:yum reinstall 

卸载:yum [remove|erase]yum greoupremove

检查可升级的包:yum check-update

升级:yum update  

   要升级到指定版本:yum update x-4.4.12-1el7.x86_64.rpm    #升级默认是升级到最新版

降级:downgrade pack_name

查询某文件由哪个rpm包安装后生成的:yum provides /path/to/somefile

查看yum的命名历史:yum history

   yum search     在软件包详细信息中搜索指定字符串

yum 不仅安装repo中的软件,也可以安装本地的软件包,yum安装本地包时会检查包的来源和完整性,检查不通过则安装不了,此时可以手动禁止检查来源及完整性:

yum install /PATH/TO/包全名 --nogpgcheck


2、yum配置文件中可用的宏

$releasever:程序的版本,对Yum而言指的是redhat-relrase版本。只替换为主版本号,如Redhat6.5 则替换为6,(就是操作系统的主版本号

$arch:系统架构,如ia32,这里不是指x86或x86_64,$basearch才是指x86或x86_64

$basearch:系统基本架构,如:i686,i586等的基本架构为i386,或者x86

$YUM0-9:在系统定义的环境变量,可以在yum中使用


3、使用yum下载rpm包而不执行安装

安装yum-downloadonly或 yum-plugin-downloadonly软件包:

yum install yum-plugin-downloadonly   #其实是升级yum,升级到3.2.29-69就包括了这个插件

yum install yum 或 yum update yum

使用方法:

  yum install 包名 --downloadonly --downloaddir=/存放路径 -y


七、自己设置本地repo源

1、准备文件服务器ftp,http,nfs;使用httpd为例,请事先确保以安装httpd程序包

2、在/var/www/html目录,使用一个目录来保存准备制作称为yum仓库的所有rpm包

3、创建yum仓库

    createrepo /var/www/html/openstack  

       #事先安装好createrepo程序,会生成repodata目录,里面保存了所有rpm包的元数据和依赖关系,创建好的repo源因为没有生成comps.xl文件,不能使用groupinstall,待后续学习

4、启动http服务

5、配置使用自建的yum仓库

7、测试使用


八、编译安装

源码:c,c++

1、编译安装的步骤

 1)拿到源代码并解压

 2)进入源码目录中

 3)执行configure脚本 # ./configure

 4)编译 # make

 5)安装 # make install

这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤:

./configure:

   是用来检查编译环境是否满足编译需求,并定义当前程序编译时启用哪个特性或功能,以及安装路径的定义等等,会根据Makefile.ini文件生成makefile文件

make:是用来编译的,它从Makefile中读取指令,然后编译。

make install:是用来安装的,它也从Makefile中读取指令,安装到指定的位置。


2、configure脚本的通用功能

我们需要定义的配置:

 1)指定安装路径

    --prefix=/usr/local/package_name

    --sysconfigdir=/etc/package_name

 2)指定启用或禁用的特性

    --enable-FEATURE    例如:--enable-fpm

    --disable-FEATURE

 3)指定所依赖功能,程序或文件

    启用某功能:--with-FUNCTION=该程序的安装路径

    禁用某功能:--without-FUNCTION

不同的程序,其configure脚本功能不同,要获取帮助:./configure --help


3、编译安装完成后续操作

 1)二进制程序的访问方法

   vim /etc/profile.d/apache.sh

      PATH=/usr/local/apache/bin:/usr/local/apache/sbin:$PATH  #将这行写进上面的文件

   expore PATH

   source /etc/profile.d/apache.sh

 2)头文件输出给系统

   ln -sv /usr/local/apache/include /usr/include/httpd

 3)让系统重新生成库文件路径缓存

   vim /etc/ld.so.conf.d/httpd.conf

     /usr/local/apache/lib      #将这行写进上面的文件

   ldconfig -v(显示详细信息)     #重新生成系统查找库文件路径的缓存/etc/ld.so.cache

   linux下的共享库机制采用了类似于高速缓存的机制,将库信息保存在/etc/ld.so.cache里边,程序连接的时候首先从这个文件里边查找,然后再到ld.so.conf的路径里边去详细找,这就是为什么修改了ld.so.conf要重新运行一下ldconfig的原因.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@Node3 ~]# ldconfig -v|grep '^[^[:space:]]'
/usr/local/lib:
/usr/lib64/mysql:
/usr/lib64/qt-3.3/lib:
/usr/lib/vmware-tools/lib32/libvmGuestLib.so:
/usr/lib/vmware-tools/lib64/libvmGuestLib.so:
/usr/lib/vmware-tools/lib32/libvmGuestLibJava.so:
/usr/lib/vmware-tools/lib64/libvmGuestLibJava.so:
/usr/lib/vmware-tools/lib32/libDeployPkg.so:
/usr/lib/vmware-tools/lib64/libDeployPkg.so:
/usr/lib64/xulrunner:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)

 4)导出man文件

   vim /etc/man.conf 

     MANPATH /usr/local/apache/man   #添加这行

或者直接使用命令:man -M /usr/local/apache/man apache


总结:

源码编译安装

  前提:准备好开发环境

  编译过程:

     ./configure

     make

     make install

  输出

    二进制程序    

    头文件

    库文件 

    man文档













本文转自xiexiaojun51CTO博客,原文链接:http://blog.51cto.com/xiexiaojun/1881301 ,如需转载请自行联系原作者


网友评论

登录后评论
0/500
评论
技术小甜
+ 关注