对比 CentOS : CentOS 使用 RPM 包 , 底层rpm , 上层yum/dnf ; Ubuntu/Debian 系使用 DEB 包 , 底层dpkg , 上层apt。
核心一句话 : dpkg 操作本地 deb 包 , 不联网、不自动解决依赖 ; apt 是 dpkg 的高级封装 , 联网拉取仓库索引 , 自动下载包、自动处理依赖。
1. deb包基础
DEB 是 Debian/Ubuntu 系统的软件包格式 , 本质是一个特殊的压缩归档文件(文件名 *.deb) , 里面包含:
程序文件 — 要安装到系统的二进制、配置、文档等
元数据 — 包名、版本、依赖关系、描述等
维护脚本 — 安装前/后、卸载前/后要执行的脚本
.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版本,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完整流程:读取
debian-binary校验deb版本读取
control, 校验架构、依赖(dpkg只检查 , 不会自动下载依赖)执行
preinst脚本(安装前)解压
data.tar, 把文件释放到系统目录执行
postinst脚本(安装后 , 一般用来创建用户、注册systemd服务)
卸载
dpkg -r 包名:执行
prerm脚本(卸载前 , 停止服务)删除 data 释放出来的程序文件,保留 conffiles 标记的配置文件
执行
postrm脚本(卸载后,清理环境)
3. deb包类型
二进制包 : 普通软件包 , 我们日常安装的
nginx、redis,后缀.deb源码包 :
.dsc+ 压缩源码 ,deb-src仓库对应的源码包元包 (meta-package) : 本身不包含任何程序文件 , 只有
control定义, 只依赖其他包 , 用来批量安装一组软件。例 :
ubuntu-desktop就是元包 , 没有data.tar,只是依赖集合。