Linux服務器升級GLIBC失敗導致shell命令不可用的情況怎么處理
在某些linux系統(tǒng)里面本身自帶的glibc版本過低,導致rpm無法安裝。如果你直接更新系統(tǒng)的glibc版本會導致系統(tǒng)崩潰,就算你編譯安裝好glibc庫到非系統(tǒng)目錄,但是你不能去設置環(huán)境變量 和ld.so.conf 這個2個文件,你一但設置指向新版本的glibc庫,系統(tǒng)分分鐘崩潰。更不能把這個新庫直接安裝到系統(tǒng)目錄下。筆者最近不幸遇到了這個問題。
glibc介紹
glibc是什么?為什么升級風險這么高?glibc的作用是什么?
glibc是GNU發(fā)布的libc庫,即c運行庫。glibc是linux系統(tǒng)中最底層的api,幾乎其它任何運行庫都會依賴于glibc。glibc除了封裝linux操作系統(tǒng)所提供的系統(tǒng)服務外,它本身也提供了許多其它一些必要功能服務的實現(xiàn)。內核實現(xiàn)一個功能,glibc要花很久才會用上,由于glibc和內核不是一塊開發(fā)的,所以glibc需要去兼容不同版本的內核,而內核也要去兼容不同版本的 glibc,雙方都背負了太多的歷史包袱。
簡單理解其實和http api接口類似,區(qū)別在于glibc是調用內核對底層磁盤,內存,網(wǎng)卡等的操作,http api則是對應用層app的操作,比如聽一首歌,下載一部電影實則都是在調用http api接口。
問題發(fā)生
試圖通過編譯安裝升級Linux服務器的glibc庫版本,install失敗以后,shell中的大部分命令(ls,cat,rm,cp,ln,scp,vi,yum等)都執(zhí)行報錯,嘗試新的ssh連接時提示拒絕連接。
命令報錯類似:
# ls ls: relocation error: /usr/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
或者
bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
可補救·操作空間
有ssh客戶端連接著這臺服務器沒有斷開原始的低版本glibc庫文件還在cd,pwd,export,echo,sln,chmod命令可用,輸入ls+兩次TAB鍵可以提示目錄下所有文件
開始嘗試修復
步驟1
glibc是Linux系統(tǒng)底層庫,許多shell命令乃至bash本身都依賴這套動態(tài)鏈接庫。
以上問題出在/lib64(/usr/lib64)
目錄下的軟連接損壞,或連接的so庫文件版本不統(tǒng)一,或所連接的so庫文件本身存在問題。
解決思路就是把以下軟連接全部恢復為指向原始版本(低版本)。
前提是先到/lib64
目錄下,用ls+兩次TAB鍵的方法確認好自己系統(tǒng)下的libc-<x.xx>.so
最低版本號(也就是好用的版本)是哪個。
lrwxrwxrwx. 1 root root 10 Jul 4 16:55 ld-linux-x86-64.so.2 -> ld-2.17.so lrwxrwxrwx. 1 root root 14 Jul 4 16:55 libanl.so.1 -> libanl-2.17.so lrwxrwxrwx. 1 root root 23 Jul 4 16:55 libBrokenLocale.so.1 -> libBrokenLocale-2.17.so lrwxrwxrwx. 1 root root 15 Jul 4 16:55 libcidn.so.1 -> libcidn-2.17.so lrwxrwxrwx. 1 root root 16 Jul 4 16:55 libcrypt.so.1 -> libcrypt-2.17.so lrwxrwxrwx. 1 root root 12 Jul 4 16:55 libc.so.6 -> libc-2.17.so lrwxrwxrwx. 1 root root 13 Jul 4 16:55 libdl.so.2 -> libdl-2.17.so lrwxrwxrwx. 1 root root 12 Jul 4 16:55 libm.so.6 -> libm-2.17.so lrwxrwxrwx. 1 root root 14 Jul 4 16:55 libnsl.so.1 -> libnsl-2.17.so lrwxrwxrwx. 1 root root 21 Jul 4 16:55 libnss_compat.so.2 -> libnss_compat-2.17.so lrwxrwxrwx. 1 root root 17 Jul 4 16:55 libnss_db.so.2 -> libnss_db-2.17.so lrwxrwxrwx. 1 root root 18 Jul 4 16:55 libnss_dns.so.2 -> libnss_dns-2.17.so lrwxrwxrwx. 1 root root 20 Jul 4 16:55 libnss_files.so.2 -> libnss_files-2.17.so lrwxrwxrwx. 1 root root 21 Jul 4 16:55 libnss_hesiod.so.2 -> libnss_hesiod-2.17.so lrwxrwxrwx. 1 root root 22 Jul 4 16:55 libnss_nisplus.so.2 -> libnss_nisplus-2.17.so lrwxrwxrwx. 1 root root 18 Jul 4 16:55 libnss_nis.so.2 -> libnss_nis-2.17.so lrwxrwxrwx. 1 root root 18 Jul 4 16:55 libpthread.so.0 -> libpthread-2.17.so lrwxrwxrwx. 1 root root 17 Jul 4 16:55 libresolv.so.2 -> libresolv-2.17.so lrwxrwxrwx. 1 root root 13 Jul 4 16:55 librt.so.1 -> librt-2.17.so lrwxrwxrwx. 1 root root 15 Jul 4 16:55 libutil.so.1 -> libutil-2.17.so
步驟2
由于ln命令已經(jīng)不能使用,可使用sln命令,創(chuàng)建/修復軟連接。命令格式:sln <被指向的文件> <軟連接名>
。假設需要回退到版本號XXX,那么只需以下命令就可以修復。
cd /lib64 sln ld-XXX.so ld-linux-x86-64.so.2 sln libanl-XXX.so libanl.so.1 sln libBrokenLocale-XXX.so libBrokenLocale.so.1 sln libcidn-XXX.so libcidn.so.1 sln libcrypt-XXX.so libcrypt.so.1 sln libc-XXX.so libc.so.6 sln libdl-XXX.so libdl.so.2 sln libm-XXX.so libm.so.6 sln libnsl-XXX.so libnsl.so.1 sln libnss_compat-XXX.so libnss_compat.so.2 sln libnss_db-XXX.so libnss_db.so.2 sln libnss_dns-XXX.so libnss_dns.so.2 sln libnss_files-XXX.so libnss_files.so.2 sln libnss_hesiod-XXX.so libnss_hesiod.so.2 sln libnss_nisplus-XXX.so libnss_nisplus.so.2 sln libnss_nis-XXX.so libnss_nis.so.2 sln libpthread-XXX.so libpthread.so.0 sln libresolv-XXX.so libresolv.so.2 sln librt-XXX.so librt.so.1 sln libutil-XXX.so libutil.so.1
至此,如果沒有操作錯誤,ls等關鍵命令、包括ssh連接都應該已經(jīng)可以正常使用,修復完成。
但是,由于筆者操作過程中的失誤(“sln xxx yyy"寫成了"sln yyy xxx”),導致ld-2.17.so原始庫文件被覆蓋成軟連接文件,所以需要進一步的補救。
誤操作后的二次補救
解決思路就是恢復不小心損壞的ld-2.17.so文件,那么就需要一份可用的ld-2.17.so文件數(shù)據(jù)。由于筆者使用的是服務器集群,原始文件從其他節(jié)點就可以獲取。如果是單機服務器,可能需要借助互聯(lián)網(wǎng)獲取ld-2.17.so原始文件。
目前最大的阻礙是:scp,mount,wget等命令都不能使用,需要考慮如何將獲取到的原始文件放到問題服務器的磁盤上——解決方法是echo命令+重定向輸出文件,具體展開如下:
以文本編輯器(例如使用Windows上的EmEditor)的二進制模式打開原始文件,全選復制出文件的原始字節(jié)內容,如下:
7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00 03 00 3E 00 01 00 00 00 20 11 00 00 00 00 00 00 40 00 00 00 00 00 00 00 48 77 02 00 00 00 00 00 00 00 00 00 40 00 38 00 07 00 40 00 1C 00 1B 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0 18 02 00 00 00 00 00 A0 18 02 00 00 00 00 00 00 00 20 00 00 00 00 00 01 00 00 00 06 00 00 00 40 1B 02 00 00 00 00 00 40 1B 22 00 00 00 00 00 40 1B 22 00 00 00 00 00 38 14 00 00 00 00 00 00 10 16 00 00 00 00 00 00 00 00 20 00 00 00 00 00 02 00 00 00 06 00 00 00 00 1E 02 00 00 00 00 00 ......(共5107行,略)......
繼續(xù)編輯文本,替換復制內容中的" “(1個空格)和” “(2個空格)替換為”\x",并且在每行首也插入"\x",如下:
\x7F\x45\x4C\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x3E\x00\x01\x00\x00\x00\x20\x11\x00\x00\x00\x00\x00\x00 \x40\x00\x00\x00\x00\x00\x00\x00\x48\x77\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x38\x00\x07\x00\x40\x00\x1C\x00\x1B\x00 \x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \xA0\x18\x02\x00\x00\x00\x00\x00\xA0\x18\x02\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00 \x40\x1B\x02\x00\x00\x00\x00\x00\x40\x1B\x22\x00\x00\x00\x00\x00\x40\x1B\x22\x00\x00\x00\x00\x00\x38\x14\x00\x00\x00\x00\x00\x00 \x10\x16\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x00\x1E\x02\x00\x00\x00\x00\x00 ......(共5107行,略)......
合并所有行為一行,并去掉所有空格,如下:
\x7F\x45\x4C\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x3E\x00\x01\x00\x00\x00\x20\x11\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x48\x77\x02......(略)......
將編輯后的十六進制數(shù)據(jù)與echo命令參數(shù)一起,組成echo -e "編輯后的16進制數(shù)據(jù)" > ~/savetheworld.bin
的形式,粘貼到連接著問題服務器的ssh終端,執(zhí)行。經(jīng)過漫長的等待之后(以小時記,因為回顯很慢。可靈活利用shell客戶端中類似CommandWindow的功能,在輸入框中輸入命令來節(jié)省時間),生成的~/savetheworld.bin
文件就作為損壞的ld-2.17.so文件的替代,重新用上文sln修復軟連接的方法,最終修復成功。
總結
你只能用第三方工具把glibc引入你的項目,第一是讓rpm安裝包自帶這個庫 ,第二種是 使用yum或者其他第三方工具庫進行安裝 ,第三種就是換更新的系統(tǒng) ,新出的系統(tǒng)里面自帶高版本glibc。我建議直接換系統(tǒng) 如果對系統(tǒng)版本沒有強制要求的情況。
到此這篇關于Linux服務器升級GLIBC失敗導致shell命令不可用的情況怎么處理的文章就介紹到這了,更多相關Linux升級GLIBC失敗導致命令不可用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Ubuntu16.04.4LTS安裝mininet遇到的問題及解決方案
今天小編就為大家分享一篇關于Ubuntu16.04.4LTS安裝mininet遇到的問題及解決方案,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10windows安裝apache系統(tǒng)中無apache2服務解決方案
一直都是用WIN開發(fā)PHP,今天有用戶反映SHUGUANG CMS在APACHE+PHP中不能正常運行,只好自己機器配置個環(huán)境測試,遇到點小問題,搜索相關資料,終于解決2011-09-09