Skip to Content
文档运维升级与迁移常见兼容问题

常见兼容问题

系统升级后可能遇到各种兼容性问题。本文汇总常见问题及其解决方案。

26.04 特有的升级兼容项

Ubuntu 26.04 LTS 在底层组件上有多项重大变更,从旧版本升级后需要特别留意。

sudo-rs 成为默认 sudo

26.04 默认使用 Rust 重写的 sudo-rs 替代传统 sudo。它兼容常见的 sudoers 语法,但部分边缘选项和插件尚未实现。

# 确认当前 sudo 实现 sudo --version # 如果脚本依赖传统 sudo 的某些特性而报错,可临时回退 sudo apt install sudo # 安装后会接管 /usr/bin/sudo;排查完毕后建议再切回 sudo-rs

rust-coreutils 成为默认

coreutils 默认由 Rust 实现的 uutils 提供。绝大多数日常用法一致,但少数 GNU 特有扩展选项可能不被支持。如脚本依赖特定 GNU 扩展,可安装 GNU 版本:

sudo apt install gnu-coreutils

APT 3.1 移除 apt-key

apt-key 已彻底移除,/etc/apt/trusted.gpg 中的残留密钥不再被信任。需将第三方源迁移到 signed-by + /etc/apt/keyrings/ 方案:

# 将密钥导出到独立 keyring curl -fsSL https://repo.example.com/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg # 在 .sources 文件中通过 Signed-By 引用 # Signed-By: /etc/apt/keyrings/example.gpg

Dracut 替代 initramfs-tools

26.04 使用 dracut 生成 initramfs。自定义 initramfs-tools hook 需迁移到 dracut 的模块/配置(/etc/dracut.conf.d/),重建命令也变化:

# 旧: sudo update-initramfs -u # 新: sudo dracut -f

systemd 259 移除 cgroup v1

systemd 259 不再支持 cgroup v1(仅 unified cgroup v2)。旧版 Docker、Kubernetes、Java 容器内存检测可能受影响,请升级到支持 cgroup v2 的版本。此外,26.04 是最后一个支持 SysV init 脚本的版本,建议尽早迁移到原生 systemd unit。

Apache MemoryDenyWriteExecute 影响 mod_php

26.04 的 Apache 2.4.66 service 默认启用 MemoryDenyWriteExecute=yes,会导致 libapache2-mod-php 崩溃。官方推荐迁移到 PHP-FPM(mod_proxy_fcgi + php-fpm)。详见服务器章节的 Nginx/Apache 配置说明。

PPA 和第三方源问题

PPA 不支持新版本

升级后最常见的问题是 PPA 尚未提供新版本的包。

# 查看被禁用的 PPA ls /etc/apt/sources.list.d/*.distUpgrade # 错误示例 # E: The repository 'https://ppa.launchpadcontent.net/example/ppa/ubuntu resolute Release' does not have a Release file. # 检查 PPA 是否支持 26.04 sudo add-apt-repository --list # 删除不兼容的 PPA sudo add-apt-repository --remove ppa:example/ppa # 或手动删除 sudo rm /etc/apt/sources.list.d/example-ppa.sources sudo apt update

第三方仓库版本代号不匹配

# 许多第三方源使用版本代号(如 noble、resolute) # 升级后需要更新代号 # 检查当前代号 lsb_release -cs # 输出: resolute # 手动修改第三方源文件中的版本代号 sudo sed -i 's/noble/resolute/g' /etc/apt/sources.list.d/example.list # 对于 DEB822 格式 sudo sed -i 's/noble/resolute/g' /etc/apt/sources.list.d/example.sources # 更新索引 sudo apt update

GPG 密钥过期

# 错误示例 # W: GPG error: https://repo.example.com ... EXPKEYSIG # 重新获取密钥 curl -fsSL https://repo.example.com/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg # 删除已过期的旧密钥 sudo rm /etc/apt/trusted.gpg.d/example.gpg

