Linux软件包管理机制

  |  

摘要: 本文记录了在 Linux 用源码以及包管理机制安装软件的方法。

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


源码安装

基本步骤

在上图第二步中的--prefix后面接的路径表示这个软件将要安装到哪个目录去,如果没有指定--prefix=/path这个参数,通常默认为/usr/local

源码包安装方式的man文件默认保存在/usr/local/man/usr/local/share/man中,如果你的安装路径自定义为如/usr/local/XXX,则man文件则一般是在/usr/local/XXX/share/man中。此时如果你想要通过man来查看你所安装软件的man手册,则需要自行修改man的路径配置文件(可能是man.config或者manpath.config)。需要在相应位置添加如下一行:

1
MANPATH = /usr/local/XXX/share/man

通过源码包安装的软件,当你想要卸载的时候,只需要把整个安装路径删除掉就行了,100%卸载,不会像windows那样经常会残留那多注册表之类的垃圾。

如果你安装时候指定的路径为:--prefix=/usr/local/XXX,那么卸载的时候只需要把XXX这个文件夹删除即可,因为该软件安装的所有文件都是放置在XXX这个文件夹。

但如果你进行源码包安装的时候没有指定位置(默认值一般为/usr/local/),或指定的位置为--prefix=/usr/local,则这时候你安装软件生成的文件将分别存储在/usr/local/里面的bin、lib或etc等目录中,这时候卸载起来就相对麻烦一点了。

源码包安装与二进制包的区别

源码包的优点:

1)开源,如果有能力可以修改源代码
2)可以自由选择所需的功能
3)软件是编译安装,所以更加适合自己的系统,更加稳定也效率更高
4)卸载方便

源码包的缺点:

1)安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误
2)编译过程时间较长,安装比二进制安装时间长
3)因为是编译安装,安装过程中一旦报错就很麻烦

二进制包的优点:

1)包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
2)安装速度比源码快得多

二进制包的缺点:

1)经过编译,不可以再看到源码
2)功能选择不如源码包灵活
3)依赖性


dpkg & apt

dpkg

deb 的命名规则 Package_Version-Build_Architecture.deb

dpkg软件包相关文件

1
2
3
4
5
/etc/dpkg/dpkg.cfg dpkg包管理软件的配置文件【Configuration file with default options】
/var/log/dpkg.log dpkg包管理软件的日志文件【Default log file (see /etc/dpkg/dpkg.cfg(5) and option --log)】
/var/lib/dpkg/available 存放系统所有安装过的软件包信息【List of available packages.】
/var/lib/dpkg/status 存放系统现在所有安装软件的状态信息
/var/lib/dpkg/info 记安装软件包控制目录的控制信息文件

dpkg 使用文本文件作为数据库来维护系统中软件,包括文件清单, 依赖关系, 软件状态, 等等详细的内容,通常在 /var/lib/dpkg 目录下。 通常在 status 文件中存储软件状态和控制信息。 在 info/ 目录下备份控制文件, 并在其下的 .list 文件中记录安装文件清单, 其下的 .mdasums 保存文件的 MD5 编码。

查询dpkg数据库 dpkg -l

每条记录的第一、二、三个字符,这就是软件包的状态标识,后边依此是软件包名称、版本号和简单描述。

第一字符为期望值(Desired=Unknown/Install/Remove/Purge/Hold)

1
2
3
4
5
u Unknown状态未知,这意味着软件包未安装,并且用户也未发出安装请求.
i Install用户请求安装软件包.
r Remove用户请求卸载软件包.
p Purge用户请求清除软件包.
h Hold用户请求保持软件包版本锁定.

第二列,是软件包的当前状态(Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend)

1
2
3
4
5
6
7
8
n Not软件包未安装.
i Inst软件包安装并完成配置.
c Conf-files软件包以前安装过,现在删除了,但是它的配置文件还留在系统中.
u Unpacked软件包被解包,但还未配置.
f halF-conf试图配置软件包,但是失败了.
h Half-inst软件包安装,但是但是没有成功.
w trig-aWait触发器等待
t Trig-pend触发器未决

第三列标识错误状态,第一种状态标识没有问题,为空. 其它符号则标识相应问题(Err?=(none)/Reinst-required (Status,Err: uppercase=bad))

1
2
3
h 软件包被强制保持,因为有其它软件包依赖需求,无法升级.
r Reinst-required,软件包被破坏,可能需要重新安装才能正常使用(包括删除).
x 软包件被破坏,并且被强制保持.

一些例子

1
2
3
4
5
ii —— 表示系统正常安装了该软件
pn —— 表示安装了该软件,后来又清除了
un —— 表示从未安装过该软件
iu —— 表示安装了该软件,但是未配置
rc —— 该软件已被删除,但配置文件仍在

dpkg子命令

