升级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 ),然后建议自己手动挂盘,不要让它自动挂,然后没什么难度,把备份替换回去就好了。 此贴有问题,大家可以跟贴,大家一起研究,呵呵^^ |
升级glibc经验谈!!!
最新推荐文章于 2024-09-09 17:35:55 发布