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的工作原理
-
apt属于C/S架构,服务端存放元数据信息和软件包,客户端通过(/etc/apt/sources.list或/etc/apt/sources.list.d/*.list)配置文件连接到服务端。
-
将服务端的元数据信息下载到Linux主机本地,并从中检索对应软件包信息
-
根据检索到的信息进行相关操作,/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