驱动问题

NVIDIA 显卡驱动

# 升级后 NVIDIA 驱动可能需要重新安装 # 检查驱动状态 nvidia-smi # 如果命令不可用,重新安装驱动 sudo ubuntu-drivers devices sudo ubuntu-drivers autoinstall # 推荐让 ubuntu-drivers 自动选择匹配的驱动版本 # 具体版本号以 ubuntu-drivers devices 输出的 recommended 为准 sudo ubuntu-drivers autoinstall # 如果卡在低分辨率或黑屏 # 1. 切换到 TTY: Ctrl+Alt+F2 # 2. 重新安装驱动(版本号以 ubuntu-drivers devices 为准) sudo apt install --reinstall nvidia-driver-XXX sudo reboot

内核模块需要重新编译

使用 DKMS 构建的第三方内核模块可能需要重新编译:

# 检查 DKMS 状态 dkms status # 如果模块未构建 sudo dkms autoinstall # 手动重建指定模块 sudo dkms build module-name/version -k $(uname -r) sudo dkms install module-name/version -k $(uname -r) # 常见需要 DKMS 的模块 # - VirtualBox Guest Additions # - NVIDIA 驱动 # - ZFS # - WireGuard (旧版内核)

Wi-Fi 和蓝牙问题

# 检查无线设备 rfkill list all iwconfig # 安装缺失的固件 sudo apt install linux-firmware -y # 如果特定网卡不工作 lspci | grep -i network lsusb | grep -i wireless # 查看内核日志中的固件错误 dmesg | grep -i firmware dmesg | grep -i wifi # 重新加载无线模块 sudo modprobe -r iwlwifi && sudo modprobe iwlwifi

声音问题

# 检查 PipeWire(26.04 默认)或 PulseAudio systemctl --user status pipewire pipewire-pulse # 重启音频服务 systemctl --user restart pipewire pipewire-pulse # 如果从 PulseAudio 迁移到 PipeWire sudo apt install pipewire-audio

软件版本变更

Python 版本变化

# 检查 Python 版本 python3 --version # 升级后 Python 小版本可能变化(如 3.12 -> 3.13) # 注意:26.04 系统 Python 受 PEP 668 保护,无法用 pip 直接装包(含 --user)。 # 已安装的依赖应在虚拟环境中重新安装——小版本变化后旧 venv 通常需要重建: rm -rf venv/ python3 -m venv venv source venv/bin/activate pip install -r requirements.txt # 命令行工具类的全局应用改用 pipx 安装/重装: # sudo apt install pipx # pipx reinstall-all

PHP 版本变化

# 检查 PHP 版本 php -v # 升级后 PHP 版本可能从 8.3 变为 8.5 # 需要更新 Web 服务器配置 # Nginx - 更新 PHP-FPM socket 路径 # 旧: fastcgi_pass unix:/run/php/php8.3-fpm.sock; # 新: fastcgi_pass unix:/run/php/php8.5-fpm.sock; sudo grep -r "php8." /etc/nginx/ # Apache - 更新模块 sudo a2dismod php8.3 sudo a2enmod php8.5 sudo systemctl restart apache2 # 重新安装 PHP 扩展 sudo apt install php8.5-mysql php8.5-curl php8.5-mbstring php8.5-xml -y

MySQL / MariaDB 升级

# 检查版本 mysql --version # 注意:MySQL 8.4 已移除 mysql_upgrade 命令, # 数据字典升级由 mysqld 启动时自动完成,无需手动运行。 # 仅 MariaDB 仍需手动升级: sudo mariadb-upgrade -u root -p # 检查表兼容性 sudo mysqlcheck -u root -p --all-databases --check-upgrade # 如果出现错误,尝试修复 sudo mysqlcheck -u root -p --all-databases --auto-repair

PostgreSQL 升级

