Fedora 版本升级方法及注意事项

Table of Contents

1. 一些经验

  1. 尽量在网速较快的环境下升级,避免部分组件下载失败;
  2. 把系统语言先修改成英文的(可更改系统语言配置文件:/etc/locale.conf),以防出现因中文编码问题打断升级过程;
  3. 系统升级过程中不要中断,被中断可能会出现包冲突的情况,详细请见后面“处理包冲突”一节。
  4. 出现问题多看系统日志。

2. 过程

1、 先更新当前系统软件包到最新:

sudo dnf upgrade --refresh

2、下载新版本所需的软件包,–releasever 参数指定需要升级至的版本:

sudo dnf system-upgrade download --releasever=24

如果是第一次升级系统大版本,可能需要为 DNF 单独安装 system-upgrade 组件才能运行上面的命令:

sudo dnf install dnf-plugin-system-upgrade

3、重启,并进入系统升级阶段:

sudo dnf system-upgrade reboot

3. 故障处理

3.1. 包冲突

在重启后进入升级阶段时,谨记不要轻易中断升级过程,因为系统是先安装新版本软件,再去清理老版本软件,在清理老版本软件之前打断升级过程就会出现包冲突。比如当前系统是 Fedora 23,要升级到 Fedora 24,在更新 Fedora 24 软件包阶段时被中断,一些软件就会同时存在 Fedora23、24 两个版本的包,这种情况叫作包冲突。如果系统关键组件(比如 Grub、Systemd 等)出现包冲突,系统是无法正常启动的。

发生包冲突后再去重新升级系统,会提示“file [冲突的包] from install of [冲突的包] conflicts with file from package”错误。这种情况可用命令:

rpm -q [冲突的包]

去查看包是否冲突,如:

rpm -q grub2

如果一个包返回了两个已安装的版本,说明发生了冲突。可用命令:

sudo package-cleanup --dupes

扫描系统中所有存在包冲突的软件。

一些网友给的方法是通过以下命令删除老版本的包:

rpm -e [包名] --nodeps # 不删除依赖的情况下删除某个包

但往往出现冲突的包不止一个,手动处理比较繁琐,系统升级中遇到包冲突可直接用 DNF 将所有包升级到最新版本来解决:

sudo dnf --releaserver=24 distro-sync

3.2. 证书问题

升级时,Fedora 会对官方源的包进行签名认证,当出现以下类似错误时,表明本地没有公钥:

warning: **.rpm: Header V3 RSA/SHA256 Signature, key ID f5282ee4: NOKEY
...
GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-x86_64"

可以从官方导入该公钥:

$ sudo rpmkeys --import https://getfedora.org/static/F5282EE4.txt # 注意这里文件名就是提示中的 key ID,并且文件名大写

key ID 可以从官网获得:https://getfedora.org/verify

3.3. 遇到 Python 报错

注:这都发生在 Python2 时代(2018-03-16)了,Python3 时代尚未遇到,可能一些老系统上会遇上。

更新(yum update)时遇到 Python 报错,导致升级被中断:

Traceback (most recent call last):
  File "/usr/libexec/urlgrabber-ext-down", line 75, in <module>
    main()
  File "/usr/libexec/urlgrabber-ext-down", line 61, in main
    fo = PyCurlFileObject(opts.url, opts.filename, opts)
  File "/usr/lib/python2.7/site-packages/urlgrabber/grabber.py", line 1258, in __init__
    self._do_open()
  File "/usr/lib/python2.7/site-packages/urlgrabber/grabber.py", line 1589, in _do_open
    self._do_grab()
  File "/usr/lib/python2.7/site-packages/urlgrabber/grabber.py", line 1723, in _do_grab
    self._do_perform()
  File "/usr/lib/python2.7/site-packages/urlgrabber/grabber.py", line 1517, in _do_perform
    raise KeyboardInterrupt
KeyboardInterrupt

是因为升级过程中刚好碰上旧库的 bug,先单独升级这个包,如上,先升级 urlgrabber。这种情况要避免用 pip 去升级,否则会打乱系统的依赖关系:

sudo yum update python-urlgrabber

再继续更新系统。