Centos6.5 升級glibc解決“libc.so.6: version GLIBC_2.14

研發發來郵件說線上有臺服務器跑程序報錯,信息如下:

/agent: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by./agent)
從上面報錯可以看出,程序運行時候,沒有找到“GLIBC_2.14”這個版本庫,而默認的Centos6.5 glibc版本最高爲2.12, 所以需要更新系統glibc庫

glibc是gnu發佈的libc庫,即c運行庫,glibc是linux系統中最底層的api,幾乎其它任何運行庫都會依賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現。

很多linux的基本命令,比如cp, rm, ll,ln等,都得依賴於它,如果操作錯誤或者升級失敗會導致系統命令不能使用,嚴重的造成系統退出後無法重新進入,所以操作時候需要慎重。

1.查看系統版本和glibc庫版本

cat /etc/redhat-release

CentOS release 6.5 (Final)

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

由上面的信息可以看出系統是CentOS 6.5,最高支持glibc的版本爲2.12,而研發程序要2.14版本,所以需要升級

2.下載軟件並升級:

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

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

tar -xvf glibc-2.14.tar.gz

tar -xvf glibc-ports-2.14.tar.gz

mv glibc-ports-2.14 glibc-2.14/ports

mkdir glibc-build-2.14

cd glibc-build-2.14/

../glibc-2.14/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

make

注意:當make成功後,會在當前glibc-build-2.14目錄下生成一個新的libc.so.6的軟連接,指向的是本目錄下的libc.so文件,如下所示:

ll glibc-build-2.14/libc.so.6

glibc-build-2.14/libc.so.6 -> libc.so

可以將上面的libc.so文件直接拷貝到/lib64下面改名爲libc-2.14.so,刪除原來的libc.so.6軟連接,建立新的連接即可使用,但是此處有一個大坑,後面會介紹,此處還是按照正常流程安裝。

繼續完成後續的安裝:

make install

以上完成不報錯的話,查看庫文件,發現/lib64/libc.so.6軟鏈接指向了2.14版本

ll /lib64/libc.so.6

/lib64/libc.so.6 -> /lib64/libc-2.14.so

3.再次查看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_2.13
GLIBC_2.14
GLIBC_PRIVATE

可以看到glibc支持的版本已經到2.14,再次執行程序就不會報錯了

其他知識點:
有些安裝方法是編譯時候指定的目錄不是/usr,而是通過建立軟鏈指向新的libc-2.14.so版本,在此過程中需要刪除原來連接,建立新的軟連接,但是此處有一個大坑,就是當你刪除libc.so.6之後會導致系統命令不可用,如下在測試機中演示的錯誤過程:

rm -rf /lib64/libc.so.6

接下來當你建立新的軟鏈接時候,會發現ln命令不能用了。

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

ln: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

當出現上面的狀況時候,可以使用以下方法解決(假設libc-2.14.so已經拷貝到/lib64/目錄下):

LD_PRELOAD=/lib64/libc-2.14.so ln -s /lib64/libc-2.14.so /lib64/libc.so.6

當然如果升級失敗,還可以使用下面命令還原至系統升級前的版本libc-2.12.so:

LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6

“LD_PRELOAD”是一個環境變量,定義在程序運行前優先加載的動態鏈接庫,本處作用就是在執行後面的ln命令時,指定使用的glibc庫,這樣命令就可以正常使用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章