各种踩坑之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