Linux共享链接库错误的解决

简介: 不久前,笔者一位在银行工作的网管朋友给笔者打电话,说他的一台安装有数据库的Linux服务器无法启动,这台Linux服务器存储着银行非常重要的数据,请帮助解决。

不久前,笔者一位在银行工作的网管朋友给笔者打电话,说他的一台安装有数据库的Linux服务器无法启动,这台Linux服务器存储着银行非常重要的数据,请帮助解决。他告诉笔者这台Linux服务器(安装的是Red Hat 5.1,内核为2.0.34)一直运行得很好,不巧UPS出了问题,电源断电,再启动服务器,当启动到init,出现如下错误提示:
INIT:2.74 version booting
can’t find libc.so.6

然后就无法启动系统了。

投石问路

Linux下的共享链接库主要放在/lib目录下,以lib*.so.*为典型的文件名。Linux下的共享链接库对于Linux非常重要,几乎所有的程序都要调用共享链接库,类似于Windows下的*.dll文件。

笔者先进入单用户模式,在“LILO:”提示符下输入:Linux single,结果同样提示libc.so.6文件找不到!看来Linux调用共享链接库是在读取/etc/inittab文件之前。在这里笔者简单地介绍一下Linux的启动过程: Linux的启动首先要引导内核,然后进行设备检测,紧接着调用一个称为init的进程,该进程按照一定的规则,读取/etc/inittab文件的内容并且执行文件中的相关进程,指引系统进入某一特定的运行规则进程,也就是大家众所周知的6种模式:0为待机,1为单用户,2为多用户本机模式,3为多用户网络模式,4为系统保留,5为XWindows,6为重启。init进程首先调用共享链接库,由于共享链接库发生错误, 所以现在单用户模式也进不去,看来只有用启动盘和修复盘进入Linux的急救模式去试一试。于是笔者在另一台机器的DOS下,利用Linux光盘dosutils目录下的rawrite.exe程序制作了一张启动盘和一张修复盘,笔者先用启动盘引导系统,在“LILO: ”提示符下输入:rescue,直至系统提示笔者插入修复盘,进入急救模式。由于处于急救模式状况下,许多常用的命令不能用,而且由于只是将软盘中的内核映射到内存中,连根分区也没有挂上,而/lib目录正是在根分区上。笔者先挂上了根分区: mount -ext2 /dev/hda1 /mnt/hda1,进入/lib目录用ls命令查看,libc.so.6存在,于是怀疑是否是超级块或者节点出了问题,于是便用fsck命令(在急救模式状况下常规的ext2文件系统的检查命令e2fsck不可用):fsck -b 8193 /dev/hda1,然后退出重启,结果故障依旧,反复用fsck命令检查也无法解决。

柳暗花明

反复了几次之后笔者耐下性子,又到/lib目录下去仔细看了一下libc.so.6: ls -l libc.so.6,注意到:

lrwxrwxrwx 1 root root 13 Mar 10 03:32 libc.so.6 -> libc-2.?.7.so

原来libc.so.6文件只是libc-2.?.7.so文件的一个链接,看来此前笔者大意了。指向的链接名有一个“?”号,问题可能就出在这儿,init进程运行首先要调用libc-2.?.7.so所指向链接文件libc.so.6,init进程真正调用的是libc-2.?.7.so,而libc-2.?.7.so文件肯定是不存在的,那么到底应该是那个文件呢?再用ls查看,lib目录下有一个libc-2.0.7.so文件,这个文件才是真正指向libc.so.6的文件。笔者执行“rm -f libc.so.6, ln -s libc-2.0.7.so libc.so.6”,重新做了指向libc.so.6的正确链接,然后退出重启,结果故障仍然存在。

水落石出

可笔者总觉得判断是对的,又到lib目录下去仔细看了一下libc.so.6这个文件:ls -l libc.so.6,结果如下所示:

lrwxrwxrwx 1 root root 13 Mar 10 03:32 libc.so.6 -> libc-2.?.7.so

看来刚才笔者所做的操作并没有写进磁盘,于是笔者又重新做了刚才的操作。可这一次笔者老老实实地“umount /dev/hda1”,然后退出重启,系统又重新正常启动了,再到lib目录下去看了一下libc.so.6这个文件:ls -l libc.so.6,结果如下:

