升级glibc经验谈!!!

 
 升级glibc经验谈!!!


都说glibc不能升级,其实只是很容易就使系统崩溃而已,不过既然GNU给咱发布GLIBC,不能升级算怎么回事啊,而且很多东西要求的GLIBC的版本也较高,那我们就来试试给我们的系统库升个级吧:)因为现在是在学校机房上课,不在linux中,可能有些东西不能说得很详细,但我尽量。。。

我是从LINUX9环境下升级的,说实话,linux9确实有些古董了。。。不过目前手头只有这个,就用它吧,相信在这么古老的系统下都能成功,其他的就更不用说了吧:)而且是在glibc2的条件下升级的,不会还有人用libc5这么古老的东东了吧。。。不过我是先把内核升级到2.6.13之后才升级的GLIBC的。

首先去 http://ftp.gnu.org/gnu/glibc/ 下载GLIBC,我用的是2.3.6:glibc-2.3.6.tar.bz2 。因为考虑的用gcc-4.1所以没用2.4(glibc-2.4不支持2.6一些内核,要求不是gcc-4.1,就是gcc-4.0以上,而且binutils也要升级,我在家编译gcc-4.1用了我1G多的空间,和大把的时间,所以在学校的这个机子就不升级gcc了。)。下载其他的add-ons(附加套件): glibc-linuxthreads-2.3.6.tar.bz2 是必需的,还有glibc-ports-2.3.6.tar.bz2 , glibc-libidn-2.3.6.tar.bz2 什么的,反正和2.3.6有关的都下来就ok了!应该总共4个文件吧。


ok!,我们继续!(建议用普通用户)把glibc-2.3.6.tar.bz2解压,进入目录glibc-2.3.6,把3个附加套件解压,新建个目录,如 temp,进入。(这样一旦出错make clean 可能不干净,这样直接删除temp文件夹就搞电了!^^)


tar xjf glibc-2.3.6.tar.bz2;
cd glibc-2.3.6
tar xjf glibc-linuxthread…………。(3个)
mkdir temp
cd temp

下面我们要configure了,建议进行之前先自己看一下README,INSTALL,之类的FAQ太烦了,不愿看就算了@@。。。

../configure --prefix=/usr --with-headers=/usr/src/linux/include --enable-kernel=2.6.13 --disable-profile --without-tls
下面开始解释
--prefix=/usr,安装为主函数库,不用担心,只要做好准备,一次成功,而且还有机会在后面改安装的地址。当然你也可以选择其他文件夹,作为辅助函数库。注意,如果你选择/usr的话,安装时会自动把一些东西放到/lib里,不用自己动手。如果安装为辅助函数库的话,本身就不用往/lib里放什么东西。。。
--with-headers=/usr/src/linux/include和--enable-kernel=2.6.13,前一句话是选择头文件,默认是/usr/include,我的2.6.13的内核在/usr/src/linux,当然用高版本的头文件了^^,--enable-kernel=N 是把此函数库编译为仅支持>=N内核版本号的内核,目的是减小体积。你可以用你的内核号代替我那里面的2.6.13。记住,一旦设置新编译的glibc不会在小于此号的内核里工作,如果作为主函数库的话,设置了enable-kernel=2.6.13再进2.4内核就会在init时出现kernel too old的提示!所以如果你还想用其他“小号”内核的话,请不要用这两项吧。注意/usr/src/linux/include高版本的可是兼容低版本的哦,兴许还有一些优化。但记得用之前先进/usr/src/linux
make defconfig;
make include/version.h;
这样的头文件才行啊。
--disable-profile,我们只是用,那就不要这个了吧^^
--without-tls 按INSTALL里的话说是有可能有兼容性问题,可以先不without,make不成功再withyou,反正我的没without也没有问题。

ok!如果一切没错的话!make 吧!!!建议LC_ALL=C make
至于-jn(并行编译,加快编译速度的),自己看着办吧^^


大约半小时到一小时之间吧。如果一切成功,LC_ALL=C make check 吧!!!

又是漫长的等待@@…………呵呵,等吧。我家机子还是PIII的呢,每次这样我就出去看电视去了。。呵呵


下面才是真正紧张的时刻了。。。。。。
如果你足够胆量 su ;make install;
如果你后悔了的话 没关系, su ;mkdir /usr/temp; make install_root=/usr/temp install
此处变量install_root用来代替“/”这样就安到了/usr/temp/$prefix里面了。
但不管怎样!!!!在make install之前,先备份一下/lib和/usr/lib是没错的!!!
su
cp -a /lib /libold
cp -a /usr/lib /usr/libold
如果prefix=/usr/local/lib的话,备份一下也是没错的。cp -a /usr/local/lib /usr/local/libold

