程序包管理

一:程序包概述

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

GPL:源码(c,c++)

POSIX规范:移植性,

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

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

:(函数\功能)可执行程序,本身不能作为程序执行的入口,但可以被调用  (编译好的二进制格式)

程序:预编译,编译,汇编,链接

      静态:程序包含静态库,

      动态:so(shared object) 调用系统共享库

注意:程序的可移植要求

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

        2、硬件平台,应用程序必须为特定的cpu所支持

程序包组成部分

二进制程序:/bin,/sbin,/usr/bin,/usr/sbin

库文件:/lib64,/usr/lib64  指定系统查找库文件的路径:/etc/ld.so.conf  /etc/ld.so.conf.d/*.conf

配置文件:/etc/

帮助文档:man,info


ldd命令:

    查看程序所依赖的共享库

     ldd [options] FILE...

     函数名(参数),头文件,保存在/usr/include中的*.h文件

[root@xxj ~]# ldd $(which ls)
alias:
ldd: ./alias: No such file or directory
ls='ls:
ldd: ./ls='ls: No such file or directory
--color=auto':
ldd: ./--color=auto': No such file or directory
/bin/ls:
        linux-vdso.so.1 =>  (0x00007fff595f7000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fd004872000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fd00466a000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007fd004465000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007fd00425d000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fd003ec9000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fd003cc4000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd004a99000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd003aa7000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007fd0038a2000)

man COMMAND

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

      /usr/share/man

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

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

  

二、应用程序管理器

1、程序包管理器

        数据库

               软件名和版本,安装生成的各文件路径,名称,效验码,依赖关系

        提供程序组成格式

                文件清单

                安装卸载时运行的脚本

                

2、包管理器的基本功能 

       打包,安装,查询,升级,卸载,效验,数据库管理

   

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

3、前端管理器(自动解决依赖关系)

        apt-get:

        yum: 


4、应用程序的安装方式

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

       包管理器的前端工具:

       源代码编译:

       简单打包的二进制格式:                    



5、包命名格式:

源程序:  

name-version.tar.gz

     version:major.minor.release

rpm包

name-version-release.ARCH.rpm

release:通常包含rpm的制作发行号,还包含使用的OS

例: bash-4.2.4-1.el7.x86.rpm


分包:把一个复制的程序打包制作成多个rpm格式

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

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



6、如何获取程序包

1、发行商提供的程序包

2、Fedora-EPEL

3、项目的官方站点

4、搜索引擎

   http://rpmfind.net

   http://rpm.phome.net

   http://pkgs.org

    

三、rpm包的使用

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

安装:(包全名

     格式  # rpm -i /PATH/TO/RPM_PACKAGE ... 


         -i,--install:安装    

                    -v:显示详细信息,-vv

        -h (或 --hash): 以#的个数显示安装进度

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

                        --nodeps:忽略依赖关系

                    --replacepgs:重装  

                    --oldpackage:降级

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

升级:

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

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

              --force:强制升级

              --nodeps:

注意:不要对内核执行升级操作

      多版本内核可并存,因此,建议执行安装操作


卸载:(指定包名即可)

    rpm -e 

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

1、把依赖者一同卸载

2、忽略依赖关系

3、不再卸载

安装:
[root@xxj Packages]# rpm -q zip-3.0-1.el6.x86_64.rpm 
package zip-3.0-1.el6.x86_64.rpm is not installed
[root@xxj Packages]# rpm -i zip
error: open of zip failed: No such file or directory
[root@xxj Packages]# rpm -i zip-3.0-1.el6.x86_64.rpm 
[root@xxj Packages]# rpm -q zip-3.0-1.el6.x86_64.rpm 
package zip-3.0-1.el6.x86_64.rpm is not installed
卸载:
[root@xxj Packages]# rpm -e zip-3.0-1.el6.x86_64.rpm  
error: package zip-3.0-1.el6.x86_64.rpm is not installed
-vh的效果:
[root@xxj Packages]# rpm -e zip
[root@xxj Packages]# rpm -q zip-3.0-1.el6.x86_64.rpm 
package zip-3.0-1.el6.x86_64.rpm is not installed
[root@xxj Packages]# rpm -iv zip-3.0-1.el6.x86_64.rpm 
Preparing packages for installation...
zip-3.0-1.el6
[root@xxj Packages]# rpm -e zip
[root@xxj Packages]# rpm -ivh zip-3.0-1.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zip                    ########################################### [100%]
升级:
[root@xxj Packages]# rpm -Uvh zip
error: open of zip failed: No such file or directory
[root@xxj Packages]# rpm -Uvh zip-3.0-1.el6.x86_64.rpm 
Preparing...                ########################################### [100%]
        package zip-3.0-1.el6.x86_64 is already installed
[root@xxj Packages]#


查询:

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

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

       -qi  查询rpm包的描述信息

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

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

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

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

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

    preinstall:安装前脚本

    postinstall:安装后脚本

    preuninstall:卸载前脚本

    postuninstall:卸载后脚本

  rpm -qp (包全名)  查询当前系统中没有安装的rpm相关信息

[root@xxj Packages]# rpm -q zsh-4.3.11-4.el6.centos.x86_64.rpm 
package zsh-4.3.11-4.el6.centos.x86_64.rpm is not installed
[root@xxj Packages]# rpm -q zsh
zsh-4.3.11-4.el6.centos.x86_64
[root@xxj Packages]# rpm -q zsh*
package zsh-4.3.11-4.el6.centos.x86_64.rpm is not installed
[root@xxj Packages]# rpm -qa |grep zsh
zsh-4.3.11-4.el6.centos.x86_64
[root@xxj Packages]# rpm -q bin*
package bind-9.8.2-0.37.rc1.el6.x86_64.rpm is not installed
package bind-chroot-9.8.2-0.37.rc1.el6.x86_64.rpm is not installed
package bind-dyndb-ldap-2.3-8.el6.x86_64.rpm is not installed
package bind-libs-9.8.2-0.37.rc1.el6.x86_64.rpm is not installed
package bind-utils-9.8.2-0.37.rc1.el6.x86_64.rpm is not installed
package binutils-2.20.51.0.2-5.43.el6.x86_64.rpm is not installed
package binutils-devel-2.20.51.0.2-5.43.el6.x86_64.rpm is not installed
[root@xxj Packages]# rpm -qa|grep bin
samba-winbind-clients-3.6.23-20.el6.x86_64
samba-winbind-3.6.23-20.el6.x86_64
binutils-2.20.51.0.2-5.43.el6.x86_64
[root@xxj Packages]# rpm -qi zsh
Name        : zsh                          Relocations: (not relocatable)
Version     : 4.3.11                            Vendor: CentOS
Release     : 4.el6.centos                  Build Date: Fri 24 Jul 2015 05:41:25 PM CST
Install Date: Mon 07 Sep 2015 01:39:55 AM CST      Build Host: c6b8.bsys.dev.centos.org
Group       : System Environment/Shells     Source RPM: zsh-4.3.11-4.el6.centos.src.rpm
Size        : 5283457                          License: BSD
Signature   : RSA/SHA1, Sat 25 Jul 2015 04:41:32 AM CST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://zsh.sunsite.dk/
Summary     : A powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor.  Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements.  Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
[root@xxj Packages]# rpm -ql zsh
[root@xxj Packages]# rpm -qf $(which cat)
coreutils-8.4-37.el6.x86_64
[root@xxj Packages]# rpm -q --scripts zsh
[root@xxj Packages]# rpm -qip gcc
error: open of gcc failed: No such file or directory
[root@xxj Packages]# rpm -qip gcc-4.4.7-16.el6.x86_64.rpm  
Name        : gcc                          Relocations: (not relocatable)
Version     : 4.4.7                             Vendor: CentOS
Release     : 16.el6                        Build Date: Thu 23 Jul 2015 10:43:01 AM CST
Install Date: (not installed)               Build Host: c6b8.bsys.dev.centos.org
Group       : Development/Languages         Source RPM: gcc-4.4.7-16.el6.src.rpm
Size        : 19496512                         License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions
Signature   : RSA/SHA1, Sat 25 Jul 2015 04:41:11 AM CST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://gcc.gnu.org
Summary     : Various compilers (C, C++, Objective-C, Java, ...)
Description :
The gcc package contains the GNU Compiler Collection version 4.4.
You'll need this package in order to compile C code.

效验

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

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@xxj Packages]# rpm -V wget 
S.5....T.    /usr/share/locale/zh_TW/LC_MESSAGES/wget.mo


3、rpm包管理:检验来源合法性和软件包完整性

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

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

命令:gpg,pgp

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

rpm --import 公钥

  

rpm -K /PATH/TO/PACKAGE_FILE

rpm --checksig /PATH/TO/PACK_FILE

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


4、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-downloadonly
yum install xxx --downloadonly --downloaddir=/xxx -y

说明:yum-downloadonly是yum的一个插件,使得yum可以从RHN或者yum的仓库只下载包而不安装。

安装完成后,查看/etc/yum/pluginconf.d/downloadonly.conf 配置文件的内容,确认这个插件已经启用:

[main]       注意:如果没有该配置文件要自己创建

enabled=1


[root@xxj 6]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id                               repo name                                   status
CentOS6                               CentOS6_cdrom                               6,575
repolist: 6,575
[root@xxj 6]# 

[root@xxj 6]# yum info gcc
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available Packages
Name        : gcc
Arch        : x86_64
Version     : 4.4.7
Release     : 16.el6
Size        : 10 M
Repo        : CentOS6
Summary     : Various compilers (C, C++, Objective-C, Java, ...)
URL         : http://gcc.gnu.org
License     : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions
Description : The gcc package contains the GNU Compiler Collection version 4.4.
            : You'll need this package in order to compile C code.


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 �Cprefix=/usr 意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 �Csys-config= 参数进行设定。有一些软件还可以加上 �Cwith、�Cenable、�Cwithout、�Cdisable 等等参数对编译加以控制,你可以通过允许 ./configure �Chelp 察看详细的说明帮助。

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文档


你可能感兴趣的:(软件包管理)