Linux程序包管理相关

前言

首先说说一个软件的诞生过程:

程序员用编程语言写文本格式的源代码,但是计算机只能读懂二进制文件,那么就需要将源代码转换成二进制格式,这个过程称为编译。编译用的工具称为编译器,编译器有很多种,在Linux上常用gcc这个编译器。利用编译器,得到二进制格式的文件(二进制程序(Windows上.exe.msi,Linux.elf)、库文件、配置文件、帮助文件)。

手动编译是一个麻烦的事情,所以软件发行商将程序照平台编译好之后,成为二进制的程序包。Windows的程序包就两个步骤:安装和卸载。
Linux的程序包根据发行版的不同,格式也不一样。主要是RedHat系的RPM包和debian系的deb包。主要介绍RPM包,以后再介绍deb包的使用。

Linux不是,Linux的哲学有一点是:Linux由众多功能单一的程序构成,只做一件事,并做到最好。那么这些功能单一的程序怎么去实现复杂的工作呢?

分工和协作嘛,我不会的事让别人去做,我会的事我还可以让其他比我做得更好的人去做。所以在Linux的程序包之间有着复杂的包间依赖关系,A程序需要B程序,B程序又依赖于C程序…

如果要单个单个的去安装包的话是一件很折磨人的事情,A包装上了告诉你没装B包,我运行不了,没满足依赖关系,那就装B包,B包装好了说你没装C包,C包又装好了,又缺D包…这可咋整2333。而且包的格式还不一样。

Linux的程序包根据发行版的不同,格式也不一样。主要是RedHat系的RPM包和debian系的deb包。主要介绍RPM包,以后再介绍deb包的使用。

下面进入正题:介绍RPM包、rpm命令、前端工具yum

RPM包

红帽系Linux用rpm命令管理RPM程序包RPM包:

主要实现的是 :安装、升级、卸载、查询、校验和数据库维护

语法: rpm [OPTION] [PACKAGE_FILE]
    安装: -i,--install
    升级: -u,--update,-F,--freshen
    卸载: -e,--erase
    查询: -q,--query
    检验: -V,--verify
    数据库维护: --builddb,--initdb

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

            rpm -ivh PACKAGE_FILE
                -v:
                -vv
            [install-options]:
                -h:显示进度,hash marks,每个#表示2%
                --test:测试安装
                --nodeps:不检测依赖直接安装
                --replace:重新安装(不会修改配置文件,如果是想通过重装恢复默认配置,将那个配置文件删除后replace)
                --noscript

            注意:rpm可以自带脚本:
                preinstall:安装前进行,%pre,--nopre
                postinstall:安装后运行,%post,--nopost
                preuninstall:卸载前运行,%preun,--unpreun
                postuninstall:卸载完运行,%postun,--nopsdtun

                --nosignature:不检查包签名信息,不检查来源合法性
                --nodigest:不检验包完整性信息
    升级:
        rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
            -U:升级或安装
        rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
            -F:只升级,如果原来没有,不安装

            rpm -Uvh PACKAGE_FILE
            rpm -Fvh PACKAGE_FILE

                --oldpackage:降级为较老版本的;回滚
                --force:强制升级;
        注意:
            1.不要对内核进行升级操作;Linux支持多内核版本共存,因此,直接安装新版本内核
            2.如果某原程序包的配置文件被修改过,升级后同名的配置文件不会被更新,而是把新配置文件重命名提供;一般叫filename.rpmnew(原文件的新版)

    查询:
        rpm {-q|--query} [select-options] [query-options]

        [select-options]:
            PACKAGE_NAME:查询指定程序包是否安装,
            -f, --file:查询文件是由哪个程序生成的
            -g, --group:
            -a, --all:查询所有已经安装过的包

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

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

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

            [query-option]
            --changelog:查看版本更迭
            -l, --list:程序安装生成的文件列表
            -i, --info:程序包相关的信息,版本号、大小
            -c, --configfiles:List only configuration files (implies -l).
            -d, --docfiles:List only configuration files (implies -l).
            --provides:List capabilities this package provides.
            -R, --requires:List capabilities on which this package depends.
            --scripts:List  the  package  specific  scriptlet(s)  that  are used as part of the installation and uninstallation processes.

            用法:
                -qi PACKAGE,-qf FILE,-qc PACKAGE,-ql PACKAGE,-qd PACKAGE
                -qpi PACKAGE_FILE,-qpl PACKAGE_FILE,-qpc PACKAGE_FILE...
        
        包相关信息查询:-i, --info
            有这些信息:版本、配置文件、文档文件、安装生成的文件、包间依赖、包的脚本

    校验:
        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
        文件大小、权限、校验码、主次设备号、属主、属组、修改时间、功能

        包来源合法性验证和完整性验证:
        来源合法性验证:
            GPG密钥
            数字签名:
                包制作者将包的特征码非对称加密,
            1.将源包提取特征码a
            2.用私钥加密特征码a,放在包的后面
            3.用户用公钥得到特征码a,再算得到包的特征码b,匹配ab特征码
        获取并导入信任的包制作者的密钥:
            对于CentOS发行版来说:
                rpm --imprt /etc/pkl/rpm-gpg/RPM-GPG-KEY-CentOS-7
            通过光盘导入数字签名: 
                rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-7
        完整性验证:
            验证: 
            1.安装此组织签名的程序时,会自动执行验证;
            2.手动验证:rpm -K PACKAGE_FILE

    数据库(database)(包的数据库)重建:
        
        rpm管理器数据库路径:/var/lib/rpm/
            查询操作:通过此处的数据库进行

        rpm {--initdb|--rebuilddb}
            --initdb:初始化数据库,当前无任何数据库时新建,有数据库时不操作
            --rebuilt:根据已安装的程序包首部信息(headers)重建数据库

