中文 English

「标题党预警」换个国内镜像源,竟让我踩了这么大一个坑:Ubuntu 26.04 apt 依赖冲突全记录

发布时间: 2026-05-17
Ubuntu apt 镜像源 依赖冲突 华为云 网易 阿里云 故障排查

先说结论

换了个国内镜像源,本以为 10 分钟搞定的事,结果折腾了两个小时。本文记录了从「镜像同步延迟导致版本撕裂」到「dpkg 强制降级」再到「apt 完全恢复正常」的全过程。核心教训:镜像源不是换上去就完事了,版本一致性才是关键。如果你的系统用了大半年突然换源,99% 会遇到依赖冲突。

本文所有操作基于 Ubuntu 26.04 (Plucky),所有 IP、主机名、路径均为脱敏示例,不包含任何内网地址或敏感信息。

换源一时爽,依赖火葬场

图 1:换源前 vs 换源后,你以为的 vs 实际的

0. 故事背景:为什么要换源

故事的起因很简单:一台新部署的 Ubuntu 26.04 服务器,业务要安装 vimcurlwget 等基础工具。服务器在内网,访问海外源速度感人,于是打算换成国内镜像源。

先查了一下当前 apt 源配置:

cat /etc/apt/sources.list.d/ubuntu.sources

输出如下:

Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: resolute resolute-updates resolute-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: resolute-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

看到 resolute 我愣了一下——这是 Ubuntu 25.04 的代号,但这台机器明明装的是 Ubuntu 26.04。Ubuntu 26.04 的代号是 Plucky(26 个字母排序第 16 个,apt 源的 Suites 字段用的是缩写)。看来 Ubuntu 26.04 默认源配置把代号弄错了,这也是为什么后续换源时需要特别注意 Suites 名称要对应正确。

第一反应是直接换国内大厂的镜像源:华为云、阿里云、网易都试了一遍。初步测试都正常,apt update 也能拉取到包列表。然后执行安装:

apt install vim lrzsz p7zip unzip net-tools curl wget ncdu -y

结果直接报错:

Unsatisfied dependencies:
  curl : Depends: libcurl4t64 (= 8.12.1-3ubuntu1) but 8.18.0-1ubuntu2 is to be installed
  vim : Depends: vim-common (= 2:9.1.0967-1ubuntu4.1) but 2:9.1.2141-1ubuntu4 is to be installed
        Depends: vim-runtime (= 2:9.1.0967-1ubuntu4.1) but it is not going to be installed
        Depends: libpython3.13 (>= 3.13.0~rc3) but it is not going to be installed

报错信息很明确:本地安装的包版本和镜像源里可用的版本对不上。本地装的是新版本,但镜像源里只有旧版本,apt 陷入了「要装新应用但依赖旧库」的死循环。

依赖冲突报错

图 2:apt 报的依赖错误,红框标注了核心冲突点

1. 问题分析:为什么换源会导致依赖冲突

1.1 根本原因:镜像同步延迟 + 系统残留版本撕裂

问题根源在于系统的本地包版本和镜像源不同步

当 apt 尝试安装 vim 时:

同样的问题也出现在 curllibcurl4t64 之间。

1.2 为什么会这样:本地状态与镜像源版本撕裂

查看当前状态:

apt-cache policy vim vim-common curl libcurl4t64

输出:

vim:
  Installed: (none)
  Candidate: 2:9.1.0967-1ubuntu4.1
  Version table:
     2:9.1.0967-1ubuntu4.1 500 <- 镜像源
     2:9.1.0967-1ubuntu4 500

vim-common:
  Installed: 2:9.1.2141-1ubuntu4  <- 本地版本比镜像源更新!
  Candidate: 2:9.1.2141-1ubuntu4
  Version table:
     2:9.1.0967-1ubuntu4.1 500
     2:9.1.0967-1ubuntu4 500

libcurl4t64:
  Installed: 8.18.0-1ubuntu2  <- 本地版本
  Candidate: 8.18.0-1ubuntu2
  Version table:
     8.12.1-3ubuntu1 500  <- 镜像源旧版本

问题的本质:Candidate(候选版本)来自镜像源,但本地已经安装了 dpkg 认为"正确"的版本。apt 在做依赖解析时,两边的版本对不上,陷入了死结。

1.3 为什么国内镜像源会不同步

很多人会问:镜像源不是实时同步的吗?为什么会出现版本差?

主要有以下几种情况:

