程序是什么?指令+数据也好,算法+数据结构也罢。它的存在形式有两种:

    1.源代码:包含了整个应用程序的编程语言的所有代码的文本文件

    2.二进制:将源代码经过一系列转换之后得到的直接执行的文件

其中,使用源代码安装的过程如下:

  预处理(用到预处理器) --> 编译(编译器) --> 字节码Bitcode 进行汇编(汇编器) --> systemcall直接运行;libcall需要链接(链接器);最终得到可执行的二进制程序文件

  汇编时,不一样的硬件往往不能兼容互通。因此诞生了一个国际化标准:

  POSIX:Portable Operating System  可移植操作系统。至于IX是向unix致敬一下下

  最终二进制文件到底能不能执行,取决于计算机的ABI接口。在不同OS上有着明显的差异,类unix系统上,ABI往往是ELF格式,如果是Windows系列 ;一般是exe或者msi格式.

我们再来回顾一下编程语言的分类

应用级编程语言:

    Java(做应用程序很强,做系统菜鸡)

      hadoop2-大数据处理平台,hbase-数据库,ELK-日志查询和分析检索系统

      这些软件运行环境需要专有的一个环境叫:JVM

    Python(离底层硬件距离太远,刚开始太消耗系统资源。现在来说,消耗已经可以忽略了 )

      Openstack--云栈,saltstack--自动化运维管理工具 运行环境:PVM

    perl、ruby(日本流行,开发很多曾经的经典游戏。)

    PHP、go

    而JVM PVM 和其他应用级语言所需要的解释器,都是由C语言开发的;

系统级编程语言:

    C/C++

      Linux、Unix的内核编程语言

      编译开发环境:预处理器、编译器、头文件、开发库文件(能够让编译库运行的库)

    (而像Java或者Python等应用级语言的开发环境:预处理器、编译器、开发库文件;)

通常情况下,源代码文件有多个,这些文件之间存在着一定的关联关系;我们称之为依赖关系;


软件项目构建工具:

  C/C++:make

  Java:maven

  Python:buildout

尽管有了这些构建工具,编译源代码还是十分困难,因此有一些人把常用的代码打包封装成程序包,发布开源社区,方便使用


程序包的管理器:


不同的linux发行版本,有着不同的程序包管理器

  Debian:dpt-Debian Package Toolkits。所有软件包封装成.deb后缀名的包文件,命令行工具 dpkg

  Redhat:rpm-Redhat Package Manager ,rpm工具,.rpm后缀名

    rpm称为linux的程序包管理器的行业标准

    开始使用的是perl语言编写,后来用C语言重写了rpm,公布后改名为rpm is package manager。

  Slackware(S.u.S.e):用的是rpm,但是对rpm进行了修改,以至于得到Redhat认可


  Gentoo:从内核开始,可以供用户任意选择挑选软件;

          采用的包管理器 : FreeBSD 的 portage的程序包管理机制,emerge工具

  Archlinux:pacman


以CentOS为例,介绍下rpm程序包管理器的相关内容:

 1.程序包的命名规则:

  源代码包:software_name-VERSION.tar.gz

    VERSION:major.minor.release

      major:主版本号,通常代表重大功能改进的版本分支;

      minor:次版本号,代表在某个版本的分支中的某个功能发生变化;

      release:发行版本号,修复了某些BUG或者对某段代码进行了优化;

  rpm程序包:  

    源代码包:software_name-VERSION.src.rpm

    二进制文件包:

      software_name-VERSION-[release].[os].arch.rpm

        VERSION:major.minor.release

        [release]:rpm包的发行版本号

        [os]:软件所支持的操作系统版本信息,el6、el7、suse11、fedora22...

        arch:硬件架构类型:i386 i686 x64(amd64) ppc sparc noarch...

        例如 gcc-4.8.5-4.el7.x86_64.rpm