dpkg-deb、dpkg-divert、dpkg-query、dpkg-split、dpkg-statoverride、start-stop-daemon

dpkg使用

安装

安装软件包,必须是deb包的完整名称。(软件的安装可被拆分为两个对立的过程“解包”和“配置”)

1
dpkg -i package-name.deb # --install

“解包”:解开软件包到系统目录但不配置,如果和-R一起使用,参数可以是一个目录

1
dpkg --unpack package-name.deb #
1
2
3
4
5
6
dpkg --configure package-name.deb #“配置”:配置软件包
dpkg -c package-name.deb #列出 deb 包的内容

-R, --recursive Recursively handle all regular files matching pattern *.deb found at specified directories and all of its
1. This can be used with -i, -A, --install, --unpack
2. --avail actions(递归地指向特定目录的所有安装包,可以结合-i, -A, --install, --unpack 与 --avail一起使用)

移除

1
2
dpkg -r package-name # --remove, 移除软件包,但保留其配置文件
dpkg -P package-name # --purge, 清除软件包的所有文件(removes everything, including conffiles)

查询

1
2
3
4
5
dpkg -l package-name-pattern # --list, 查看系统中软件包名符合pattern模式的软件包
dpkg -L package-name # --listfiles, 查看package-name对应的软件包安装的文件及目录
dpkg -p package-name # --print-avail, 显示包的具体信息
dpkg -s package-name # --status, 查看package-name(已安装)对应的软件包信息
dpkg -S filename-search-pattern # --search,

从已经安装的软件包中查找包含filename的软件包名称 (Tip:也可使用子命令dpkg-query来进行查询操作)

apt

linux distribution 先将软件放置到对应的服务器中,然后分析软件的依赖关系,并且记录下来,然后当客户端有安装软件需求时,通过清单列表与本地的dpkg以存在的软件数据相比较,就能从网络端获取所有需要的具有依赖属性的软件了。

Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源。

然而,由于每位用户所处的网络环境不同,不可能随意地访问各镜像站点。为了能够有选择地访问,在Ubuntu系统中,使用软件源配置文件/etc/apt/sources.list列出最合适访问的镜像站点地址。

用户可以使用“apt-get update”命令刷新软件源,建立更新软件包列表。在Ubuntu Linux中,“apt-get update”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。 使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。

apt install 原理

apt相关文件

1
2
3
4
var/lib/dpkg/available 文件的内容是软件包的描述信息, 该软件包括当前系统所使用的Debian 安装源中的所有软件包,其中包括当前系统中已安装的和未安装的软件包.
/etc/apt/sources.list 记录软件源的地址(当你执行 sudo apt-get install xxx 时,Ubuntu 就去这些站点下载软件包到本地并执行安装)
/var/cache/apt/archives 已经下载到的软件包都放在这里(用 apt-get install 安装软件时,软件包的临时存放路径)
/var/lib/apt/lists 使用apt-get update命令会从/etc/apt/sources.list中下载软件列表,并保存到该目录

apt使用

常用选项

1
2
3
4
5
6
7
8
9
10
11
12
13
-h 本帮助文件。
-q 输出到日志 - 无进展指示
-qq 不输出信息,错误除外
-d 仅下载 - 不安装或解压归档文件
-s 不实际安装。模拟执行命令
-y 假定对所有的询问选是,不提示
-f 尝试修正系统依赖损坏处
-m 如果归档无法定位,尝试继续
-u 同时显示更新软件包的列表
-b 获取源码包后编译
-V 显示详细的版本号
-c=? 阅读此配置文件
-o=? 设置自定的配置选项,如 -o dir::cache=/tmp

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1)apt-get update 更新源
2)apt-get dist-upgrade 升级系统到相应的发行版(根据 source.list 的配置)
3)apt-get upgrade 更新所有已经安装的软件包
4)apt-get install package_name 安装软件包(加上 --reinstall重新安装)
apt-get install package_name=version 安装指定版本的软件包
5)apt-get remove package_name 卸载一个已安装的软件包(保留配置文件)
6)apt-get purge package_name 移除软件包(删除配置信息)
或apt-get --purge remove packagename
7)apt-get check 检查是否有损坏的依赖
8)apt-get autoclean
删除你已经删掉的软件(定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式,您可以释放大量的磁盘空间。如果您的需求十分迫切,可以使用apt-get
clean以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件,因此如果您为磁盘空间不足
而感到焦头烂额,这个办法也许值得一试)
9)apt-get clean 把安装的软件的备份也删除,不过这样不会影响软件的使用

apt-cache performs a variety of operations on APT’s package cache. apt-cache does not manipulate the state of the system but does provide operations to search and generate interesting output from the package metadata.