原因 说明
定时批量同步 大部分国内镜像采用 rsync 定时同步(如每日/每小时),并非实时推送
分批分阶段同步 某些镜像会按系列分批同步(如 main 先同步,security 后同步)
同步链路延迟 从官方源到国内镜像的链路本身就有几小时延迟
本地手动安装 系统管理员手动安装了比镜像源更新的包(编译安装、deb 直接安装)

对于这台服务器,很可能是系统预装的包版本就比任何一家国内镜像源都快——Ubuntu 26.04 是 2026 年 4 月发布的,而我们的系统可能使用了 Ubuntu 26.04 正式发布后第一时间推送的包,但国内镜像的同步还没到位。

1.4 换镜像源的时机选择

强烈建议:在以下时机换源:

  1. 全新安装后立即换源,然后再 apt update && apt upgrade -y 做一次全量升级
  2. 系统刚部署完毕、还没有安装任何额外软件包时
  3. docker 镜像构建前,在 Dockerfile 里指定镜像源

尽量避免

  1. 系统已经运行了一段时间,中间有手动安装/升级过软件
  2. 生产环境已经在跑业务,骤然换源可能导致依赖问题影响业务
  3. 系统已经通过其他渠道获取了比镜像源更新的包

如果你的系统已经处于「撕裂」状态,完整的解法是全量升级或全量降级到镜像源一致的版本,或者使用本文的补救方案。

2. 解决过程:从失败到成功

2.1 第一步:常规修复尝试(失败)

# 清理 apt 缓存
apt clean
apt update

# 尝试修复依赖
apt --fix-broken install -y

结果:没有任何改善,依赖问题依然存在。

2.2 第二步:逐个包安装测试(发现哪些能装哪些不能)

# 逐个安装,观察哪些能成功
for pkg in vim lrzsz p7zip unzip net-tools curl wget ncdu; do
    echo "=== Installing $pkg ==="
    apt install $pkg -y 2>&1 | tail -5
done

结果:

包名 结果 说明
lrzsz ✅ 成功 无依赖冲突
p7zip ✅ 成功 无依赖冲突
unzip ✅ 成功 已是最新版
net-tools ✅ 成功 无依赖冲突
wget ✅ 成功 已是最新版
ncdu ✅ 成功 无依赖冲突
vim ❌ 失败 vim-common 版本不匹配
curl ❌ 失败 libcurl4t64 版本不匹配

这说明问题集中在 vim 和 curl 两个包,其他包没有依赖冲突。

2.3 第三步:理解 dpkg 和 apt 的关系

在深入研究后,我理解了问题的本质:

所以当 vim 需要的 vim-common = 9.1.0967-1ubuntu4.1,但本地已经装了 vim-common = 9.1.2141-1ubuntu4 时:

关键点:解决方案不是让 apt 升级,而是让 apt 降级,或者强制用镜像源的版本替换本地版本

2.4 第四步:全量升级尝试(部分成功)

apt full-upgrade -y

这个命令比 apt upgrade 更激进,它会尝试安装/升级/删除必要的包来解决依赖关系。

结果:系统升级了 3 个包(libicu76libxml2tracker-extract),移除了 localsearch,但 vim 和 curl 的问题依然存在。

2.5 第五步:手动下载 deb 包强制安装(关键突破)

核心思路:绕过 apt 的依赖解析,直接用 dpkg 强制安装正确版本的包

5.1 移除冲突的本地包

先用 dpkg --force-all 强制移除不兼容的本地包:

# 强制移除 vim-common(注意:会同时移除依赖它的 vim-tiny)
dpkg --force-all --remove vim-common

输出:

dpkg: vim-common: dependency problems, but removing anyway as you requested:
 vim-tiny depends on vim-common (= 2:9.1.2141-1ubuntu4).
Removing vim-common (2:9.1.2141-1ubuntu4)…

成功移除了本地的 vim-common。注意这里用到了 --force-all 参数,因为正常情况下 dpkg 不会允许移除被其他包依赖的包。

5.2 下载正确版本的包

在临时目录里下载需要的包:

mkdir -p /tmp/vim-packages
cd /tmp/vim-packages
apt download vim-common vim-runtime vim

apt download 是一个很实用的命令,它只下载 deb 包但不安装,比 wget 直接从镜像站下载更可靠(因为 URL 路径可能因版本而异)。

下载完成后:

vim_2:9.1.0967-1ubuntu4.1_amd64.deb
vim-common_2:9.1.0967-1ubuntu4.1_all.deb
vim-runtime_2:9.1.0967-1ubuntu4.1_all.deb

5.3 强制安装

dpkg -i vim-common_*.deb vim-runtime_*.deb vim_*.deb

