在centos6.5上部署node.js v6.4.0踩过的那些坑

背景说明:

有一个项目用到了Node.js,于是要在centos下部署node V6.4.0的运行环境。

 

简介:

Node.js平台是在后端运行JavaScript代码,所以,必须首先在本机安装Node环境。

npmNode.js的包管理工具(node package manager,用于管理Node.js代码引用的模块的下载,方便解决各个模块的依赖关系。

 

问题综述:

其实主要原因还是环境不满足,升级了一个,又依赖另一个,确实心累。最惨的是最后把libc.so.6升级到2.14版后(centos6.5自带是2.12),影响了本机的语言环境,svn更新时有中文无法更新。于是想删除了高版本的libc.so.6动态库还原老的来回退,结果一删除系统就无法运行任何命令了,马上通过网上搜索到的解决办法恢复,LD_PRELOAD=/lib64/libc-2.12.so ln -s /usr/local/glibc-2.14/lib/libc-2.14.so libc.so.6,系统又活过来了;可第二次不死心,心想是不是应用程序占用的原因导致,又删除了一遍,仍然不行,再次恢复后过了几秒,系统就崩溃了。还好是个测试系统,收拾过情绪,靠centos 光盘启动进入救援模式通过备份原libc.so.6还原了,再启动就一路正常。

 

下面凭记忆还原一下,我是怎么一步一步掉坑儿里的,以便以后回味,或者看到的同学可以绕过一些坑:

 因为npm安装模块时的依赖,需要python2.7gcc-c++4.8.0:

 

首先,python2.6升级到2.7

实施步骤:

1、下载nux release文件:

wget http://li.nux.ro/download/nux/dextop/el6/i386/nux-dextop-release-0-2.el6.nux.noarch.rpm

rpm -ivh nux-dextop-release-0-2.el6.nux.noarch.rpm

yum -y install python27

yum -y install python27-devel

2、升级python

Centos默认还是使用python2.6.*,需要用python2.7的文件覆盖python文件。

cd /usr/bin/

rm -rf python

cp python2.7 python

3、测试

在命令行里输入python --version,如果输出的结果显示的是这样就正确了:

[root@linuxidc script]# python --version

Python 2.7.3

4、由于yum没有兼容python2.7,需要vi /usr/bin/yum将 #!/usr/bin/python 修改为 #!/usr/bin/python2.6

 

 

 然后,npm install时需要gcc-c++-4.8.0以上,在centos6.5默认是gcc-c++-4.4.7。没办法,只能编译升级:

 

1.下载gcc最新的源码包 wget http://gcc.skazkaforyou.com/releases/gcc-4.9.1/gcc-4.9.1.tar.gz

2.解压缩 tar -xf gcc-4.9.1.tar.gz

3. cd gcc-4.9.1

4.运行download_prerequisites脚本, ./contrib/download_prerequisites ,这个脚本会自动下载所需要的依赖文件和库

5.建立输出目录,将所有的中间文件都放到该目录,

mkdir gcc_temp

cd gcc_temp

6. 运行 ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

7. make & make install

 

然而,gcc升级后,并没有结束,npm install发现引起的依赖关系是libstdc++版本不够高,

 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15'

libstdc++ 检查发现,GLIBCXX 最高只有 3.4.13

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

于是下载了一个 6.0.20 的,替换掉当前使用的 libstdc++

cp /usr/local/lib64/libstdc++.so.6.0.20 /usr/lib64/

ln -s -f /usr/lib64/libstdc++.so.6.0.20 /usr/lib64/libstdc++.so.6

检查一下新的 libstdc++GLIBCXX 最高到 3.4.20 

 

libstdc++.so.6的坑填完之后,就是最挫的地方了,linux的语言环境设置异常,报错:

# locale -a|more

locale: Cannot set LC_CTYPE to default locale: No such file or directory

locale: Cannot set LC_MESSAGES to default locale: No such file or directory

locale: Cannot set LC_COLLATE to default locale: No such file or director

试遍网上的改编码的方式,都不行,其实我也知道,肯定还是glibc版与glibc-common版本不一致造成,找遍度娘谷哥都没找到类似的解决方法,有一个网友跟我的出错一毛一样,但是他也没解决,他说更新了glibc-common仍然无效,此时我有点想回滚了;最悲剧的场面也是因此产生,删除了动态库libc.so.6,服务器直接就挂了,当时就傻了,应该另外找台机器来搞的,没想到依赖关系这么多,捅一堆篓子。

 

这里其实就是,libstdc++依赖/lib64/libc.so.6: version `GLIBC_2.14'的问题,报错如下:

node: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/lib64/libstdc++.so.6)

centos6.5libc.so.6默认版本是2.12,所以,又得升级。。。

于是安装glibc2.14,将glibc更新到glibc2.14

1)下载

glibc2.14下载地址:

http://ftp.gnu.org/gnu/glibc/

wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz

2)编译

tar -zxvf glibc-2.14.tar.gz

cd glibc-2.14

mkdir build

cd build

../configure --prefix=/usr/local/glibc-2.14

make -j4

make install

 

方法一:直接生效(建议)

编译.bash_profile下设置:

export LD_PRELOAD=/lib64/libc

export LD_PRELOAD=/usr/local/glibc-2.14/lib/libc-2.14.so

source .bash_profile

在网上查找时,博主是建议用这个,但是糟糕在我选了删除动态库重建链接

 

方法二:(效果不好,不建议用)

可以先删除软链接:删除/lib64/libc.so.6

cd /lib64

rm libc.so.6

此时libc.so.6被删除,无法执行其他命令,需要用一下命令进行恢复,并重新建立软链接:

export LD_PRELOAD=/lib64/libc

export LD_PRELOAD=/lib64/libc-2.12.so

恢复完成之后执行:

cp /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc-2.14.so

ln -s libc-2.14.so libc.so.6

此时,libc.so.6就升级完成。

 

其实我也就是想回滚libc.so.6包到2.12版本出的问题,过程如下:

cd /lib64

rm libc.so.6

结果系统命令就无法执行,就想先恢复系统,还是用2.14

LD_PRELOAD=/lib64/libc-2.12.so ln -s /usr/local/glibc-2.14/lib/libc-2.14.so libc.so.6

 

结果,恢复后几秒,系统就挂了,无法开机了。

 

 

下面是拯救过程:思路就是用系统安装镜像(因为我是虚拟机)把libc.so.6

还原成2.12

进入救援模式后,chroot /mnt/sysimage,结果报错libc.so.6 too short,总之是异常。

然后,我想直接mv 或者删除再拷贝旧版本的libc.so.6都操作失败。

最后想,要不看下当前的挂载情况,看到/mnt/sysimage挂载路径,于是进入

/mnt/sysimage/user/lib64/

删除libc.so.6,再ln -s /libc-2.12.so libc.so.6

 

之后,重启,至此,系统终于恢复。。。

 

 

总结:Centos6.5自带的gccpython版本都太低,编译升级后各种依赖关系真是让人头疼,而已容易把环境搞得很乱,给维护也带来很大难度,所以程序要求环境的版本比较高,该升centos 7就升吧。我最后也是这么干的,升到centos7后,安装一路顺利,高歌挺进,下一篇写一下整个安装过程。

 

因水平有限,如有疏漏,还请留言反馈,谢谢~

 

参考文档:

python2.6升级到2.7

http://www.linuxidc.com/Linux/2014-07/104555.htm

 

GCC4.7升级到4.9.1

https://www.cppfans.org/1719.html

 

libstdc++ 的问题

http://blog.41ms.com/post/54.html

 

libstdc++依赖/lib64/libc.so.6: version `GLIBC_2.14'的问题:

http://rocketeer.leanote.com/post/Glibc%E9%94%99%E8%AF%AF

 

猜你喜欢

转载自myjcwy.iteye.com/blog/2322342