; Linux程序包管理相关 | Linux运维部落

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包:

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
语法: 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,每个<span class="hljs-comment">#表示2%</span>
                --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:强制升级;
        注意:
            <span class="hljs-number">1.</span>不要对内核进行升级操作;Linux支持多内核版本共存,因此,直接安装新版本内核
            <span class="hljs-number">2.</span>如果某原程序包的配置文件被修改过,升级后同名的配置文件不会被更新,而是把新配置文件重命名提供;一般叫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, --<span class="hljs-keyword">list</span>:程序安装生成的文件列表
            -i, --info:程序包相关的信息,版本号、大小
            -c, --configfiles:<span class="hljs-keyword">List</span> only configuration files (implies -l).
            -d, --docfiles:<span class="hljs-keyword">List</span> only configuration files (implies -l).
            --provides:<span class="hljs-keyword">List</span> capabilities this package provides.
            -R, --requires:<span class="hljs-keyword">List</span> capabilities on which this package depends.
            --scripts:<span class="hljs-keyword">List</span>  the  package  specific  scriptlet(s)  that  are used <span class="hljs-keyword">as</span> part of the installation <span class="hljs-keyword">and</span> 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 <span class="hljs-keyword">and</span> file type)
        <span class="hljs-number">5</span> digest (formerly MD5 sum) differs
        D Device major/minor number mismatch
        L readLink(<span class="hljs-number">2</span>) path mismatch
        U User ownership differs
        G Group ownership differs
        T mTime differs
        P caPabilities differ
        文件大小、权限、校验码、主次设备号、属主、属组、修改时间、功能

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

    数据库(database)(包的数据库)重建:
       
        rpm管理器数据库路径:/<span class="hljs-keyword">var</span>/lib/rpm/
            查询操作:通过此处的数据库进行

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

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

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

yum

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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 <span class="hljs-params">| erase package1 [package2] [...]
    * autoremove [package1] [...]
    * list [...]
    * info [...]
    * provides |</span> whatprovides feature1 [feature2] [...]
    * clean [ packages <span class="hljs-params">| metadata |</span> expire-cache <span class="hljs-params">| rpmdb |</span> plugins <span class="hljs-params">| all ]
    * makecache [fast]
    * groups [...]
    * search string1 [string2] [...]
    * shell [filename]
    * resolvedep dep1 [dep2] [...]
       (maintained <span class="hljs-keyword">for</span> legacy reasons only - use repoquery <span class="hljs-keyword">or</span> yum provides)
    * localinstall rpmfile1 [rpmfile2] [...]
       (maintained <span class="hljs-keyword">for</span> legacy reasons only - use install)
    * localupdate rpmfile1 [rpmfile2] [...]
       (maintained <span class="hljs-keyword">for</span> legacy reasons only - use update)
    * reinstall package1 [package2] [...]
    * downgrade package1 [package2] [...]
    * deplist package1 [package2] [...]
    * repolist [all|</span>enabled<span class="hljs-params">|disabled]
    * repoinfo [all|</span>enabled<span class="hljs-params">|disabled]
    * repository-packages &lt;enabled-repoid&gt; &lt;install|</span>remove<span class="hljs-params">|remove-<span class="hljs-keyword">or</span>-reinstall|</span>remove-<span class="hljs-keyword">or</span>-distribution-synchronization&gt; [package2] [...]
    * version [ all <span class="hljs-params">| installed |</span> available <span class="hljs-params">| group-* |</span> nogroups* <span class="hljs-params">| grouplist |</span> groupinfo ]
    * history [info<span class="hljs-params">|list|</span>packages-list<span class="hljs-params">|packages-info|</span>summary<span class="hljs-params">|addon-info|</span><span class="hljs-keyword">redo</span><span class="hljs-params">|undo|</span>rollback<span class="hljs-params">|new|</span>sync<span class="hljs-params">|stats]
    * load-transaction [txfile]
    * updateinfo [summary |</span> list <span class="hljs-params">| info |</span> remove-pkgs-ts <span class="hljs-params">| exclude-updates |</span> exclude-all <span class="hljs-params">| check-running-kernel]
    * fssnapshot [summary |</span> list <span class="hljs-params">| have-space |</span> create <span class="hljs-params">| delete]
    * fs [filters |</span> refilter <span class="hljs-params">| refilter-cleanup |</span> du]
    * check
    * help [command]
   
    有点多了,常用的选项有这些:
   
    显示仓库列表<span class="hljs-symbol">:repolist</span> [all<span class="hljs-params">|enable|</span>disable]
    显示程序包<span class="hljs-symbol">:list</span>
        <span class="hljs-comment"># yum list [all| glob_exp1] [glob_exp2] [...]</span>
        <span class="hljs-comment"># yum list {available|installed|updates} [glob_exp1] [...]</span>
    安装程序包:install
        install package [package2] [...]
        reinstall package1 [package2] [...] (重装)
    升级程序包:
        update [package1] [package2] [...]
        downgrade package1 [package2] [...] (降级)
    检查升级:check-update
    卸载程序包:
        remove<span class="hljs-params">| erase package1
    查询包信息:info
        info [...]
    查看指定特性或文件是由哪个程序包所提供的:
        provides |</span> whatprovides feature1 [feature2] [...]
    清除本地缓存(包):
        clean [ package <span class="hljs-params">| metadate |</span> expire-cache <span class="hljs-params">| rpmdb |</span> plugins <span class="hljs-params">| all ]:我爱用all选项
    构建缓存:
        makecache
    搜索关键字:
        search string1 [string2] [...]
        以指定的关键字搜索程序包及summary信息
    依赖关系分析:
        deplist package1 [package2] [...]
    yum历史事务:
        history [info|</span>list<span class="hljs-params">|packages-list|</span>packages-info<span class="hljs-params">|summary|</span>addon-info<span class="hljs-params">|<span class="hljs-keyword">redo</span>|</span>undo<span class="hljs-params">|rollback|</span>new<span class="hljs-params">|sync|</span>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,仓库又被称为源,有本地源和网络源,可以用光盘作为本地源获取软件并安装,这样不用担心软件来源和安全问题。网络源国内有阿里源(吐槽一下阿里源太慢了),搜狐源,还有清华大学的源。

将光盘作为本地源

首先挂载光盘:


1
2
mount -r /dev/cdrom /media/cdrom
<span class="hljs-comment"># -r只读挂载,将光盘挂载到/media目录下的cdrom目录</span>

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


1
2
3
4
5
6
7
8
9
10
vi /etc/yum.repos.d/locationcdrom.repo
<span class="hljs-comment"># 格式如下</span>

[repositoryID]
<span class="hljs-comment">#自定义一个软件仓库的ID</span>
name=
<span class="hljs-comment">#</span>
baseurl=
enabele=
gpgcheck=

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


1
<span class="hljs-comment">#yum repolist还会更新一下本地软件仓库列表的缓存</span>

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

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


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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论列表(1条)

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

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

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐注册  guoqibee.com  万达娱乐注册  万达直属QQ  万达主管  万达主管QQ  万达娱乐招商  万达开户  万达主管  万达招商QQ