Ubuntu 正在把硬件认证状态检查工具 hwctl 从 deb 包迁移为 snap。这个变化的关键并不只是安装命令不同,而是 Canonical 对软件边界作出了明确判断:hwctl 及其依赖只服务于 Ubuntu,没有其他 Debian 系发行版需要消费这些 deb 包,因此继续维护传统发行版包的复用价值很低。
为什么 hwctl 适合单独迁移
Canonical 工程师 Alan Griffiths 给出的理由很直接:hwctl 是 Ubuntu 专有工具,它的依赖同样只面向 Ubuntu。这里所谓 deb 版本“受众为零”,更准确地说,是指 Ubuntu 之外没有下游发行版依赖这些 deb 包,并不是说 Ubuntu 用户不使用 hwctl。
这使它成为适合迁移到 snap 的候选对象:
- 不需要维持 Debian 或其他发行版能够复用的包结构。
- 工具和专用依赖可以作为一个整体发布,减少系统仓库中的依赖协调。
- 工具更新不必完全跟随 Ubuntu 发行版的软件仓库节奏。
- 维护者可以围绕单一 Ubuntu 运行环境测试和交付。
不过,“适合迁移”不等于“迁移没有成本”。deb 由 APT 和系统包数据库管理;snap 则由 snapd 管理,拥有独立的版本通道、自动更新和权限模型。运维脚本、离线镜像与合规扫描如果只认识 dpkg,就可能漏掉这个工具。
改变的不只是安装命令
对普通用户而言,最明显的差异是包管理入口发生变化:
# deb 包的常见检查方式
apt-cache policy hwctl
dpkg-query -W -f='${Package}\t${Version}\n' hwctl 2>/dev/null || true
# snap 包的常见检查方式
snap info hwctl
snap list hwctl 2>/dev/null || true
以上命令可以直接运行;如果当前 Ubuntu 版本尚未发布对应 snap,snap info hwctl 会报告找不到该 snap,这本身也能帮助确认迁移是否已经落到所用的软件源或发布通道。
迁移还会影响几个运维假设:
| 关注点 | deb | snap |
|---|---|---|
| 查询工具 | apt、dpkg |
snap |
| 更新机制 | 通常由 APT 更新计划驱动 | 通常由 snapd 自动刷新 |
| 版本来源 | Ubuntu 软件仓库 | Snap Store 及其通道 |
| 回退方式 | 安装指定 deb 版本并处理依赖 | 可使用 snap 的修订版本与回退能力 |
| 权限边界 | 主要依赖传统 Unix 权限和系统集成 | 还需关注 snap confinement 与接口连接 |
对于需要读取硬件和系统状态的工具,权限尤其值得验证。包能安装成功,不代表它在受限环境中一定能够访问全部设备或系统接口。具体接口应以实际发布的 snap 元数据为准,不应预先假设它采用严格限制或经典模式。
可以这样改造资产清单脚本
下面的脚本同时检查 deb、snap 和最终可执行文件,适合改造成巡检或迁移验证任务。它不会安装或删除任何软件:
#!/usr/bin/env bash
set -u
printf '%-12s %s\n' 'CHECK' 'RESULT'
if dpkg-query -W -f='${Version}' hwctl >/tmp/hwctl-deb-version 2>/dev/null; then
printf '%-12s %s\n' 'deb' "installed: $(cat /tmp/hwctl-deb-version)"
else
printf '%-12s %s\n' 'deb' 'not installed'
fi
rm -f /tmp/hwctl-deb-version
if command -v snap >/dev/null 2>&1 && snap list hwctl >/dev/null 2>&1; then
snap_version=$(snap list hwctl | awk 'NR == 2 {print $2 " (rev " $3 ")"}')
printf '%-12s %s\n' 'snap' "installed: ${snap_version}"
else
printf '%-12s %s\n' 'snap' 'not installed'
fi
if command -v hwctl >/dev/null 2>&1; then
printf '%-12s %s\n' 'command' "$(command -v hwctl)"
else
printf '%-12s %s\n' 'command' 'not found in PATH'
fi
将它保存为 check-hwctl.sh 后运行:
chmod +x check-hwctl.sh
./check-hwctl.sh
在自动化系统中,不要只把 apt install hwctl 替换为某条 snap 命令就结束。还应检查调用路径是否写死为 /usr/bin/hwctl、主机是否运行 snapd、出口策略是否允许访问所需软件源,以及更新窗口是否符合组织要求。
采用前应核对什么
这次迁移体现的是一种有边界的打包策略:当软件只属于 Ubuntu、依赖没有跨发行版消费者,并且维护者希望独立交付时,snap 能减少 deb 仓库中的专用维护工作。它并不能推出“所有核心包都会转成 snap”,也不能证明 snap 对每种系统组件都更合适。
升级或制作基础镜像时,建议核对以下事项:
- 目标 Ubuntu 版本是否已经提供
hwctlsnap,以及使用哪个通道。 - 现有脚本是否依赖
dpkg-query、apt-cache或固定的可执行文件路径。 - snap 的权限接口能否覆盖硬件认证检查所需的系统访问。
- 离线安装、代理、镜像和漏洞扫描流程是否包含 snap。
- 自动刷新和回退策略是否满足变更管理要求。
对桌面用户,这可能只是安装来源发生变化;对管理成百上千台 Ubuntu 主机的团队,它则是一次资产发现、更新控制和软件供应链边界的调整。