飞牛OS 升级失败排障与恢复全攻略(含一键脚本)

飞牛OS 升级失败排障与恢复全攻略(含一键脚本)

适用系统:飞牛OS(基于 Debian 12 Bookworm)
作者:实战整理(根据一次真实排障会话复盘)
更新日期:2025-09-01


目录


现象回顾

执行一系列升级相关命令后,系统出现:

  • apt upgrade/apt full-upgrade 过程中反复提示 Unmet dependencies、**E: Sub-process /usr/bin/dpkg returned an error code (1)**。
  • linux-headers-6.1.0-38-amd64linux-headers-amd64 未配置成功,导致后续升级被阻塞。
  • qemu-system-gui 依赖 7.2+dfsg-7+deb12u13,而系统里已有 …deb12u15,出现 版本不一致
  • 早期还出现过 python3.11-dev / libpython3.11-devdeb12u5 与 deb12u6 小版本错位
  • apt 显示 kept back(搁置升级) 包,如 libc6samba 系列、linux-image-amd64 等。
  • uname -r 显示正在运行 6.12.18-trim —— 这是 飞牛OS定制内核 Debian 官方 6.1.x LTS 内核。

这些现象叠加,让系统陷入“定制内核 + 官方 headers 元包”的矛盾,最终导致升级失败。


根因分析

  1. 内核/头文件不匹配

    • 运行内核:6.12.18-trim(飞牛OS定制)
    • 官方元包:linux-headers-amd64 指向 Debian LTS 内核头,如 6.1.0-38
    • 由于官方仓库 没有 6.12.18-trim 对应的 headers,dpkg 无法完成配置 → 升级被卡。
  2. 多源混用导致“版本错位”

    • 源列表包含:USTC Debian 镜像、Debian 安全更新、Backports、Docker、ZeroTier、第三方(pkg.ltec.ch)等。
    • 同一软件不同源版本推进节奏不同,容易出现 u13 与 u15 类似的错位(如 QEMU)。
  3. 核心库/服务大版本升级需要 full-upgrade

    • libc6samba 等包,普通 upgrade 可能被 kept back,需要 full-upgrade/dist-upgrade 处理。
  4. 早期 Python 开发包小版本对不齐

    • python3.11-dev/libpython3.11-devdeb12u5 vs deb12u6 → 手动对齐或 --fix-broken 可解。

恢复思路总览

  • 核心原则:先让 dpkg/apt 回到“可运转”的健康态,再分两条路:
    • 方案A(推荐):继续使用飞牛OS定制内核,移除 Debian 的 headers 元包,避免未来再次被尝试安装;升级其余包。
    • 方案B:切换到 Debian 官方内核(linux-image-amd64 + linux-headers-amd64),以后按 Debian 节奏升级。

两种方案都需要先做 清理 → 修复 → 升级 → 验证


方案A:保留飞牛OS定制内核(推荐)

适合:你想继续使用 6.12.18-trim,不编译内核模块或飞牛仓库已提供匹配 headers。

步骤 1. 基础自检(了解现状,不改变系统)

BASH
1
2
3
uname -r
apt list --upgradable 2>/dev/null | sed -n '1,200p'
dpkg -l | grep -E 'linux-(image|headers)' | sed -n '1,200p'

步骤 2. 移除冲突/未配置成功的官方 headers 包

如果普通移除失败,可用 --force-remove-reinstreq

BASH
1
2
sudo dpkg --remove --force-remove-reinstreq linux-headers-6.1.0-38-amd64 linux-headers-amd64 || true
sudo apt-get remove --purge linux-headers-6.1.0-38-amd64 linux-headers-amd64 -y || true

步骤 3. 修复 dpkg/依赖的损坏状态

BASH
1
2
3
sudo dpkg --configure -a
sudo apt-get -f install -y
sudo apt --fix-broken install -y

步骤 4. 锁定官方内核元包,避免再次被拉回

BASH
1
sudo apt-mark hold linux-image-amd64 linux-headers-amd64

步骤 5. 升级其余包(含 kept back)

BASH
1
2
sudo apt update
sudo apt full-upgrade -y

步骤 6. (可选)安装与当前内核匹配的 headers

仅当你需要 DKMS/驱动编译等功能时:

BASH
1
2
3
4
5
# 查找是否存在匹配 6.12.* 的 headers 包
apt search linux-headers-6.12 | sed -n '1,200p'

# 若仓库提供,安装匹配内核的头文件(示例)
sudo apt install linux-headers-$(uname -r) -y

步骤 7. 清理 & 验证

BASH
1
2
3
4
sudo apt autoremove -y
sudo apt clean
uname -r
sudo apt list --upgradable 2>/dev/null | sed -n '1,200p'

方案B:切回 Debian 官方内核(可选)

适合:想完全按 Debian 节奏升级、需要稳定的官方 headers 生态。

步骤 1. 安装官方 LTS 内核与 headers

BASH
1
2
sudo apt update
sudo apt install -y linux-image-amd64 linux-headers-amd64

步骤 2. 重启并验证

BASH
1
2
3
sudo reboot
# 重启后:
uname -r

步骤 3. 升级剩余包 & 清理

