Linux apt和dpkg

  • apt和dpkg是debian系列发行版的软件管理工具,例如debian、ubuntu、Deepin、Kali等都是使用apt和dpkg来管理软件。

  • Debian诞生时就设计了dpkg(debian package)来管理后缀为 .deb 的"包"文件,但是dpkg 本身并不处理依赖关系或与远程软件仓库的交互,所以后面debian为了更方便地管理包的依赖关系和与远程软件仓库的交互。

  • apt(Advanced Packaging Tool) 被设计并加入到 Debian 系统中。它在用户和 dpkg 之间充当了一个中介,处理依赖关系、软件仓库更新、包搜索等高级功能。

dpkg和apt具有以下的区别和联系:

  • dpkg: 直接处理 .deb 软件包文件的安装、卸载、查询等基本操作。不处理软件包的依赖关系。

  • apt: 是 dpkg 的前端,可以处理软件包的依赖关系,通过从软件仓库中下载并安装软件包以及它们的依赖。

  • apt是用户直接与之交互的工具,而它会在后台调用dpkg来完成具体的工作。

dpkg的使用

  • -i 安装软件包

  • -P 卸载软件包,配置文件也会被删除

  • -l 列出已安装的软件包

安装卸载

# 安装某个软件包
dpkg -i package_name

# 卸载某个软件包,会删除配置文件
dpkg -P package_name

查询操作

# 列出当前所有已安装的包
dpkg -l

# 列出一个已安装软件包的所有文件
dpkg -L # 大写L

# 查询某个文件属于哪个软件包
dpkg -S /path/to/file

# 查看某个软件包是否安装
# dpkg-query是专为查询已安装软件包数据库而设计的工具
dpkg-query --show --showformat='${Status}' package_name

例如:查看vsftpd这个软件包的所有文件

dpkg -L vsftpd

例如:查看vsfptd是否被安装

dpkg -l | grep vsftpd

例如:以指定的格式查看vsftpd软件包信息

# -W是 --show的段格式  -f是--showformat的段格式
dpkg-query -f='${Package}\t${Version}\n' -W 'vaftpd'

# ${Package} 软件包名称
# ${Version} 软件包版本

例如:查看vsfptd是否被安装

dpkg-query --show --showformat='${Status}' vsftpd

例如:查看vsftpd软件包的版本信息

dpkg -s vsftpd

dpkg-query -W -f='${Version}\n' vsftpd

dpkg-query的方式:

apt的使用

早期的时候,apt是由很多消得分支命令组成得,例如apt-get和apt-cache,在ubuntu里面,从1604版本就将这些命令合并成了apt一个命令了,当然apt-cache这些命令还能用。

  • apt-get:用于软件的安装、卸载等操作

  • apt-cache:用于软件的搜索

例如:查看mysql-server在apt源中的版本信息

# apt-cache policy 是一个用于查询软件包的安装状态、候选版本以及软件包在不同 APT 源中的可用版本的命令。
apt-cache policy mysql-server

apt的工作原理

  1. apt属于C/S架构,服务端存放元数据信息和软件包,客户端通过(/etc/apt/sources.list或/etc/apt/sources.list.d/*.list)配置文件连接到服务端。

  2. 将服务端的元数据信息下载到Linux主机本地,并从中检索对应软件包信息

  3. 根据检索到的信息进行相关操作,/var/cache/apt/archives/ 存储已下载的软件包文件。

apt配置文件

apt的apt源配置文件一般是存放在/etc/apt/sources.list或/etc/apt/sources.list.d/中

配置文件格式:

<type> <url> <distribution> <components>
  • type:通常为 deb 或 deb-src。deb 表示二进制软件包源(大多数用户都需要的),而 deb-src 表示源代码包。

  • url:软件包的路径

  • distribution:例如,对于Ubuntu,这可能是 focal、bionic 等,表示特定的发行版

  • components:表示软件包分类的部分。对于Ubuntu,这些可能是 main、restricted、universe 和 multiverse。

ubuntu发行版代号:

Ubuntu的版本号通常遵循YY.MM的格式,其中YY是发布年份的最后两位,MM是发布月份。每个版本都有一个代号,一般是由两个以字母顺序排列的词组成,这两个词分别是形容词和动物的名字。

  • Ubuntu 14.04 LTS: Trusty Tahr

  • Ubuntu 16.04 LTS: Xenial Xerus

  • Ubuntu 18.04 LTS: Bionic Beaver

  • Ubuntu 20.04 LTS: Focal Fossa

apt的软件源

互联网上提供了很多apt软件源,一般经常使用阿里云的软件源。

# 阿里
https://developer.aliyun.com/mirror/

# 清华大学
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

# 腾讯云
http://mirrors.cloud.tencent.com/repo/

例如:配置本地软件源为阿里云软件源

1、去阿里云复制指定版本的软件源

2、修改配置文件

ehigh@ubuntu:~$ sudo vim /etc/apt/sources.list

3、将以上复制的内容粘贴到 /etc/apt/sources.list中

4、执行apt update更新本地的元数据等信息

sudo apt update

apt相关命令

# 安装软件包
apt install package_name

# 离线下载某个软件包机器依赖(仅下载,不安装)
# 默认存放在 /var/cache/apt/archives/下
sudo apt install -d package_name

# 仅下载指定的软件包,不考虑其依赖,也不安装。
apt download  package_name

# 移除软件包(只删除掉了程序,配置文件没有被删除掉
apt remove package_name

# 移除软件包及配置文件
apt purge package_name

# 清除APT的缓存目录 (/var/cache/apt/archives/) 中的所有已下载的软件包文件(.deb 文件)
apt clean

# 刷新本地存储库索引
apt update

# 升级所有可升级的软件包
apt upgrade package_name

# 自动删除不需要的包
apt autoremove

#  查询软件包的安装状态以及显示软件包在不同软件源中的可用版本
apt policy  package_name

# 查找与某个关键词相关的所有软件包
apt search package_name

#查看某个安装包的详细信息
apt show package_name

说明:

如果一个软件包已经安装并且是最新版本,即使使用了 apt clean 清除了缓存,apt install -d <package_name> 还是不会重新下载该软件包,且就算这个软件没有安装,但是相关依赖已经在本机安装了,也不会再重新下这些依赖。
解决方法:
1、可以先将本机的软件使用purge卸载了再安装。

2、或者可以通过apt-rdepends这个工具来列出这个软件包有哪些依赖,然后再通过apt download一个一个下载。

sudo apt install apt-rdepends

apt-rdepends <package_name>

apt download xxxx

例如:
1、先安装apt-rdepends工具

sudo apt install apt-rdepends

2、查询软件包的依赖,以vsftpd为例

sudo apt-rdepends vsfptd

3、使用apt dowload一个个下载,可以写为脚本的方式操作
也可以在一些软件源上进行手动下载

例如;

https://mirrors.aliyun.com/gnu/

https://developer.aliyun.com/packageSearch

在这儿即可所搜对应的软件

例如:离线下载vsfptd的软件包机器依赖
在一个机器上下载软件包及其依赖,并稍后在另一个无外网机器上离线安装
1、执行apt clean命令清除/var/cache/apt/archives/下所有已下载的软件包文件

sudo apt clean

2、使用apt install -d下载软件包及其依赖

sudo apt install -d vsftpd

3、进入/var/cache/apt/archives/查看相关deb包

/var/cache/apt/archives

posted on 2022-06-28 18:52  背对背依靠  阅读(490)  评论(0编辑  收藏  举报