天天看點

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

故事事故是這樣的

新開發的jar包部署在老伺服器上,版本是Red Hat Enterprise Linux AS release 4 (Nahant Update 5),提示需要高版本jdk,高版本jdk提示glibc版本太低得更新,是的,就像套娃。

使用編譯源碼的方式将glibc由2.3更新到2.9,更新完ls指令不好使了。 用LD_PRELOAD方法解決了ls指令不好使的問題後還挺有成就感的呢!

輕度強迫症的我當然要重新開機,然後

#reboot           

就沒有然後了。。

作業系統起不來了。各種嘗試,最好的結果是卡死在

Starting cups-config-daemon:
Starting HAL daemon:           

再也不往下走了。007的伺服器被996的程式員幹進了ICU。

看到了吧,搞垮伺服器可以顯得很無辜。删庫顯得太刻意了,會被人指責性格有問題。

搶救思路

像《信條》一樣進行一次逆過程,把glibc相關的靜态庫、動态庫都用原來的低版本覆寫回來。cp覆寫和安裝rpm覆寫一起上。

必要條件

  • 能進機房,直接操作伺服器,因為ssh此時已經連不上了。
  • 有相同版本的Linux系統CD光牒,Linux搶救模式需要CD光牒引導。
  • 有相同版本的Linux系統的iso鏡像檔案,用來擷取rpm 【或者替代方法】
  • 有相同版本的Linux系統的伺服器或者虛拟機,用來下載下傳.a檔案 【或者替代方法】

    準備工作

    rpm安裝包

    将iso檔案解壓,在
    RHEL4.6-i386-AS-DVD\RedHat\RPMS           

    目錄下就包括所有需要的rpm包。

    需要準備的安裝包是下面這些:

    如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

    .a靜态庫檔案

    到好用的版本一緻的伺服器對應目錄下載下傳下面的庫檔案

    目錄/lib

    如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花
    目錄/usr/lib
    如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

将這些安裝包和靜态庫放入一個U盤中,U盤插到伺服器上。

搶救過程

進入CD光牒系統

将CD光牒放入光驅。

開機快速按F2,進入

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

通過+-号調整開機啟動順序,将CD-ROM調整到最上面

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

按回車,系統重新啟動,進入CD光牒引導界面

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

按F5,進入

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

輸入 linux rescue

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

按回車,稍等一會,進入

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

按回車,進入

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花
如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花
如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

将光标移動到No,按回車,進入

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花
如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

提示原有系統已經挂載到/mnt/sysimage,按回車進入,目前所處的就是CD光牒搶救模式(rescue mode),環境是CD光牒系統,原系統所有檔案都在CD光牒系統的子目錄/mnt/sysimage裡。

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

可以看到原有系統的所有目錄結構在/mnt/sysimage下都是可以看見的。

挂載U盤

首先将U盤挂載到CD光牒系統,

mount -t vfat /dev/sdb1 /mnt/usb/           

不同環境中U盤的辨別符不一定是sdb1,在實體機上可能是sda1, 可以通過

fdisk –l 指令看各個目錄容量大小來判定哪個是U盤。

如果挂載U盤提示格式錯誤,U盤可能是fat16格式,執行

mount -t msdos /dev/sdb1 /mnt/usb/ 試試

此時,U盤裡的檔案都在/mnt/usb/目錄下, 原系統所有檔案都在/mnt/sysimage下。将usb目錄下的檔案拷貝到/mnt/sysimage下面你能記住的任意目錄,本文拷貝到/mnt/sysimage/home下。

cp /mnt/usb/* /mnt/sysimage/home           

切換到原系統

執行

#chroot  /mnt/sysimage           

這個指令使你由目前CD光牒系統切換到原系統(就是我們要搶救的那個系統),執行pwd和ls可以看到,你所處的目錄就是原系統的根目錄,賬号是原系統的root賬号。

如何優雅的搞垮伺服器,再優雅的救活故事事故是這樣的搶救思路必要條件準備工作搶救過程完結撒花

一句話,原系統直接進進不去,但是從CD光牒系統跳,是能跳進去的。

安裝rpm

進入/home,

rpm -ivh --force rpm包名           

一個一個安裝U盤的rpm包。裝失敗的就等把成功的都裝完了回頭重試,和答卷子題不會一個玩法,都是依賴關系導緻失敗的。

rpm最好自己重新命名,改成簡短的名字(glibccomm.rpm這種),一定要去掉“-”。我當時看見顯示器上顯示的名字包括亂碼和問号,靠猜來判斷是哪個包,後悔之前沒重命名。

替換靜态庫檔案

然後手動cp指令替換/lib 和 /usr/lib的靜态庫(*.a檔案)。

cp /home/libpthread.a  /lib
cp /home/*.a  /usr/lib           

修改動态庫軟連接配接

手動修改動态庫的軟連接配接

無論安裝rpm包時是否自動修改過軟連接配接,都最好手動修改一遍。

到/lib目錄裡,先

rm  *2.9*  #删除高版本的庫           
ln -sf libutil-2.3.4.solibutil.so.1  
ln -sf libresolv-2.3.4.solibresolv.so.2  
ln -sf libnss_nis-2.3.4.solibnss_nis.so.2  
ln -sf libnss_nisplus-2.3.4.solibnss_nisplus.so.2  
ln -sf libnss_hesiod-2.3.4.solibnss_hesiod.so.2  
ln -sf libnss_files-2.3.4.so  libnss_files.so.2  
ln -sf libnss_dns-2.3.4.so  libnss_dns.so.2  
ln -sf libnss_compat-2.3.4.solibnss_compat.so.2  
ln -sf libnsl-2.3.4.solibnsl.so.1  
ln -sf libdl-2.3.4.solibdl.so.2  
ln -sf libcrypt-2.3.4.solibcrypt.so.1  
ln -sf libBrokenLocale-2.3.4.solibBrokenLocale.so.1  
ln -sf libanl-2.3.4.solibanl.so.1  
ln -sf libc-2.3.4.solibc.so.6  
ln -sf librt-2.3.4.solibrt.so.1  
ln -sf libpthread-0.10.so libpthread.so.0  
ln -sf libm-2.3.4.solibm.so.6             

跳回CD光牒系統

完結撒花

繼續閱讀