包管理器

包管理器

Scroll Down

一、软件包管理器的发展

开源软件最早的时候是没有软件包以及软件包管理器的,用户只能下载源代码包自行配置(configure),编译(make)和安装(make install),且后续维护麻烦。后来随着Linux的发展,通过源码包来安装软件就逐步退出历史舞台。

通过定义软件包格式、以及通过软件包管理器安装软件将会方便许多。Debian发行版本推出了deb格式的软件包,并配备apt软件包管理器Red hat发行版本推出了rpm格式的软件包,并配备yum软件包管理器。deb软件包的丰富程度和易用性上高于rpm,这也是很多linux发行版基于debain/ubuntu的原因(比如说kali linux)。

二、deb格式软件

1、deb格式软件包

deb格式最早被Debian开发和采用,由于Ubuntu是从Debian分支发展而来的,所以自然而然也继承了这种软件包格式。

image.png

2、开源软件的依赖性

由于开源软件分散开发相互依赖的特点,所以deb软件包也存在着的依赖关系。比如A开发了一个系统的大致框架,该框架的特点就是提供前端界面开发并且开源,但是界面很丑,B在用他的框架时改进了前端界面,并将前端界面的包开源。那么C如果在使用该软件时,不能只安装B发布的开源软件,而是需要将A的开源软件一起安装,否则就会出现依赖问题。常见的依赖关系:

  • depends(依赖):想要安装B,就必须要安装A,不安装A没法使用
  • conflicts(冲突):想要安装B,就不可以安装A
  • recommends(推荐):安装完B后,为了凸显本软件的功能强大,推荐安装A,不安装A也可以正常使用

三、ubuntu的软件来源

手机的APP是从应用商店下载并安装的。那么deb软件包也是从ubuntu仓库去下载和安装的,不过安装的时候,得解决软件包相互依赖的问题。ubuntu仓库又分为官方和第三方仓库,那么系统就从官方库和第三方库去下载软件。

软件仓库也称为软件源

image.png

1、官方仓库

官方库是由ubuntu软件包维护者维护并发布的deb软件包的集合。这些deb软件包可以以在线的形式存在,也可以以线下的形式存在(比如CD/DVD等形式)。因为官方的服务器在国外,所以在更新或者下载安装时会很慢,所以很多国内互联网公司/高校将官方库的所有deb软件包定期下载到自己的服务器上(即镜像官方库),以供国内使用者去下载安装。

  1. 官方库有四个,不过一般只建议使用前三个,如果要在生产环境中使用需要慎重考虑

  2. 不同ubuntu版本使用的官方库之间不兼容,但是同版本之间的不同应用镜像使用的是相同的官方库,比如说18.04 desktop和18.04 server使用的就是相同官方库。

官方库中的软件是根据版本来进行发布的,就是18.04发布后,18.04专用的官方库才开放且软件数量不变。如果你看某个软件更新的新功能想去使用,如果要安装最新的软件版本,则需要等到18.10或者19.04发布。针对该情况,ubuntu提出PPA&第三方库解决方案。

需要注意的是,如果18.04某个软件存在安全性问题,那么官方库中是有补丁的

2、第三方仓库

1) PPA

第三方库顾名思义个人开发者发布的软件包的集合,一般称为PPA(personal package archives,个人软件包归档)。PPA中的软件非常丰富,版本大多也是最新的,但是不会经过官方审核,可能存在安全风险/系统稳定性问题,所以强烈不建议在生产环境中使用PPA。

一般desktop中可以去使用PPA,server中强烈不建议使用PPA

PPA在线

如何去下载PPA中的软件呢?将PPA软件源添加至系统的软件源索引文件(/etc/apt/sources.list.d)中,然后更新索引文件,最后去下载并安装PPA软件。如何将PPA添加到系统的软件源索引中呢?

当需要通过apt下载安装软件时,系统首先读取软件源索引文件中的官方库和PPA,如果该文件没有任何软件源就会返回”unable to locate package”到终端

2) 添加PPA至软件源索引文件

