Linux包管理器

Posted by wsxq2 on 2019-11-21
TAGS:  包管理器yumrpmaptdpkgTODO

本文最后一次编辑时间:2020-06-19 10:12:14 +0800

众所周知,Linux 下管理软件对新手而言很不友好,因此本文将详细讲解基于 redhat 的yumrpm和基于 debian 的aptdpkg的用法。在学 Linux 的路上,这应该是最先需要掌握的内容

本文以基于 redhat 的 CentOS 和 基于 debian 的 Ubuntu 为例

基本原理

开源镜像站

中国开源镜像站点

——引用自handbook/CentOS7更换yum软件镜像源.md at master · jaywcjlove/handbook

CentOS

镜像源

国内常用镜像源:

软件库

可供 CentOS 使用的软件库可参见 zh/AdditionalResources/Repositories - CentOS Wiki

由于使用其它软件库可能导致系统不稳定(比如atomic),因此官方建议正常情况下不要使用其它库:

1
2
sed -i 's/enabled *= *1/enabled=0/' /etc/yum.repos.d/epel.repo
sed -i 's/enabled *= *1/enabled=0/' /etc/yum.repos.d/atomic.repo

epel

安装方法;

1
yum install epel-release

atomic

安装方法;

1
wget -O - http://updates.atomicorp.com/installers/atomic |sh

yum

yum provides

In general, you can search for what package provides a command using the yum provides command:

1
sudo yum provides '*bin/nslookup'

事实上,只要知道该包的某个文件的路径即可:

1
yum provides */X11/extensions/Xrandr.h

详情参见Nslookup: command not found error on RHEL/CentOS 7

yum history

使用回滚彻底删除安装的依赖包:

1
2
yum history list <package>
yum history undo <ID>

使用代理

参见 10. 有代理服务器时使用 yum

rpm

List the installed RPMs by date of installation/update?

  1. To list all packages and their install dates, latest first:

    1
    
    rpm -qa --last
    
  2. This should work on any RPM based machine:

    1
    
    rpm -qa --qf '%{INSTALLTIME} (%{INSTALLTIME:date}): %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' | sort -n
    

    (To get a list of all possible tags, use rpm --querytags.)

——引用自CentOS: List the installed RPMs by date of installation/update? - Unix & Linux Stack Exchange

关于 RPM 文件的使用方法

事实上,对于 RPM 文件,除了可以直接使用rpm -i命令进行安装,还可以使用yum install命令安装。使用 yum 的好处是能自动处理依赖关系。例如:

1
2
3
4
root@wsxq21:~/shadowsocks-libev/rpm/RPMS/x86_64# rpm -i *.rpm
错误:依赖检测失败:
        zsh 被 shadowsocks-libev-zsh-completion-3.3.0-1.21.gite3c6c80.el7.x86_64 需要
root@wsxq21:~/shadowsocks-libev/rpm/RPMS/x86_64#

而使用 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
root@wsxq21:~/shadowsocks-libev/rpm/RPMS/x86_64# yum install *.rpm
已加载插件:fastestmirror
正在检查 libshadowsocks-libev-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm: libshadowsocks-libev-3.3.0-1.21.gite3c6c80.el7.x86_64
libshadowsocks-libev-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm 将被安装
正在检查 libshadowsocks-libev-devel-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm: libshadowsocks-libev-devel-3.3.0-1.21.gite3c6c80.el7.x86_64
libshadowsocks-libev-devel-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm 将被安装
正在检查 shadowsocks-libev-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm: shadowsocks-libev-3.3.0-1.21.gite3c6c80.el7.x86_64
shadowsocks-libev-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm 将被安装
正在检查 shadowsocks-libev-debuginfo-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm: shadowsocks-libev-debuginfo-3.3.0-1.21.gite3c6c80.el7.x86_64
shadowsocks-libev-debuginfo-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm 将被安装
正在检查 shadowsocks-libev-zsh-completion-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm: shadowsocks-libev-zsh-completion-3.3.0-1.21.gite3c6c80.el7.x86_64
shadowsocks-libev-zsh-completion-3.3.0-1.21.gite3c6c80.el7.x86_64.rpm 将被安装
正在解决依赖关系
--> 正在检查事务
---> 软件包 libshadowsocks-libev.x86_64.0.3.3.0-1.21.gite3c6c80.el7 将被 安装
---> 软件包 libshadowsocks-libev-devel.x86_64.0.3.3.0-1.21.gite3c6c80.el7 将被 安装
---> 软件包 shadowsocks-libev.x86_64.0.3.3.0-1.21.gite3c6c80.el7 将被 安装
---> 软件包 shadowsocks-libev-debuginfo.x86_64.0.3.3.0-1.21.gite3c6c80.el7 将被 安装
---> 软件包 shadowsocks-libev-zsh-completion.x86_64.0.3.3.0-1.21.gite3c6c80.el7 将被 安装
--> 正在处理依赖关系 zsh,它被软件包 shadowsocks-libev-zsh-completion-3.3.0-1.21.gite3c6c80.el7.x86_64 需要
Loading mirror speeds from cached hostfile
 * base: repos.lax.quadranet.com
 * elrepo-kernel: repos.lax-noc.com
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: repos.lax.quadranet.com
 * updates: repos.lax.quadranet.com
