今天完整的学完了关于程序包管理的知识。

下面梳理一下学习的知识。

 


 

一个程序想要在机器上运行,大致经历一下几个过程:

程序源代码->预处理->编译->汇编->机器能读懂的指令格式

而在汇编过程中,除了要将源代码汇编,还将要源代码调用的库文件进行汇编;

  • 静态编译:程序源代码自己工程中带有库。但这种方式就有弊端。就比如100个源代码都带有相同的库文件,得不偿失。
  • 共享编译:源代码直接调用/lib,/lib64等目录下的共享库文件即可。(.so结尾)

 


 

ABI:(Application Binary Interface)应用二进制接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行

目标源代码在不同平台上编译为二进制代码之后:

  • linux: .ELF 结尾
  • Window: .exe 结尾

API:(Application Programming Interface)

只要遵循POSIX,操作系统就可以移植

因此就有了库级别的虚拟化,虚拟了操作系统的运行环境。运用API转换技术实现

eg:Linux中的WINE,能够支持Window的程序。只要将该程序相关的DLL库文件引入linux中即可。

 


 

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

二进制文件:位于/bin, /sbin, /usr/bin, /usr/bin, /usr/sbin, /usr/local/bin etc

库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib ,/usr/local/lib64 .(note:系统是32位的没有lib64文件)

配置文件:/etc, /usr/local/etc etc ..

帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc

所以在真正安装一个二进制程序时,上述组成部分到底放在哪个位置?因此就有了程序包管理器

 


 

程序包管理器:

redhat:rpm(redhat package manager)管理rpm包(以.rmp结尾的包)

    

不同程序包的命名方式:

源代码软件包:(需要手动编译安装)

  name-VERSION.tar.gz

    VERSION:主版本号.次版本号.发行号

rmp包:

  name-VERSION-release.arch.rpm

    VERSION:主版本号.次版本号.发行号

    release:常见写法为release.os

    arch:平台,eg:i386,i486,i586;x86_64,x64,amd64;ppc;noarch

  eg:bash-4.3.2-1.centos.i386.rpm

 

如果一个应用程序大部分用户只使用一部分95%功能,而只有少部分用户使用剩下的5%,因为可以只将95%的功能汇编成二进制代码。

因此就出现了拆包。拆为主包和次包。因此就出现了包与包之间的依赖关系。

 

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

使用yum在安装程序包时,它能够自动查找源数据文件并获取到包之间的依赖关系,而且能在指定的包仓库中去下载依赖包。

  

两个和库有关的命令:

ldd /PATH/TO/BINARY_FILE :查看二进制程序所依赖的库文件

ldconfig -p :显示本机已缓存的所有可用库文件名以及文件路径的映射文件

      ldconfig 还可以改变配置后,让系统重新生成缓存然后读取

      配置文件所在目录:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

      缓存文件所在目录:/etc/ls.so.cache

 

程序包管理:

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

程序包的组成:

  • 程序的组成清单(每个包都有各自的组成清单)
    • 文件清单
    • 安装或卸载时运行的脚本
  •  数据库(公共)
    • 程序包名称以及版本
    • 依赖关系
    • 功能说明
    • 安装生成的文件的文件路径以及校验码信息(防止第三方更改)

管理程序包的方式:

  • 使用包管理器:rpm
  • 使用前端工具:yum,dnf

 

CentOS系统上rpm命令管理程序包

  安装,卸载,升级,查询,校验,数据库维护。(使用直接查看 man rpm)

  注意:rmp命令执行安装操作时不会安装依赖包

 

CentOS系统上yum命令管理程序包(类似于C/S架构)

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

      文件服务器类型:ftp://, http://, file:///, nfs://

  yum客户端:

    配置文件:

       /etc/yum.conf:为所有仓库提供公共配置 (eg:缓存文件放在哪里)

       /etc/yum.repos.d/*.repo:为仓库的指向提供配置信息

1 [root@VM_11_5_centos etc]# cd yum.repos.d/
2 [root@VM_11_5_centos yum.repos.d]# ll
3 total 12
4 -rw-r--r-- 1 root root 614 Jul 25 18:43 CentOS-Base.repo
5 -rw-r--r-- 1 root root 230 Jul 25 18:43 CentOS-Epel.repo
6 -rw-r--r-- 1 root root 245 Sep  3 08:28 centos-local.repo.bak

    自定义仓库

      格式:

        [repositoryID]

        name=

        baseurl=url://PATH/TO/repository(即repodata所在的目录,可设置多个)

        enabled={1|0} 是否启用本仓库,默认启动1

        gpgcheck={1|0}对此仓库中的所有程序包安装前是否检查其完整性及来源合法性

        gpgkey=URL 指明密钥文件。(能访问到密钥文件的访问路径,可能是对方仓库提供多个)

        enablegroups={1|0}是否允许在此仓库上基于组执行程序包管理

        failovermethod={"roundrobin"|"priority"}故障转移方法。roundrobin:随机,priority:次序

        cost=[1000]开销。默认1000

 


 

yum命令的用法(man yum)

 


 

程序包的编译安装:

  1. ./configure
  2. make
  3. make install
  • ./configure(具体选项查看命令使用方法)
    • 通过选项传递参数,指定启动特性,安装路径等。执行时会参考用户的指定以及Makefile.in文件生成makefile文件
    • 检查依赖到的外部环境(如果某个依赖包不存在,则报错,下一步不能执行)
  • make:
    • 根据makefile文件构建应用程序
  • make install
    • 把构建好的应用程序的二进制文件放到二进制安装路径下,库文件方法哦指定的库文件中等

建议:安装之前查看INSTALL,README文档

安装后的配置:

  • 导出二进制程序目录至PATH环境变量中,否则只能使用绝对路径来访问
    • 编辑文件/etc/profile.d/*.sh
    • export PATH=/PATH/TO/BINARY:$PATH
  • 导出库文件路径
    • 编辑/etc/ld/so/conf.d/*.conf,把库文件路径直接添加进去即可
    • 让系统重新生成缓存 ldconfig [-v]
  • 导出头文件
    • 基于软链接的方式实现即可 ln -sv ..
  • 导出帮助手册
    • 编辑/etc/man.config文件,添加一个manpath即可,会立即生效。

 

编译安装具体执行见下一篇;P  ---by:孙好烦

 

      

posted on 2018-09-03 15:11  孙好烦  阅读(220)  评论(0编辑  收藏  举报