升级Fedora最新发行版本

备注

Fedora 支持从不同低版本( 34/33 ,最多支持两代跨越,也就是最多支持 35 或 36) 直接升级到最新的 Fedora 37

我最初安装部署的 z-dev 版本是 Fedora 35,Fedora 37正式发布时做一次全面的版本升级,以体验最新的Linux技术

升级需要较大的磁盘空间,我在最初构建虚拟机时候采用了非常小的初始磁盘。所以升级过程中DNF提示磁盘空间不足,采用 在libvirt LVM卷管理存储池中扩展虚拟机磁盘 将磁盘扩展到 32G 42G

  • 更新所有系统已经安装的软件包:

更新操作系统的所有软件包
dnf --refresh upgrade
  • 重启操作系统

  • 安装/升级 dnf-plugin-system-upgrade 软件包:

安装 dnf-plugin-system-upgrade
dnf install dnf-plugin-system-upgrade --best
  • 下载更新软件包:

下载Fedora 37更新软件包
dnf system-upgrade download --releasever=37

如果一切检查正常,提示信息类似:

...
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Complete!
Transaction saved to /var/lib/dnf/system-upgrade/system-upgrade-transaction.json.
Download complete! Use 'dnf system-upgrade reboot' to start the upgrade.
To remove cached metadata and transaction use 'dnf system-upgrade clean'
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'dnf clean packages'.
  • 开始升级:

执行升级重启
dnf system-upgrade reboot

升级完成后操作

大多数配置文件存放在 /etc 目录。如果修改过默认配置,则RPM安装会创建一个 .rpmnew 文件(也就是新版本的默认配置)或者 .rpmsave (旧的配置文件备份)。可以搜索这些文件,或使用 rpmconf 工具来处理:

sudo dnf install rpmconf

然后执行:

sudo rpmconf -a

备注

对于使用BIOS的系统,会升级 GRUB rpm,但是安装或内嵌的bootloader不会自动升级,所以建议在fedora升级后执行一次重新安装升级:

sudo mount | grep "/boot "
# 假设这里显示 /dev/sda4 on /boot type ext4 (rw,relatime,seclabel)
# 则执行
sudo grub2-install /dev/sda
  • 清理无用软件包

一些旧版本的软件包在新版本中已经不不再升级,也不再使用,建议删除:

如果只跨了一个版本升级(从Fedora 36升级到37),则执行:

sudo dnf install remove-retired-packages
remove-retired-packages

如果跨2个版本升级(从Fedora 35升级到37),则执行:

sudo dnf install remove-retired-packages
remove-retired-packages 35
  • 清理旧软件包

先查看已经没有依赖关系的孤儿包:

sudo dnf repoquery --unsatisfied

通过如下命令查看是否存在重复包(也就是安装了多个版本的软件包):

sudo dnf repoquery --duplicates

查看是否有不属于软件仓库的软件包:

sudo dnf list extraso

上述软件包可以通过以下命令清理:

sudo dnf remove $(sudo dnf repoquery --extras --exclude=kernel,kernel-\*)
  • 清理不再使用的软件包:

    sudo dnf autoremove
    
  • 清理旧软连接:

    # 检查
    sudo symlinks -r /usr | grep dangling
    # 清理
    sudo symlinks -r -d /usr
    

一些可能问题处理方法

  • 如果出现一些RPM/DNF报错,可能是rpm数据库损坏,通过以下命令修复:

    sudo rpm --rebuilddb
    
  • 系统升级默认使用了 dnf distro-sync ,但是可能会遇到软件包依赖错误,尝试以下修复方法:

    sudo dnf distro-sync
    

对于一些不再安全的依赖,可以通过以下方式检查:

sudo dnf distro-sync --allowerasing
  • 如果出现SELinux相关策略告警,可能是SELinux权限设置问题,执行:

    sudo fixfiles -B onboot
    

参考