--> 正在检查事务
---> 软件包 zsh.x86_64.0.5.0.2-31.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

==============================================================================================================================================================================================
 Package                                      架构               版本                                    源                                                                              大小
==============================================================================================================================================================================================
正在安装:
 libshadowsocks-libev                         x86_64             3.3.0-1.21.gite3c6c80.el7               /libshadowsocks-libev-3.3.0-1.21.gite3c6c80.el7.x86_64                         212 k
 libshadowsocks-libev-devel                   x86_64             3.3.0-1.21.gite3c6c80.el7               /libshadowsocks-libev-devel-3.3.0-1.21.gite3c6c80.el7.x86_64                   4.4 k
 shadowsocks-libev                            x86_64             3.3.0-1.21.gite3c6c80.el7               /shadowsocks-libev-3.3.0-1.21.gite3c6c80.el7.x86_64                            846 k
 shadowsocks-libev-debuginfo                  x86_64             3.3.0-1.21.gite3c6c80.el7               /shadowsocks-libev-debuginfo-3.3.0-1.21.gite3c6c80.el7.x86_64                  4.0 M
 shadowsocks-libev-zsh-completion             x86_64             3.3.0-1.21.gite3c6c80.el7               /shadowsocks-libev-zsh-completion-3.3.0-1.21.gite3c6c80.el7.x86_64             5.7 k
为依赖而安装:
 zsh                                          x86_64             5.0.2-31.el7                            base                                                                           2.4 M

事务概要
==============================================================================================================================================================================================
安装  5 软件包 (+1 依赖软件包)

总计:7.4 M
总下载量:2.4 M
安装大小:11 M
Is this ok [y/d/N]:

重建 SRPM

本部分内容主要参考自 zh/HowTos/RebuildSRPM - CentOS Wiki

SRPM 简介

RPM 文件大家都非常熟悉,是基于 RedHat 的 Linux 发行版(如 CentOS )的软件包文件。然而,你可能到目前为止从未听过 SRPM 文件。所谓的 SRPM(Source RPM),顾名思义,即只带有打包的源文件和 SPEC 文件的 RPM。使用file命令查看的结果如下:

1
2
3
4
5
root@wsxq21:~/shadowsocks-libev/rpm/SRPMS# ls
shadowsocks-libev-3.3.0-1.21.gite3c6c80.src.rpm
root@wsxq21:~/shadowsocks-libev/rpm/SRPMS# file shadowsocks-libev-3.3.0-1.21.gite3c6c80.src.rpm
shadowsocks-libev-3.3.0-1.21.gite3c6c80.src.rpm: RPM v3.0 src
root@wsxq21:~/shadowsocks-libev/rpm/SRPMS#

使用rpm-qpl参数可得结果如下:

1
2
3
4
root@wsxq21:~/shadowsocks-libev/rpm/SRPMS# rpm -qpl shadowsocks-libev-3.3.0-1.21.gite3c6c80.src.rpm
shadowsocks-libev-3.3.0-1.21.gite3c6c80.tar.gz
shadowsocks-libev.spec
root@wsxq21:~/shadowsocks-libev/rpm/SRPMS#

温馨提示-qpl也能对 RPM 文件使用

那么,它有什么用呢?不像 RPM 文件,SRPM 文件不能直接使用rpm命令的-i参数安装,它必需配置参数以编译成 RPM 文件。由此可见,其好处自然是可以在编译前自定义参数,修改默认编译配置,提高编译灵活性。即类似于./configure && make && make install系列命令的功能

从 SRPM 得到 RPM

方法一:单一步重建 SRPM

该方法使用默认的编译参数,无需手动修改,直接使用如下命令即可:

1
rpmbuild --rebuild /tmp/mypackage-1.0.0-1.src.rpm

一切顺利的话,你便会在~/rpmbuild/RPMS/i386目录里产生一个mypackage-1.0.0-1.i386.rpm文件(如果你的架构不是 i386,则相应的文件名称及目录都会发生改变)。

方法二:安装 SRPM 然后以 spec 文件重建

另一个做法就是先安装来自 SRPM 的文件,然后利用rpmbuild按照 spec 文件重建。Fedora >= 11 的 RPM 必须这样处理。

