• Linux之软件包管理


    一,包管理器

    1.1 二进制应用程序的组成部分:

     二进制文件,库文件,配置文件,帮助文件

    1.2 程序包管理器

      debian : deb文件,dpkg包管理器

      redhat : rpm文件,rpm包管理器

      rpm : Redhat Package Manager 

    源代码: name-Version.tar.gz|bz2|xz

        Version :major.minor.release

    rpm 包命名方式:

    name-VERSION-release.arch.rpm

      VERSION         :major.minor.release

      release             :release.OS

      arch(常见的)

                x86 :i386,i486,i586,i686

                x86_64 :x64,x86_64,amd64

    包的分类:

      Application-VERSION-ARCH.rpm                      主包 

      Application-devel-VERSION-ARCH.rpm             开发子包 

      Application-utils-VERSION-ARHC.rpm                其它子包 

      Application-libs-VERSION-ARHC.rpm                 其它子包 

    包与包之间可能存在依赖关系,甚至循环依赖,因此,就拥有了一些解决依赖包的管理工具,比如:

      yum             :rpm 包管理器的前端工具

      apt-get         :deb包管理的前端工具

      zypper          :suse上的rpm前端管理工具

      dnf                :Fedora 18+(centos strea) rpm包管理前端管理工具

    库文件

    许多二进制程序运行时都依赖一些库文件,查看二进制程序所依赖的库文件:

     ldd /path/to/binaryfile

    管理和查看本机装载的库文件

    1.  ldconfig
    2.  ldconfig -p :显示本机已经缓存的所有可用库文件名及文件路径映射的关系

     配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf 

     缓存文件:/etc/ld.so.cache

    程序包管理器:

    将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装,卸载,查询,升级和校验等管理操作

    1,包文件组成(每个包独有)

     rpm包内的文件

     rpm的元数据,如名称,版本,依赖性,描述等

     安装或卸载时运行的脚本

    2,数据库(公共)

     程序包名称及版本

     依赖关系

     功能说明

     包安装后生成的各文件路径及校验码信息

    3,管理程序包的方式

     使用包管理器:rpm

     使用前端工具:yum,dnf

    4,获取程序包的途径

     a,系统发行版的光盘或官方的服务器

         CentOS镜像: 

        https://www.centos.org/download/ 

        http://mirrors.aliyun.com 

        http://mirrors.sohu.com 

        欢迎访问网易开源镜像站

     b,项目官方站点

     c,第三方组织

         Fedora-EPEL: Extra Packages for Enterprise Linux 

         Rpmforge:RHEL推荐,包很全 

         搜索引擎: 

         http://pkgs.org 

         http://rpmfind.net 

         http://rpm.pbone.net 

         https://sourceforge.net/ 

     d,自己制作

    注意:一定要检查其合法性,来源合法性,程序包的完整性

    二 rpm包管理及其详细命令

    centos系统上使用rpm命令管理程序包:

     安装,卸载,升级,查询,校验,数据库维护

    1,安装:

    rpm {-i,--install}[install-options]PACKAGE_FILE...

     -v :verbose 显示详细信息

     -vv : 显示更加详细的信息

     -h :以#显示程序包管理执行进度,每一个#代表2%

    rpm -ivh PACKAGE_FILE

    [install-options]

     --test :测试安装,但不真正的执行安装;dry run 模式

     --nodeps :忽略依赖关系(最后不要忽略,可能会造成程序执行的错误)

     --replacepkgs | replacefiles :重新安装

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

     --nodigest :不检查包完整性

     --noscripts :不执行程序脚本片段

     自带脚本,可分为四类 都不想执行 --noscripts

    preinstall 安装过程开始之前 %pre   --nopre

    postinstall 安装过程完成之后运行的脚本 %post    --nopost

    preuninstall 卸载过程真正开始执行之前运行的脚本 %preun   --nopreun 

    postuninstall 卸载过程完成之后运行的脚本 %postun    --nopostun

    2,rpm包升级

    1. rpm {-U|--upgrade}[install-opintos]package_file
    2. rpm {-F|--freshen}[install-opintos]package_file

     --upgrade:安装有旧版程序包,则升级;如果不存在旧版程序包,则安装;

     --freshen:安装有就版程序包,则升级;如果不存在就版程序包,则不执行升级操作

        

    1. rpm -Uvh package_file...
    2. rpm -Fvh package_file...

     --oldpackage :降级

     --force :强制升级

    注意:

    不要对内核进行升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核即可

    如果某源程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有的版本的配置文件,而是把新版本的配置文件重命名(filename.rpmnew)后提供

    3,rpm包信息查询----非常非常非常重要-----

    rpm {-q|--query}[select-options][query-opintos]

    [select-options]

    package_name :查询指定的程序包是否已经安装,及其版本

    -a,--all :查询所有已经安装过的包

    -f FILE :查询指定的文件由哪个程序包安装生成

    -p,--package package_file :用于实现对未安装的程序包执行查询操作

    --whatprovides CAPABILITY :查询指定的CAPANILITY由哪个程序包提供?

    --whatrequires CAPABILITY :查询指定的CAPANILITY被哪个包所依赖

    1. rpm2cpio 包文件|cpio –itv 预览包内文件 
    2. rpm2cpio 包文件|cpio –id  “*.conf” 释放包内文件

    复习一下命令: cpio

    cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以'.cpio'或者'.tar'结尾的文件

    1. cpio [选项] > 文件名或者设备名 
    2. cpio [选项] < 文件名或者设备名 

    选项:

     -o :将文件拷贝打包成文件或者将文件输出到设备上

     -i :解包,将打包文件解压或将设备上的备份还原到系统

     -t :预览,查看文件内容或者输出到设备上的文件内容

     -v :显示打包过程中的文件名称

     -d :解包生成目录,在cpio还原时,自动的建立目录

     -c :一种较新的存储方式

    [query-opintos]

    --changelog :查询rpm包的changelog

    -l,list:列出一个包安装生成的所有文件的列表

    -i,info:查询程序包相关的信息

    -c,--configfiles:查询指定的程序提供的配置文件

    -d,--docfiles :查询指定的程序包提供的文档

    --provides :列出指定的程序包提供的所有CAPABILITY

    -R,--requires :查询指定程序包的依赖关系

    --scripts :查看程序包自带的脚本程序

    用法:

    -qi package   #查询安装过程序的信息

    -qf file     #查询指定的文件由哪个程序包安装生成

    -qc package   #查询程序的配置文件

    -ql package   #查询程序安装后生成的所有文件

    -qd package   #查询程序安装后的文档

    4,卸载

    rpm {-e|--erase}[--allmatches][--nodeps][--noscripts][--test]package_name...

    --allmatches :卸载所有匹配指定名称的程序包的各版本

    --nodeps :忽略依赖关系

    --test :测试卸载,dry run 模式

    5,校验

    rpm -V package
    rpm {-V|--verify} [select-options] [verify-options]

      S file Size differs

           M Mode differs (includes permissions and file type)

           5 digest (formerly MD5 sum) differs

           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

    包来源合法性验证和完整性验证

    来源合法性验证:RSA

        完整性验证:SHA256

    公钥加密

        对称加密:加密,解密使用同一密钥

        非对称加密:密钥是成对的

            putlic key:公钥,公开所有人

            secret key:私钥,不能公开

    导入所需的公钥

     rpm  -K|checksig rpmfile 检查包的完整性和签名 

     rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 

     CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7 

     rpm -qa gpg-pubkey*

    rpm数据库

    数据库重建: /var/lib/rpm

    1. rpm {--initdb|--rebuilddb}
    2.  initdb: 初始化 如果事先不存在数据库,则新建之,否则,不执行任何操作 
    3.  rebuilddb:重建 无论当前存在与否,直接重新创建数据库

    二 yum相关操作及其命令

    yum :全称 Yellowdoy Update Modifier ,rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包,up2date的替代工具

    yum repository : yum repo ,存储了众多rpm包,以及包相关的元数据文件(放置于特定目录repodata下)

    文件服务器:

      ftp://

      http://

      file:///

    1,yum配置文件

    yum客户端配置文件:可以通过命令 rpm -qc yum 来查看配置文件路径

    1.  /etc/yum.conf :为所有仓库提供公共配置
    2.  /etc/yum.repos.d/*.repo :为仓库的指向提供配置

    仓库指向的定义:

    1. [repositoryID]
    2. name=Some name for this repository
    3. baseurl=url://path/to/repository/
    4. enable={1|0}
    5. gpgcheck={1|0}
    6. gpgkey=URL
    7. enablegroups={1|0}
    8. failovermethod={roundrobin|priority} #默认为 roundrobin 随机挑选
    9. cost= #默认为1000  越小,优先级越高

    2,yum命令的用法

    yum [options] [command] [package ...]
    1. yum-config-manager --disable NAME :禁用仓库名为NAME的仓库
    2. yum-config-manager --enable NAME :启用仓库

    显示仓库列表: 

    yum reportlist [all|enabled|disable]

    显示程序包: 

    1. yum list [all | glob_exp1] [glob_exp2] [...]
    2. yum list {available|installed|updates} [glob_exp1] [...]

    安装程序包

    1. yum install package1 [package2] [...]
    2. yum reinstall package1 [package2] [...] (重新安装,基于覆盖方式安装)

    升级程序包:

    1. yum update [package1] [package2] [...] (升级)
    2. yum downgrade package1 [package2] [...] (降级)

    检查可用升级:

    yum check-update

    卸载程序包:

    yum remove | erase package1 [package2] [...]

    查看程序包information

    yum info [...]

    查看指定的特性(可以是某个文件)是由哪个程序包所提供:

    yum provides | whatprovides feature1 [feature2] [...]

    q本地缓存:

    yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

    构建缓存:

    yum makecache [fast]

    搜索:

    1. yum search string1 [string2] [...]
    2. 以指定关键字搜索程序包名及summary信息

    查看指定包所依赖的CAPABILITIES:

    yum deplist package1 [package2] [...]

    查看yum事务历史

    yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    1. yum history info 6  #查看详细信息
    2. yum history undo 6  #撤销id为6的所做的所有更改

    日志 :/var/log/yum.log

    安装及升级本地程序包:

    yum localinstall rpmfile1 [rpmfile2] [...]  (maintained for legacy reasons only - use install)
    yum localupdate rpmfile1 [rpmfile2] [...] (maintained for legacy reasons only - use update)

    包组管理的相关命令:

    1. yum groupinstall group1 [group2] [...]
    2. yum groupupdate group1 [group2] [...]
    3. yum grouplist [hidden] [groupwildcard] [...]
    4. yum groupremove group1 [group2] [...]
    5. yum groupinfo group1 [group2] [...]

    如何使用光盘当作本地yum仓库

     1,挂载光盘至某目录,例如 /media/cdrom

    mount -r /dev/sr0 /media/cdrom/

     2,创建配置文件

    1. [locate]
    2. name=
    3. baseurl=
    4. gpgcheck=
    5. enabled=

    yum 的命令行选项:

    --nogpgcheck : 禁止进行gpg check ;

    -y :自动回答为yes

    -q :静默模式

    --disablerepo=repoidglob : 临时禁用此处指定的repo;

    --enablerepo=repoidglob :临时启用指定的repo

    --noplugins :禁止所有插件

    yum的repo配置文件中可用的变量:

    $releasever :当前OS的发行版的主版本号

    $arch :平台

    $basearch :基础平台

    $YUM0-$YUM9 :自定义变量

    比如: http://mirrors.aliyun.com/centos/$releasever/$basearch/os

    创建yum仓库:

    lftp 登陆到远程ftp,

    通过 !mkdir /yum/repo 创建本地目录,

    通过 lcd /yum/repo  进入本地目录,

    通过 mget *.rpm 将远程的rpm包下载到 /yum/repo 目录下

    1. createrepo 目录 # createrepo /yum/repo 直接创建
    2. createrepo [options]

    程序包编译安装:

    testapp-VERSION-release.src.rmp --> 安装后,使用rpmbuild 命令制作成二进制rpm包,而后再安装

    源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行

    源代码组织格式:

    多文件:文件中的代码之间,很可能存在跨文件依赖关系;

    C,C++ :make (configure --> Makefile.in --> makefile)

    java :maven 

    编译安装三个步骤

    1, ./configure 

    a,通过选项传递参数,指定启用特性,安装路径等:执行时,会参考用户的指定以及Makefile.in文件生成makefile;

    b,检查依赖到的外部环境

    2, make

    根据makefile文件,构建应用程序;

    3, make install

    复制文件到相应路径

    开发工具:

    autoconf :生成configure脚本

    automake :生成Makefile.in

    建议:安装前查看INSTALL,README

    开源程序源代码的获取:

    官方自建站点

    代码托管:

    SourceForge

    Github.com

    code.google.com

    c/c++ :gcc (GNU C Complier)

    编译C源代码:

    前提:提供开发工具及开发环境

    开发工具:make,gcc等

    开发环境:开发库,头文件

    glibc:标准库

    通过“包组”提供开发组件

    第一步:configure脚本

    选项:指定安装位置,指定启用的特性

    --help :获取其支持使用的选项

    选项分类:

    安装路径设定:

    --prefix=/PATH/TO/SOMEWHERE:指定默认安装位置  默认为/usr/local

    --sysconfdir=/PATH/TO/SOMEWHERE :指定配置文件的位置

    System types:

    Optional Features:可选特性

    --disable-FEATURE 

    --enable-FEATURE[=ARG]

    Optional Packages:可选包

    --with-PACKAGE[=ARG]

    --without-PACKAGE

    第二步:make

    第三步:make install

    安装后的配置:

    1,导出二进制程序目录至PATH环境变量中

    编辑文件 /etc/profile.d/NAME.SH

    export PATH=/PAHT/TO/BIN:$PATH

    2,导出库文件路径

    编辑文件 /etc/ld.so.conf.d/NAME.conf

    添加新的库文件所在目录至此文件中

    让系统重新生成缓存:

    ldconfig [-v]

    3,导出头文件默认在/user/include/目录下

    基于链接的方式实现:

    ln -sv 

    4,导出帮助手册

    编辑 /etc/man.conf 文件

    MANPATH /FILE/TO/MAN



    练习:

    1、yum的配置和使用;包括yum repository的创建 

    1. [root@centos7 bin]# lftp 10.1.0.1
    2. lftp 10.1.0.1:/pub/Sources/7.x86_64> cd zabbix/
    3. lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> ls
    4. -rw-r--r--    1 500      500      144896000 Nov 11  2015 alert-agent-4.0.1-RC4.tar.gz
    5. -rw-r--r--    1 500      500        293144 Nov 11  2015 trousers-0.3.11.2-4.el7_1.x86_64.rpm
    6. -rw-r--r--    1 500      500        295992 Feb 27 06:19 trousers-0.3.13-1.el7.x86_64.rpm
    7. drwxr-xr-x    3 0        0            4096 May 16 07:42 x86_64
    8. -rwxr--r--    1 500      500        774903 May 16 08:01 zabbix_agents_2.2.9.win.zip
    9. -rwxr--r--    1 500      500        861877 May 16 08:01 zabbix_agents_3.0.0.win.zip
    10. lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> lmkdir /testdir/repodb
    11. Unknown command `lmkdir'.
    12. lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> !mkdir /testdir/repodb  #在本地创建一个文件夹
    13. lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> lcd /testdir/repodb/    #切换本地路径
    14. lcd ok, local cwd=/testdir/repodb
    15. lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> mget * .
    16. mget: Access failed: 550 Failed to open file.                      
    17. 147121916 bytes transferred in 2 seconds (88.69M/s)
    18. Transfer of 1 of 6 files failed
    19. lftp 10.1.0.1:/pub/Sources/7.x86_64/zabbix> bye
    20. [root@centos7 bin]# cd /testdir/repodb/
    21. [root@centos7 repodb]# ll
    22. total 143684
    23. -rw-r--r--. 1 root root 144896000 Nov 11  2015 alert-agent-4.0.1-RC4.tar.gz
    24. -rw-r--r--. 1 root root    293144 Nov 11  2015 trousers-0.3.11.2-4.el7_1.x86_64.rpm
    25. -rw-r--r--. 1 root root    295992 Feb 27 14:19 trousers-0.3.13-1.el7.x86_64.rpm
    26. -rw-r--r--. 1 root root    774903 May 16 16:01 zabbix_agents_2.2.9.win.zip
    27. -rw-r--r--. 1 root root    861877 May 16 16:01 zabbix_agents_3.0.0.win.zip
    28. [root@centos7 repodb]# createrepo .
    29. Spawning worker 0 with 1 pkgs
    30. Spawning worker 1 with 1 pkgs
    31. Workers Finished
    32. Saving Primary metadata
    33. Saving file lists metadata
    34. Saving other metadata
    35. Generating sqlite DBs
    36. Sqlite DBs complete
    37. [root@centos7 repodb]# ll
    38. total 143688
    39. -rw-r--r--. 1 root root 144896000 Nov 11  2015 alert-agent-4.0.1-RC4.tar.gz
    40. drwxr-xr-x. 2 root root      4096 Aug 22 22:05 repodata    #通过createrepo创建出来的数据文件
    41. -rw-r--r--. 1 root root    293144 Nov 11  2015 trousers-0.3.11.2-4.el7_1.x86_64.rpm
    42. -rw-r--r--. 1 root root    295992 Feb 27 14:19 trousers-0.3.13-1.el7.x86_64.rpm
    43. -rw-r--r--. 1 root root    774903 May 16 16:01 zabbix_agents_2.2.9.win.zip
    44. -rw-r--r--. 1 root root    861877 May 16 16:01 zabbix_agents_3.0.0.win.zip
    45. [root@centos7 repodb]# vim /etc/yum.repos.d/minebase.repo
    46. [minedb]
    47. name=mine repo db
    48. baseurl=file:///testdir/repodb
    49. gpgcheck=0
    50. [root@centos7 repodb]# yum repolist
    51. BDB2053 Freeing read locks for locker 0xa8: 87680/140405761406784
    52. BDB2053 Freeing read locks for locker 0xaa: 87680/140405761406784
    53. BDB2053 Freeing read locks for locker 0xab: 87680/140405761406784
    54. BDB2053 Freeing read locks for locker 0xac: 87680/140405761406784
    55. Loaded plugins: fastestmirror, langpacks
    56. Loading mirror speeds from cached hostfile
    57.  * base: mirrors.tuna.tsinghua.edu.cn
    58.  * extras: mirrors.yun-idc.com
    59.  * updates: mirrors.yun-idc.com
    60. repo id                                     repo name                                                      status
    61. base/7/x86_64                                CentOS-7 - Base                                                9,007
    62. extras/7/x86_64                                CentOS-7 - Extras                                                375
    63. minedb                                    mine repo db                                                       2
    64. updates/7/x86_64                           CentOS-7 - Updates                                             2,297
    65. repolist: 11,681
    66. [root@centos7 repodb]# yum install trousers

    2、编译安装apache 2.2,并启动此服务
     

    1,先登陆ftp服务器获取源码包,发现lftp命令不存在,通过yum安装

    2,/pub/Sources/sources/httpd/下httpd源码

    3,解压

    4,发现有报错,提示缺少APR

    5,发现缺少 apr pcre apr-util 三个包

    直接从网络获取,下载自己所需要的包

    1.    wget http://archive.apache.org/dist/apr/apr-1.4.5.tar.gz  
    2.    wget http://archive.apache.org/dist/apr/apr-util-1.3.12.tar.gz  
    3.    wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.10/pcre-8.10.zip  

    6,先解压编译安装apr包,然后在安装其他两个包

    安装时如果提示缺失什么包,然后在编译命令后加上 

    1.  --with-apr=/usr/local/apr
    2.  --with-apr-util=/usr/local/apt-util
    3.  --with-pcre=/usr/local/pcre

    提示缺失哪一个就添加哪一个,三个可以同时添加

    比如我安装时的问题

    7,安装时务必保证没有其他错误提示,若有错误,要解决,否则可能会失败

    8,启动apache服务

    1. cd /usr/local/apache2/bin
    2. apachectl start

    查看80端口处于监听状态

    9,测试

    发现电脑不能访问,原来没有关闭防火墙

    iptables -F  #临时关闭防火墙

    然后测试成功

    10,安装后配置

    1,导出二进制程序目录至PATH环境变量中

    编辑文件 vim /etc/profile.d/apache2.sh添加内容如下

    PATH=$PATH:/usr/local/apache2

          

    2,导出库文件路径

    编辑文件 vim /etc/ld.so.conf.d/apache2.conf 添加内容如下

    1. /usr/local/pcre/lib/
    2. /usr/local/apr-util/lib/
    3. /usr/local/apr-util/lib/

    让系统重新生成缓存:

    ldconfig [-v]

    3,导出头文件

    基于链接的方式实现:

    ln -s /usr/local/apache2/include/ apache2

    4,导出帮助手册

    编辑 vim /etc/man_db.conf 文件

    MANDATORY_MANPATH           /usr/local/apache2/man

       

  • 相关阅读:
    浏览器指定DNS
    Android组件通信——消息机制(二十六)
    golang设计模式——职责链模式
    IntelliJ IDEA 2023.2 主要更新了什么?(图文版)
    3.旅行家-完全背包
    大华相机C#学习之IStream类
    【杂记-浅谈OSPF协议中的Router ID】
    在IDEA 中的配置Tomcat
    python---协程与任务详解
    电子战基本概念 (01)
  • 原文地址:https://blog.csdn.net/ly1358152944/article/details/126298468