Fedora 版本升级方法及注意事项
1. 一些经验
- 尽量在网速较快的环境下升级,避免部分组件下载失败;
- 把系统语言先修改成英文的(可更改系统语言配置文件:/etc/locale.conf),以防出现因中文编码问题打断升级过程;
- 系统升级过程中不要中断,被中断可能会出现包冲突的情况,详细请见后面“处理包冲突”一节。
- 出现问题多看系统日志。
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
再继续更新系统。