centos7.9升级glibc到2.28

疑难杂症  

前言

node -v  
 node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
 node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by node)
 node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
 node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
 node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
 node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)

一、修改yum源

[root@centos7-publish-002 ~]# vim /etc/yum.repos.d/CentOS-Base.repo 
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com  
failovermethod=priority  
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/  
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1  
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#released updates 
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com  
failovermethod=priority  
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/  
        http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1  
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com  
failovermethod=priority  
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/  
        http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1  
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com  
failovermethod=priority  
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/  
        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1  
enabled=0  
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com  
failovermethod=priority  
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/  
        http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1  
enabled=0  
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

# 添加如下2段
[centos-sclo-sclo]
name=CentOS-7 - SCLo sclo  
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/sclo/  
# mirrorlist=https://mirrors.aliyun.com?arch=$basearch&release=7&repo=sclo-sclo
gpgcheck=0  
enabled=1  
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

[centos-sclo-rh]
name=CentOS-7 - SCLo rh  
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/  
#mirrorlist=https://mirrors.aliyun.com?arch=$basearch&release=7&repo=sclo-rh
gpgcheck=0  
enabled=1  
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo[root@centos7-publish-002 ~]# yum clean all && yum makecache[root@centos7-publish-002 ~]# yum repolist  

二、安装依赖。安装glibc之前需要升级gcc和make

安装依赖[root@localhost ~]# yum install -y gcc make bison ncurses-devel centos-release-scl
# 安装gcc8
[root@localhost ~]# yum update -y && yum install -y centos-release-scl
[root@localhost ~]# yum install -y bison wget bzip2 gcc gcc-c++ glibc-headers nss-devel


# 升级make
[root@localhost ~]# wget http://ftp.gnu.org/gnu/make/make-4.2.1.tar.gz
[root@localhost ~]# tar -zxvf make-4.2.1.tar.gz
[root@localhost ~]# mkdir make-4.2.1/build && cd make-4.2.1/build
[root@localhost build]# ../configure --prefix=/usr/local/make && make -j4 && make install
[root@localhost build]# export PATH=/usr/local/make/bin:$PATH
[root@localhost build]# ln -s /usr/local/make/bin/make   /usr/local/make/bin/gmake
[root@localhost build]# make -v
GNU Make 4.2.1

[root@centos7-publish-002 build]# cd 

# 升级GCC
[root@centos7-publish-002 ~]# yum install -y centos-release-scl bison
[root@centos7-publish-002 ~]# yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils
[root@centos7-publish-002 ~]# echo "source /opt/rh/devtoolset-8/enable" | tee -a /etc/profile
[root@centos7-publish-002 ~]# source /etc/profile
[root@centos7-publish-002 ~]# gcc -v
....
  ....
gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)  

三、 更新libstdc++.so.6.0.26

先检查系统中libstdc++.so.6是从哪里链接的,如果就是从libstdc++.so.6.0.26链接的,不用执行下面的步骤:
wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26  
cp libstdc++.so.6.0.26 /usr/lib64/  
cd /usr/lib64/  
ln -snf ./libstdc++.so.6.0.26 libstdc++.so.6  

四、安装glibc