# PostgreSQL 升级后可能需要迁移数据目录 # 检查版本 pg_lsclusters # 如果有多个集群版本(如从 24.04 的 16 升级到 26.04 的 18) # 旧集群在升级后会保留 sudo pg_upgradecluster 16 main 18 # 确认新集群正常后删除旧集群 sudo pg_dropcluster 16 main

Node.js 版本

# 如果通过系统包安装 node --version # 推荐使用 nvm 管理版本,不受系统升级影响 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash nvm install --lts

配置文件冲突

查找被替换的配置

# 升级过程中选择了"安装维护者版本"的配置文件 # 旧版本会备份为 .dpkg-old find /etc -name "*.dpkg-old" 2>/dev/null find /etc -name "*.dpkg-dist" 2>/dev/null find /etc -name "*.ucf-dist" 2>/dev/null # 比较差异 diff /etc/ssh/sshd_config /etc/ssh/sshd_config.dpkg-old

合并配置变更

# 使用 diff3 进行三方合并 # 需要原始配置、你的修改和新版本配置 # 对于 debconf 管理的配置 sudo dpkg-reconfigure package-name # 重新配置所有使用 ucf 的配置文件 sudo ucf --purge /etc/some/config sudo apt install --reinstall package-name

systemd 服务问题

服务文件变更

# 检查是否有需要重新加载的服务 sudo systemctl daemon-reload # 查看被覆盖的服务文件 systemd-delta # 检查自定义的 override 是否仍然有效 systemctl cat your-service.service

服务名称变更

# 某些服务名称在新版本中可能更改 # 例如: # iptables -> nftables # isc-dhcp-server -> kea-dhcp4-server # 检查服务是否存在 systemctl list-unit-files | grep service-name

GRUB 和引导问题

GRUB 更新失败

# 重新安装 GRUB sudo grub-install /dev/sda # 或你的引导磁盘 sudo update-grub # 查看 GRUB 配置 cat /boot/grub/grub.cfg | grep menuentry

旧内核无法清理

# 如果 autoremove 无法删除旧内核 dpkg --list | grep linux-image # 手动删除指定旧内核 sudo apt purge linux-image-5.15.0-xx-generic sudo apt purge linux-headers-5.15.0-xx-generic sudo update-grub

桌面环境问题

GNOME 扩展不兼容

# 升级后 GNOME Shell 版本可能变化 gnome-shell --version # 禁用所有扩展 gsettings set org.gnome.shell disable-user-extensions true # 逐个启用测试 gnome-extensions list gnome-extensions enable extension-name@example.com # 更新扩展 # 访问 https://extensions.gnome.org 重新安装

Wayland / X11 问题

# 检查当前显示协议 echo $XDG_SESSION_TYPE # 某些应用不兼容 Wayland,可强制 X11 后端 GDK_BACKEND=x11 application-name

Ubuntu Desktop 默认会话在 26.04 中是 Wayland-only。若工作流必须依赖完整 X.org 会话,请评估仍提供 X.org 的其他桌面环境,例如 Xfce、MATE、i3 等。

Docker 兼容性

# 检查 Docker 服务状态 sudo systemctl status docker # 如果 Docker 仓库版本代号未更新 # 重新配置 Docker 源 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install --only-upgrade docker-ce docker-ce-cli -y # 验证 docker run hello-world docker compose version

通用排查思路

# 1. 查看系统日志 sudo journalctl -b -p err sudo journalctl -b -p warning | head -50 # 2. 查看特定服务日志 sudo journalctl -u service-name --since "1 hour ago" # 3. 检查包完整性 sudo debsums -c # 检查修改过的配置文件 sudo debsums -s # 静默模式,仅显示错误 # 4. 重新配置包 sudo dpkg-reconfigure package-name # 5. 查看升级日志 less /var/log/dist-upgrade/main.log less /var/log/dist-upgrade/apt.log
Last updated on