在制作rpm程序包的时候,通常其制作者会采用分包技术来构建rpm程序包:根据程序的不同功能,构建多个程序包;被分包的一般分为两类

    1.主程序包:

      software_name-VERSION-[release].[os].arch.rpm

    2.附属功能包:

      software_name-function-VERSION-[release].[os].arch.rpm

    一般来讲,主程序包和附属功能包具有相同版本号 发行版本号 操作系统要求和硬件架构类型

    所以 主程序包往往被所有的附属程序包所依赖;依赖关系:A --> B -->C D --> A 构成一个依赖黑洞 因此rpm存在着诸多'不与人为善'的弊端


获取程序包的途径:

  1.系统发行版的光盘,或镜像

  2.官方的文件服务器或者镜像站点:

    http://mirrors.aliyun.com

    http://mirrors.sohu.com

    http://mirrors.163.com

    http://mirrors.tuna.tsinghua.edu.cn

    http://mirrors.hust.edu.cn

    ...

  3.某项目的官方站点 例如apache

  4.第三方组织制作的rpm程序包站点

    Fedora EPEL:红帽官方的社区组织,在镜像站点中也包含EPEL镜像

    搜索引擎:

      http://pkgs.org  基本可以搜索到所有

      http://rpmfind.net 法国的一个站点

      http://rpm.pbone.net

  5.自己制作 咯

  建议:在获得程序包之后实施校验,完整性检查:

    1.来源合法性

      通过程序提供者的数字签名加密的数据,我们可以通过其公钥进行解密验证;

    2.程序包完整性

      sha-1校验码

rpm命令行工具:

  安装 卸载 升级(降级) 查询 文件校验

  【通用选项】:

    -v --verbose:显示安装历程详情,仅仅显示安装软件名

    -vv  显示非常详细的操作信息

  安装:

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

    [install-options]

     -h --hash      用50个“#”来表示安装进度

     --test:      并不是真正的安软件包,仅仅是测试是否在安装时能够正常完成,dry run

     --nodeps :    忽略因为依赖关系导致的安装错误,不建议使用

     --replacefiles  安装软件包时,软件包中的文件会直接将原来安装的文件替换

     --replacepkgs   不卸载软件包 而是重新装一遍

     --noscripts    不运行任何脚本

     --nopre

     --nopost

     --nosignature   不考虑软件包的来源是否合法

     --nodigest     不考虑软件包是否完整

  升级:

    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

      可以升级也可以全新安装

    rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

      仅仅是对已经安装的低版本的程序包进行升级安装

      常用选项与安装相同

      特殊的选项:

        --oldpackage   降级安装

        --force      强制升级

  注意:

    1.强烈建议:不要对内核进行升级操作;linux支持多内核

    2.升级后带来文件的变化,系统默认不会直接更改之前的配置文件,新程序包的配置文件会被重命名,通常是:FILENAME.rpmnew

  卸载:

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

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

     --nodeps:忽略依赖关系

     --test:测试卸载

     --nopreun 

     --nopostun

  查询:

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

      [select-options]

        -a,--all:查询所有已安装的程序包名

 

        -f,--file FILE 查找指定的文件是由哪个程序包提供的

        -p,--package PACKAGE_FILE : 对还没安装的程序包文件中执行查询操作

        --whatprovided CAPABILITY 查询指定的 CAPABILITY是由哪个程序包提供的

        --whatrequires CAPABILITY

      [query-options]

        -c,--configfiles:  查看相关配置文件

        -i,--info          查询程序包相关信息,包括版本号,发行号,等等

        -l,--list          列表显示安装程序包会生成哪些文件

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

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

        --scripts:        查询程序包的脚本

  校验:

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

    [select-options] 与查询的[select-options]相同

  认证:

   --import PUBKEY ...导入相应的/PATH/TO/KEY_FILE

   {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...

    手动测试 验证软件包的合法性

  数据库管理:

    数据库的初始化和重建:/var/lib/rpm

      rpm {--initdb|--rebuilddb}

        [--dbpath DIRECTORY]