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

相关推荐

  • bash 数组和变量

    数组可以把多个变量集合起来,不用再一个个的声明变量,也可以调多个单个的变量使用,极大方便了我们的使用,而且Linux bash中的数组还支持同一个数组中同时有数字和字符串。下面让我们来了解一下数组。 一,数组的简介 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 数组名和索引 索引:编号从0 开始,属于数值索引 注意…

    Linux干货 2016-08-24
  • 第一天,学习

    好好学习,天天向上

    Linux干货 2016-08-08
  • Linux基础之—基础权限和特殊权限以及FACL权限管理

    Linux是多用户多任务的操作系统,了解掌握Linux的权限分配机制,也是管理Linux系统安全的基础之一。 文件目录的权限格式如下:   1.其中权限位可以看对象到是一个9个占位符,其实分为三位一组: (1) 第一组:对应的是文件或目录的所有者属主权限。owner (2) 第二组:对应的是文件或目录的所属组权限。group (3) 第三组:对应的…

    Linux干货 2016-08-07
  • N28-第四周博客作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。

    2、编辑/etc/group文件,添加组hadoop。

    3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop。

    4、复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。

    5、修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop。

    6、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;

    7、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

    8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;

    9、找出/etc/passwd文件中的一位数或两位数;

    10、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

    11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

    12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;

    13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

    Linux干货 2017-12-26
  • UEFI与GPT(7.3课上作业)

    一、UEFI:统一可扩展固件接口 1、什么是UEFI         统一可扩展固件接口(Unified Extensible Firmware Interface,UEFI)是一种PC系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。UEFI负责加电自…

    Linux干货 2016-07-12
  • 马哥教育网络班22期+第11周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 Bob先利用单向加密算法提取当前数据的指纹(特征码),再用自己的私钥加密数据指纹并附加于数据尾部, 然后利用对称加密将整个文件加密,之后用Alice的公钥加密对称加密密钥附加于尾部。 Alice收到数据后,先用自己的私钥解密,得到对称加密密钥,之后用对称加密密钥解密,然后用Bob的公钥 解密得到数据指纹,并且验…

    Linux干货 2016-11-14

评论列表(1条)

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

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