# 下载并安装Glibc[root@centos7-publish-002 ~]# wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
[root@centos7-publish-002 ~]# tar xzvf glibc-2.28.tar.gz需要修改glibc-2.28编译时候的bugvi glibc-2.28/scripts/test-installation.pl找到第128行 将下文:&& $name ne "nss_test1" && $name ne "libgcc_s") {改为:
  && $name ne "nss_test1" && $name ne "nss_test2" && $name ne "nss_nis" && $name ne "nss_nisplus" && $name ne "libgcc_s") {
[root@centos7-publish-002 ~]# mkdir glibc-2.28/build && cd glibc-2.28/build[root@centos7-publish-002 build]# ../configure --prefix=/usr --with-headers=/usr/include --with-binutils=/usr/bin --disable-profile --enable-add-ons
[root@centos7-publish-002 build]# make -j4
[root@centos7-publish-002 build]# make install

五、查看版本

[root@centos7-publish-002 build]# strings /lib64/libc.so.6 | grep ^GLIBC_2.28
GLIBC_2.28  
GLIBC_2.28  

六、升级带来的问题处理

报错1:-bash: warning: setlocale: LC_TIME:cannot change locale(en_US.UTF-8)
解决# 重新生成本地化文件
在升级glibc后,可能需要重新生成本地化文件,确保系统能够识别并使用正确的本地化环境。你可以使用以下命令重新生成所有本地化文件:
[root@centos7-publish-002 ~]# localedef -c -i en_US -f UTF-8 en_US.UTF-8
注:这将重新生成 en_US.UTF-8 本地化环境

# 更新系统的 locale 设置
如果 en_US.UTF-8 本地化环境缺失或损坏,可以通过安装或重新配置来修复它
首先确认是否已安装所需的本地化包
[root@centos7-publish-002 ~]# yum -y install glibc-common

然后,重新设置系统本地化配置。你可以使用 localectl 命令来设置系统默认的语言和地区:
[root@centos7-publish-002 ~]# localectl set-locale LANG=en_US.UTF-8

# 验证本地化环境是否生效,确保本地化环境已经正确设置
[root@centos7-publish-002 ~]# locale
locale: 无法将 LC_ALL 设置为缺省的语区: 没有那个文件或目录  
LANG=zh_CN.UTF-8  
LC_CTYPE="zh_CN.UTF-8"  
LC_NUMERIC=zh_CN.UTF-8  
LC_TIME=zh_CN.UTF-8  
LC_COLLATE="zh_CN.UTF-8"  
LC_MONETARY=zh_CN.UTF-8  
LC_MESSAGES="zh_CN.UTF-8"  
LC_PAPER=zh_CN.UTF-8  
LC_NAME=zh_CN.UTF-8  
LC_ADDRESS=zh_CN.UTF-8  
LC_TELEPHONE=zh_CN.UTF-8  
LC_MEASUREMENT=zh_CN.UTF-8  
LC_IDENTIFICATION=zh_CN.UTF-8  
LC_ALL=

# 重新生成缺失的语言环境文件
如果 glibc-common 已安装,但仍然没有找到 zh_CN.UTF-8 或其他所需的本地化文件,可以尝试重新生成这些语言环境文件
[root@centos7-publish-002 ~]# localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8
[root@centos7-publish-002 ~]# localedef -c -i en_US -f UTF-8 en_US.UTF-8
注:这将生成 zh_CN.UTF-8 和 en_US.UTF-8 语言环境,解决 locale 配置缺失的问题

# 检查 /etc/locale.conf 文件
检查并确认 /etc/locale.conf 中的配置是否正确,尤其是 LANG 和 LC_ALL 变量
[root@centos7-publish-002 ~]# vim /etc/locale.conf
LANG=zh_CN.UTF-8  
LC_ALL=zh_CN.UTF-8  
注:如只想使用zh_CN.UTF-8,并且没有LC_ALL,可删除LC_ALL变量或者将其设置为合适的值。确保其他 LC_* 变量也指向正确的语言环境

# 检查系统本地化设置
[root@centos7-publish-002 ~]# locale
LANG=zh_CN.UTF-8  
LC_CTYPE="zh_CN.UTF-8"  
LC_NUMERIC=zh_CN.UTF-8  
LC_TIME=zh_CN.UTF-8  
LC_COLLATE="zh_CN.UTF-8"  
LC_MONETARY=zh_CN.UTF-8  
LC_MESSAGES="zh_CN.UTF-8"  
LC_PAPER=zh_CN.UTF-8  
LC_NAME=zh_CN.UTF-8  
LC_ADDRESS=zh_CN.UTF-8  
LC_TELEPHONE=zh_CN.UTF-8  
LC_MEASUREMENT=zh_CN.UTF-8  
LC_IDENTIFICATION=zh_CN.UTF-8  
LC_ALL=


# 重新加载 shell 环境
如果所有配置都正确,可以尝试重新加载 shell 环境
[root@centos7-publish-002 ~]# source /etc/profile
或者直接重启:
[root@centos7-publish-002 ~]# reboot         # 最好重启下

# 清除缓存
为了确保新的glibc配置生效,可以清除系统的缓存
[root@centos7-publish-002 ~]# ldconfig