glibc升級導致系統段錯誤問題解決方案
一,GLIBC介紹
glibc是GNU發布的libc庫,即c運行庫。glibc是linux系統中最底層的api,幾乎其它任何運行庫都會依賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現。內核實現一個功能,glibc要花很久才會用上,由於glibc和內核不是一塊開發的,所以glibc需要去兼容不同版本的內核,而內核也要去兼容不同版本的 glibc,雙方都背負了太多的歷史包袱。
二,升級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
做完這一步無論輸入什麽命令(實際是已執行),系統都顯示段錯誤:
四,解決方案
如果是ssh登陸的話,這個時候一定不能退出,否則的話是無論如何也登錄不進去的,ldconfig是一個動態鏈接庫管理命令,其中有一個-l參數,文檔中是這麽描述的:
-l Manually link individual libraries(手動連接單個庫).
在其他相同配置的機器下,查看下/lib64/libc.so.6
發現libc.so.6其實是一個軟連接文件,這個時候需要你手動的使用ldconfig鏈接原來的so文件
這個時候系統就恢復如初,不會報段錯誤之類的問題。
總結: GLIBC是系統底層依賴的文件,自己不要隨隨便便編譯,如果真要升級,那就使用yum升級,不要自己編譯,因為編譯出來的版本和內核版本之間不一定能兼容在一起,這是個很麻煩的事。
glibc升級導致系統段錯誤問題解決方案