1)apt-cache depends packagename 了解使用依赖
2)apt-cache rdepends packagename 是查看该包被哪些包依赖
3)apt-cache search packagename 搜索包
4)apt-cache show packagename 获取包的相关信息,如说明、大小、版本等
5)apt-cache showpkg packagename 显示软件包的大致信息


rpm & yum

rpm

RPM最大的特点就是需要安装的软件已经编译过,并已经打包成RPM机制的安装包,通过里头默认的数据库记录这个软件安装时需要的依赖软件。当安装在你的Linux主机时,RPM会先依照软件里头的数据查询Linux主机的依赖属性软件是否满足,若满足则予以安装,若不满足则不予安装。

优点:

1)软件已经编译打包,所以传输和安装方便,让用户免除编译
2)在安装之前,会先检查系统的磁盘、操作系统版本等,避免错误安装
3)软件的信息都已经记录在linux主机的数据库上,方便查询、升级和卸载

缺点:

1)软件包安装的环境必须与打包时的环境一致或相当
2)必须安装了软件的依赖软件
3)卸载时,最底层的软件不能先移除,否则可能造成整个系统不能用

为了解决RPM属性依赖的问题,下面也将会为你详细介绍YUM的使用方法。

RPM包的命名格式:

软件名称-版本号-发布次数.适合linux系统.硬件平台.rpm
包全名:rpm操作没有安装的软件包,软件包使用的是包全名
包 名:rpm操作的已经安装的软件,软件包使用的是包名
例如:ftp-0.17-74.fc27.i686.rpm,包全名为ftp-0.17-74.fc27.i686.rpm,包名为ftp。

RPM安装软件的默认路径

/etc 配置文件放置目录
/usr/bin 一些可执行文件
/usr/lib 一些程序使用的动态链接库
/usr/share/doc 一些基本的软件使用手册与说明文件
/usr/share/man 一些man page档案

RPM安装原理

RPM使用

安装

-i:install的意思,安装
-v:查看更详细的安装信息画面(provide more detailed output)
-h:以安装信息栏显示安装进度

不显示安装的进度

1
rpm -i emacs-25.3-1.fc28.aarch64.rpm

显示进度

1
rpm -ivh package-name

升级

-U:upgrade的意思,更新软件,若系统中没有该软件则进行安装(upgrade package(s))
-F:freshen的意思,更新系统已安装的某个软件(upgrade package(s) if already instaalled)

例子

1
rpm –Uvh  foo-2.0-1.i386.rpm

查询

RPM在查询的时候,其实查询的地方是/var/lib/rpm/这个目录下的数据库文件。另外,RPM也可以查询未安装的RPM文件内的信息。

1
2
3
4
5
6
7
8
9
rpm {-q|--query} [select-options] [query-options] 
-a:all,列出已经安装在本机的所有软件(Query all instaled packages.)
-p:package,查询一个RPM文件的信息(Query an (uninstalled) package. )
-f:file,由后面接的文件名称找出该文件属于哪狐假虎威已安装的软件(Query package owning file.)
-i:information,列出该软件的详细信息,包含开发商、版本与说明等(Display package information, including name, version, and description.)
-l:list,列出该软件所有的文件与目录所在完整文件名(List file in package)
-c:configuration,列出该软件的所有设置文件(找出在/etc/下面的文件名而已)(List only configuration files)
-d:documentation,列出该软件所有的帮助文档(List only documentation files)
-R:required,列出与该软件有关的依赖软件所含的文件(List capabilities on which this depends.)

注意:在查询的部分,所有的参数之前都要加上-q才是所谓的查询。

例子

1)查询你的Linux是否有安装某个软件

1
rpm -q yum

2)查询属于该软件所提供的所有目录与文件

1
2
3
rpm -ql yum
rpm -qc yum #仅列出该软件的所有设置文件
rpm -qd yum #仅列出该软件的所有帮助文档

3)列出gcc这个软件的相关数据说明

1
rpm -qi gcc

4)找出/bin/sh是由哪个软件提供的

1
rpm -qf /bin/sh

5)假设我有下载一个RPM文件,包名为wget-1.19.1-3.fc27.aarc64.rpm,想要知道该文件的需求文件,该如何办?

1
rpm -qpR wget-1.19.1-3.fc27.aarc64.rpm

卸载

使用rpm的卸载过程一定要由最上层往下卸载,以rp-pppoe为例,这个软件主要是依据ppp这个软件来安装的,所以当你要卸载ppp的时候,就必须先卸载rp-pppoe才行!

1
rpm -e

YUM

YUM可以看作是CS架构的软件,YUM的存在很好的解决了RPM的属性依赖问题。

YUM通过依赖rpm软件包管理器, 实现了rpm软件包管理器在功能上的扩展, 因此YUM是不能脱离rpm而独立运行的。

yum 特点

1)可以同时配置多个资源库(Repository)
2)简洁的配置文件(/etc/yum.conf)
3)自动解决增加或删除rpm包时遇到的依赖性问题
4)使用方便
5)保持与RPM数据库的一致性

