libc.so.6被刪后導致系統無法使用的原因及解決方法


記一次升級glibc庫發生的錯誤

今天給glibc庫升級,發生了一件讓我嚇出一聲汗的事情,我把動態庫中的libc.so.6給刪了,瞬間所有的非系統命令都無法使用,使用就報錯


當時就嚇尿了,生產環境被我玩壞了,怎么破。后來查原因才知道很多命令都依賴glibc,我把它的軟鏈接刪了系統找不到此庫,那肯定玩完。
整個事情完整的經過是這樣的:同事需要升級glibc庫,於是此任務落到了我手中,當時沒有想到那么多,以為和一般的軟件一樣隨手一升就行了,后來發現有點復雜的,下了個2.9的版本(忽略下圖的2.6,后來改成2.9了,2.6也一樣,所有的glibc都會有這個問題),按照configure、make、make install三部曲來,結果第一步就失敗了

后來才知道需要在glibc的同級目錄下創建一個glibc-build目錄,在glibc-build目錄中執行configure,具體步驟參見
http://blog.csdn.net/officercat/article/details/39520227
其實按照這個鏈接操作理論上是不會發生我這樣坑爹的事情的,但是我作死了,在--prefix的時候沒有使用/usr,而是安裝在了自定義的目錄中,當時想的是怕裝在usr中會破壞現有環境(事實上glibc都要升級了還留着老版本干嘛?)
於是在我安裝到自定義目錄后,我開始將安裝到自定義目錄中的glibc動態庫一個個拷貝到/lib64中(有的系統是/lib),就在這里我將libc.so.6刪除了,准備重做一個軟鏈接到新的glibc庫中,刪除之后就出現了文中開頭的那一幕。我在貼個圖就能明白為什么會發生這種情況了

不僅僅是iconv,基本上非系統命令都有這一條 libc.so.6 => /lib64/libc.so.6 ,因此libc.so.6至關重要,絕對不能刪,不能改名,能不能覆蓋就不知道了,想作死的可以試試
好了,死做完了,說說怎么解決問題吧。
既然命令無法尋址到軟連接,那么直接命令行給他就是了,網上看到了兩種方法
1、ldconfig -l -v /lib64/libc-2.5.so
這里寫的libc庫必須是原來使用的而不是你更新過的
2、LD_PRELOAD=/lib64/libc-2.5.so ln -s /lib64/libc-2.5.so /lib64/libc.so.6
LD_PRELOAD允許你定義在程序運行前優先加載的動態鏈接庫,因此在使用ln前就加載了lib庫,而不是等到使用ln時加載,這樣就能臨時使用命令了
不僅僅是ln,只要加了LD_PRELOAD=/lib64/libc-2.5.so,后面可以跟一切因為libc.so.6被刪不能用的命令
我使用的是第二種方法
然后命令又能用了,然后我就老老實實的按照之前給出的連接安裝到/usr,可以看到現在libc.so.6是軟連接到libc-2.9.so的,最開始是連接到libc-2.5.so的。

使用strings命令查看,可以看到已經有2.9了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM