首页 > 代码库 > 【linux基础】16、软件包管理

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

一、软件包概述

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...

[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可以使用选项这里都可以使用  

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

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

[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:不检查完整性

[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

     yum repositories

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

repository:仓库

                1、各rpm包

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

                ftp,http,nfs,file


yum客户端工作机制:

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

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

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

    4、执行具体操作


2、yum配置

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

yum的配置文件:

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

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

配置文件格式:由两段组成,类似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


3、yum的使用

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

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

yum 缓存路径/var/cache/yum 

yum makecache 生成缓存 

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

yum grouplist

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

yum groupinfo


三个跟开发相关的包组:

Desktop Platform Development:有图形程序时需要安装此组

Server Platform Development

Development Tools

 

安装:yum install,yum groupinstal

重装:yum reinstall 

卸载:yum [remove|erase],yum greoupremove

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

要升级到指定版本:yum update x-4.4.12-1el7.x86_64.rpm

升级:yum update  

降级:downgrade pack_name

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

查看yum的命名历史:yum history


yum配置文件中可用的宏

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

  $arch:系统架构

  $basharch:系统基本架构,如i686,i586等的基本架构为i386

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


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

1. 安装yum-downloadonly或 yum-plugin-downloadonly 软件包。


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

yum install xxx --downloadonly --downloaddir=/xxx -y

[root@ElementServer puppet-3.7]# rpm -qa|grep yum

yum-plugin-fastestmirror-1.1.30-14.el6.noarch

yum-3.2.29-40.el6.centos.noarch

yum-metadata-parser-1.1.2-16.el6.x86_64

[root@ElementServer puppet-3.7]# yum install yum

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

 * base: mirrors.pubyun.com

 * epel: mirrors.yun-idc.com

 * extras: centos.ustc.edu.cn

 * rpmforge: ftp.kddilabs.jp

 * updates: centos.ustc.edu.cn

Setting up Install Process

Resolving Dependencies

--> Running transaction check

---> Package yum.noarch 0:3.2.29-40.el6.centos will be updated

---> Package yum.noarch 0:3.2.29-69.el6.centos will be an update

--> Finished Dependency Resolution


Dependencies Resolved


===================================================================================

 Package      Arch            Version                          Repository     Size

===================================================================================

Updating:

 yum          noarch          3.2.29-69.el6.centos             base          1.0 M


4、自己设置本地repo源

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

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

3、创建yum仓库

   createrepo /var/www/html/openstack  事先安装好createrepo程序,创建好的repo源因为没有生成comps.xl文件,不能使用groupinstall,待后续学习

   4.启动http服务

   5.配置实用自建的yum仓库

   7.测试使用



五、编译安装

源码:c,c++

      perl

      python


编译安装的步骤:

  1、拿到源代码并解压

  2、进入源码目录中

  3、执行configure脚本 # ./configure

  4、编译  # make

  5、安装  # make install


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

./configure:是用来

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

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


1、configure,这一步一般用来生成 Makefile,为下一步的编译做准备,会检测你的安装平台的目标特征,自动设定源程序以符合各种不同平台上系统的特性,并且根据系统叁数及环境产生合适的Makefile文件或是C的头文件(header file),让源程序可以很方便地在这些不同的平台上被编译连接。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。

你可以通过在 configure 后加上参数来对安装进行控制,

比如代码:./configure –prefix=/usr 意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 –sys-config= 参数进行设定。有一些软件还可以加上 –with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure –help 察看详细的说明帮助。

2、make,这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。

3、make insatll,这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)。


到此时,就可以运行make进行编译,在运行make install进行安装了,最后运行make clean删除临时文件。

$ make

$ make install           (注:运行这个要有足够的权限)

$ make clean

利用configure所产生的Makefile文件有几个预设的目标可供使用,其中几个重要的简述如下:

make all:产生我们设定的目标,即此范例中的可执行文件。只打make也可以,此时会开始编译原始码,然后连结,并且产生可执行文件。

make clean:清除编译产生的可执行文件及目标文件(object file,*.o)。

make distclean:除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。

make install:将程序安装至系统中。如果原始码编译无误,且执行结果正确,便可以把程序安装至系统预设的可执行文件存放路径。如果用bin_PROGRAMS宏的话,程序会被安装至/usr/local/bin这个目录。

make dist:将程序和相关的档案包装成一个压缩文件以供发布。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。 PACKAGE和VERSION这两个变数是根据configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。在此范例中会产生test-1.0.tar.gz的档案。

make distcheck:和make dist类似,但是加入检查包装后的压缩文件是否正常。这个目标除了把程序和相关文件包装成tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并且进行make all 的动作,确认编译无误后,会显示这个tar.gz文件可供发布了。这个检查非常有用,检查过关的包,基本上可以给任何一个具备GNU开发环境-的人去重新编译。


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


二进制程序的访问方法

/etc/profile.d/apache.sh

PATH=/usr/local/apache/bin:/usr/local/apache/sbin:$PATH

expore PATH


source /etc/profile.d/apache.sh


头文件输出给系统

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

    

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

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

    /usr/local/apache/lib

    ldconfig

 

导出man文件

     /etc/man.conf 

添加 MANPATH /usr/local/apache/man


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


总结:源码编译安装

  前提:准备好开发环境

  编译过程:

     ./configure

     make

     make install

   输出

     头文件

     库文件

     二进制程序

     man文档


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