但是rpm只是解决了包的安装卸载的问题,有个困扰用户的巨大问题没有被解决:包间依赖!在红帽系列的上采用了yum这个前段工具。

所以我们通常使用yum管理软件,很好用哦。

yum

yum能干什么呢?yum能根据所要安装的软件,分析软件的依赖关系,并且在软件仓库中下载软件到本地安装,也就是说,只需要输入一条yum指令就可以直接装好软件并使用了特别方便。下面介绍yum的用法:

yum命令用法:
yum [OPTIONS] [COMMAND] [PACKAGE]

   看看有哪些command可以用:
    * 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 ]
    * 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]
    * repoinfo [all|enabled|disabled]
    * 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|rollback|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]
    
    有点多了,常用的选项有这些:
    
    显示仓库列表:repolist [all|enable|disable]
    显示程序包:list
        # yum list [all| glob_exp1] [glob_exp2] [...]
        # yum list {available|installed|updates} [glob_exp1] [...]
    安装程序包:install
        install package [package2] [...]
        reinstall package1 [package2] [...] (重装)
    升级程序包:
        update [package1] [package2] [...]
        downgrade package1 [package2] [...] (降级)
    检查升级:check-update
    卸载程序包:
        remove| erase package1 
    查询包信息:info
        info [...]
    查看指定特性或文件是由哪个程序包所提供的:
        provides | whatprovides feature1 [feature2] [...]
    清除本地缓存(包):
        clean [ package | metadate | expire-cache | rpmdb | plugins | all ]:我爱用all选项
    构建缓存:
        makecache 
    搜索关键字:
        search string1 [string2] [...]
        以指定的关键字搜索程序包及summary信息
    依赖关系分析:
        deplist package1 [package2] [...]
    yum历史事务:
        history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    安装及升级本地的包:
        localinstall rpmfile1 [rpmfile2] [...]
        localupdate rpmfile1 [rpmfile2] [...]
    包组管理相关的命令:groups
        groupinstall group1 [group2] [...]
        groupupdate group1 [group2] [...]
        grouplist [hidden] [groupwildcard] [...]
        groupremove [groupr1] [groupr2] [...]
        grouprinfo group1 [group2] [...]

yum仓库

再来说说仓库,repository,仓库又被称为源,有本地源和网络源,可以用光盘作为本地源获取软件并安装,这样不用担心软件来源和安全问题。网络源国内有阿里源(吐槽一下阿里源太慢了),搜狐源,还有清华大学的源。

将光盘作为本地源

首先挂载光盘:

mount -r /dev/cdrom /media/cdrom
# -r只读挂载,将光盘挂载到/media目录下的cdrom目录

修改本地的yum仓库文件,/etc目录下的/etc/yum.repos.d/目录下的以.repo文件。

vi /etc/yum.repos.d/locationcdrom.repo
# 格式如下

[repositoryID]
#自定义一个软件仓库的ID
name=
#
baseurl=
enabele=
gpgcheck=

然后用yum repolist查看是否已经建立好的仓库

#yum repolist还会更新一下本地软件仓库列表的缓存

如果想将定义一个网络源,.repo文件需要将baseurl选项修改为网络源的URL即可。

那么我平常只会用到几款软件并不想让本地缓存变得特别大,怎么办?
可以自建yum仓库。用createrepo一键轻松搞定!

eg:我有100个RPM包放在~/software目录下
    createrepo ~/software
    于是就建立了一个repodate目录,就可以提供给本地使用了

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/90826

(0)
上一篇 2018-01-04 09:34
下一篇 2018-01-04 10:08

相关推荐

  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-22
  • 用户和组相关的配置文件

    目录 l  用户 l  组账号 l  UID和GID号 l  /etc/passwd分析 l  /etc/shadow分析 l  /etc/group分析 l  /etc/gshadow分析 l  通过用户和用户组配置文件来查询或管理用户 l  总结 1、用户(User…

    Linux干货 2016-10-23
  • keepalived单主模型和nginx双主模型

    主程序:keepalived 主配置文件:/etc/keepalived/keepalived.conf 单主模型ipvs: global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0….

    Linux干货 2017-08-08
  • 国际标准OSI七层模型和事实标准TCP/IP四层模型

    我们知道,标准分为三种:国际标准、国家标准和事实标准。那我们学习的两个重要模型:OSI和TCP/IP模型分别属于国际标准和事实标准,接下来我们来总结一下两种模型的分层及功能还有异同: 一:国际标准OSI模型 OSI:(Open System Interconnect) 开放系统互连,总共分为七层,从下到上顺序为:物理层(physical)、数据链路层(dat…

    2017-09-02
  • Linux进程与作业1

    Linux进程与作业 操作系统的组成部分:硬件,kernel,lib, 系统调用–>调用kernel lib调用–> 库调用,kernel调用 运行用户代码–>用户模式–>用户空间; 运行kernel–>内核模式–>内核空间; 内核的功用:进程管理,文件系统,网络功能,内存管理,驱动程序,安全功能 C…

    Linux干货 2016-08-02
  • 马哥教育网络班22期-第4周博客作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@zck ~]# cp -r /etc/skel /home/tuser1 [root@zck ~]# ll -d /hom…

    Linux干货 2016-09-02

评论列表(1条)

  • 马哥教育
    马哥教育 2018-01-07 17:59

    博文描述的有点简单哈~可以深入一点,类似yum中遇到的问题、搭建网络yum源等~