美文网首页
linux程序包管理相关

linux程序包管理相关

作者: 耗奇害死猫 | 来源:发表于2018-01-04 09:45 被阅读0次

    前言

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

    程序员用编程语言写文本格式的源代码,但是计算机只能读懂二进制文件,那么就需要将源代码转换成二进制格式,这个过程称为编译。编译用的工具称为编译器,编译器有很多种,在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程序包管理相关

          本文链接:https://www.haomeiwen.com/subject/oqglnxtx.html