Centos7.9使用nvm管理node踩坑记录

1,359 阅读3分钟

环境

  • 系统版本:CentOS Linux release 7.9.2009 (Core)

nvm安装记录

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
// 或者
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

安装之后会自动注入到shell配置文件中,例如上面是注入到bash的.bashrc中

之后我们执行命令来让nvm命令生效

source ~/.bashrc

如果是zsh的话就需要

source ~/.zshrc

安装指定版本node

nvm install 20.18.0

问题

安装高版本node后报错

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)

nvm current
none

原因

从node18开始都需要GLIBC_2.27支持,可是目前系统内却没有那么高的版本

查看GLIBC版本

strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
...
GLIBC_2.17
....

我们需要根据所需更新### glibc

解决问题

下载glibc-2.28

wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar xf glibc-2.28.tar.gz 
cd glibc-2.28/ && mkdir build  && cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

这一步可能会报错

configure: error: 
*** These critical programs are missing or too old: make bison compiler
*** Check the INSTALL file for required versions.

这是提示gcc和make版本过低,我们需要升级gcc和make版本

# 升级GCC(默认为4 升级为8)</span>
yum install -y centos-release-scl
yum install -y devtoolset-8-gcc*
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++

# 升级 make(默认为3 升级为4)
wget http://ftp.gnu.org/gnu/make/make-4.3.tar.gz
tar -xzvf make-4.3.tar.gz && cd make-4.3/
./configure  --prefix=/usr/local/make
make && make install
cd /usr/bin/ && mv make make.bak
ln -sv /usr/local/make/bin/make /usr/bin/make

在安装devtoolset-8-gcc*(gcc包)的时候可能会报错

Could not retrieve mirrorlist http://mirrorlist.centos.org?arch=x86_64&release=7&repo=sclo-rh error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"

原因是在 2024年6月30日时,变更了repo 的域名,导致了原来的 repo 都不能够使用了 我在一篇文章中找到了解决方法,来记录一下,具体就是更新一下yum的repo的域名:

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-SCLo* 
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-SCLo* 
sed -i 's|# baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-SCLo*

yum clean all && yum makecache

另外如果没有安装g++ 我们还要自己手动安装一下

yum install -y g++

执行make的时候还有可能报错

configure: error: 
*** These critical programs are missing or too old: bison
*** Check the INSTALL file for required versions.

这是提示我们的bison版本太老或者未安装,我这里是未安装我直接安装一下

yum install -y bison

这回我们安心执行make

cd /root/glibc-2.28/build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

make && make install

时间应该比较久,执行完成之后我们查看node版本可能还会报错

npm -v
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)

用下面命令查看

strings /usr/lib64/libstdc++.so.6 | grep CXXABI

image.png 我们需要更新更新libstdc++.so.6.0.26

# 更新lib libstdc++.so.6.0.26
wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26
 
 
# 替换系统中的/usr/lib64
cp libstdc++.so.6.0.26 /usr/lib64/

cd /usr/lib64/

ln -snf ./libstdc++.so.6.0.26 libstdc++.so.6

执行wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26这一步可能会报错:

ERROR: cannot verify cdn.frostbelt.cn's certificate, issued by '/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Encryption Everywhere DV TLS CA - G2':
  Issued certificate has expired.
To connect to cdn.frostbelt.cn insecurely, use `--no-check-certificate'.

我们根据提示在后面添加--no-check-certificate

wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26 --no-check-certificate

然后顺序执行后面的操作,即可解决node安装问题

感谢

感谢大佬的文章解惑

  1. 整体流程
  2. 解决yum源问题