要安装一个 SRPM,请执行rpm -i指令并提供 SRPM 文件的名称作为参数。请留意用没有特殊权限的户口执行 rpm -i,而不是 root。你亦可以利用rpm -qpl来列出 SRPM 文件内的文件。当你安装一个 SRPM 文件时,spec 文件(也就是有.spec扩展名的那个)会被放进你的~/rpmbuild/SPECS目录内,而其它来自 SRPM 的文件(多数是 tar 压缩档及修正档)会被放进你的~/rpmbuild/SOURCES目录内。举个例说,要解压/tmp/mypackage-1.0.0-1.src.rpm这个文件的内容,这执行这个指令:

1
[user@host ~]$ rpm -i /tmp/mypackage-1.0.0-1.src.rpm

假如是後期 Fedora 的 RPMS,或者出現的錯誤類似 “error: unpacking of archive failed on file /builddir/build/SOURCES/mypackage-1.0.0.tar.gz;4dc983a7: cpio: MD5 sum mismatch”,则可使用如下命令:

1
[user@host ~]$ rpm --nomd5 -i /tmp/mypackage-1.0.0-1.src.rpm

当你将 SRPM 解压后,你便会留意到在~/rpmbuild/SPECS目录内多了一个 spec 文件(在这个例子里它多数会称为mypackage.spec)。你就是利用这个文件来创建 RPM。要这样做,请使用下列指令:

1
2
[user@host ~]$ cd ~/rpmbuild/SPECS
[user@host SPECS]$ rpmbuild -ba mypackage.spec

rpmbuild -ba这个指令会执行 RPM 创建过程里的所有步骤,然后在完成时创建一个 RPM 文件(它会被存储在~/rpmbuild/RPMS/i386内,或者对应你结构的目录内),与及一个新的 SRPM 文件(它会被存储在~/rpmbuild/SRPMS内)。

进一步阅读

遇到过的问题

  1. yum - Remove unused packages - Unix & Linux Stack Exchange
  2. linux - CentOS yum – pre-existing rpmdb issues - Super User
  3. yum - CentOS epel repository listed more than once - Unix & Linux Stack Exchange

Ubuntu

镜像源(source.list)

该部分对于所有基于DebianLinux均适用,因为它们都使用apt作为包管理器。kali基于Debian,所以下面以kali为例进行说明

镜像源是获取软件包(通常为开源软件)的 Web 网站, Linux 中不需要像 Windows 一样手动下载.exe文件安装,只需要配置好镜像源,然后在终端(Terminal)中使用apt命令(apt install)即可

kali 常用镜像源(文件位置:/etc/apt/source.list):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#官方(每个Linux通常都有自己官方的镜像源,但是大多在国外,比较慢)
#deb https://http.kali.org/kali kali-rolling main non-free contrib 
#deb-src https://http.kali.org/kali kali-rolling main non-free contrib
#deb https://security.kali.org/kali-security kali/updates main contrib non-free

#中国科学技术大学开源镜像(每个大学几乎都有一个开源镜像站,使用本校的镜像通常最快)
deb http://mirrors.ustc.edu.cn/kali kali main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali main non-free contrib
deb http://mirrors.ustc.edu.cn/kali-security kali/updates main contrib non-free

#阿里云镜像(一个很出名的国内开源镜像源)
#deb http://mirrors.aliyun.com/kali kali main non-free contrib
#deb-src http://mirrors.aliyun.com/kali kali main non-free contrib
#deb http://mirrors.aliyun.com/kali-security kali/updates main contrib non-free

可以通过官方获取最佳镜像源获取最佳镜像,然而亲测并不好用,强烈推荐你所在大学的镜像站,如果没有的话建议使用中国科学技术大学开源镜像

获得Https支持:apt install apt-transport-https

可以使用apt edit-source快速编辑/etc/apt/source.list

apt

dpkg

yum provides的替代?

首先,Ubuntu 中输入命令如果未找到则会提示你安装相应的包,如使用lex命令未找到会提示你安装flex,所以如果只是为了使用相应的命令(程序)而查找软件包的话,直接输入命令根据提示即可找到。这得益于软件包command-not-found。如果是需要查找某个文件所属的软件包的话,则可以继续往后阅读

在已安装的软件包中查询可使用dpkg命令中的-S参数,如:

1
dpkg -S `which flex`

在所有软件包中查询请前往 Ubuntu – Ubuntu Packages Search,注意输入正确的 Ubuntu 版本代码(使用lsb_release -a查询你当前的版本代码)。

此外,还可以使用apt-file

详情参见: apt-get or aptitude equivalent to yum whatprovides - Ask Ubuntu

链接

下面总结了本文中使用的所有链接: