Linux apt 高级使用技巧

4次阅读

apt install -y –no-install-recommends 是真正可靠的静默安装方式,配合 debian_frontend=noninteractive 可避免 debconf 交互;遇 hold 包需先解除,内核升级应使用 full-upgrade 并谨慎验证。

Linux apt 高级使用技巧

apt install 时如何跳过确认并静默安装

默认 apt install 会停在「Do you want to continue? [Y/n]」,自动化脚本里卡住就麻烦了。本质是 apt 检测到 stdin 不是终端(tty),但某些场景下仍会交互——比如有 held 包或需删除依赖时。

真正可靠的静默方式是组合两个参数:-y 强制确认,--no-install-recommends 避免因推荐包触发额外依赖决策。单独用 -y 在部分旧版 ubuntu 上仍可能失败。

  • apt install -y --no-install-recommends nginx —— 推荐写法,覆盖绝大多数静默需求
  • 如果遇到「The following packages have unmet dependencies」后仍卡住,大概率是存在 hold 状态包,先查 dpkg --get-selections | grep hold
  • CI 环境中建议加 DEBIAN_FRONTEND=noninteractive 环境变量,防止某些 debconf 配置弹窗(如 tzdata)

清理 apt 缓存但保留刚装过的包缓存

apt clean 会删光 /var/cache/apt/archives/ 下所有 deb,包括你昨天才装的内核;而 apt autoclean 只删「已不存在于源中」的老包——但很多公司内网源不更新 Release 文件,导致它几乎不删任何东西。

真正可控的做法是手动按时间筛选,用 find 配合 apt list --installed 结果做白名单。

  • 列出当前已安装包对应的 deb 文件名:apt list --installed | tail -n +2 | cut -d'/' -f1 | xargs -I{} find /var/cache/apt/archives -name "{}_*" 2>/dev/NULL
  • 删掉 7 天前的缓存,但跳过上面查到的文件:find /var/cache/apt/archives -name "*.deb" -mtime +7 | grep -vFf
  • 注意:Ubuntu 22.04+ 的 apt install 默认启用 Binary::apt::APT::Keep-Downloaded-Packages "true",但该配置只影响新安装行为,不改变已有缓存

apt update 报错「The repository does not have a Release file」怎么定位

这个错误不是源地址写错了,而是 apt 尝试读取 ReleaseInRelease 文件失败,常见于源配置中混用了 httphttps、路径拼错、或镜像同步延迟。

别急着换源,先用最简命令验证问题范围:apt update --allow-insecure-repositories -o Debug::Acquire::http=true 2>&1 | grep -E "(GET|Error)",能直接看到 apt 实际请求的 URL 和返回状态码。

  • 如果看到 GET http://archive.ubuntu.com/ubuntu/dists/jammy/Release 返回 404,说明 /etc/apt/sources.list 里写的 jammy 对应源已下线(如 Ubuntu 22.04 ESM 启用后,非订阅用户无法访问 public jammy-updates)
  • 若报错指向某第三方源(如 deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main),检查其官网是否已弃用该路径——Chrome 已迁移到 https://dl.google.com/linux/chrome/deb/stablestable/main 子目录
  • 临时禁用某个源最快方法:sed -i '/google.com/s/^/#/' /etc/apt/sources.list.d/google-chrome.list

为什么 apt upgrade 不升级内核,但 apt full-upgrade 会

根本区别在于依赖冲突处理策略:upgrade 坚持「不删除任何已安装包」,而新内核常要求卸载旧内核(因 linux-image-* 包标记为 Conflicts);full-upgrade 允许删除/替换包来满足依赖。

这在生产环境很关键——比如某次 apt upgrade 显示「0 upgraded, 0 newly installed」,但 apt list --upgradable 却列出 linux-image-Generic,说明内核升级被卡在依赖冲突上。

  • 安全更新(如 USN)通常只推送到 upgrade 路径,但内核热补丁(Livepatch)可能要求特定内核版本,这时必须用 full-upgrade
  • 查看具体冲突:apt -s full-upgrade | grep -A5 "The following packages will be REMOVED"
  • 长期运行的服务器建议加 apt-mark hold linux-image-* 防意外重启进错内核,升级前再 apt-mark unhold

内核升级涉及重启和兼容性验证,不是「装完就完」的事——尤其当你用 ZFS 或 NVIDIA 驱动时,新内核对应模块没编译好,机器可能起不来。

text=ZqhQzanResources