这样,就基本上有了在真崩溃了的情况下,迅速恢复系统的条件了!


那么,确认都一切无误后,准备开始吧!勇士们!!!
首先,在linux9环境下(别的我不知道),/lib/tls,和/lib/i686文件夹的内容是会和我们新编译的glibc的,于是,
mv /lib/tls /lib/tlsold;
mv /lib/i686 /lib/i686old;
或者干脆不用客气,删!事实证明这样的操作不会对系统有什么影响,况且我们马上就要用新的glibc了,不用心疼!杀!

LC_ALL=C make install;

好了,祈求老天祝福你吧!如果没有出错的话,一般会有一句:it seem to be ok!
那,ok就是ok了,何必那么含蓄呢,还seem to be。 reboot and enjoy it !!!

怎么判断我们是在用新的函数库呢?
首先,如果是prefix=/usr的话,应该已经是了
否则的话记住ldconfig $prefix/lib 一下,确认没问题后把$prefix/usr加入/etc/ld.so.conf文件中($prefix记住用configure里设的目录替换呀>o^)
然后怎么直观的确定我是在使用新的函数库呢?
首先
如果是prefix=/usr的话ls -l /lib/libc.so.6看看是不是指向了libc-2.3.6.so。
ldconfig -p|less;看一下是不是有新函数库的文件出现。
ldd /bin/ls看看用的是不是新函数库
如果不是安装为主函数的话,你可能还要 ln -sf $prefix/ld-linux.so.2 /lib/ld-linux.so.2或者LD_TRACE_LOADED_OBJECTS=1 $prefix/ld-linux.so.2 /bin/ls 观察一下。具体可看man ld.so
还可以
sleep 100&
看它的pid
然后lsof -p $pid |grep lib 查看($pid用上面输出的数代替)
再或者运行 /lib/libc.so.6
再或者编译连接一下
#include <stdio.h>
#include <gnu/libc-version.h>
int main (void) { puts (gnu_get_libc_version ()); return 0; }运行一下。
总之方法很多啦^^

没问题的话,进入收尾工作:
如果用了--with-headers的话,最好记得把/usr/src/linux/include/linux 和/usr/src/linux/include/asm指向的文件夹复制到/usr/include/ 分别叫linux 和asm,/usr/src/linux/include/asm-geneic也要复制过去好像还有asm-err因为asm里有对它们的引用。记不太清了。
这时如果你进入Xwindow的话,可能会发现很多地方变成英文了,没问题,解决它!
localedef -i zh_CN -f gb2312 zh_CN.gb2312
localedef -i zh_CN -f gbk zh_CN.gbk
localedef -i zh_CN -f gb13080 zh_CN #我们这里把gb12080作为默认的了,你也可以选择其他的
localedef -i en_US en_US
这样就应该ok了。



如果真的出错的话,很不幸。。。不过好在我们有备份。不用从启,直接操作
注意这时可能大部分程序不能运行了,好在还有静态连接程序在而且,我们还有shell,shell的内部命令还是可以使的,活用会用很的帮助的。如一些文件我们用不了mv,但我们可以用echo >来清空它哦^^

ldconfig /libold /usr/libold #还好ldconfig是静态连接的
/libold/ld-linux.so.2 /bin/ls #如果这句可以运行的话!太棒了,我们的系统还可以工作,真正要用的是下面几句
/libold/ld-linux.so.2 /bin/mv /lib /libnew
/libold/ld-linux.so.2 /bin/cp -a /libold /lib
/libold/ld-linux.so.2 /bin/mv /usr/lib /usr/libnew
/libold/ld-linux.so.2 /bin/cp -a /usr/libold /usr/lib
ldconfig #再来一次ldconfig,应该已经把系统恢复了。
ls #可以运行了?!好,系统恢复完毕!!!


如果上面的方法不行呢 /libold/ld-linux.so.2 /bin/ls 报库函数错,那只好重启进系统恢复盘了(系统安装盘:linux rescue ),然后建议自己手动挂盘,不要让它自动挂,然后没什么难度,把备份替换回去就好了。

此贴有问题,大家可以跟贴,大家一起研究,呵呵^^


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值