BASH
1
2
3
sudo apt full-upgrade -y
sudo apt autoremove -y
sudo apt clean

若以后想避免被切回飞牛定制内核,可将飞牛相关内核包 apt-mark hold;反之亦然。


本次会话出现的典型报错与解法速查

1) dpkg 错误码 1 / 未配置成功

APACHE
1
2
E: Sub-process /usr/bin/dpkg returned an error code (1)
linux-headers-6.1.0-38-amd64 is not configured yet

解法

BASH
1
2
3
sudo dpkg --remove --force-remove-reinstreq linux-headers-6.1.0-38-amd64 linux-headers-amd64
sudo dpkg --configure -a
sudo apt --fix-broken install -y

2) QEMU 依赖不一致(u13 vs u15)

VIM
1
qemu-system-gui : Depends: qemu-system-x86 (= ...deb12u13) but ...deb12u15 is installed

解法(选一)

  • 统一升级:sudo apt install qemu-system-gui qemu-system-x86 qemu-system-arm qemu-system-mips qemu-system-ppc qemu-system-sparc qemu-system-misc -y
  • 不需要 GUI 时移除:sudo apt remove --purge qemu-system-gui -y

3) Python 开发包小版本错位(deb12u5 vs deb12u6)

ADA
1
libpython3.11-dev : Depends: libpython3.11-stdlib (= ...u5) but ...u6 is installed

解法

BASH
1
2
sudo apt install -y python3.11-dev libpython3.11-dev  # 让两者对齐为同一 u*
# 或:sudo apt --fix-broken install -y

4) kept back(搁置升级)

  • 出现在 libc6sambalinux-image-amd64 等包
    解法
    BASH
    1
    2
    sudo apt full-upgrade -y
    # 若仅想升级非内核包,可手动点名安装除 linux-image-amd64 外的其余包

5) /boot 或根分区空间不足(可能性)

排查df -h
解法:清理旧内核镜像、apt autoremove、删除缓存 apt clean


一键脚本

将以下脚本保存并执行,可一键完成关键修复步骤。

A1) 保留飞牛内核:fix_keep_flyos_kernel.sh

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env bash
set -euo pipefail

echo "[i] Running kernel:"
uname -r || true

echo "[i] Step 1: Remove conflicting Debian headers (if any)"
sudo dpkg --remove --force-remove-reinstreq linux-headers-6.1.0-38-amd64 linux-headers-amd64 || true
sudo apt-get remove --purge -y linux-headers-6.1.0-38-amd64 linux-headers-amd64 || true

echo "[i] Step 2: Repair dpkg/apt state"
sudo dpkg --configure -a || true
sudo apt-get -f install -y || true
sudo apt --fix-broken install -y || true

echo "[i] Step 3: Hold Debian kernel meta packages to avoid reintroduction"
sudo apt-mark hold linux-image-amd64 linux-headers-amd64 || true

echo "[i] Step 4: Upgrade remaining packages"
sudo apt update
sudo apt full-upgrade -y || true

echo "[i] Step 5: Cleanup"
sudo apt autoremove -y || true
sudo apt clean || true

echo "[i] Done. Current kernel:"
uname -r || true

echo "[i] Upgradable list (top 50):"
apt list --upgradable 2>/dev/null | sed -n '1,50p' || true

B1) 切回 Debian 官方内核:switch_to_debian_kernel.sh

BASH
1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash
set -euo pipefail

echo "[i] Install Debian LTS kernel + headers"
sudo apt update
sudo apt install -y linux-image-amd64 linux-headers-amd64

echo "[i] Suggest reboot now to switch kernel:"
echo " sudo reboot"

用法:
chmod +x fix_keep_flyos_kernel.sh && ./fix_keep_flyos_kernel.sh
或:chmod +x switch_to_debian_kernel.sh && ./switch_to_debian_kernel.sh


术语 & 小贴士

  • 定制内核 vs 官方内核:飞牛OS自带 6.12.18-trim 等版本,不一定提供对应 headers;官方 LTS 内核为 6.1.x,headers 完整。
  • headers 的用途:编译 DKMS 模块(如显卡驱动、虚拟化增强模块)时需要;普通容器/服务场景可不装。
  • apt-mark hold:防止某包被升级或重新引入;apt-mark unhold <pkg> 可解除。
  • full-upgrade:允许处理依赖变更(安装/删除),解决 kept back。

附录:自检与验证命令

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1) 系统/内核
uname -a
cat /etc/os-release

# 2) 源与优先级(可选)
grep -R "^[^#]" /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null | sed -n '1,200p'

# 3) apt 基础健康检查
sudo dpkg --configure -a
sudo apt --fix-broken install -y
sudo apt update
apt list --upgradable 2>/dev/null | sed -n '1,200p'

# 4) 头文件/内核相关
dpkg -l | grep -E 'linux-(image|headers)' | sed -n '1,200p'
apt search linux-headers-$(uname -r | cut -d- -f1,2) 2>/dev/null | sed -n '1,200p'

# 5) 空间检查
df -h

如果你的场景需要 ZeroTier 或其他内核模块,请优先确认是否有与“正在运行内核”匹配的 headers;若仓库缺失、又必须编译模块,建议切回官方 LTS 内核或手动编译 headers。