Linux程序包管理

目录

一、程序包管理基础

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

2.程序包管理器

3.rpm包命名方式

二、rpm命令管理程序包

1.安装

2.升级

3.查询

4.卸载

5.校验

6.数据库重建

三、yum

1.配置文件

2.yum命令的用法

3.显示仓库列表

4.显示程序包

5.安装程序包

6.升级程序包

7.检查可用升级

8.卸载程序包

9.查看程序包information

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

11.清理本地缓存

12.构建缓存

13.搜索

14. 查看指定包所依赖的capabilities

15.查看yum事务历史

16.安装及升级本地程序包

17.包组管理的相关命令

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

19. yum的命令行选项

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

21.创建yum仓库

四、程序包编译安装

1.C代码编译安装三步骤

2.开源程序源代码的获取

3.编译C源代码

4.安装后的配置

回顾

参考资料

一、程序包管理基础

      APIApplication Programming Interface     应用编程接口

            POSIX:Portable OS      可移植操作系统

      程序源代码 --> 预处理 --> 编译 -> 汇编 --> 链接

静态编译:编译器在编译可执行文件的时候,将可执行文件需要调用的对应静态库(.a或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库

                  共享编译:/lib, /lib64下的 .so

      ABIApplication Binary Interface     应用二进制接口

            Windows与Linux不兼容

            库级别的虚拟化:

                  Linux:WINE

                  Windows:Cywin

Linux程序包管理

      系统级开发

            C

            C++

      应用级开发

            java

            Python

            php

            perl

            ruby

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

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

2.程序包管理器

      自动将程序包文件里的二进制程序、库文件、配置文件、帮助文件等解压复制到指定路径下,并能实现升级、卸载、查询等其他功能

            debian:deb, dpt

            redhat:rpm, rpm   (最开始用Perl语言研发,之后用C语言研发)

                  rpm:Redhat Package Manager

                       RPM is Package Manager

            Gentoo

            Archlinux

      源代码:name-VERSION.tar.gz

            VERSION:major.minor.release        主版本号.次版本号.发行版本号

3.rpm包命名方式

      name-VERSION-release.arch.rpm

                  VERSION:major.minor.release

                  release.arch:         此处的release是rpm包自己的release号

                       release:release.OS

                  e.g. zlib-1.2.7-13.el7.i686.rpm

                  常见的arch:

                       x86:i386, i486, i586, i686

                       x86_64:x64, x86_64, amd64

                       powerpc:ppc

                       跟平台无关:noarch

            拆包

                  e.g.

                        testapp-VERSION-ARCH.rpm:主包

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

                        testapp-testing-VERSION-ARHC.rpm

                  包之间:存在依赖关系

                        X, Y, Z

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

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

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

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

      查看二进制程序所依赖的库文件:

            ldd /PATH/TO/BINARY_FILE

Linux程序包管理

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

            ldconfig

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

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

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

      程序包管理:

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

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

                  文件清单

                  安装或卸载时运行的脚本

            数据库(公共)

                  程序包名称及版本

                  依赖关系(被哪个文件依赖或依赖于哪个文件)

                  功能说明

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

      管理程序包的方式:

            使用包管理器:rpm

            使用前端工具:yum, dnf

      获取程序包的途径:

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

                  CentOS镜像:

                       http://mirrors.aliyun.com

                       http://mirrors.sohu.com

                       http://mirrors.163.com

            ②项目官方站点

            ③第三方组织:

                  Fedora-EPEL

                  搜索引擎:

                       http://pkgs.org

                       http://rpmfind.net

                       http://rpm.pbone.net

            ④自己制作

P.S. 检查其合法性

                  来源合法性

                  程序包的完整性

二、rpm命令管理程序包

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

1.安装

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

            -v:verbose

            -vv:

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

                  rpm -ivh PACKAGE_FILE ...

Linux程序包管理

                       [install-options]

                        --test测试安装,但不真正执行安装过程;dry run干跑模式

                       --nodeps:忽略依赖关系

Linux程序包管理

                       --ignoreos:忽略操作系统版本

                       --replacepkgs重新安装

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

                       --nodigest:不检查包完整性

Linux程序包管理

                        --noscipts不执行程序包脚本片断

                                   %pre:安装前脚本; --nopre

                                   %post:安装后脚本; --nopost

                                   %preun:卸载前脚本; --nopreun

                                   %postun:卸载后脚本; --nopostun

2.升级

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

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

upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”

freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行任何操作

            rpm -Uvh PACKAGE_FILE ...

            rpm -Fvh PACKAGE_FILE ...

                  --oldpackage降级

                  --force强行升级

P.S.

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

②如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

3.查询

      rpm {-q|--query} [select-options] [query-options] 对哪些包查询,查询什么

      [select-options]

            -a所有包

Linux程序包管理

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

Linux程序包管理

Linux程序包管理

            -p /PATH/TO/PACKAGE_FILE针对尚未安装的程序包文件做查询操作

--whatprovides CAPABILITY:查询指定的功能,文件等由哪个包所提供

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

Linux程序包管理

      [query-options]

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

            -c查询程序的配置文件

            -d查询程序的文档

            -iinformation

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

            --scripts程序包自带的脚本片断

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

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

Linux程序包管理

Linux程序包管理

      用法:

            -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE

            -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...

            -qa

Linux程序包管理

4.卸载

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

          [--notriggers] [--test] PACKAGE_NAME ...

Linux程序包管理

5.校验

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

     与在rpm留存的数据库信息比较

Linux程序包管理

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  caPabilities不匹配

包来源合法性验正及完整性验正:

            完整性验正:SHA256

            来源合法性验正:RSA

      公钥加密:

            对称加密:加密、解密使用同一**

            非对称加密:**是成对儿的

                  public key:公钥,公开所有人

                  secret key:私钥,不能公开

Linux程序包管理

      导入所需要公钥:

                  rpm --import /PATH/FROM/GPG-PUBKEY-FILE

Linux程序包管理

P.S. CentOS 7发行版光盘提供的**文件:RPM-GPG-KEY-CentOS-7

6.数据库重建

      rpm {--initdb|--rebuilddb}

            initdb初始化

                  如果事先不存在数据库,则新建之;否则,不执行任何操作

            rebuilddb:重建

                       无论当前存在与否,直接重新创建数据库

Linux程序包管理

三、yum

      CentOS:yum, dnf

      URL:ftp://x.x.x/x/x/ 统一资源定位符

      YUM:yellow dog, Yellowdog Update Modifier

      yum repository:yum repo

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

            文件服务器:

                  ftp://

                  http://

                  nfs://

                  file:///

Linux程序包管理

yum客户端

1.配置文件

      /etc/yum.confyum命令自己的配置以及为所有仓库提供的公共配置

Linux程序包管理

[main] 公共配置段的名称

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

            仓库指向的定义:

            [repositoryID]

            name=Some name for this repository

            baseurl=url://path/to/repository/    仓库访问路径

(P.S. =左右不要有空格)

mirrorlist=url://path/to/repository/

            enabled={1|0}   是否启用此仓库

            gpgcheck={1|0}     是否检查来源合法性和完整性

            gpgkey=URL     指明秘钥文件路径

            enablegroups={1|0}      是否支持使用组批量管理程序包

            failovermethod={roundrobin|priority}     故障转移方法

                  默认为:roundrobin,意为随机挑选

            cost=   开销定义

                  默认为1000

Linux程序包管理

Linux程序包管理

2.yum命令的用法

      yum [options] [command] [package ...]

       command is one of:

        * install package1 [package2] [...]

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

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

        * check-update

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

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

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

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

        * list [...]

        * info [...]

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

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

        * makecache

        * groupinstall group1 [group2] [...]

        * groupupdate group1 [group2] [...]

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

        * groupremove group1 [group2] [...]

        * groupinfo group1 [...]

        * search string1 [string2] [...]

        * shell [filename]

        * resolvedep dep1 [dep2] [...]

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

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

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

        * check

        * help [command]

3.显示仓库列表

repolist [all|enabled|disabled]

Linux程序包管理

4.显示程序包

   list

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

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

5.安装程序包

    install package1 [package2] [...]

reinstall package1 [package2] [...]  (重新安装)

6.升级程序包

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

    downgrade package1 [package2] [...] (降级)

7.检查可用升级

    check-update

8.卸载程序包

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

9.查看程序包information

    info [...]

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

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

Linux程序包管理

11.清理本地缓存

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

12.构建缓存

    makecache

13.搜索

    search string1 [string2] [...]

         P.S. 以指定的关键字搜索程序包名及summary信息

14. 查看指定包所依赖的capabilities

deplist package1 [package2] [...]

Linux程序包管理

15.查看yum事务历史

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

Linux程序包管理

Linux程序包管理

Linux程序包管理

16.安装及升级本地程序包

      * localinstall rpmfile1 [rpmfile2] [...]

          (maintained for legacy reasons only - use install)

* localupdate rpmfile1 [rpmfile2] [...]

          (maintained for legacy reasons only - use update)

17.包组管理的相关命令

* groupinstall group1 [group2] [...]

* groupupdate group1 [group2] [...]

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

* groupremove group1 [group2] [...]

* groupinfo group1 [...]

Linux程序包管理

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

    ①挂载光盘至某目录,e.g. mount -r -t iso9660 /dev/cdrom /media/cdrom

    ②创建配置文件

         [CentOS7]

         name=

         baseurl=           指定到repodata的父目录即可

         gpgcheck=

         enabled=

Linux程序包管理

19. yum的命令行选项

    --nogpgcheck禁止进行gpg check

    -y:自动回答为“yes”

    -q:静默模式

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

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

    --noplugins:禁用所有插件

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

内部变量用于获取判断当前系统的一些信息

Linux程序包管理

Linux程序包管理

Linux程序包管理

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

    $arch:平台

    $basearch基础平台

    $YUM0-$YUM9

e.g. http://mirrors.tudou.com/centos/$releasever/$basearch/os

21.创建yum仓库

createrepo [options] <directory>

Linux程序包管理

Linux程序包管理

四、程序包编译安装

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

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

源代码组织格式:

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

    C、C++: make (configure --> Makefile.in --> makefile)   项目管理器

    java:maven

1.C代码编译安装三步骤

(1)./configure:

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

②检查依赖到的外部环境

P.S. 当依赖的程序包不存在时,configure会报错

    (2)make

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

(3)make install

     将二进制文件、配置文件等复制到某目录下,类似于cp命令

开发工具:

         autoconf:生成configure脚本

         automake:生成Makefile.in

建议:安装前查看INSTALL,README

2.开源程序源代码的获取

官方自建站点:

               apache.org (ASF)

               mariadb.org

                     ...

代码托管:

               SourceForge

               Github.com

               code.google.com

3.编译C源代码

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

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

               开发工具:make, gcc等

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

                                 glibc:标准库

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

CentOS 6:"Development Tools", "Server Platform Development",

Linux程序包管理

第一步:configure脚本

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

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

选项分类:

    安装路径设定:

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

--sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置

System types     交叉编译时用到

      --build

      --host

Optional Features:可选特性

    --disable-FEATURE

         --enable-FEATURE[=ARG]

Optional Packages:可选包

         --with-PACKAGE[=ARG]

         --without-PACKAGE

第二步:make

第三步:make install

4.安装后的配置

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

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

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

导出库文件路径

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

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

               让系统重新生成缓存:

                           ldconfig [-v]

导出头文件

         基于链接的方式实现:

                     ln -sv

导出帮助手册

         编辑/etc/man.config文件

                     添加一个MANPATH

Linux程序包管理

练习

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

Linux程序包管理

②编译安装apache 2.2; 启动此服务

Linux程序包管理

Linux程序包管理

Linux程序包管理

Linux程序包管理

Linux程序包管理

回顾

Linux程序包管理的实现、rpm包管理器、yum、源代码编译安装

      rpm命令实现程序管理:

            安装:-ivh, --nodeps, --replacepkgs

            卸载:-e, --nodeps

            升级:-Uvh, -Fvh, --nodeps, --oldpackage

            查询:-q, -qa, -qf, -qi, -qd, -qc, -q --scripts, -q --changlog, -q --provides, -q --requires

            校验:-V

                  导入GPG**:--import, -K, --nodigest, --nosignature

            数据库重建:--initdb, --rebuilddb

     yum [OPTION]... COMMAND [args]...

           install, list, remove, update, groupinstall, grouplist, clean, makecache

     源代码编译:

           前提:开发环境

                 ./configure

                 make

                 make install

参考资料:

马哥随堂笔记

注:诚恳欢迎读者对本文提出批评意见,若发现存在错误,我定第一时间修改。如果读者觉得文章对您有帮助,欢迎点赞鼓励一下哟٩(๑❛ᴗ❛๑)۶。