LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1765|回复: 9

(原创)升级glibc经验谈^^敢于挑战的近来看看吧^0^第一次写这些东西,大家顶啊!谢谢支持!

[复制链接]
发表于 2006-5-25 16:39:49 | 显示全部楼层 |阅读模式
都说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^
发表于 2006-5-25 17:41:50 | 显示全部楼层
写的不错,欢迎来 LFS 坐坐。。

Glibc 的第二版本升级,最好更新所有的包,不然不保证系统的正确运行。。

还有,--enable-kernel 的作用你清楚不?。感觉好像你说错了,不过不确定,你再说说?
回复 支持 反对

使用道具 举报

发表于 2006-5-25 17:44:07 | 显示全部楼层
直接编译glibc升级是有点麻烦,而且也是容易把系统弄崩溃。但是用软件包管理程序如:rpm,deb或者gentoo的portage系统可以方便的升级glibc的。
回复 支持 反对

使用道具 举报

发表于 2006-5-25 19:43:49 | 显示全部楼层
gentoo下升级glibc哪这么麻烦。现在早就是glibc 2.4了。emerge glibc一切就ok了。
回复 支持 反对

使用道具 举报

发表于 2006-5-26 00:47:09 | 显示全部楼层
fei,glibc原来版本是?更新glibc后,你有没有更新系统?好奇的问问。
回复 支持 反对

使用道具 举报

发表于 2006-5-26 06:40:43 | 显示全部楼层
加精鼓励!希望楼主再接再厉。像这种升级glibc的事情,还是请兄弟们自己斟酌着办。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-26 10:17:47 | 显示全部楼层
Post by 终极幻想
写的不错,欢迎来 LFS 坐坐。。

Glibc 的第二版本升级,最好更新所有的包,不然不保证系统的正确运行。。

还有,--enable-kernel 的作用你清楚不?。感觉好像你说错了,不过不确定,你再说说?


我觉得--enable-kernel=x.y.z 的作用就是使编译的glibc只支持>=x.y.z的内核,以减小一些无用的支持。
--with-header的作用是用自己指定的头文件,与上面不同的是可以低版本的内核用高版本的头文件。
不知道这样的理解对不,呵呵^^,还望指教
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-26 10:27:55 | 显示全部楼层
Post by fei
gentoo下升级glibc哪这么麻烦。现在早就是glibc 2.4了。emerge glibc一切就ok了。

2.3.6是目前最后一个还使用threads的glibc版本了吧(不过好像加入了ntpl,可以在add-ons里选),2.4就是ntpl了。我不用2.4主要是还得升级其他很多相关包,比较麻烦,这就是用linux9这么老版本的不爽的地方了,但我想2.4也应该大同小异吧^^
还有老兄说的麻烦,呵呵,是挺麻烦的,不过,能真正学到东西,提高自己对linux的理解才对,是吧^^,我觉得麻烦也有麻烦的好处,要不都像微软的傻瓜操作方式,根本就提高不了什么能力,对吧^^
我觉得正个升级过程我收获最多的还是失败带给我的解决问题的方法,和对库的更深的理解。我希望也能把这种收获与大家分享才写的这篇帖子的,希望大家支持,呵呵^^
回复 支持 反对

使用道具 举报

发表于 2006-5-26 14:56:41 | 显示全部楼层
今天gcc 4.1.1进gentoo了。从3.4.6直接升上去了。一切ok.象glibc这种东西。不能平滑升级的放行版还是不推荐升。
回复 支持 反对

使用道具 举报

发表于 2006-5-26 16:57:08 | 显示全部楼层
Post by Skymoon
我觉得--enable-kernel=x.y.z 的作用就是使编译的glibc只支持>=x.y.z的内核,以减小一些无用的支持。
--with-header的作用是用自己指定的头文件,与上面不同的是可以低版本的内核用高版本的头文件。
不知道这样的理解对不,呵呵^^,还望指教

看来是我理解错你的意思了,我觉得你说的没错。:)。

不过我一般还是喜欢用 --enable-kernel=2.6.0。呵呵。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表