lrwxrwxrwx 1 root root 13 Mar 10 03:32 libc.so.6 -> libc-2.0.7.so

这回所做的修改写进了磁盘。看来问题归根结底是出在libc.so.6文件的链接问题上,问题总算解决了!

后 记

为什么非要做umount?在正常模式下没做umount,所做的操作也能写进磁盘的。笔者查了一下资料才明白: Linux文件系统更新是一个复杂的过程,当用户程序对文件系统进行修改以后,例如进行了写操作,文件数据将修改记录在内核缓冲中,在数据没有写到磁盘的时候,依然能够执行用户进程,所有数据的改变都在inode的内容中得到反映。磁盘的数据更新实际上是异步进行的,很有可能在写操作已经完成很长时间以后才真正对磁盘的数据进行更新。sync命令强制将磁盘缓冲的所有数据写入磁盘,如果在没有将磁盘缓冲区的信息写入磁盘之前终止系统,则磁盘的文件系统就会处在一个不稳定的状态。而在正常模式下即使没有对分区进行umount的操作,在重启之前系统会调用sync命令强制将磁盘缓冲的所有数据写入磁盘,而在急救模式下必须对所挂的分区进行umount的操作,系统才会调用sync命令强制将磁盘缓冲的所有数据写入磁盘,请在急救模式下的朋友注意这个问题。其实“reboot -n(Don’t sync before reboot or halt)”在重启之前不用sync命令强制将磁盘缓冲的所有数据写入磁盘,就很能说明问题。

相关文章
|
7月前
|
存储 Linux
Linux下的系统编程——共享存储映射(十)
Linux下的系统编程——共享存储映射(十)
62 1
Linux下的系统编程——共享存储映射(十)
|
7月前
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】Linux 提供SMB共享 smbd命令 使用指南
【Shell 命令集合 网络通讯 】Linux 提供SMB共享 smbd命令 使用指南
246 0
|
4月前
|
Linux 数据安全/隐私保护 Windows
Linux共享Windows目录
Linux共享Windows目录
|
4月前
|
运维 Ubuntu 安全
在Linux中,如何配置NFS共享?
在Linux中,如何配置NFS共享?
|
4月前
|
网络协议 Linux 网络安全
在Linux中,如何配置Samba共享?
在Linux中,如何配置Samba共享?
|
4月前
|
网络协议 Unix Linux
Linux 多种方式实现文件共享(三)NFS 6
【8月更文挑战第6天】NFS 即网络文件系统,是一种使用于分布式文件系统的协议,NFS 功能是通过网络让不同的机器,不同的操作系统能够彼此分享各自的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据
83 13
|
4月前
|
存储 网络协议 Linux
Linux 多种方式实现文件共享(四)iSCSI 磁盘共享服务 7
【8月更文挑战第7天】iSCSI技术是一种新储存技术, iSCSI 提供了在 IP 网络封装 SCSI 命令,且以TCP/IP协议传输.
90 5
|
4月前
|
存储 Linux 开发工具
Linux 多种方式实现文件共享(二)Samba 5
【8月更文挑战第5天】Samba 文件共享
91 5
|
4月前
|
安全 Linux 网络安全
Linux 多种方式实现文件共享(一)VSFTP4
【8月更文挑战第4天】Linux系统中VSFTP(Very Secure FTP)服务的配置方法,涵盖匿名访问、本地用户登录及虚拟用户管理等场景。VSFTP作为增强版FTP服务器,具备较高安全性,如普通用户权限运行、命令整合、chroot限制等特性。文中详细说明了配置步骤,包括安装VSFTP、修改主配置文件(如启用被动模式、设置端口范围)、创建用户及家目录、设置虚拟用户认证数据库等。此外,还介绍了如何实现FTP服务的加密传输,通过生成SSL证书并配置VSFTP以支持安全连接。这些配置适用于不同需求的文件共享服务。
74 4
|
4月前
|
Ubuntu Linux 网络安全
在Linux中,如何配置Samba或NFS文件共享?
在Linux中,如何配置Samba或NFS文件共享?