从安装VS Code到系统core dumped

起因

实验室更换了新的服务器,由于本人日常使用VS Code,故准备安装之。默认进入VS Code官网,下载rpm包,准备安装。

经过

  1. 安装的日期是2024年2月22日,因此下载的VS Code版本是1.86.2,其包名是code-1.86.2-1707854644.el8.x86_64.rpm。(写在前面,压缩包的VS Code勉强能使用,但是不能保存配置,每次启动都要显示Start up,具体见后文。)
  2. 执行yum localinstall code-1.86.2-1707854644.el8.x86_64.rpm
  3. 报错,说Requires: libc.so.6(GLIBC_2.28)(64bit)。第一反应是安装这个库。
  4. 执行yum provides libc.so.6。找到提供libc.so.6的包,发现是glibc提供的,安装之。
  5. 执行yum install glibc。告诉我已经安装了最新版本,Nothing to do。(现在反思如果看到这一步就停下来后面就没有这么多事了T.T)查找原因后发现,原来GLIBC有具体的版本,查看版本之。
  6. 执行strings /usr/lib64/libc.so.6 | grep GLIBC_。发现当前版本最新只有GLIBC_2.17。好!那么就找方法更新。
  7. 执行
wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.31.tar.gz
tar -xzf glibc-2.31.tar.gz
mkdir glibc-2.31/build
cd glibc-2.31/build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-sanity-checks --disable-werror

提示make bison compiler python太老了,无法执行。执着啊!依次更新之。
8. 执行

wget https://mirrors.aliyun.com/gnu/make/make-4.3.tar.gz
tar -xzf make-4.3.tar.gz
mkdir make-4.3/build
cd make-4.3/build
../configure --prefix=/usr
make
make install

。make更新完成输入make -v。可以看到版本确实变成4.3了。
9. 执行yum install bison。完成bison的更新。
10. 执行

wget https://mirrors.aliyun.com/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz
tar -zxf gcc-9.3.0.tar.gz
mkdir gcc-9.3.0/build
cd gcc-9.3.0/build
../configure --enable-checking=release --enable-language=c,c++ --disable-multilib --prefix=/usr

报错Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+。安装之。
11. 执行

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz
tar -jxf gmp-6.1.0.tar.bz2

报错 bzip2: Cannot exec: No such file or directory。安装之。
12. 执行yum install bzip2。安装bzip2。
13. 执行

tar -jxf gmp-6.1.0.tar.bz2
mkdir gmp-6.1.0/build
cd gmp-6.1.0/build
../configure
make
make install

tar -jxf mpfr-3.1.4.tar.bz2
mkdir mpfr-3.1.4/build
cd mpfr-3.1.4/build
../configure
make
make install

tar -xzf mpc-1.0.3.tar.gz
mkdir mpc-1.0.3/build
cd mpc-1.0.3/build
../configure
make
make install

安装完成gcc 9.3.0编译依赖。继续编译gcc。
14. 执行

../configure --enable-checking=release --enable-language=c,c++ --disable-multilib --prefix=/usr
make

报错:C++ preprocessor "/lib/cpp" fails sanity check,发现缺少c++库,安装之。
14. 执行yum install gcc-c++。安装完成继续执行

make
make install

完成gcc9.3.0版本安装。输入gcc -v可以确认版本完成更新。
15. 执行

wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz
../configure --prefix=/usr/local/python-3.12.2 --enable-optimizations
  1. 编译安装完glibc2.28后,会报错。此时看起来相安无事,实际上xvnc已经无法正常工作了。
  2. 平时我是使用xrdp远程连接到服务器的,但是现在每次连接都会报错,观察log,发现xvnc没有办法启动。
  3. 兜兜转转意识到是glibc修改了系统的库,查看/usr/lib64/目录下的libc.so.6发现它确实是软链到libc-2.28.so,好好好,为了保证xrdp的正常使用,我准备修改软链到libc-2.17.so。
  4. 执行unlink libc.so.6。坏事开始发生了,所有的命令都无法执行,我没办法重新创建这个软链。
  5. 开始补救。执行export LD_PRELOAD=/lib64/libc-2.5.so。可以恢复执行,然而当我创建到libc-2.17.so软链后,发现其他用户连ssh都无法登陆了。故修改回libc-2.28.so。ssh所有用户登陆正常。
  6. 作死!!!查找资料后发现GLIBC包含了许多库,要完成替换,必须替换所有库,其中ld.so和libc.so是两个最核心的库,于是我开始准备替换ld.so的软链,有了上次unlink出错的经验,我这次很小心,采用了替换软链的方法(最作死的一步)执行ln -sfn ld-2.17.so ld.so。至此所有的命令都显示Segmentation fault(Core dumped)。
  7. 目前尚未修复,等待更新。希望大家不要重蹈覆辙!!!经测试在https://code.visualstudio.com/updates/v1_86 网址下载1.82版本可以直接yum安装VS Code。

2024.02.7已完成修复。
流程如下:

  1. 制作一个与服务器系统版本一致的启动盘。
  2. 切换启动盘启动服务器,选择Trouble Shooting, Rescue a CentOS。
  3. 根据提示执行,让拯救系统自动挂载待修复系统。
  4. 如果正常挂载待修复系统会在拯救系统的/mnt/sysimage中。
  5. 删除/mnt/sysimage/usr/lib64中所有新版本glibc的库,我的老版本是2.17,新版本是2.28,'''rm /mnt/sysimage/usr/lib64/2.28'''。
  6. 挂载启动盘中存放package的地方,U盘通常是sdd1,光盘就是cdrom。'''mount /dev/sdd1 /mnt/sysimage/home/user/media'''。
  7. 通过文件复制修改好libc和ld两个动态库,后切换root到待修复盘,chroot /mnt/sysimage
  8. 执行rpm安装media中的glibc。cd /home/user/media``````rpm -Uvh --force --nodeps glibc-*.rpm
  9. 修复完成,重启后可正常开机。
    千万千万不要作死强行升级GLIBC,主要是CentOS7的yum源支持的软件包不一定支持新版的GLIBC,因此有一些常用程序会崩溃。所以要么就优先安装新版GLIBC后所有软件都通过源码编译安装,要么就老老实实找支持CentOS7的软件版本!!!
posted @ 2024-02-23 20:19  -Airan  阅读(357)  评论(0)    收藏  举报