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
下一篇 2018-01-04

相关推荐

  • 计算机的组成及功能

    计算机的组成及功能 计算机的组成 计算机的组成,简单地来说,包含硬件和软件两部分,两者相辅相成,缺一不可。在计算机网络发展的今天,网络也已成为计算机不可或缺的一部分。 计算机硬件 可以分为如下5个部分: 控制器 负责对程序的控制信息进行分析,控制并协调输入、输出操作或内存访问,如CPU 运算器 负责数据的算术运算和逻辑运算,如C…

    Linux干货 2016-10-29
  • RAID解说

    RAID(RedundantArrays of Inexpensive Disks,RAID),又叫独立的磁盘阵列。有“价格便宜具有冗余能力的磁盘阵列”之意。原理是利用数组方式来作磁盘组,配合数据分散排列的设计,提升数据的安全性。磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术…

    2017-03-14
  • 请罗列Linux发行版的基础目录名称命名法则及功用规定

    Linux文件系统 <逻辑视图>     根文件系统(rootfs):         root filesystem     LSB,FHS:(FileSystem Heirache Standard)         /bo…

    Linux干货 2016-10-30
  • 图解Man

    个人浅见 欢迎指正

    Linux干货 2016-10-18
  • 高阶函数&&装饰器

    Edit 高阶函数&&装饰器 高阶函数 first class object 函数在python中是一等公民 函数也是对象,可调用的对象 函数可以作为普通比变量、参数、返回值 高阶函数 数学概念:y = g(f(x)) 在数学和计算机科学中,高阶函数应当是至少满足下面一个条件的函数 接受一个或多个函数作为参数 输出一个函数,return 函数…

    Linux干货 2017-10-24
  • N21_第x周_Storm_01_单机实践篇

       这2周没有按马哥安排的课程走,因公司需要,大家一直在试尝大数据这块。作业不能不做,也不知道马哥哪周的作业会有storm,只好先将这段时间的实验慢慢记录下来(其它flume、kafka、spark等本周会慢慢补充),等知道具体的作业题目后,再完善。 实验目的   了解storm的原理,并用storm单机版实验加深理解,为后面…

    Linux干货 2016-09-15

评论列表(1条)

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

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