这篇文章上次修改于 325 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

昨天决定把服务器的系统从 Ubuntu 18.04 升级到 Ubuntu 20.04,其中经历了不少问题点,下面记录下处理过程。

首先就是升级当前系统所有包到最新:

apt update && apt upgrade -y
apt autoremove && apt purge

然后安装升级需要的管理包,不过一般系统都是自带的:

apt install update-manager-core

然后就可以更新系统了:

do-release-upgrade

标准流程就是以上几步,但是在最后一步的时候问题就开始出现了。

在执行升级命令后出现报警:

Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

在查询一些资料后,原来是 ssl certificates 验证问题,系统无法鉴定上面的 https 链接证书是否有效就返回错误了。

这个问题也是我这个系统的一个遗留问题,每次执行 wget 或 curl 下载东西的时候就会提示证书报错,需要通过附加指令跳过证书验证,但这就会存在安全问题了。

解决方法就是更新本地证书库后添加 SSL_CERT_DIR 环境变量指向系统证书目录:

update-ca-certificates --verbose --fresh
export SSL_CERT_DIR=/etc/ssl/certs

为了方便以后使用,将环境变量添加到 ~/.bashrc 文件中。这样就解决了 https 链接证书验证问题。

然后先删除之前执行升级命令后错误内容:

rm /var/lib/ubuntu-release-upgrader/release-upgrade-available
/usr/lib/ubuntu-release-upgrader/release-upgrade-motd

之后再次执行升级命令 do-release-upgrade

这时候报错信息变化了,这时候提示的是 python3 有问题,原因是我当前系统使用的是自己编译的 python 3.8,路径在 /opt 目录下。当时将系统软链接 /usr/bin/python/usr/bin/python3 都指向了自己安装的 python,需要将他们恢复到指向系统内置的 python 程序。

下面需要介绍下系统内 python 主程序和软链接的分布:

python2 主应用程序为 /usr/bin/python2.7
python3 主应用程序为 /usr/bin/python3.6
pip 主程序为 /usr/bin/pip
pip3 主程序为 /usr/bin/pip3

下面是默认的软链接及指向的应用程序:

/usr/bin/python  ->  /usr/bin/python2.7
/usr/bin/python2  ->  /usr/bin/python2.7
/usr/bin/python3  ->  /usr/bin/python3.6
/usr/local/bin/pip  ->  /usr/bin/pip
/usr/local/bin/pip3  ->  /usr/bin/pip3

如果你修改过这些软链接到自己的 python 版本,就需要修改回来:

ln -sf /usr/bin/python2.7 /usr/bin/python
ln -sf /usr/bin/python2.7 /usr/bin/python2
ln -sf /usr/bin/python3.6 /usr/bin/python3
ln -sf /usr/bin/pip /usr/local/bin/pip
ln -sf /usr/bin/pip3 /usr/local/bin/pip3
ldconfig

以上问题都处理完后,再次执行升级命令,一切都正常了。