对比 CentOS : CentOS 使用 RPM 包 , 底层rpm , 上层yum/dnf ; Ubuntu/Debian 系使用 DEB 包 , 底层dpkg , 上层apt。

核心一句话 : dpkg 操作本地 deb 包 , 不联网、不自动解决依赖 ; apt 是 dpkg 的高级封装 , 联网拉取仓库索引 , 自动下载包、自动处理依赖。

1. deb包基础

DEB 是 Debian/Ubuntu 系统的软件包格式 , 本质是一个特殊的压缩归档文件(文件名 *.deb) , 里面包含:

  1. 程序文件 — 要安装到系统的二进制、配置、文档等

  2. 元数据 — 包名、版本、依赖关系、描述等

  3. 维护脚本 — 安装前/后、卸载前/后要执行的脚本

.deb 是 ar 归档格式 , 把 3 个文件打包在一起

xxx.deb
├── debian-binary        # deb格式版本号,固定为2.0
├── control.tar.gz       # 控制信息 : 包名、版本、依赖、脚本等(核心)
└── data.tar.zst/gz/xz   # 软件真正的文件(二进制、配置、man手册等)
​

不同 Ubuntu 版本压缩算法不一样 : 老版本用data.tar.gz , 新版多用data.tar.xz/zst。

成员

内容

debian-binary

一行文本 : 2.0 , 表示deb 格式版本号

control.tar.gz

元数据 + 维护脚本(control、postinst 等)

data.tar.gz

实际的程序文件 , 解压后就是要安装到系统的目录树

  • debian-binary

    内容只有一行: 2.0 ,代表deb版本, dpkg 用来识别包格式

  • control.tar.gz(控制文件)

    解压后里面关键文件:

    • control : 必选,描述包基础信息

      Package: nginx
      Version: 1.18.0-0ubuntu1
      Architecture: amd64
      Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
      Installed-Size: 4531
      Depends: libpcre3 (>= 8.39), zlib1g (>= 1:1.1.4), ...
      Recommends: libnginx-mod-http-geoip
      Suggests: libnginx-mod-http-geoip
      Section: httpd
      Priority: optional
      Homepage: http://nginx.net
      Description: small, powerful, scalable web/proxy server
       Nginx ("engine X") is a high-performance web and reverse proxy server...

      关键字段说明 :

      • Package : 软件包名称

      • Version : 版本号

      • Architecture : 架构 , amd64 /arm64 /all(与架构无关 ,文档、配置包)

      • Depends : 依赖列表 ,dpkg/apt 根据此字段校验依赖

      • Maintainer : 维护人

      • Description : 软件描述

    • preinst : 安装之前执行的脚本(pre install)

    • postinst : 安装之后执行的脚本(post install)

    • prerm : 卸载之前执行脚本(pre remove)

    • postrm : 卸载之后执行脚本(post remove)

    • conffiles : 记录配置文件列表 , 标记哪些是配置文件(卸载时决定是否保留)

  • data.tar.*

    存放软件所有实际文件 : 二进制程序、配置文件、文档、服务单元文件。 解压后目录结构和安装到系统后的目录完全一致 : usr/、etc/、lib/。

    etc/nginx/nginx.conf , 安装时直接释放到系统 /etc/nginx/

手动解包:

# 解压deb包
ar x nginx_1.24.0-1ubuntu1_amd64.deb
# 得到三个文件 : debian-binary control.tar.gz data.tar.xz
​
# 解压control
mkdir control
cd control
tar -zxf ../control.tar.gz
​
# 解压data
mkdir data
cd data
tar -Jxf ../data.tar.xz
​

2. deb 包安装卸载流程

  • dpkg - i xxx.deb完整流程:

    1. 读取 debian-binary 校验 deb 版本

    2. 读取 control , 校验架构、依赖(dpkg 只检查 , 不会自动下载依赖)

    3. 执行 preinst 脚本(安装前)

    4. 解压 data.tar , 把文件释放到系统目录

    5. 执行 postinst 脚本(安装后 , 一般用来创建用户、注册 systemd 服务)

  • 卸载 dpkg -r 包名 :

    1. 执行 prerm 脚本(卸载前 , 停止服务)

    2. 删除 data 释放出来的程序文件,保留 conffiles 标记的配置文件

    3. 执行 postrm 脚本(卸载后,清理环境)

3. deb包类型

  1. 二进制包 : 普通软件包 , 我们日常安装的nginx、redis,后缀.deb

  2. 源码包 : .dsc + 压缩源码 , deb-src仓库对应的源码包

  3. 元包 (meta-package) : 本身不包含任何程序文件 , 只有control 定义, 只依赖其他包 , 用来批量安装一组软件。

    例 : ubuntu-desktop 就是元包 , 没有 data.tar ,只是依赖集合。


熊熊