软件的开发分为四个层次

1、面向硬件,操作系统

2、面向内核,譬如驱动的开发

3、面向库,诸多应用程序、像CC++

4、面向应用级,譬如javaphppythonperlruby

wKioL1YJ2nXT1VB0AAFZGSGGRXA194.jpg

4、面向应用程序的开发可实现一处编译到处执行,为什么?因为它的运行只需要自己的虚拟机平台,没有库或者说CPU架构不同而无法运行问题

1、面向硬件的操作系统必须要在合适的CPU架构上才能安装运行,譬如ix86  86_64CPU架构

2、面向内核的应用程序必须要有相同的systemcall 接口才能(异地)运行

3、面向lib的应用程序必须要有相同的库才能迁移运行

 

问题:

而大多数不是面向应用平台、只单一的依赖库的程序,到底能不能在你的平台上运行?你的开发平台上有没有它所需的特有的库呢?它们在编译过程中需要哪些库呢?是如何调用的?它们安装后该怎样被执行运行(放置)呢?

         linux上的大多数应用程序是面向libC应用程序!

 

解决:

为了解决以上问题

大多开发版linux为用户提供了软件包管理器

 

 

程序包管理器:

         debiandebdpt

         redhatrpm

                   rpmRedhatPacket Manager(早期的)

                            RPMis Package Manager

         Gentooarchlinux

 

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

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

 

linux多数应用程序开发者为用户提供应用程序形式为

         源代码:需手动编译、安装、需要编译环境

rpm包:运行rpm程序安装

如下:

         源代码:name-VERSION.tar.gz

                   VERSION:major.minor.release

         rpm包命名方式:

                   name-VERSION-release.arch.rpm

                            VERSION:major.minor.release

                            release.arch

                                     releaserelease.OS

如:                            zlib-1.2.7-13.el7.i686.rpm

 

                            常见的arch

                                     x86:i386, i486, i586, i686

                                     x86_64:x64, x86_64, amd64

                                     powerpc:ppc

                                     跟平台无关:noarch

 

                   testapp:拆包(一个程序不一定有一个程序员开发,可能会把程序放在不同的包中)

                            testapp-VERSION-ARCH.rpm:主包

                            testapp-devel-VERSION-ARCH.rpm:支包

                            testapp-testing-VERSION-ARHC.rpm

 

                   几乎所有程序不是独立一个包完成任务的,包与包之间,存在依赖关系

                   linux的哲学思想:任务由多个小程序组合完成的)

                   要想完成安装、完美运行,多数情况需要解决依赖关系、安装所需的依赖包,因此linux开发者又提出了程序白管理器前端工具

如下:

                            yumrpm包管理器的前端工具;

                            apt-getdeb包管理器前端工具;

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

                            dnf:Fedora 22+ rpm包管理器前端管理工具;

那么如何查看你的二进制程序所需的库文件呢?

         ldd /path/to/BINARY_FILE

[root@localhost Packages]#ldd /bin/ls

         linux-vdso.so.1 =>  (0x00007fff845b4000)

         libselinux.so.1 =>/lib64/libselinux.so.1 (0x00007f2494b76000)

         libcap.so.2 => /lib64/libcap.so.2(0x00007f2494971000)

         libacl.so.1 => /lib64/libacl.so.1(0x00007f2494767000)

         libc.so.6 => /lib64/libc.so.6(0x00007f24943a6000)…

你的主机中开机时有装载了哪些库文件呢?

         ldconfig–p  显示主机已经缓存的所有可用库文件及文件路径映射关系

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

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

程序包管理

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

                   1、程序的组成组成清单 (每个包独有)

                            文件清单

                            安装或卸载时运行的脚本

                   2、数据库(公共)

                            程序包名称及版本

                            依赖关系;

                            功能说明;

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

管理程序包的方式:

使用包管理器:rpm

使用前端工具:yum dnf(新式)

获取程序包的途径

1)系统发行版的光盘或官方的服务器

CentOs镜像

http://mirrors.aliyun.com

http://mirrors.sohu.com

http://mirrors.163.com

2)项目官方站点

3)第三方组织  fedora-EPEL

搜索引擎:

http://pkgs.org

http://rpmfind.net

http://rpm.pbone.net

4)自己制作

 

建议:检查其合法性。

来源合法性

程序包的完整性

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

安装、卸载、升级、查询、校验、管理数据库

安装

-v       verbose

-vv

-h   以#显示程序包管理执行进度;每个#表示2%的进度

