解决 code-server 4.20 不再支持 glibc2.27 的问题:一次 Ubuntu 18.04 维护之旅

在这篇博客中,我将详细介绍一次 Ubuntu 18.04 系统维护的过程。我们的目标是升级 code-server 到最新版本,但由于系统中的 glibc 版本过低,我们需要进行一系列的操作来解决这个问题。

问题描述

我们的系统是 Ubuntu 18.04,安装的 glibc 版本是 2.27。然而,最新版本的 code-server 需要 glibc 2.28 或更高版本。因此,我们需要升级我们的 glibc。

解决方案

安装 glibc 2.28

我们首先尝试升级 Ubuntu 到最新版本,但由于 Python3 版本的问题,我们无法完成升级。因此,我们决定通过编译源码的方式来安装 glibc 2.28。

我们下载 glibc 2.28 的源码,然后进行编译和安装。然而,尽管我们已经安装了 glibc 2.28,但 ldd 命令仍然显示我们的 glibc 版本是 2.27。这是因为我们没有修改系统的动态链接库。

修改动态链接库

我们尝试通过以下命令修改动态链接库:

sudo ln -sf /opt/glibc-2.28/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2

然而,修改动态链接库后,我们发现所有的 Linux 命令都无法执行。这是因为我们错误地修改了动态链接库,导致系统无法找到正确的库文件。

进入救援模式修复系统

由于系统无法启动,我们需要进入救援模式来修复系统。在救援模式下,我们可以检查和修复文件系统,或者重新安装 glibc。

我们首先挂载之前的系统盘到 /mnt/ubuntu,然后使用绝对路径恢复之前的动态链接库:

ln -sf /mnt/ubuntu/lib/x86_64-linux-gnu/ld-2.27.so /mnt/ubuntu/lib64/ld-linux-x86-64.so.2

然而,即使我们恢复了动态链接库,系统仍然无法启动。这是因为我们的动态链接库仍然指向了错误的位置。

最后,我们尝试将动态链接库链接到一个在救援模式下不存在,但在 Ubuntu 系统中存在的地址:

cd /mnt/ubuntu
ln -sf /lib/x86_64-linux-gnu/ld-2.27.so lib64/ld-linux-x86-64.so.2

这次,我们成功地修复了系统,系统可以正常启动了。

后续问题和解决方案

尽管我们已经解决了 glibc 的问题,但我们还遇到了一些其他的问题。

网络问题

系统启动后,我们发现没有网络。我们可以看到网络接口,但没有分配 IP 地址。我们尝试使用 dhclient 命令来获取 IP 地址,这确实可以解决问题。

然而,每次重启系统后,我们都需要手动执行 dhclient 命令才能访问网络。我们尝试使用 systemd/etc/rc.local 来自动执行 dhclient 命令,但这些方法都不起作用。最后,我们使用 crontab,并添加了 @reboot /sbin/dhclient 来解决这个问题。

DNS 问题

我们还发现,虽然我们可以获取 IP 地址,但我们无法访问网络。这是因为我们的 DNS 解析器配置错误。我们发现,虽然我们的 nameserver 是本机地址,但 systemd-resolved 服务并没有运行。启动 systemd-resolved 服务后,我们就可以访问网络了。也可以使用其它nameserver, 修改/etc/resolv.conf ,添加 nameserver 8.8.8.8 nameserver 8.8.4.4

结论

尽管我们尝试了多种方法来升级 glibc,但最终我们并未成功升级到 glibc 2.28。由于 code-server 4.20 无法在 glibc 2.27 的环境下运行,我们最后选择降级 code-server 到 4.16 版本,这样 code-server 可以正常运行。

在这个过程中,我们遇到了许多问题,包括系统无法启动、网络无法连接等。通过一系列的故障排查和修复,我们成功地解决了这些问题。

这次的维护过程让我们深刻地认识到,系统升级和故障排查是一个复杂的过程,需要我们具备扎实的技术基础和丰富的实践经验。希望这篇博客能够帮助你在遇到类似问题时找到解决方案

评论

还没有人评论,抢个沙发吧...

Viagle Blog

欢迎来到我的个人博客网站