TrumanWong

使用dnf-plugin-system-upgrade升级Fedora

TrumanWong
11/9/2023

dnf-plugin-system-upgradeDNF包管理器的插件,用于将系统升级到当前版本的Fedora

执行系统升级

备份数据

在执行升级之前备份数据,因为每次系统升级都存在潜在风险,导致数据丢失或损坏。作为预防措施,应该通过创建数据备份,以防出现问题,确保在升级过程中不会丢失重要文件。

更新系统

$ sudo dnf update --refresh

提示:请勿跳过此步骤,系统更新需要接收更高版本版本的签名密钥,并且它们通常会修复与升级过程相关的问题。

安装dnf-plugin-system-upgrade

$ sudo dnf install dnf-plugin-system-upgrade

下载更新包

$ sudo dnf system-upgrade download --releasever=40
Before you continue ensure that your system is fully upgraded by running "dnf --refresh upgrade". Do you want to continue [y/N]: y

--releasever=后面改成你需要的Fedora版本号,系统更新最多只能跨两个版本号

如果某些依赖不满足,升级将会被终止,可添加--allowerasing选项删除依赖损坏的包。这可能是第三方源还未进行更新。建议卸载这些依赖不满足的包。带上--best选项,可查看依赖问题的详细信息。

导入新的GPG key

Importing GPG key 0xA15B79CC:
 Userid     : "Fedora (40) <fedora-40-primary@fedoraproject.org>"
 Fingerprint: 115D F9AE F857 853E E844 5D0A 0727 707E A15B 79CC
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-40-x86_64
Is this ok [y/N]: y
Key imported successfully

当出现以下内容即下载完成:

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'.

重启执行升级

$ sudo dnf system-upgrade reboot

升级后的操作

更新系统配置文件

大部分配置文件是存储在 /etc 目录下。如果您更改了包的配置文件,RPM 会使用.rpmnew(新的默认配置文件)或.rpmsave(备份的旧配置文件)创建新文件。您可以搜索这些文件,或使用rpmconf简化此过程的工具。

# 安装rpmconf
$ sudo dnf install rpmconf
$ sudo rpmconf -a

如果您使用rpmconf升级包附带的系统配置文件进行升级,则某些配置文件可能会发生变化。升级后,您应该验证/etc/ssh/sshd_config/etc/nsswitch.conf/etc/ntp.conf以及其他配置文件内容是否符合预期。例如,如果 OpenSSH 升级,则sshd_config恢复为默认包配置。

清理旧的包

随着每个版本的发布,Fedora 都会淘汰一些软件包。原因有多种:软件包变得过时,或者它们的上游已经不更新了。Fedora 不再分发这些软件包;但是,它们仍然在您的系统上。这些软件包将不会获得升级。强烈建议删除它们。

查看依赖关系已经损坏的包列表

$ sudo dnf repoquery --unsatisfied

该列表应该为空,但如果不是这种情况,请考虑删除它们,因为它们不太可能起作用。

查看你重复的软件包

$ sudo dnf repoquery --duplicates

列出重复的包,通常不会有重复包存在,如果有,可以使用以下方法删除它们:

$ sudo dnf remove --duplicates

列出已经从源中删除的包

$ sudo dnf list extras

对于来自官方存储库的软件包,应安装最新版本。但是,系统上仍然存在的某些软件包可能不再位于存储库中。如果您看到不需要或不使用的软件包,可以使用以下命令将其删除:

$ sudo dnf remove $(sudo dnf repoquery --extras --exclude=kernel,kernel-\*)

您可以安全地删除不再使用的软件包:

$ sudo dnf autoremove

清理旧的内核

旧内核在执行 dnf autoremove 后并不会被删除,这是有意设计的,防止误删。

当启动到新的内核,如果一切正常可以删除以前旧的内核来节省空间。可以使用以下脚本:

#!/usr/bin/env bash

old_kernels=($(dnf repoquery --installonly --latest-limit=-1 -q))
if [ "${#old_kernels[@]}" -eq 0 ]; then
    echo "No old kernels found"
    exit 0
fi

if ! dnf remove "${old_kernels[@]}"; then
    echo "Failed to remove old kernels"
    exit 1
fi

echo "Removed old kernels"
exit 0

清除旧的符号链接

升级后,文件系统中可能存在一些断开的dangling`的符号链接。您可以通过安装符号链接实用程序并删除旧链接来清理这些断开的符号链接:

$ sudo dnf install symlinks

安装该应用程序后,您可以检查断开的符号链接,如下所示,-r表示递归:

$ sudo symlinks -r /usr | grep dangling

验证损坏的符号链接列表后,您可以删除它们,如下所示。-d表示删除。

$ sudo symlinks -r -d /usr