引子
在 DIY 树莓派各种项目的时候,总要安装各种各样的软件包,一般执行 sudo apt-get install <package>
指令就可以完成安装。如果下载速度太慢,还可以 更换软件源 加速下载。
树莓派初学者通常到这里就结束了,但如果你想基于树莓派进一步学习 Linux 知识,成为树莓派高阶玩家,就非常有必要了解 apt-get
这条指令背后的原理,以及 Debian 系的包管理知识。
树莓派官方的 Raspbian 操作系统是 Debian 的衍生版,共用 Debian 的软件包管理机制,两者是相通的。
起初 GNU/Linux 的世界中只有 .tar.gz。如果用户要使用一个软件,那就必须自己编译。当 Debian 诞生以后,一种能管理操作系统中已安装的软件包的系统显得很有必要,这个系统被命名为 dpkg。软件包一词在此第一次出现在 GNU/Linux。不久之后,红帽公司创建了他们自己的包管理系统 rpm。
GNU/Linux 的创造者们很快又陷入了新的窘境。他们希望通过一种快捷、实用而且高效的方式来安装软件包,并能自动处理相互之间的依赖关系,还要在软件包升级过程中维护好配置文件。Debian 又一次充当了开路先锋的角色,首创了 APT(Advanced Packaging Tool,高级软件包管理工具)。这一工具后来被 Conectiva 移植到红帽公司的 rpm 包管理系统。在其他一些发行版中,我们也能看到 APT 的身影。
dpkg (Debian Package)
在 Linux 发展之初,安装软件的时候是需要下载以 tar.gz 结尾的软件源码包,然后对源码包进行编译安装。这是极其麻烦的使用。后来 Debian 开发了 dpkg(Debian Package) 管理工具来管理软件,软件都是以 deb 结尾的编译好的二进制包,通过 dpkg 命令可以安装软件和卸载软件。
dpkg -i
- 安装软件包dpkg -r
- 移除软件包dpkg -l
- 查看某个软件包是否已经安装dpkg -L
- 查看某个软件包中都包含哪些文件dpkg --list
- 查看系统上安装的所有软件包和相关状态
dpkg 是底层的包管理工具,不太常用,最常用的是 apt。
APT (Advanced Packaging Tool)
dpkg 不够人性化的一点就是不能自动解决依赖问题,比如 A 软件包依赖于 B 软件包,那么你先得安装 B 才能安装 A。而且使用 dpkg 需要将软件下载到本地才能安装。使用 apt 安装软件时会自动从软件仓库下载软件进行安装,并且 apt 能自动解决依赖问题,当有依赖的时候它也会自动从软件仓库下载依赖的包进行安装。当然 apt 底层还是调用 dpkg 来进行软件安装的。
apt 相关文件
/etc/apt/source.list
配置软件包来源,也就是上面说的软件仓库/ect/apt/apt.conf.d
存在 apt 的零碎配置文件/ect/apt/preferences
制定软件包的版本参数/var/cache/apt/archives
存放已下载的软件包/var/cache/apt/archives/partial
存放正在下载的软件包/var/lib/apt/lists
存放已下载的软件包详细信息
树莓派的 APT 相关配置文件:
软件源
软件源(软件仓库)中存放这大量的软件包,apt 会从软件源中下载软件。在 /ect/apt/soure.list
中可以为 apt 配置软件源。在这个文件中 deb 关键字定义已编译的软件包来源,deb-src 定义源码包的来源。每一行的格式如下:
deb(或deb-src) <软件源地址> <主版本代号> [软件仓库1] [软件仓库2] [软件仓库3] ...
树莓派的软件仓库一般有四种限定词:
- main:官方支持的符合 DFSG 规范的软件
- contrib:带有非自由依赖关系的 DFSG 兼容软件
- non-free:非 DFSG 兼容软件
- firmware:官方固件,非开源
DFSG 即 Debian Free Software Guidelines、自由软件指导方针,比如规定软件必须开源等。详细说明见: Debian 社群契约
树莓派的默认软件源配置:
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
软件源里面有什么?如果你在浏览器上打开软件源 url http://raspbian.raspberrypi.org/raspbian/
,会发现它其实是一个静态资源目录:
- dists 目录包含 Raspbian 的各个发行版,既包括像
buster
一样的具体发行版本,也包括像stable
、testing
和unstable
的代号 - pool 目录为软件包的下载地址。为了方便管理,pool 目录下会继续划分 main、contrib 和 non-free 等子目录。比如 python3 就位于
pool/main/p/python3-defaults
这个目录下。
apt-get 命令
apt-get 命令一般用于软件包的安装,更新和移除
apt-get update
- 更新本地的软件源索引。在你更改了 Raspbian 的/etc/apt/sources.list
或/etc/apt/preferences
后,需要运行这个命令让改动生效。最好能定期运行该命令,以确保软件源索引是最新的。apt-get upgrade
- 更新所有已安装的软件包apt-get install
- 安装软件包apt-get reinstall
- 重装软件包apt-get remove
- 删除已安装的软件包(保留配置文件)apt-get purge
- 删除已安装包,同时删除配置文件apt-get autoremove
- 删除未使用的安装包apt-get dist-upgrade
- 更新整个系统到最新的发行版,相当于升级 Raspbian 系统apt-get clean
- 删除本地所有的 deb 包(不会删除软件)apt-get autoclean
- 删除本地已经安装过的 deb 包apt-get check
- 检查是否存在未安装的软件包依赖apt-get source
- 下载 deb 源码包到本地apt-get download
- 下载 deb 包到本地apt-get changelog
- 打印软件包的版本变更日志
apt-cache 命令
apt-cache 一般用于软件包查找和显示软件包信息。
apt-cache search
- 搜索软件包。当你不知道软件包全名的时候,可以用这个指令搜索关键词apt-cache depends
- 打印软件包的依赖包信息apt-cache rdepends
- 打印依赖这个包的软件包信息(反向依赖)
常用命令组合
查看系统上安装的软件包
查看系统上安装的所有软件包和相关状态,执行
dpkg --list
输出每个软件包的一行简单介绍,2 字符的状态标志,包名,所安装版本和简要描述。
如果要过滤包名,比如只显示 python 开头的包,执行
dpkg --list python*
要获取软件包的更详细信息,比如 python3,执行:
dpkg --status python3
输出状态、版本号、依赖包等信息。
列出软件包包含的文件
要找出一个软件包包含的所有文件,比如找出 rclone 安装过程中生成了哪些文件,执行:
dpkg --listfiles rclone
rclone 一是款文件同步工具,支持本地文件和 Microsoft OneDrive,Amazon Cloud Drive,Dropbox,FTP,SSH/SFTP 等多种云存储同步 —— 如何在树莓派上免费获取 GB 级存储空间 - 硬核树莓派
也可以直接查看 deb 包内的文件,执行:
dpkg-deb --contents rclone_1.45-3_armhf.deb
还可以把 deb 包内的文件解压到当前的 temp 目录(这不是安装,而是在本地目录测试包内容的简单方法),执行:
dpkg-deb --extract rclone_1.45-3_armhf.deb temp
但如果你只想知道某个文件是哪个软件包生成的,执行:
dpkg --search rclone
其他常用命令
Raspbian 不一定默认带有下面这些命令。如果没有的话,apt-get install
安装即可。
apt-show-versions
- 打印系统中所有已安装的包的当前版本和可升级版本apt-config
- apt 的配置工具tasksel
- 用于安装软件集,例如一键安装 gnome 桌面、xfce 桌面等等。--list-tasks
参数可以列出所有支持的软件集。dselect
- 包管理系统的图形菜单界面,对第一次安装和大范围升级特别有用dpkg-deb
- 用于操作 deb 文件,比如探查包内文件等dpkg-split
- 大软件包分割工具,例如把一个大 deb 分割成 N 部分,每部分 460KB
参考资料
- UbuntuHelp:AptGet/Howto/zh - Ubuntu 中文
- APT HOWTO (Obsolete Documentation)
- Ubuntu 软件包管理器 - 被罚站的树 - 博客园
- Debian / packaging-tutorial · GitLab
- The Debian GNU/Linux FAQ - Debian 的包管理系统
- The Debian GNU/Linux FAQ - Debian 的 FTP
- debian - What is the difference between 'contrib' and 'non-free' packages repositories? - Unix & Linux Stack Exchange
- 2. The Debian Archive — Debian Policy Manual v4.5.0.0
- Debian 社群契约
- 第 2 章 Debian 软件包管理