1. 程式人生 > >glibc升級導致系統段錯誤問題解決方案

glibc升級導致系統段錯誤問題解決方案

報錯 封裝 enabled 分享 segment 功能 stat 版本過低 技術分享

系統:阿裏雲ECS CentOS6.5 當前GLIBC版本:2.12 準備升級GLIBC版本:2.19

一,GLIBC介紹
glibc是GNU發布的libc庫,即c運行庫。glibc是linux系統中最底層的api,幾乎其它任何運行庫都會依賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現。內核實現一個功能,glibc要花很久才會用上,由於glibc和內核不是一塊開發的,所以glibc需要去兼容不同版本的內核,而內核也要去兼容不同版本的 glibc,雙方都背負了太多的歷史包袱。

GLIBC官網: http://www.gnu.org/software/libc/

二,升級GLIBC原因
當前ECS上需要裝一個nginx,給出的版本是1.15.9,因為用的nginx是已經編譯好的,所以編譯步驟會不會報錯暫時忽略,nginx具體編譯參數如下所示:

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.1.1b 26 Feb 2019
TLS SNI support enabled
configure arguments: --prefix=/root/mysql-installer/nginx-1.15.x/deploy/nginx-1.15.9-std --user=nginx --group=nginx --with-pcre=/root/mysql-installer/nginx- 1.15.x/.Source-code-std/third-party/pcre-8.43 --with-zlib=/root/mysql-installer/nginx-1.15.x/.Source-code-std/third-party/zlib-1.2.11 --with-openssl=/root/mysql-installer/nginx-1.15.x/.Source-code-std/third-party/openssl-1.1.1b --with-openssl-opt=enable-tls1_3 --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module

在nginx的sbin目錄下,驗證時,發現:
技術分享圖片
當時以為是GLIBC庫版本過低,於是自己就下載了GLIBC2.19版本的開始編譯,編譯過程不再贅述。

三,問題出現的原因
1,編譯完成後,需要在系統中指定庫文件的路徑,於是就在/etc/ld.so.conf.d/glibc.conf(自己手動創建得文件),寫入庫文件路徑:
/opt/glibc-2.19/lib
2,使用ldconfig -v 將庫文件生效加載一遍
2,將庫文件中的/opt/glibc-2.19/lib/libc.so.6做軟連接到系統識別的路徑下:
ln -sv /opt/glibc-2.19/lib/libc.so.6 /lib64/libc.so.6
做完這一步無論輸入什麽命令(實際是已執行),系統都顯示段錯誤:

segmentation fault

四,解決方案
如果是ssh登陸的話,這個時候一定不能退出,否則的話是無論如何也登錄不進去的,ldconfig是一個動態鏈接庫管理命令,其中有一個-l參數,文檔中是這麽描述的:
-l Manually link individual libraries(手動連接單個庫).
在其他相同配置的機器下,查看下/lib64/libc.so.6
技術分享圖片
發現libc.so.6其實是一個軟連接文件,這個時候需要你手動的使用ldconfig鏈接原來的so文件
技術分享圖片
這個時候系統就恢復如初,不會報段錯誤之類的問題。

總結: GLIBC是系統底層依賴的文件,自己不要隨隨便便編譯,如果真要升級,那就使用yum升級,不要自己編譯,因為編譯出來的版本和內核版本之間不一定能兼容在一起,這是個很麻煩的事。

glibc升級導致系統段錯誤問題解決方案