各种踩坑之CentOS6.5 升级glibc至2.17版本。
发表于:
来源:阿酷技术学习
作者:simplefastbest
默认的Centos6.5 glibc版本最高为2.12, 当我在Centos 6.5上安装chromedriver模拟浏览器请求时,报以下错误:
./chromedriver: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./chromedriver)
./chromedriver: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by ./chromedriver)
所以我就要在不升级系统的情况下,我就要主动手动升级glibc.
查看当前系统glibc版本
执行命令: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
可以看到centos6.5自带的glibc版本是2.12版本的。
另外, 执行$ ll /lib64/libc**
可以看到此时的libc.so.6是libc-2.12.so的别名。
ls -alh /lib64/libc*
-rwxr-xr-x 1 root root 1.9M 4月 10 00:59 /lib64/libc-2.12.so
lrwxrwxrwx 1 root root 18 11月 14 2013 /lib64/libcap-ng.so.0 -> libcap-ng.so.0.0.0
-rwxr-xr-x 1 root root 19K 6月 25 2011 /lib64/libcap-ng.so.0.0.0
lrwxrwxrwx 1 root root 14 11月 14 2013 /lib64/libcap.so.2 -> libcap.so.2.16
-rwxr-xr-x 1 root root 19K 12月 8 2011 /lib64/libcap.so.2.16
-rwxr-xr-x 1 root root 197K 4月 10 00:59 /lib64/libcidn-2.12.so
lrwxrwxrwx 1 root root 15 10月 8 16:07 /lib64/libcidn.so.1 -> libcidn-2.12.so
lrwxrwxrwx 1 root root 17 9月 28 2014 /lib64/libcom_err.so.2 -> libcom_err.so.2.1
-rwxr-xr-x 1 root root 17K 7月 22 2014 /lib64/libcom_err.so.2.1
-rwxr-xr-x 1 root root 43K 4月 10 00:59 /lib64/libcrypt-2.12.so
lrwxrwxrwx 1 root root 22 11月 14 2013 /lib64/libcryptsetup.so.1 -> libcryptsetup.so.1.1.0
-rwxr-xr-x 1 root root 95K 6月 22 2012 /lib64/libcryptsetup.so.1.1.0
lrwxrwxrwx 1 root root 16 10月 8 16:07 /lib64/libcrypt.so.1 -> libcrypt-2.12.so
lrwxrwxrwx 1 root root 12 10月 8 16:07 /lib64/libc.so.6 -> libc-2.12.so
glibc安装
下载
wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz
完成后解压:
tar -xzvf glibc-2.17.tar.gz
cd glibc-2.17
然后依次执行以下命令:
$ mkdir build // 在glibc-2.17目录下建立build文件夹
$ cd build // 进入build目录
$ ../configure --prefix=/opt/glibc-2.17 // 配置glibc并设置当前glibc-2.17安装目录
$ make & make install // 编译安装glibc-2.17库
glibc软链
安装完成后, 建立软链指向glibc-2.17, 执行如下命令:
rm -rf /lib64/libc.so.6 // 先删除先前的libc.so.6软链
ln -s /opt/glibc-2.17/lib/libc-2.17.so /lib64/libc.so.6
报错:
ln: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
那么我就按照网上说得方法:
LD_PRELOAD=/opt/glibc-2.17/lib/libc-2.17.so ln -s /opt/glibc-2.17/lib/libc-2.17.so /lib64/libc.so.6
然后又报错:
while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
这个错误原因是由于ld 与libc的版本不一致,命令中只是支持了lib库的一个位置,并没有指定使用哪一个ld.所以我就指定ld-2.17.so,方法如下
LD_LIBRARY_PATH=/opt/glibc-2.17/lib:/lib64/:/usr/lib64/ /opt/glibc-2.17/lib/ld-2.17.so /bin/ln -s /opt/glibc-2.17/lib/libc-2.17.so /lib64/libc.so.6
这个建链接成功,但是系统其它命令都没有办法使用了。
ls -alh libc*
ls: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
如果上述更新失败可使用如下命令还原:
LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6 // libc-2.12.so 此项是系统升级前的版本
也可以这样还原
LD_LIBRARY_PATH=/opt/glibc-2.17/lib:/lib64/:/usr/lib64/ /opt/glibc-2.17/lib/ld-2.17.so /bin/ln -s /lib64/libc-2.12.so /lib64/libc.so.6
所以最后,我就采取系统中2.12和2.17共存方式。当我需要使用时,我就手动指定。如下。
LD_LIBRARY_PATH=/opt/glibc-2.17/lib:/lib64/:/usr/lib64/ /opt/glibc-2.17/lib/ld-2.17.so /root/soft/chromedriver -v
ChromeDriver 77.0.3865.40 (f484704e052e0b556f8030b65b953dce96503217-refs/branch-heads/3865@{#442})
Segmentation fault
LD_LIBRARY_PATH=/opt/glibc-2.17/lib:/lib64/:/usr/lib64/ /opt/glibc-2.17/lib/ld-2.17.so /root/soft/chromedriver -h
Usage: /root/soft/chromedriver [OPTIONS]
Options
--port=PORT port to listen on
--adb-port=PORT adb server port
--log-path=FILE write server log to file instead of stderr, increases log level to INFO
--log-level=LEVEL set log level: ALL, DEBUG, INFO, WARNING, SEVERE, OFF
--verbose log verbosely (equivalent to --log-level=ALL)
--silent log nothing (equivalent to --log-level=OFF)
--append-log append log file instead of rewriting
--replayable (experimental) log verbosely and don't truncate long strings so that the log can be replayed.
--version print the version number and exit
--url-base base URL path prefix for commands, e.g. wd/url
--whitelisted-ips comma-separated whitelist of remote IP addresses which are allowed to connect to ChromeDriver
--readable-timestamp add readable timestamps to log
--disable-dev-shm-usage do not use /dev/shm (add this switch if seeing errors related to shared memory)
Segmentation fault
参考:
https://stackoverflow.com/questions/40932215/error-while-using-a-newer-version-of-glibc
https://stackoverflow.com/questions/8657908/deploying-yesod-to-heroku-cant-build-statically/8658468#8658468