这个问题经常发生在有大量磁盘读写操作且磁盘分区很大的环境中,下面简单描述下此案例的应用环境:这是一个 Web 服务器故障案例,客户利用两台服务器加一个磁盘阵列做了一个双机热备的 Web 系统,所有网站数据都存储在磁盘阵列中,两台服务器共享一个磁盘阵列分区,在正常情况下主机挂载磁盘阵列分区提供网站服务,主机故障时备机接管磁盘阵列分区继续提供网站服务。
1 . 案例现象
接到客户电话说他们的网站无法添加数据了,不过网站还可以正常访问,服务器和磁盘阵列也没有任何告警信息。
2 . 解决思路
根据这个简单信息,基本排查思路如下:
网站程序可能出现问题了
服务器磁盘故障
3 . 排查问题
首先通知研发人员对网站程序问题进行排查。经过检查,并没有发现程序有问题,而在程序日志中发现了一条信息:
java.lang.RuntimeException: Cannot make directory: file:/www/data/html/2013-03-30
根据这个输出可知,程序不能创建目录,那么尝试手动创建一个目录试试,登录 Web服务器,在/www/data/html 目录下创建一个目录 test,操作如下:
[root@localhost html]# mkdir test
mkdir: cannot create directory `test': Read-only file system
从这个输出信息可知,/www/data/html 目录所在的磁盘分区出现了问题,通过检查发现,/www/data/html 目录正是挂载的磁盘阵列分区,于是问题原因找到了。
4 . 解决问题
磁盘出现“Read-only file system”的原因有很多种,可能是文件系统数据块出现不一致导致的,也有可能是磁盘故障造成的。主流的 ext3、ext4 文件系统都有很强的自我修复机制,对于简单的错误,文件系统一般可自行修复,当遇到致命错误无法修复时,文件系统为了保证数据一致性和安全,会暂时屏蔽文件系统的写操作,将文件系统变为只读,进而出现了上面的“Read-only file system”现象。
手工修复文件系统错误的命令是 fsck,在修复文件系统前,最好卸载文件系统所在的磁
盘分区:
[root@localhost ~]# umount /www/data
umount: /www/data: device is busy
提示无法卸载,可能这个磁盘中还有文件对应的进程在运行,检查如下:
[root@localhost ~]# fuser -m /dev/sdb1
/dev/sdb1: 8800
接着检查一下 8800 这个端口对应是什么进程,如图所示,查询 8800 端口对应的进程信息:
原来是系统的 apache 进程还没有停止,停止 apache,成功卸载磁盘,操作如下:
[root@localhost ~]#/usr/local/apache2/bin/apachectl stop
[root@localhost ~]# umount /www/data
最后,执行修复操作,如图所示。用 fsck 命令修复磁盘分区。
修复过程比较简单,上面省略了很多输出信息。修复的时间根据磁盘大小和文件系统损
坏程度而定。如果有些数据无法修复,会提示是否删除,此时可根据情况选择。修复完成后,
被删除的文件会保留在对应磁盘分区挂载点的 lost+found 目录中。
修复完成后,执行挂载操作:
[root@localhost ~]# mount /dev/sdb1 /www/data
最后,在/www/data 目录下验证是否可以成功创建文件,至此,问题圆满解决。