rpm -ivh PACKAGE_FILE ...

[install-option]

--test:测试安装,并不真的安装    干跑模式

--nodeps:忽略依赖关系

--replacepkgs       替代  修改的配置文件可能不能使用

--ignoreos    忽略os

--nodigest 忽略包的完整性

--nosignature 忽略来源合法性

 

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

%pre  安装前脚本      --nopre

%post  安装后脚本     --nopost

%preun  卸载前脚本    --nopreun

%postun  卸载后脚本   --nopostun

 

升级

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

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

升级后的配置文件一般不变

 

rpm -Uvh       即可升级,也可安装

rpm -Fvh       只用于升级

--oldpackage  :降级:由旧版替代新版

--force       :强制升级

  注意:1、不要对内核作升级操作:linux支持多内核版本并存,因此,对直接安装新版本内核

2、如果源程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一配置文件并不会直接覆盖

假如,你不确定是否安装,或者不确定是否已经完全解决了依赖关系可以加

--test 如下

[root@localhostPackages]# rpm -ivh --test httpd-2.4.6-31.el7.centos.x86_64.rpm

错误:依赖检测失败:

    /etc/mime.types httpd-2.4.6-31.el7.centos.x86_64 需要

    httpd-tools = 2.4.6-31.el7.centos httpd-2.4.6-31.el7.centos.x86_64 需要

    libapr-1.so.0()(64bit) httpd-2.4.6-31.el7.centos.x86_64 需要

    libaprutil-1.so.0()(64bit) httpd-2.4.6-31.el7.centos.x86_64 需要

假如即试图忽略依赖关系则可用--nodeps这次则没有提示依赖关系失败

[root@localhostPackages]# rpm -ivh --test --nodeps httpd-2.4.6-31.el7.centos.x86_64.rpm

准备中...                         ################################# [100%]

同样,你也可以忽略os 包完整性,来源合法性等,也可以替换安装

[root@localhostPackages]# rpm -ivh --replacepkgs net-tools-2.0-0.17.20131004git.el7.x86_64.rpm

准备中...                         ################################# [100%]

正在升级/安装...

  1:net-tools-2.0-0.17.20131004git.el#################################[100%]

重新安装了一遍

    升级操作后一般配置文件不发生修改

查询 

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

-p/path/to/package_file  针对尚未安装的程序包文件作查询操作

[select-options]  由指定文件查找指定包

-a:所有包

-f 查看指定的文件是由哪个程序包安装生成的

 

--whatprovides  查询指定的功能或特性是由哪个包提供

--whatrequires  查询哪个包依赖指定的功能或特性

[query-options]  由指定包查找其文件

--changelog   查询rpm包的修改日志

-c  由程序的配置文件

-d  查询doc文件

-i   查询 程序的简要信息

-L  Liense

-l  查看指定程序包安装后生成后的所有文件

--scripts  程序包自带的脚本

--trigger

-R: --requires查询指定的程序包所依赖的程序包

--provides  列出指定程序包所提供的功能

 

-p针对尚未安装的程序包文件作查询操作

对为安装的程序包进行修改日志查询

对包的查询

查找/bin/ls由那个包提供类似与--whatprovides

~]# rpm -qf/bin/ls

coreutils-8.22-11.el7.x86_64

~]# rpm -q--whatprovides /bin/ls

coreutils-8.22-11.el7.x86_64

查询某特型依赖与哪些包

~]# rpm -q--whatrequires /bin/bash

nss-softokn-freebl-3.16.2.3-9.el7.x86_64

iproute-3.10.0-21.el7.x86_64

查询为安装的某程序包的配置文件

~]# rpm -qpc zsh-5.0.2-7.el7.x86_64

/etc/skel/.zshrc

/etc/zlogin

查询某rpm程序包的修改日志

~]# rpm -q--changelog bash-4.2.46-12.el7.x86_64 |more

* 1 11 2015 Ondrej Oprala<ooprala@redhat.com> - 4.2.46-12

- Shellshockrelated parser bugs - patches

  Related: #1175647

查询某程序包的帮助手册

~]# rpm -qdbash-4.2.46-12.el7.x86_64

/usr/share/doc/bash-4.2.46/COPYING

/usr/share/info/bash.info.gz

查询某程序包的简要信息

~]# rpm -qibash-4.2.46-12.el7.x86_64

Name        : bash

Version     : 4.2.46

Release     : 12.el7

Architecture:x86_64

Install Date:20150827星期四 185850

Group       : System Environment/Shellsr

