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目录,就可以提供给本地使用了
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容