一、我是怎樣一步一步毀掉系統的
最近在centos 7上進行開發。由於需要使用高版本linux內核的特性,需要將linux內核升級。按照教程:centos 7升級內核 進行升級的時候發現在安裝elrepo的yum源時遇到問題說elrepo-release-7.0-2.el7.elrepo.noarch.rpm 需要glibc-2.17。
使用ldd --version
發現系統的glibc版本為 glibc-2.22,當時沒有想到更好的方法,就嘗試將系統的glibc版本修改為glibc-2.17.
於是按照stackoverflow上的教程
You cannot update glibc on Centos 6 safely. However you can install 2.14 alongside 2.12 easily, then use it to compile projects etc. Here is how: mkdir ~/glibc_install; cd ~/glibc_install wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz tar zxvf glibc-2.14.tar.gz cd glibc-2.14 mkdir build cd build ../configure --prefix=/opt/glibc-2.14 make -j4 sudo make install export LD_LIBRARY_PATH=/opt/glibc-2.14/lib
進行編譯安裝 glibc-2.17.
當make install 完成之后,看教程上說需要將 /lib64/libc.so.6 軟鏈接更新為 /usr/local/glibc-1.7/lib/libc-2.17.so,於是我准備刪除 /lib64/libc.so.6,然后新建一個指向/usr/local/glibc-1.7/lib/libc-2.17.so.然后我就刪除了 /lib64/libc.so.6,然后,就沒有然后了。。。
libc.so.6 是c運行時庫 glibc的軟鏈接,而系統幾乎所有程序都依賴c運行時庫。程序啟動和運行時,是根據libc.so.6 軟鏈接找到glibc庫。刪除libc.so.6將導致系統的幾乎所有程序不能工作。
每個glibc.so文件有它支持的libc版本,可以通過# strings /lib64/libc.so.6 |grep GLIBC_ 查看。如果程序編譯的時候鏈接的libc庫版本不在程序運行環境下的glibc庫支持的libc版本之內,也會報錯.
於是,系統的所有命令 ls,cp,cd 等等都無法使用了。
二、修復系統
趕緊百度了下該怎么處理,發現說使用系統光盤或者U盤進入修復模式,在修復模式下新建 libc.so.6 軟鏈接。於是我就按照教程centos7 營救模式 和 lic.so.6 缺失問題的做法修復。大體步驟是:
1.搞到系統光盤或者U盤 2.開機設置bios由光盤或U盤啟動 3.選擇 troubleshooting,rescue a centos system 4.進入終端,系統提示說 原系統的目錄被mount到/mnt/sysimage下,於是進入/mnt/sysimage,此時就可以使用ln -s命令創建軟鏈接了。 5.重啟,搞定
更簡單的做法
這種做法要求在刪除libc.so.6之后沒有關閉shell或者ssh連接的情況下緊急處理。按照教程libc.so.6: cannot open shared object file報錯處理所說,執行
先刪除連接 : # cd /lib64 建立新連接 : # LD_PRELOAD=/usr/local/glibc-2.17/libc-2.17.so ln -s /usr/local/glibc-2.17/libc-2.17.so /lib64/libc.so.6 #注意 LD_PRELOAD和后面的ln -s在同一行
LD_PRELOAD的解決原理是,linux調用so庫文件時,先搜索當前路徑,然后是系統庫目錄,提供LD_PRELOAD系統變量可以改變這個順序,改變后的搜索順序為 LD_PRELOAD, 當前路徑, 系統庫目錄
。
於是,使用LD_PRELOAD指向正常的glibc庫文件,然后執行ln等命令,就可以正常執行,執行成功之后, libc.so.6 就又存在了。