如何優雅的搞垮伺服器,再優雅的救活

故事事故是這樣的

如何優雅的搞垮伺服器,再優雅的救活

新開發的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系統光碟,Linux搶救模式需要光碟引導。

有相同版本的Linux系統的iso映象檔案,用來獲取rpm 【或者替代方法】

有相同版本的Linux系統的伺服器或者虛擬機器,用來下載。a檔案 【或者替代方法】

準備工作rpm安裝包

將iso檔案解壓,在

RHEL4。6-i386-AS-DVD\RedHat\RPMS

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

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

。a靜態庫檔案

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

目錄/lib

目錄/usr/lib

將這些安裝包和靜態庫放入一個隨身碟中,隨身碟插到伺服器上。

搶救過程進入光碟系統

將光碟放入光碟機。

開機快速按F2,進入

透過+-號調整開機啟動順序,將CD-ROM調整到最上面

按回車,系統重新啟動,進入光碟引導介面

按F5,進入

輸入 linux rescue

按回車,稍等一會,進入

按回車,進入

按回車,進入

按回車,進入

將游標移動到No,按回車,進入

按回車,進入

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

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

掛載隨身碟

首先將隨身碟掛載到光碟系統,

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

不同環境中隨身碟的識別符號不一定是sdb1,在物理機上可能是sda1, 可以透過

fdisk –l 命令看各個目錄容量大小來判定哪個是隨身碟。

如果掛載隨身碟提示格式錯誤,隨身碟可能是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安裝rpm

進入/home,

rpm -ivh ——force rpm包名

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

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

替換靜態庫檔案

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

cp /home/libpthread。a /libcp /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跳回光碟系統

執行exit跳回到光碟系統,

在上圖游標處再一次輸入exit,按回車 ,系統會重新啟動。

立刻修改BIOS,設定系統從硬碟啟動,原系統可以正常啟動了。

完結撒花

搶救成功還挺有成就感的呢!其它操作搞垮伺服器,也可以試試,只要那個操作能逆向來一遍,問題都不大。

為什麼不重灌?上面部署的東西是多年前放的,物是人非,沒辦法重頭再來。

為什麼敢升級?親眼看見過別人把RHEL6。6的glibc升級了沒出事。真不知道會出這麼嚴重的問題。

如果沒有版本一致的光碟,接近的也可以。我實際用的光碟是RHEL4。6,和原系統差了一個小號。

rpm和。a檔案能拿到就行,不用非按本文方法。

網友提供的替換so的方案不靠譜,必須rpm安裝。

2。3升級到2。9不可以,不代表升級到2。4也不可以,版本離的近可能成功。

這個伺服器至今還在跑著,那些jar包部署到別的伺服器上了。