点击访问 Linux 命令大全 >>
deb 格式是 Debian 系统(包含 Debian 和 Ubuntu)专属安装包格式,配合 apt 软件管理系统,成为了当前在 Linux 下非常流行的一种安装包。
deb 将包文件信息以及包内容,经过 gzip 和 tar 打包而成。处理这些包的经典程序是 dpkg,经常是通过 Debian 的 apt-get 来运作。通过 Alien 工具,可以将 deb 包转换成 rpm、tar.gz 格式。
deb 包在 Linux 操作系统中类似于 windows 中的软件包(exe),几乎不需要什么复杂的编译即可通过鼠标点击安装使用。
deb 是 Unix 系统(其实主要是 Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组。由于 Unix 类系统对权限、所有者、组的严格要求,而 deb 格式安装包又经常会涉及到系统比较底层的操作,所以权限等的设置尤其重要。
deb 包本身有三部分组成:
(1)数据包,包含实际安装的程序数据,文件名为 data.tar.XXX;data.tar.XXX 包含的是实际安装的程序数据,而在安装过程中,该包里的数据会被直接解压到根目录(即 / ),因此在打包之前需要根据文件所在位置设置好相应的文件/目录树。
(2)安装信息及控制脚本包,包含 deb 的安装说明,标识,脚本等,文件名为 control.tar.gz;而 control.tar.gz 则包含了一个 deb 安装的时候所需要的控制信息。一般有 5 个文件:
control 用了记录软件标识,版本号,平台,依赖信息等数据;
preinst 在解包data.tar.gz 前运行的脚本;
postinst 在解包数据后运行的脚本;
prerm 卸载时,在删除文件之前运行的脚本;
postrm 在删除文件之后运行的脚本;
(3)deb 文件的一些二进制数据,包括文件头等信息,一般看不到,在某些软件中打开可以看到;
例如:下载 tree 软件包,下载地址为 https://www.rpmseek.com/rpm-dl/tree_1.6.0-1_amd64.html?hl=com&cs=tree:PN:0:0:0:0:0:13629564 ,下载后使用压缩工具打开,内容如下图:
【注意】
deb 本身可以使用不同的压缩方式。tar 格式并不是一种压缩格式,而是直接把分散的文件和目录集合在一起,并记录其权限等数据信息。之前提到过的 data.tar.XXX,这里 XXX 就是经过压缩后的后缀名。deb 默认使用的压缩格式为 gzip 格式,所以最常见的就是 data.tar.gz。常有的压缩格式还有 bzip2 和 lzma,其中 lzma 压缩率最高,但压缩需要的 CPU 资源和时间都比较长。
dpkg 命令是“Debian Packager ”的简写。为 Debian 专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自 Debian 的 Linux 发行版都使用 dpkg,例如:Ubuntu、Knoppix 等。
dpkg 是 Debian 软件包管理器的基础,它被伊恩·默多克创建于1993年。dpkg 与 RPM 十分相似,同样被用于安装、卸载和供给 .deb 软件包相关的信息。
dpkg 本身是一个底层的工具。上层的工具,如 apt 被用于从远程获取软件包以及处理复杂的软件包关系。
注意:下面的命令均在 Ubuntu 20 LTS 下面进行执行。
可以使用命令列出当前系统中已经安装的软件以及软件包的状态。如:
snow@ubuntu:~$ dpkg -l Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-==========================================-===================================-============-==========================================> ii accountsservice 0.6.55-0ubuntu12~20.04.1 amd64 query and manipulate user account informat> ii acl 2.2.53-6 amd64 access control list - utilities ii acpi-support 0.143 amd64 scripts for handling many ACPI events ii acpid 1:2.0.32-1ubuntu1 amd64 Advanced Configuration and Power Interface> ii adduser 3.118ubuntu2 all add and remove users and groups ii adwaita-icon-theme 3.36.1-2ubuntu0.20.04.2 all default icon theme of GNOME (small subset) ii aisleriot 1:3.22.9-1 amd64 GNOME solitaire card game collection ii alsa-base 1.0.25+dfsg-0ubuntu5 all ALSA driver configuration files ii alsa-topology-conf 1.2.2-1 all ALSA topology configuration files ii alsa-ucm-conf 1.2.2-1ubuntu0.1 all ALSA Use Case Manager configuration files ii alsa-utils 1.2.2-1ubuntu1 amd64 Utilities for configuring and using ALSA ii amd64-microcode 3.20191218.1ubuntu1 amd64 Processor microcode firmware for AMD CPUs ii anacron 2.3-29 amd64 cron-like program that doesn't go by tim ......
该命令每行输出中的第一列 ii 表示软件包的安装和配置状态,其格式如下:期望状态|当前状态|错误,其中:
期望状态有以下几种
u:即 unknown,软件包未安装且用户未请求安装
i:即 install,用户请求安装该软件包
r:即 remove,用户请求卸载该软件包
p:即 purge,用户请求卸载该软件包并清理配置文件
h:即 hold,用户请求保持续当前软件包版本
当前状态有以下几种:
n:即 not-installed,软件包未安装
i:即 installed,软件包已安装并完成配置
c:即 config-files,软件包已经被卸载,但是其配置文件未清理
u:即 unpacked,软件包已经被解压缩,但还未配置
f:即 half-configured,配置软件包时出现错误
w:即 triggers-awaited,触发器等待
t:即 triggers-pending,触发器未决
错误状态有以下几种:
h:软件包被强制保持
r:即 reinstall-required,需要卸载并重新安装
x:软件包被破坏
因此 ii 表示该软件需要安装且已经安装,没有出现错误;iu 表示已经安装该软件,但未正确配置;rc 表示该软件已经被删除,但配置文件未清理。
查看处于 rc 状态的软件包:
snow@ubuntu:~$ dpkg -l | grep ^rc rc linux-image-5.4.0-26-generic 5.4.0-26.30 amd64 Signed kernel image generic rc linux-modules-5.4.0-26-generic 5.4.0-26.30 amd64 Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP rc linux-modules-extra-5.4.0-26-generic 5.4.0-26.30 amd64 Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
此外,还可以使用 dpkg -l <package_name_pattern> 命令筛选出名称中包含指定模式的软件包。如下:
snow@ubuntu:~$ dpkg -l vim Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-==============-===================-============-================================= ii vim 2:8.1.2269-1ubuntu5 amd64 Vi IMproved - enhanced vi editor
dpkg 命令可以使用 -i 选项用来安装 deb 安装包。例如:
snow@ubuntu:~$ sudo dpkg -i tree_1.6.0-1_amd64.deb Selecting previously unselected package tree. (Reading database ... 189833 files and directories currently installed.) Preparing to unpack tree_1.6.0-1_amd64.deb ... Unpacking tree (1.6.0-1) ... Setting up tree (1.6.0-1) ... Processing triggers for man-db (2.9.1-1) ...
上面实例中,我们成功安装了 tree 命令。使用 tree 命令查看当前目录的树形结构,如下:
snow@ubuntu:~$ tree . ├── deb │ ├── net-tools_1.60-25ubuntu2_amd64.deb │ ├── tree_1.6.0-1_amd64.deb │ └── vim_7.4.052-1ubuntu3_amd64.deb ├── Desktop ├── Documents ├── Downloads ├── Music ├── Pictures ├── Public ├── snap │ └── snap-store │ ├── 433 │ ├── 467 │ ├── common │ └── current -> 433 ├── Templates └── Videos 15 directories, 3 files
dpkg 命令的 -r 选项可以用来卸载已安装的软件包,此时只需要指定软件的名称即可。例如:
snow@ubuntu:~$ sudo dpkg -r tree [sudo] password for snow: (Reading database ... 189840 files and directories currently installed.) Removing tree (1.8.0-1) ... Processing triggers for man-db (2.9.1-1) ... snow@ubuntu:~$ tree -bash: /usr/bin/tree: No such file or directory
注意:-r 选项只会移除指定的软件包而不对其配置文件产生影响,可以使用 -P 选项在删除软件包的同时清理配置文件。例如:
snow@ubuntu:~$ sudo dpkg -P tree (Reading database ... 189840 files and directories currently installed.) Removing tree (1.8.0-1) ... Processing triggers for man-db (2.9.1-1) ...
dpkg 命令可以使用 -c 选项查看 deb 包中的内容,如下:
snow@ubuntu:~$ dpkg -c tree_1.6.0-1_amd64.deb drwxr-xr-x root/root 0 2012-05-01 09:43 ./ drwxr-xr-x root/root 0 2012-05-01 09:43 ./usr/ drwxr-xr-x root/root 0 2012-05-01 09:43 ./usr/bin/ -rwxr-xr-x root/root 57176 2012-05-01 09:43 ./usr/bin/tree drwxr-xr-x root/root 0 2012-05-01 09:43 ./usr/share/ drwxr-xr-x root/root 0 2012-05-01 09:43 ./usr/share/man/ drwxr-xr-x root/root 0 2012-05-01 09:43 ./usr/share/man/man1/ -rw-r--r-- root/root 4100 2012-05-01 09:43 ./usr/share/man/man1/tree.1.gz drwxr-xr-x root/root 0 2012-05-01 09:43 ./usr/share/doc/ drwxr-xr-x root/root 0 2012-05-01 09:43 ./usr/share/doc/tree/ -rw-r--r-- root/root 2210 2011-06-24 07:34 ./usr/share/doc/tree/TODO -rw-r--r-- root/root 2425 2012-02-04 05:32 ./usr/share/doc/tree/copyright -rw-r--r-- root/root 2254 2011-06-24 07:34 ./usr/share/doc/tree/README.gz -rw-r--r-- root/root 1552 2012-05-01 09:43 ./usr/share/doc/tree/changelog.Debian.gz
上面实例将输出 tree_1.6.0-1_amd64.deb 软件包的内容。
使用 dpkg -s <package> 命令可以查看指定软件包的详细信息。例如:
snow@ubuntu:~$ dpkg -s tree Package: tree Status: install ok installed Priority: optional Section: utils Installed-Size: 106 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Architecture: amd64 Version: 1.6.0-1 Depends: libc6 (>= 2.4) Description: displays directory tree, in color Displays an indented directory tree, using the same color assignments as ls, via the LS_COLORS environment variable. Original-Maintainer: Florian Ernst <florian@debian.org> Homepage: https://mama.indstate.edu/users/ice/tree/
或者使用 dpkg --status <package> 命令查看,如下:
snow@ubuntu:~$ dpkg --status tree Package: tree Status: install ok installed Priority: optional Section: utils Installed-Size: 106 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Architecture: amd64 Version: 1.6.0-1 Depends: libc6 (>= 2.4) Description: displays directory tree, in color Displays an indented directory tree, using the same color assignments as ls, via the LS_COLORS environment variable. Original-Maintainer: Florian Ernst <florian@debian.org> Homepage: https://mama.indstate.edu/users/ice/tree/
使用 dpkg -L <package> 或 dpkg --list-files <package> 命令查看安装包的安装位置。例如:
snow@ubuntu:~$ dpkg -L tree /. /usr /usr/bin /usr/bin/tree /usr/share /usr/share/man /usr/share/man/man1 /usr/share/man/man1/tree.1.gz /usr/share/doc /usr/share/doc/tree /usr/share/doc/tree/TODO /usr/share/doc/tree/copyright /usr/share/doc/tree/README.gz /usr/share/doc/tree/changelog.Debian.gz
上面实例查看了 tree 命令的安装位置信息。
dpkg 使用 --version 选项获取 dpkg 命令的版本信息。例如:
now@ubuntu:~/Desktop$ dpkg --version Debian 'dpkg' package management program version 1.19.7 (amd64). This is free software; see the GNU General Public License version 2 or later for copying conditions. There is NO warranty.
dpkg 使用 -S 选项模糊查询包里面包含指定名称的文件。例如:
snow@ubuntu:~$ dpkg -S presubj libuno-salhelpergcc3-3: /usr/share/bug/libuno-salhelpergcc3-3/presubj fonts-sil-abyssinica: /usr/share/bug/fonts-sil-abyssinica/presubj fonts-liberation2: /usr/share/bug/fonts-liberation2/presubj libreoffice-style-elementary: /usr/share/bug/libreoffice-style-elementary/presubj fonts-opensymbol: /usr/share/bug/fonts-opensymbol/presubj libreoffice-writer: /usr/share/bug/libreoffice-writer/presubj bash-completion: /usr/share/bug/bash-completion/presubj hplip: /usr/share/bug/hplip/presubj ......
上面实例中,查询所有包中包含 presubj 文件的安装包。