安装时报错:

Package libpython3.13 is not installed.
dpkg: error processing package vim (--install):
 dependency problems - leaving unconfigured

vim 依赖 libpython3.13,但这个包也没装。继续下载:

apt download libpython3.13 libpython3.13-stdlib libpython3.13-minimal
dpkg -i libpython3.13-minimal_*.deb
dpkg --configure -a

这一步完成后,vim 终于安装成功:

Setting up vim (2:9.1.0967-1ubuntu4.1)…
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vi (vi) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vim (vim) in auto mode

5.4 解决 curl 的问题

curl 的问题和 vim 如出一辙:本地装的 libcurl4t64 版本太新(8.18.0),但镜像源里的 curl 需要旧版本(8.12.1)。

同样是手动下载安装:

# 用 wget 从镜像站直接下载(apt download 因为本地版本问题无法使用)
cd /tmp
wget http://mirrors.163.com/ubuntu/pool/main/c/curl/libcurl4t64_8.12.1-3ubuntu1_amd64.deb
dpkg -i libcurl4t64_*.deb

然后安装 curl:

apt install curl -y

成功!

2.6 第六步:修复 ubuntu-minimal 的依赖警告

安装过程中还有一个警告:

ubuntu-minimal : Depends: vim-tiny but it is not going to be installed

这是因为 ubuntu-minimal 包依赖 vim-tiny,而我们装的是完整版 vim(不是 tiny 版本)。

解决方法是同时安装 vim-tiny(两个版本可以共存,通过 update-alternatives 管理):

apt install vim-tiny -y

完成后,所有依赖问题都解决了:

apt --fix-broken install -y
# 输出:Solving dependencies... Summary: Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0

2.7 最终验证

$ which vim curl wget
/usr/bin/vim
/usr/bin/curl
/usr/bin/wget

$ dpkg -l | grep -E 'vim |curl |wget |lrzsz|p7zip|unzip|net-tools|ncdu' | grep '^ii'
ii  curl         8.12.1-3ubuntu1    amd64   command line tool for transferring data with URL syntax
ii  lrzsz        0.12.21rc-0.2     amd64   Tools for zmodem/xmodem/ymodem file transfer
ii  ncdu         1.21-2            amd64   ncurses disk usage viewer
ii  net-tools    2.10-1.1ubuntu1   amd64   NET-3 networking toolkit
ii  p7zip        16.02+transitional all    transitional package
ii  unzip        6.0-29ubuntu1     amd64   De-archiver for .zip files
ii  vim          2:9.1.0967-1ubuntu4.1   amd64   Vi IMproved - enhanced vi editor

所有包都安装成功,版本与镜像源一致。

3. 完整复盘:换源的标准流程

3.1 推荐流程(适用于全新系统)

第一步:换源后立即全量升级

# 编辑镜像源配置
vim /etc/apt/sources.list.d/ubuntu.sources

# 写入镜像源配置(以华为云为例)
cat > /etc/apt/sources.list.d/ubuntu.sources << 'EOF'
Types: deb
URIs: https://mirrors.huaweicloud.com/ubuntu/
Suites: plucky plucky-updates plucky-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: https://mirrors.huaweicloud.com/ubuntu/
Suites: plucky-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF

# 清理缓存 + 全量更新 + 全量升级
apt clean
apt update
apt full-upgrade -y

第二步:验证系统状态

apt --fix-broken install -y
dpkg --audit

3.2 已部署系统的换源风险评估

如果你已经有一台运行了一段时间的 Ubuntu 系统,想换源之前建议先评估:

# 检查是否有手动安装的包(本地版本与镜像源不一致)
apt-cache policy $(dpkg --get-selections | grep install | cut -f1 | head -50)

# 或者检查本地版本比候选版本新的包
apt list --upgradable 2>/dev/null | grep -v "已安装" | head -20

3.3 常见镜像源对比

镜像源 地址 同步频率 速度
华为云 https://mirrors.huaweicloud.com/ubuntu/ 实时
阿里云 https://mirrors.aliyun.com/ubuntu/ 实时
网易 https://mirrors.163.com/ubuntu/ 每小时
清华大学 https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ 实时
中科大 https://mirrors.ustc.edu.cn/ubuntu/ 实时

建议:如果是国内服务器,首选阿里云或华为云;如果是家用带宽/教育网,可以试试中科大或清华大学。

3.4 Ubuntu 版本代号速查

