实时连接器ld.so.1文件损坏或丢失后系统怎样恢复正常?

发表于:2007-05-26来源:作者:点击数: 标签:
实时连接器ld.so.1文件损坏或丢失后系统怎样恢复正常? 前言:看到网上好多人遇到ld.so.1文件损坏或丢失,系统瘫痪询问怎样处理,为此我将这一故障现象进行归纳总结,供各位网友参考,希望从中得到帮助。 一、动态连接库的概念 大家都知道,在 WINDOWS 系统中

实时连接器ld.so.1文件损坏或丢失后系统怎样恢复正常?
前言:看到网上好多人遇到ld.so.1文件损坏或丢失,系统瘫痪询问怎样处理,为此我将这一故障现象进行归纳总结,供各位网友参考,希望从中得到帮助。

一、动态连接库的概念
大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。
Solaris系统里面有些库文件,当编译的时候,如果把库文件也编译到文件中,那文件本身就可以执行,但这样的缺点是生成的文件十分大。所以很多情况下使用动态连接库,就是编译出的文件不包含库,而只包含到库的指针,这样在运行的时候会到指定的地方调用这个库,这样就减少了文件的大小。Solaris包含的实时连接器ld.so.1,就是动态对象的运行阶段链接程序。

从下面的的命令中,我们可以列出可执行文件或者共享对象的动态从属关系,这玩意没了,你的什么ls,cd什么的命令就都费了,如果ld.so.1文件被破坏了,系统肯定无法正常启动。

/usr/bin/ldd [filename]  
/* List the dynamic dependencies of executable files */  

# /usr/bin/ldd /usr/bin/cat
        libc.so.1 =>     /usr/lib/libc.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        /usr/platform/SUNW,Ultra-1/lib/libc_psr.so.1
# ldd /usr/bin/ls
        libc.so.1 =>     /usr/lib/libc.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        /usr/platform/SUNW,Ultra-1/lib/libc_psr.so.1
# ldd /usr/bin/cp
        libc.so.1 =>     /usr/lib/libc.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        /usr/platform/SUNW,Ultra-1/lib/libc_psr.so.1

二、ld.so.1文件损坏或丢失解决的办法

1.如果意外的/usr/lib/ld.so.1损坏或丢失,系统没有正常启动的情况下:
执行命令都会出现错误信息:
#reboot
Reboot :can not find /usr/lib/ld.so.1
#find
Find: /usr/lib/ld.so.1
#ls
Ls: can not find can not find

这时,千万不要重启动,立即用/usr/sbin/static/mv、/usr/sbin/static/cp命令恢复  :

#/sbin/static/cp /etc/lib/ld.so.1 /usr/lib/
经过实验,系统恢复正常!这时,你试试如下命令,就能体会到为什么了。
---------------------------------------------------------------------------
   # ls /usr/sbin/static  
   cp*   ln*   mv*   rcp*  tar*  
  SUN的工程师非常聪明,为了防备了这个情况, 做了以上几个不使用动态连接库的命令
#find / -name ld.so.1 -print
/usr/lib/sparcv9/ld.so.1
/usr/lib/ld.so.1
/etc/lib/ld.so.1
blade% ls -ld /usr/lib/sparcv9/ld.so.1
-rwxr-xr-x   1 root     bin       191672 Jul 28  2001 /usr/lib/sparcv9/ld.so.1
blade% ls -ld /usr/lib/ld.so.1
-rwxr-xr-x   1 root     bin       196852 Jul 28  2001 /usr/lib/ld.so.1
blade% ls -ld /etc/lib/ld.so.1
-rwxr-xr-x   1 root     bin       196852 Jul 28  2001 /etc/lib/ld.so.1
---------------------------------------------------------------------------
从上面的,我们又可以看到,这个库文件,不仅仅在/usr/lib有,在/etc/lib、/usr/lib/sparcv9/下也有,所以你就重新在本机上拷贝一份就行了。这些信息在这个连接库不正常的情况下是看不到的。

2.如果意外的/usr/lib/ld.so.1损坏或丢失,系统启动的情况下:
错误信息:
Uname:can not find /usr/lib/ld.so.1
Loadkeys: can not find /usr/lib/ld.so.1
Killed
Cfsfstype: can not find /usr/lib/ld.so.1
Expr: can not find /usr/lib/ld.so.1
Swap: can not find /usr/lib/ld.so.1
Killed
Fsck: can not find /usr/lib/ld.so.1
Killed

