故事事故是這樣的
新開(kāi)發(fā)的jar包部署在老服務(wù)器上蠢护,版本是Red Hat Enterprise Linux AS release 4 (Nahant Update 5)堤结,提示需要高版本jdk,高版本jdk提示glibc版本太低得升級(jí)必怜,是的肉拓,就像套娃。
使用編譯源碼的方式將glibc由2.3升級(jí)到2.9梳庆,升級(jí)完ls命令不好使了暖途。 用LD_PRELOAD方法解決了ls命令不好使的問(wèn)題后還挺有成就感的呢!
輕度強(qiáng)迫癥的我當(dāng)然要重啟膏执,然后
#reboot
就沒(méi)有然后了驻售。。
操作系統(tǒng)起不來(lái)了更米。各種嘗試欺栗,最好的結(jié)果是卡死在
Starting cups-config-daemon:
Starting HAL daemon:
再也不往下走了。007的服務(wù)器被996的程序員干進(jìn)了ICU。
看到了吧迟几,搞垮服務(wù)器可以顯得很無(wú)辜消请。刪庫(kù)顯得太刻意了,會(huì)被人指責(zé)性格有問(wèn)題类腮。
搶救思路
像《信條》一樣進(jìn)行一次逆過(guò)程臊泰,把glibc相關(guān)的靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)都用原來(lái)的低版本覆蓋回來(lái)蚜枢。cp覆蓋和安裝rpm覆蓋一起上缸逃。
必要條件
- 能進(jìn)機(jī)房,直接操作服務(wù)器厂抽,因?yàn)閟sh此時(shí)已經(jīng)連不上了需频。
- 有相同版本的Linux系統(tǒng)光盤(pán),Linux搶救模式需要光盤(pán)引導(dǎo)筷凤。
- 有相同版本的Linux系統(tǒng)的iso鏡像文件贺辰,用來(lái)獲取rpm 【或者替代方法】
- 有相同版本的Linux系統(tǒng)的服務(wù)器或者虛擬機(jī),用來(lái)下載.a文件 【或者替代方法】
準(zhǔn)備工作
rpm安裝包
將iso文件解壓嵌施,在
RHEL4.6-i386-AS-DVD\RedHat\RPMS
目錄下就包括所有需要的rpm包饲化。
需要準(zhǔn)備的安裝包是下面這些:
.a靜態(tài)庫(kù)文件
到好用的版本一致的服務(wù)器對(duì)應(yīng)目錄下載下面的庫(kù)文件
目錄/lib
目錄/usr/lib
將這些安裝包和靜態(tài)庫(kù)放入一個(gè)U盤(pán)中,U盤(pán)插到服務(wù)器上吗伤。
搶救過(guò)程
進(jìn)入光盤(pán)系統(tǒng)
將光盤(pán)放入光驅(qū)吃靠。
開(kāi)機(jī)快速按F2,進(jìn)入
通過(guò)+-號(hào)調(diào)整開(kāi)機(jī)啟動(dòng)順序足淆,將CD-ROM調(diào)整到最上面
按回車巢块,系統(tǒng)重新啟動(dòng),進(jìn)入光盤(pán)引導(dǎo)界面
按F5巧号,進(jìn)入
輸入 linux rescue
按回車族奢,稍等一會(huì),進(jìn)入
按回車丹鸿,進(jìn)入
按回車越走,進(jìn)入
按回車,進(jìn)入
將光標(biāo)移動(dòng)到No靠欢,按回車廊敌,進(jìn)入
按回車,進(jìn)入
提示原有系統(tǒng)已經(jīng)掛載到/mnt/sysimage门怪,按回車進(jìn)入骡澈,目前所處的就是光盤(pán)搶救模式(rescue mode),環(huán)境是光盤(pán)系統(tǒng)掷空,原系統(tǒng)所有文件都在光盤(pán)系統(tǒng)的子目錄/mnt/sysimage里肋殴。
可以看到原有系統(tǒng)的所有目錄結(jié)構(gòu)在/mnt/sysimage下都是可以看見(jiàn)的囤锉。
掛載U盤(pán)
首先將U盤(pán)掛載到光盤(pán)系統(tǒng),
mount -t vfat /dev/sdb1 /mnt/usb/
不同環(huán)境中U盤(pán)的標(biāo)識(shí)符不一定是sdb1护锤,在物理機(jī)上可能是sda1嚼锄, 可以通過(guò)
fdisk –l 命令看各個(gè)目錄容量大小來(lái)判定哪個(gè)是U盤(pán)。
如果掛載U盤(pán)提示格式錯(cuò)誤蔽豺,U盤(pán)可能是fat16格式区丑,執(zhí)行
mount -t msdos /dev/sdb1 /mnt/usb/ 試試
此時(shí),U盤(pán)里的文件都在/mnt/usb/目錄下修陡, 原系統(tǒng)所有文件都在/mnt/sysimage下沧侥。將usb目錄下的文件拷貝到/mnt/sysimage下面你能記住的任意目錄,本文拷貝到/mnt/sysimage/home下魄鸦。
cp /mnt/usb/* /mnt/sysimage/home
切換到原系統(tǒng)
執(zhí)行
#chroot /mnt/sysimage
這個(gè)指令使你由當(dāng)前光盤(pán)系統(tǒng)切換到原系統(tǒng)(就是我們要搶救的那個(gè)系統(tǒng))宴杀,執(zhí)行pwd和ls可以看到,你所處的目錄就是原系統(tǒng)的根目錄拾因,賬號(hào)是原系統(tǒng)的root賬號(hào)旺罢。
一句話,原系統(tǒng)直接進(jìn)進(jìn)不去绢记,但是從光盤(pán)系統(tǒng)跳扁达,是能跳進(jìn)去的。
安裝rpm
進(jìn)入/home蠢熄,
rpm -ivh --force rpm包名
一個(gè)一個(gè)安裝U盤(pán)的rpm包跪解。裝失敗的就等把成功的都裝完了回頭重試,和答卷子題不會(huì)一個(gè)玩法签孔,都是依賴關(guān)系導(dǎo)致失敗的叉讥。
rpm最好自己重新命名,改成簡(jiǎn)短的名字(glibccomm.rpm這種)饥追,一定要去掉“-”图仓。我當(dāng)時(shí)看見(jiàn)顯示器上顯示的名字包括亂碼和問(wèn)號(hào),靠猜來(lái)判斷是哪個(gè)包但绕,后悔之前沒(méi)重命名救崔。
替換靜態(tài)庫(kù)文件
然后手動(dòng)cp指令替換/lib 和 /usr/lib的靜態(tài)庫(kù)(*.a文件)。
cp /home/libpthread.a /lib
cp /home/*.a /usr/lib
修改動(dòng)態(tài)庫(kù)軟連接
手動(dòng)修改動(dòng)態(tài)庫(kù)的軟連接
無(wú)論安裝rpm包時(shí)是否自動(dòng)修改過(guò)軟連接壁熄,都最好手動(dòng)修改一遍帚豪。
到/lib目錄里碳竟,先
rm *2.9* #刪除高版本的庫(kù)
然后
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
跳回光盤(pán)系統(tǒng)
執(zhí)行exit跳回到光盤(pán)系統(tǒng)草丧,
在上圖光標(biāo)處再一次輸入exit,按回車 莹桅,系統(tǒng)會(huì)重新啟動(dòng)昌执。
立刻修改BIOS烛亦,設(shè)置系統(tǒng)從硬盤(pán)啟動(dòng),原系統(tǒng)可以正常啟動(dòng)了懂拾。
完結(jié)撒花
搶救成功還挺有成就感的呢煤禽!其它操作搞垮服務(wù)器,也可以試試岖赋,只要那個(gè)操作能逆向來(lái)一遍檬果,問(wèn)題都不大。
為什么不重裝唐断?上面部署的東西是多年前放的选脊,物是人非,沒(méi)辦法重頭再來(lái)脸甘。
為什么敢升級(jí)恳啥?親眼看見(jiàn)過(guò)別人把RHEL6.6的glibc升級(jí)了沒(méi)出事。真不知道會(huì)出這么嚴(yán)重的問(wèn)題丹诀。
如果沒(méi)有版本一致的光盤(pán)钝的,接近的也可以。我實(shí)際用的光盤(pán)是RHEL4.6铆遭,和原系統(tǒng)差了一個(gè)小號(hào)硝桩。
rpm和.a文件能拿到就行,不用非按本文方法枚荣。
網(wǎng)友提供的替換so的方案不靠譜亿柑,必須rpm安裝。
2.3升級(jí)到2.9不可以棍弄,不代表升級(jí)到2.4也不可以望薄,版本離的近可能成功。
這個(gè)服務(wù)器至今還在跑著呼畸,那些jar包部署到別的服務(wù)器上了痕支。