版本 代号 年月
Ubuntu 24.04 Noble Numbat 2024-04
Ubuntu 24.10 Oracular Oriole 2024-10
Ubuntu 25.04 Plucky Puffin 2025-04
Ubuntu 25.10 Warty Warthog 2025-10
Ubuntu 26.04 Plucky (进化) 2026-04

重要:26.04 的代号确认是 plucky,不是 noble。如果你在配置里写错了代号,apt update 会报错 Unable to locate package

4. Q&A

Q1: 为什么不直接卸载再重装?

有人会问:既然本地版本和镜像源不一致,直接 apt removeapt install 不就解决了吗?

答案是不行,因为:

  1. 有些包是系统核心组件(如 vim-tinyubuntu-minimal 依赖),不能随便卸载
  2. 有些包是其他包的依赖,卸载可能引发连锁反应
  3. 即使卸载了,本地 dpkg 数据库里残留的信息仍可能导致问题

所以正确的做法是先装正确的版本,再用 dpkg --configure -a 修复半安装状态,而不是先卸后装。

Q2: 为什么 apt download 能用但 apt install 不行?

apt download 只是从镜像站下载 deb 包到当前目录,它不涉及 dpkg 数据库的写入,所以不会触发依赖解析。

apt install 会:

  1. 查询本地 dpkg 数据库
  2. 解析所有依赖关系
  3. 决定是否需要降级/升级
  4. 调用 dpkg 实际安装

当本地数据库和镜像源不一致时,apt install 的依赖解析就会失败。但 apt download 没有这个限制——它只是下载文件。

Q3: 能不能用 apt-get -t 指定版本安装?

可以试试 apt install vim=2:9.1.0967-1ubuntu4.1,但在我的测试中,由于本地 vim-common 版本是更新的,apt 仍然拒绝降级。apt-get -t 参数在这种情况下也无济于事。

Q4: 如何避免类似问题?

最佳实践

  1. 全新系统第一时间换源并全量升级

    # 新系统到手第一件事
    sed -i 's|http://archive.ubuntu.com/ubuntu/|https://mirrors.aliyun.com/ubuntu/|g' /etc/apt/sources.list.d/ubuntu.sources
    apt update && apt full-upgrade -y
    
  2. 使用 apt-cloneapt-mark 备份已安装包列表

    # 导出当前已安装包列表
    dpkg --get-selections > /tmp/packages.list
    
    # 新系统导入
    dpkg --set-selections < /tmp/packages.list
    apt dselect-upgrade
    
  3. 重要生产环境先在测试环境验证 任何换源操作之前,先在测试机/VM/容器里验证是否会有依赖问题。

Q5: 华为云镜像和阿里云镜像哪个更好?

没有绝对答案,主要看你的网络环境:

我建议三家里选两家做双源备份,一个主用一个备用:

# /etc/apt/sources.list.d/aliyun.sources
Types: deb
URIs: https://mirrors.aliyun.com/ubuntu/
Suites: plucky plucky-updates plucky-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: https://mirrors.aliyun.com/ubuntu/
Suites: plucky-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

# /etc/apt/sources.list.d/huawei.sources(同理配置)

apt 会按照文件顺序优先使用第一个源的包。

Q6: 换源后提示 “Unable to locate package” 怎么办?

通常是 Suites 名称写错了:

# 错误写法
Suites: noble noble-updates  # ❌ noble 是 24.04 的代号

# 正确写法
Suites: plucky plucky-updates  # ✅ 26.04 代号是 plucky

可以用以下命令验证:

# 列出镜像站支持的发行版代号
curl -s https://mirrors.aliyun.com/ubuntu/dists/ | grep -o 'href="[^"]*">' | head -20

# 或者直接访问镜像站根目录
curl -s https://mirrors.aliyun.com/ubuntu/ | grep -o 'plucky\|noble\|oracular\|warty' | sort -u

5. 总结

这次换源踩坑,核心教训就一句话:镜像源换上去只是第一步,版本一致性才是关键

对于全新部署的 Ubuntu 系统,建议的操作流程:

  1. 装完系统第一件事就是换国内镜像源(趁系统还「干净」)
  2. 换源后立即执行 apt clean && apt update && apt full-upgrade -y
  3. 验证 apt --fix-broken install 无报错
  4. 后续安装任何第三方软件前,先检查依赖是否会冲突

如果你已经不幸中招,按照本文的方法:dpkg --force-all 强制移除冲突的本地包,再用 apt download 下载正确版本的包,最后用 dpkg -i 逐个安装并 dpkg --configure -a 修复——这是最稳妥的补救路径。

最后,祝大家换源永不踩坑,apt install 永远一路绿灯 🚦


延伸阅读