Size        : 3663626

License     : GPLv3+

Signature   : RSA/SHA256, 20150314星期六153908, Key ID 24c6a8a7f4a80eb5

SourceRPM  : bash-4.2.46-12.el7.src.rpm

BuildDate  : 20150306星期五060915

BuildHost  : worker1.bsys.centos.org

Relocations :(not relocatable)

Packager    : CentOS BuildSystem<http://bugs.centos.org>

Vendor      : CentOS

URL         : http://www.gnu.org/software/bash

Summary     : The GNU Bourne Again shell

Description :

The GNU BourneAgain shell (Bash) is a shell or command language

interpreterthat is compatible with the Bourne shell (sh). Bash

incorporatesuseful features from the Korn shell (ksh) and the C shell

(csh). Most shscripts can be run by bash without modification.

 

查询某程序包安装后可能的生成的所有文件

~]# rpm -qlbash

/etc/skel/.bash_logout

/etc/skel/.bash_profile

/etc/skel/.bashrc

...

查询与某程序包的脚本信息

~]# rpm -q--scripts net-tools-2.0-0.17.20131004git.el7.x86_64

postinstallscriptlet (using /bin/sh):

 

if [ $1 -eq 1] ; then

        # Initial installation

        /usr/bin/systemctl presetarp-ethers.service >/dev/null 2>&1 || :

fi

查询某程序包所依赖的关系(一般是库)

~]# rpm -qRnet-tools-2.0-0.17.20131004git.el7.x86_64

/bin/sh

libc.so.6()(64bit)

libc.so.6(GLIBC_2.14)(64bit)

查询某程序包安装后提供的功能特性

~]# rpm -q--provides net-tools-2.0-0.17.20131004git.el7.x86_64

net-tools =2.0-0.17.20131004git.el7

net-tools(x86-64)= 2.0-0.17.20131004git.el7

以上查询的常用组合

-qiPACKAGE      查询指定包的简要信息

-qf FILE                 查询指定文件或特性是由哪个程序包提供的

-qc PACKEAGE     查询指定包的配置文档

-ql PACKEAGE      查询指定包安装后产生的所有文件

-qd PACKAGE      查询指定报的doc文件

-qpi PACKEAGE    查询为安装包的简要信息

-qpl                         列出未安装的指定包可能产生的文件

卸载

    rpm –e

校验

    当程序安装后,我们可以通过数据库中的校验信息与现有数据作校验,就会发现数据是否被修改过以下是用法和常用的校验项

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

       S file Size differs                                                           文件大小校验

       M Mode differs (includes permissions andfile type)    权限和类型的校验

       5 digest (formerly MD5 sum) differs                                 数据完整性校验

       D Device major/minor number mismatch                       设备的设备号校验

       L readLink(2) path mismatch                                              读链接是否匹配

       UUser ownership differs                                                     属主关系校验

       G Group ownership differs                                                  属组关系校验

       T mTime differs                                                                      修改时间是否匹配

       P caPabilities differ                                                               

包的安装是要确保其安全性、可靠性

    因此要进行校验

    完整性校验

    来源合法性校验

一般通过公钥私钥非对称算法进行的

    CentOS 6/7的公钥RPM-GPG-KEY-CentOS-6/7

rpm的数据库文件

C7 /var/lib/rpm

数据库重建

rpm{initdb|rebuilddb}

initdb初始化

    如果实现不存在,则新建至,否则,不执行任何操作

rebuilddb重建数据库

    无论当前是否存在,直接重建之

导入数据校验码

~]# rpm--import /media/cdrom/RPM-GPG-KEY-CentOS-7

 

 

二、YUM安装

            

1 command is oneof:

        * install package1 [package2] [...] 

