zoukankan      html  css  js  c++  java
  • 升级glic: 解决"libc.so.6: version 'GLIBC_2.14' not found"问题

    线上一台服务器在执行leveldb程序的时候,报错:"libc.so.6: version `GLIBC_2.14' not found"。 排查原因及解决方法如下:

    1)产生原因
    是由于Linux系统的glibc版本太低,而软件编译时使用了较高版本的glibc引起的!

    查看系统glibc支持的版本
    [root@localhost ~]# strings /lib64/libc.so.6 |grep GLIBC_  
    GLIBC_2.2.5
    GLIBC_2.2.6
    GLIBC_2.3
    GLIBC_2.3.2
    GLIBC_2.3.3
    GLIBC_2.3.4
    GLIBC_2.4
    GLIBC_2.5
    GLIBC_2.6
    GLIBC_2.7
    GLIBC_2.8
    GLIBC_2.9
    GLIBC_2.10
    GLIBC_2.11
    GLIBC_2.12
    GLIBC_PRIVATE
    
    [root@localhost ~]# rpm -qa |grep glibc
    glibc-common-2.12-1.209.el6_9.2.x86_64
    glibc-2.12-1.209.el6_9.2.x86_64
    glibc-headers-2.12-1.209.el6_9.2.x86_64
    glibc-devel-2.12-1.209.el6_9.2.x86_64
    
    可以看到最高只支持2.12版本。现在需要将glibc支持的版本升级到GLIBC_2.14
    

    2)升级glibc支持的版本到GLIBC_2.14
    http://www.gnu.org/software/libc/下载最新版本,这里下载了glibc-2.14.tar.xz 这个版本,解压到/usr/local/src目录下
    百度云盘下载地址:https://pan.baidu.com/s/1YGia4YD45s42xMq9VapJow
    提取密码:nejp

    [root@uatblockchain01 ~]# cd /usr/local/src/
    [root@uatblockchain01 src]# ll
    total 9888
    -rw-r--r-- 1 root root 10122492 Apr  8 03:21 glibc-2.14.tar.xz
    [root@uatblockchain01 src]# tar -vxf glibc-2.14.tar.xz
            
    创建/var/VMdisks,将解压后的glibc-2.14移到/var/VMdisks目录下
    [root@uatblockchain01 src]# mkdir -p /var/VMdisks
    [root@uatblockchain01 src]# mv glibc-2.14 /var/VMdisks/
            
    在glibc源码目录建立构建目录,并cd进入构建目录
    [root@uatblockchain01 src]# cd /var/VMdisks/glibc-2.14/
    [root@uatblockchain01 glibc-2.14]# mkdir build && cd build/
    [root@uatblockchain01 build]# ../configure --prefix=/usr/local/glibc-2.14
    [root@uatblockchain01 build]# make -j4
    [root@uatblockchain01 build]# make install
            
    临时修改环境变量
    [root@uatblockchain01 build]# echo $LD_LIBRARY_PATH
    
    [root@uatblockchain01 build]# 
    [root@uatblockchain01 build]# export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH
    [root@uatblockchain01 build]# echo $LD_LIBRARY_PATH
    /usr/local/glibc-2.14/lib:
    
    可以发现,上面设置export LD_LIBRARY_PATH环境变量之后,查看$LD_LIBRARY_PATH的值后面有个冒号":"!
    这是因为在设置export LD_LIBRARY_PATH之前,$LD_LIBRARY_PATH默认值就是空的。
    
    最好如下设置
    [root@uatblockchain01 build]# export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib
    [root@uatblockchain01 build]# echo $LD_LIBRARY_PATH
    /usr/local/glibc-2.14/lib
        
    ================================================================================================
    需要注意:
    这里环境变量要如上一样临时修改,决不能写在/etc/profile文件里,并source使之生效!
    否则会导致某些shell命令执行不了。比如:
        
    [root@uatblockchain01 build]# vim /etc/profile
    .......
    export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib:$LD_LIBRARY_PATH
    [root@uatblockchain01 build]# source /etc/profile
         
    这样,将会出现一些命令卡住的现象。
    [root@uatblockchain01 build]# java -version      //一直卡着不动
         
    [root@uatblockchain01 build]# su - app           //一直卡着不动
         
    解决办法:
    将上面那条配置从/etc/profile文件里删除,然后source使之生效!重新登录机器即可解决!
    ================================================================================================
    需要注意:
    如果是在普通用户下,就修改普通用户下的环境变量。比如这里我是在app账号下启动的leveldb程序,那么:
    [app@uatblockchain01 ~]$ echo $LD_LIBRARY_PATH
    
    [app@uatblockchain01 ~]$ 
    [app@uatblockchain01 ~]$ export LD_LIBRARY_PATH=/usr/local/glibc-2.14/lib
    [app@uatblockchain01 ~]$ echo $LD_LIBRARY_PATH
    /usr/local/glibc-2.14/lib
    ================================================================================================
        
    修改/lib64/libc.so.6的软链接来源,由之前的libc-2.12.so修改为libc-2.14.so
    [root@uatblockchain01 build]# cd /lib64
    [root@uatblockchain01 lib64]# ll libc.so.6
    lrwxrwxrwx 1 root root 12 Apr  8 03:50 libc.so.6 -> libc-2.12.so
            
    [root@uatblockchain01 lib64]# ll /usr/local/glibc-2.14/lib/libc-2.14.so
    -rwxr-xr-x 1 root root 9645192 Apr  8 03:28 /usr/local/glibc-2.14/lib/libc-2.14.so
    [root@uatblockchain01 lib64]# cp /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/
            
    删除libc-2.12.so之前的软链接
    [root@uatblockchain01 lib64]# unlink /lib64/libc.so.6
    或者直接执行
    [root@uatblockchain01 lib64]# rm -f /lib64/libc.so.6
        
    ================================================================================================
    需要注意:
    如上面操作,在取消之前libc.so.6的软链接或者删除/lib64/libc.so.6之后,可能导致系统的好多命令都无法使用!
    这时候要特别注意:千万不要关闭当前的终端窗口!!!因为此时机器可能无法登陆了,只能在当前终端窗口下进行紧急修复:
        
    可能出现下面两个报错!
    <<< 报错1 >>>
    error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
        
    解决办法:
    [root@uatblockchain01 lib64]# ldconfig
          
    原因可能是:前面设置"export LD_LIBRARY_PATH"的环境变量有误导致的。
    linux调用so的库文件时,搜素路径为当前路径,接着再是系统lib目录。可能是由于前面提供了一个LD_PRELOAD系统变量来改变这个顺序。
    设置LD_PRELOAD了后,库加载的顺序就改变了。搜素路径为:LD_PRELOAD ,当前路径,接着再是系统lib目录。
        
    <<< 报错2 >>>
    error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
        
    上面报错,既然命令无法寻址到软连接,那么直接命令行给它!即将原来的/lib64/libc.so.6库再软链接连接回去!!
    可以采用下面两种挽救方法:
        
    挽救方法1:
    [root@uatblockchain01 lib64]# unset LD_LIBRARY_PATH
    [root@uatblockchain01 lib64]# LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6
    [root@uatblockchain01 lib64]# ldconfig
        
    挽救方法2:
    [root@uatblockchain01 lib64]# unset LD_LIBRARY_PATH
    [root@uatblockchain01 lib64]# ldconfig -l -v /lib64/libc-2.12.so
    [root@uatblockchain01 lib64]# ldconfig
        
    需要注意:
    1. libc库必须是原来使用的而不是你更新过的lib库!
    2. LD_PRELOAD允许你定义在程序运行前优先加载的动态链接库,因此在使用ln前就加载了lib库,而不是等到使用ln时加载,这样就能临时使用命令了。
    3. 不仅仅是ln,只要加了LD_PRELOAD=/lib64/libc-2.12.so,后面可以跟一切"因为libc.so.6软链接被取消或被删除"而不能用的命令。
    ================================================================================================
        
    然后做/lib64/libc.so.6新的软链接,软链接到libc-2.14.so
    [root@uatblockchain01 lib64]# ln -s libc-2.14.so /lib64/libc.so.6  
    [root@uatblockchain01 lib64]# ll libc.so.6
    lrwxrwxrwx 1 root root 12 Apr  8 03:50 libc.so.6 -> libc-2.14.so
            
    最后再查看系统glibc支持的版本:
    [root@uatblockchain01 lib64]# strings /lib64/libc.so.6 |grep GLIBC_
    GLIBC_2.2.5
    GLIBC_2.2.6
    GLIBC_2.3
    GLIBC_2.3.2
    GLIBC_2.3.3
    GLIBC_2.3.4
    GLIBC_2.4
    GLIBC_2.5
    GLIBC_2.6
    GLIBC_2.7
    GLIBC_2.8
    GLIBC_2.9
    GLIBC_2.10
    GLIBC_2.11
    GLIBC_2.12
    GLIBC_2.13
    GLIBC_2.14
    GLIBC_PRIVATE
            
    发现glibc最高可以支持到2.14版本了,然后再执行leveldb程序,就会发现不会有那个报错了!问题得到解决!
      
    另外需要谨记:libc库是很多命令操作得依赖库,libc.so.6至关重要,绝对不能删,不能改名!!

    更简单升级方法:不改变环境变量,可以直接将glibc新版本编译安装到系统默认路径/usr下面

    如下升级glibc版本到2.17做法
    # wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz
    # tar -xvf glibc-2.17.tar.gz
    # cd glibc-2.17
    # mkdir build; cd build
    # ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
    # make -j 8
    # make install
    
    查看版本,发现已升级到2.17版本
    # ldd --version
    # strings /lib64/libc.so.6 |grep GLIBC_
    
    ===============================================================
    如下升级glibc版本到2.18做法
    # wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
    # tar -xvf glibc-2.18.tar.gz 
    # cd glibc-2.18
    # mkdir build && cd build && ../configure --prefix=/usr && make -j4 && make install
  • 相关阅读:
    24 Scrapy爬虫的基本使用
    22 Scrapy框架简介
    21 Scrapy框架的安装
    19 正则表达式的基本知识
    18 “中国大学排名定向爬虫”实例介绍
    17 基于bs4库的HTML内容查找方法
    16 信息标记形式及信息提取的一般方法
    python中with as语句的用法
    Firefox安装Charles配置https后无法上网解决方案(转载)
    Windows下(Win10)Charles从下载安装到证书设置和浏览器抓包测试,亲测有效!(转载)
  • 原文地址:https://www.cnblogs.com/kevingrace/p/8744417.html
Copyright © 2011-2022 走看看