yum原理

Server端先对程序包进行分类后存储到不同repository容器中; 再通过收集到大量的rpm的数据库文件中程序包之间的依赖关系数据, 生成对应的依赖关系和所需文件在本地的存放位置的说明文件(.xml格式), 存放在本地的repodata目录下供Client端取用

Cilent端通过yum命令安装软件时发现缺少某些依赖性程序包, Client会根据本地的配置文件(/etc/yum.repos.d/*.repo)找到指定的Server端, 从Server端repo目录下获取说明文件xxx.xml后存储在本地/var/cache/yum中方便以后读取, 通过xxx.xml文件查找到需要安装的依赖性程序包在Server端的存放位置, 再进入Server端yum库中的指定repository容器中获取所需程序包, 下载完成后在本地实现安装。

YUM是一个在线软件管理工具,所以使用YUM进行的操作大都是需要在联网的条件下才能正常使用。

yum的配置文件

1. 容器说明

虽然yum是你在联网后就能直接使用,不过,由于你系统的站点镜像没选择好,会导致连接速度非常慢!所以,这时候就需要我们去手动修改yum的设置文档了。

如你连接到CentOS的镜像站点 http://ftp.twaren.net/Linux/CentOS/7.6.1810/ 后,就会发现里面有一堆链接,那些链接就是这个yum服务器所提供的容器了,包括centosplus、extras、fasttrack、os、updates等容器,最好认的就是os(系统默认的软件)与updates(软件升级版本)。

在yum服务器的容器里面,最重要的一个目录就是那个“repodata”,该目录是分析RPM软件后所产生的软件依赖数据放置处。因此,当你找到容器所在网址时,最重要的就是该网址下面一定要有一个名为“repodata”的目录存在,那就是容器的网址了。

2. 容器查询

查询一下目录yum server所使用的容器有哪些。

yum repolist all 结果示例如下

只有当最右边的status为enabled该容器才算激活

/etc/yum.repos.d/里面会有多个配置文件(文件名以.repo结尾),yum会从里面逐个查找,所以里面的容器名称不能有重复。

3. 配置文件修改

vi /etc/yum.repos.d/CenOS-Base.repo

1
2
3
4
5
6
7
8
[base]:代表容器的名字。中括号一定要存在,里面的名称可以随意起,但不能有两个相同的容器名称,否则yum会不知道去哪里找容器相关软件列表文件。
name:只是说明一下这个容器的意义而已,重要性不高。
mirrorlist:列出这个容器可以使用的镜像站点,如果不想使用可以批注掉这一行。
baseurl:这个最重要,因为后面接的就是容器的实际网址。mirrorlist是由yum程序自行去找镜像站点,
baseurl则是指定固定的一个容器网址。
enable=1:启动这个容器,默认值也为1。关闭这个容器可以设置enable=0。
gpgcheck=1:指定是否需要查阅RPM文件内的数字证书。
gpgkey:数字证书的公钥文件所在位置,使用默认值即可。

注意:

1) yum会自动识别/etc/yum.repos.d/目录以.repo结尾的文件。
2)当我们修改了配置文件的网址却没有修改容器名称,可以会造成本机的列表与yum服务器的列表不同步,这时就需要手动来清除容器的数据了:

1
yum clean [packages | headers | all]

参数:
packages:将已下载的软件文件删除
headers:将下载的软件文件头删除
all:将所有容器数据都删除

例:删除已下载过的所有容器相关数据(含软件本身与列表)

1
yum clean all

yum使用

1. 查询

search:搜索某个软件名称或者是描述的重要关键字;
list:列出目前yum所管理的所有的软件名称与版本,有点类似于rpm -qa
info:同上,不过有点类似于rpm -qai
provides:从文件去搜索软件!类似于rpm -qf

1)查询与ftp相关的软件有哪些

1
yum search ftp

2)查询gcc这个软件的功能

1
yum info gcc

可以查询到该软件的版本号、描述信息、是否已安装等信息。

3)列出yum服务器上所提供的所有软件名称

1
yum list

4)列出目前服务器上可供本机进行升级的软件有哪些

1
yum list updates

5)列出提供passwd这个文件的软件有哪些

1
yum provides passwd

6)查找以pam开头的软件名称有哪些

1
yum list pam*

2. 安装与升级

install:后面接要安装的软件。
update:后面接要升级的软件。若要整个系统都升级,就直接update即可。
使用参数-y,当遇到需要等待用户输入时,这个选项会提供yes的响应,如:yum -y install emacs

3. 卸载

remove

4. 软件组管理

grouplist:列出所有可用的组列表
groupinfo:后面接group name,则可以了解该组内含的所有组名称
groupstall:安装一整级的软件
groupremove:删除某个组


Share