这时,用光盘启动到单用户下:
ok boot cdrom -s (放入启动安装光盘)  
#mount /dev/dsk/c0t0d0s0 /mnt (这里指定原usr目录对应的原始设备名)  
# cp /mnt/etc/lib/ld.so.1 /mnt/lib/(就是将/usr/etc下的这个文件拷贝到/usr/lib下。)
系统重新启动,一切正常!

3.如果/usr被改名了情况下,怎么办?  
假设/usr改名成了/faint,系统没有启动  
马上执行
#/faint/sbin/static/mv  /faint /usr  

   假设/usr改名成了/faint,系统重新启动,这时肯定不能正常启动,同样我们启动到单用户下:
ok boot cdrom -s (放入启动安装光盘)  
mount /dev/dsk/c0t0d0s0 /mnt (这里指定原usr目录对应的原始设备名)  
mv /mnt/faint /mnt/usr  

      建议把/usr/sbin/static下的东西拷一份到/sbin下或者其它比较可信的跟/在同一个文件系统下的目录下。以备系统不测.  

之后,我又进行了多次实验,各个版本系统下的/usr/lib/ld.so.1文件互相兼容。所以也可以从其他机器拷贝过来。

   在解决问题的过程中,得到了一位大师的帮助,希望写出来,供大家参考!

 race 回复于:2004-05-31 13:56:15
鼓励原创

 Philmoon 回复于:2004-05-31 13:58:11
不错!好东东!

 大海剑侠 回复于:2004-05-31 14:26:59
好深奥啊!!!简直想象不到还有这么好的recuse and damage system方法

 race 回复于:2004-05-31 14:35:18
[quote:560b50df34="大海剑侠"]好深奥啊!!!简直想象不到还有这么好的rescuse方法[/quote:560b50df34]

你一周内不交类似的作业,就去扁你。

 easytolab 回复于:2004-05-31 14:44:19
可是没光驱的时候咋办?

 race 回复于:2004-05-31 14:47:34
在网上做个安装服务器,从那里引导,速度也比光驱快的多。

 www.pctint.com 回复于:2004-05-31 14:55:35
不错不错。。。

 easytolab 回复于:2004-05-31 15:05:00
就是不知道这个ld.so.1坏了以后,网络安装服务器发现之类的操作还能不能做哦,呵呵

 大海剑侠 回复于:2004-05-31 15:21:20
用一外置光驱很容易办到

 吹拂的晨风 回复于:2004-06-01 09:02:09
好东东!鼓励原创,支持支持,加油加油!

 大海剑侠 回复于:2004-06-01 15:47:22
race,作业已交完,能继续交作业吗?

 mmmmn 回复于:2004-06-01 18:12:03
[quote:4a62511946="飞天二狭"]
blade% ls -ld /usr/lib/sparcv9/ld.so.1 
-rwxr-xr-x 1 root bin 191672 Jul 28 2001 /usr/lib/sparcv9/ld.so.1 
blade% ls -ld /usr/lib/ld.so.1 
-rwxr-xr-x 1 root bin 196852 Jul 28 2001 /usr/lib/ld.so.1 
blade% ls -ld /etc/lib/ld.so.1 
-rwxr-xr-x 1 root bin 196852 Jul 28 2001 /etc/lib/ld.so.1 
--------------------------------------------------------------------------- 
从上面的,我们又可以看到,这个库文件,不仅仅在/usr/lib有,在/etc/lib、/usr/lib/sparcv9/下也有,所以你就重新在本机上拷贝一份就行了。这些信息在这个连接库不正常的情况下是看不到的。 

....[/quote:4a62511946]
看到什么啊?容量都不一样,能是一样的吗?
看看清楚

 飞天二狭 回复于:2004-06-01 21:16:31
这个我已经实验过了,即使是不同的版本,不同的容量,都没问题的,只要拷贝过来就行!

 fufu 回复于:2004-10-10 11:07:06
好文章,又学到一招,多谢分享宝贵经验!!!

原文转自:http://www.ltesting.net