添加PPA:sudo add-apt-repository ppa:ppa
tips1:以ppa:dr-akulavich/lighttable为例,如果添加ppa:dr-akulavich则会得到该层的所有软件包;如果添加ppa:dr-akulavich/lighttable,则只会得到lighttable
tips2:当输入完后,系统将会在/etc/apt/sources.d目录下创建.list和.save文件,用来保存PPA的软件源
更新索引文件:sudo apt-get update
安装软件包:sudo apt-get install xxxx
删除PPA:sudo add-apt-repository --remove ppa:ppa
tips1:删除PPA之前,建议先删除PPA安装的软件,否则软件会保留在系统中不会得到任何更新而已。Ubuntu是无法删除PPA安装的软件包的,必须使用synaptic包管理器去查找并删除(sudo apt-get install synaptic)

四、包管理器

Ubuntu使用的包管理器有很多种,比如dpkg、apt、aptitude、snap、synaptic,不过常用的就dpkgaptsnap

image.png

1、dpkg

dpkg是Ubuntu软件包管理工具的基础。主要对本地软件包进行管理,负责安全卸载软件包,配置,以及维护已安装的软件包。本地软件包包括已经下载安装的软件和已经下载但没有安装的deb文件不解决依赖关系

image.png

dpkg [参数] [软件包.deb]
-i:安装
-s:查看已安装的软件详细信息
-P:彻底删除,包括配置文件
-S:查找文件归属哪个软件包
-l:列出本地所有已安装的软件包
--print-architecture:查看软件包的硬件兼容信息(amd64表示64bits架构、i386表示32bits架构)
tips1:不建议使用dpkg来安装deb格式软件包,因为无法解决依赖关系的问题,而强制安装则会带来很大危害。

2、apt

apt包管理器是自动化的包管理器指可以自动解决DEB软件包依赖关系软件管理工具)、也是现在推荐使用的包管理器。在管理软件包之前,首先要做的是备份默认的软件源索引文件(/etc/apt/sources.list)。apt的特点就是依赖版本软件库(即一个版本对应一个官方库),能够自动解决软件包依赖问题。

tips1:备份索引文件:sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

apt包含了apt-cache和apt-get,其中apt-cache搜索软件,而apt-get管理软件。

apt-cache

搜索软件:apt-cache search xxx
查看软件:apt-cache show xxx
显示软件包的依赖关系和包的提供者信息:apt-cache showpkg xxx
了解使用依赖:apt-cache depends xxx

apt-get

编辑索引文件:sudo apt edit-sources
更新索引文件:sudo apt-get update
升级可升级的软件包:sudo apt-get upgrade
tips1:需要先更新索引
检查依赖是否损坏:sudo apt-get check
自动解决依赖关系:sudo apt-get -f install
安装软件:sudo apt-get install xxx -y
卸载软件:sudo apt-get remove xxx --purge
重新安装:sudo apt-get install xxx --reinstall
升级系统(风险操作):sudo apt-get dist-upgrade

apt使用过程中的问题

a) 警告稳定性

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.如果只是单独执行,apt命令一般的使用还是没问题的

b) 清除锁文件

在使用apt安装软件时,可能会得到如下错误:E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?这种情况可能是其他的包管理器也在进行安装相关的操作,更有可能是其他程序锁定但程序退出时却没有即时删掉其创建的锁定文件造成的。
tips1:解决方法就是删除锁文件 rm -rf /var/lib/dpkg/lock

3、snap

从Ubuntu 16.04开始,Canonical主推的snappy软件包技术亮相,对应最新的软件包格式snap软件包,类似于MacOS的pkg格式软件包,即将所有依赖包全部打入一个软件包中,用空间换便捷。Ubuntu 20.04,snap格式则更加成熟,软件包数量上也丰富了很多,这是一种面向未来的技术和规范,将会日益流行。snap软件包格式最大的优势就是不存在复杂的依赖关系且与操作系统隔离更加安全解决apt依赖版本软件库的问题。此外还可通过snapcraft工具将现有的deb包转为snap格式,并且创建snap应用程序。

image.png

snap软件包安装在/snap目录下,将下载的安装文件挂载到该目录下并自动创建挂载点,然后复制文件到指定位置。

snap

查找软件:sudo snap find “关键词”
安装软件:sudo snap install xxx
更新软件:sudo snap refresh xxx
查看已安装的软件:sudo snap list
查看已安装的软件包信息:sudo snap info xxx
删除软件:sudo snap remove xxx
获得最近变更:sudo snap changes