新開發的jar包部署在老服務器上,版本是Red Hat Enterprise Linux AS release 4 (Nahant Update 5),提示須要高版本jdk,高版本jdk提示glibc版本過低得升級,是的,就像套娃。
使用編譯源碼的方式將glibc由2.3升級到2.9,升級完ls命令很差使了。 用LD_PRELOAD方法解決了ls命令很差使的問題後還挺有成就感的呢!
輕度強迫症的我固然要重啓,而後linux
#reboot
就沒有而後了。。
操做系統起不來了。各類嘗試,最好的結果是卡死在程序員
Starting cups-config-daemon: Starting HAL daemon:
不再往下走了。007的服務器被996的程序員幹進了ICU。
看到了吧,搞垮服務器能夠顯得很無辜。刪庫顯得太刻意了,會被人指責性格有問題。服務器
像《信條》同樣進行一次逆過程,把glibc相關的靜態庫、動態庫都用原來的低版本覆蓋回來。cp覆蓋和安裝rpm覆蓋一塊兒上。ssh
將iso文件解壓,在操作系統
RHEL4.6-i386-AS-DVD\RedHat\RPMS
目錄下就包括全部須要的rpm包。
須要準備的安裝包是下面這些:
code
到好用的版本一致的服務器對應目錄下載下面的庫文件
目錄/lib
目錄/usr/lib
dns
將這些安裝包和靜態庫放入一個U盤中,U盤插到服務器上。開發
將光盤放入光驅。
開機快速按F2,進入
經過+-號調整開機啓動順序,將CD-ROM調整到最上面
按回車,系統從新啓動,進入光盤引導界面
按F5,進入
輸入 linux rescue
按回車,稍等一會,進入
按回車,進入
按回車,進入
按回車,進入
將光標移動到No,按回車,進入
按回車,進入
提示原有系統已經掛載到/mnt/sysimage,按回車進入,目前所處的就是光盤搶救模式(rescue mode),環境是光盤系統,原系統全部文件都在光盤系統的子目錄/mnt/sysimage裏。
能夠看到原有系統的全部目錄結構在/mnt/sysimage下都是能夠看見的。部署
首先將U盤掛載到光盤系統,源碼
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
這個指令使你由當前光盤系統切換到原系統(就是咱們要搶救的那個系統),執行pwd和ls能夠看到,你所處的目錄就是原系統的根目錄,帳號是原系統的root帳號。
一句話,原系統直接進進不去,可是從光盤系統跳,是能跳進去的。
進入/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
執行exit跳回到光盤系統,
在上圖光標處再一次輸入exit,按回車 ,系統會從新啓動。
馬上修改BIOS,設置系統從硬盤啓動,原系統能夠正常啓動了。
搶救成功還挺有成就感的呢!其它操做搞垮服務器,也能夠試試,只要那個操做能逆向來一遍,問題都不大。 爲何不重裝?上面部署的東西是多年前放的,物是人非,沒辦法重頭再來。 爲何敢升級?親眼看見過別人把RHEL6.6的glibc升級了沒出事。真不知道會出這麼嚴重的問題。 若是沒有版本一致的光盤,接近的也能夠。我實際用的光盤是RHEL4.6,和原系統差了一個小號。 rpm和.a文件能拿到就行,不用非按本文方法。 網友提供的替換so的方案不靠譜,必須rpm安裝。 2.3升級到2.9不能夠,不表明升級到2.4也不能夠,版本離的近可能成功。 這個服務器至今還在跑着,那些jar包部署到別的服務器上了。