#安装程序包

        * update [package1] [package2] [...]#更新程序包

        * update-to [package1] [package2] [...]#

        * update-minimal [package1] [package2][...]

        * check-update  #检查更新

        * upgrade [package1] [package2] [...]

        * upgrade-to [package1] [package2][...]

        * distribution-synchronization[package1] [package2] [...]

        * remove | erase package1 [package2] [...]#卸载

        * autoremove [package1] [...]

        * list [...] #列出指定软件包

        * info [...]  #显示指定软件包的信息

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

        * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]  清除软件包,当变换yum仓库时很有用

        * makecache [fast]

        * groups [...]

        * search string1 [string2] [...]

        * shell [filename]

        * resolvedep dep1 [dep2] [...]

           (maintained for legacy reasons only- use repoquery or yum provides)

        * localinstall rpmfile1 [rpmfile2][...]

           (maintained for legacy reasons only- use install)

        * localupdate rpmfile1 [rpmfile2] [...]

           (maintained for legacy reasons only- use update)

        * reinstall package1 [package2] [...]重新安装

        * downgrade package1 [package2] [...]

        * deplist package1 [package2] [...]  #显示软件包的依赖关系

        * repolist [all|enabled|disabled]   #列出repo仓库的简要信息

        * repoinfo [all|enabled|disabled]  #列出repo仓库的详细信息

        * repository-packages<enabled-repoid> <install|remove|remove-or-reinstall|remove-or-

       distribution-synchronization>[package2] [...]

        * version [ all | installed | available| group-* | nogroups* | grouplist | groupinfo

        *  history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|roll?   #显示yum安装的更新历史信息

       back|new|sync|stats]

     *load-transaction [txfile]

        * updateinfo[summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all   #显示软件包的更新信息

       | check-running-kernel]

        * fssnapshot [summary | list |have-space | create | delete]

        * fs [filters | refilter |refilter-cleanup | du]

        * check

        * help [command]

 

2、简要解释:

显示仓库列表:

repolist[all|enabled|disabled]

显示程序包:

list

# yum list[all | glob_exp1] [glob_exp2] [...]

# yum list{available|installed|updates} [glob_exp1] [...]

安装程序包

installpackage1 [package2] [...]

 

reinstallpackage1 [package2] [...]  (重新安装)

升级程序包

update [package1] [package2][...]

 

downgradepackage1 [package2] [...] (降级)

检查可用升级

check-update

卸载程序包

remmove|erase package1[...]

查看程序包information

info[...]

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

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

 

查看yum事务历史信息

history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

本地安装即升级本地程序

*localinstall rpmfile1 [rpmfile2] [...]

          (maintained for legacy reasons only - use install)

           *localupdate rpmfile1 [rpmfile2] [...]

          (maintained for legacy reasons only - use update)

 

包组管理的相关命令

 groupinstall group1 [group2] [...]

          * groupupdate group1 [group2][...]

          * grouplist [hidden] [groupwildcard] [...]

           * groupremove group1 [group2] [...]

          * groupinfo group1 [...]

~]# yum grouplist

已加载插件:fastestmirror

设置组进程

Loading mirror speeds from cached hostfile

http://172.16.0.1/fedora-epel/6/x86_64/repodata/repomd.xml:[Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 501 NotImplemented"

尝试其他镜像。

已安装的组:

   CIFS 文件服务器

   FTP 服务器

   MySQL 数据库客户端

yum groupinstall “ FTP 服务器”  

        

注:默认可升级不可降级:yum源可以是更新的,但不可是旧版本

 

--nogpgcheck:禁止进行gpgcheck

-y

-q:静默模式(无information)

-disablerepo=repoidglob:临时禁用此处仓库

--enablerrpo=    指定安装那个yum仓库中的软件包

--noplugins  禁用所有插件

 

 

3、制作yum仓库

createrepo

制作yum仓库时,要手动软件包依赖关系

三、编译安装

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

 

源代码——预处理——编译——汇编——链接——执行

 

源代码组织格式

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

CC++ make  (项目管理器) (configure ——Makefile.in——>  makefile)

 

java:maven

 

编译安装三步走

./comfigure

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

2.       检查依赖到的外部环境

make

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

make install

将对应文件放在对应文件下

 

开发工具:

autoconf:生成configure脚本

automake:生成Makefile.in

建议:安装前查看INSTALLREADME

 

源程序源代码的获取

官方自建站点

appache.org

mariadb.org

代码托管站点

SourceForge

Github.com

code.google.com

C++ :gcc (GNU C Complier) 

编译C源代码

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

开发工具:makegcc

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

glibc标准库

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

CentOS 6“”

        第一步:configure脚本

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

        --help 

        选项分类

        安装路径设定

        系统类型

        (指定目标系统平台,只用于交叉编译)

        optional Features

         

        enable

        disable

        可选程序包

        --with-Package[arg]

        --without-package[arg]

        第二步:make

         

        第三步:make install

        安装后的配置 

        1)导出二进制程序目录至PATH

        2)导出库文件路径

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

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

        让系统重新生成缓存:ldconfig [-v]

        3)导出头文件

        基于链接的方式实现

        -ln -sv

        4)导出帮助手册

        编辑/etc/man.conf文件

        添加一个MANPATH