各类故障报错及解决方法

问题一、Read-only file system 错误与解决方法。

解析:出现这个问题的缘由有不少种,多是文件系统数据块出现不一致致使的,也多是磁盘故障形成的,主流ext3/ext4文件系统都有很强的自我修复机制,对于简单的错误,文件系统通常均可以自行修复,当遇到致命错误没法修复的时候,文件系统为了保证数据一致性和安全,会暂时屏蔽文件系统的写操做,讲文件系统变为只读,今儿出现了上面的“read-only file system”现象。java

手工修复文件系统错误的命令式fsck,在修复文件系统前,最好卸载文件系统所在的磁盘分区node

1
2
3
4
5
6
7
8
9
10
11
12
# umount /www/data
Umount : /www/data : device is busy
提示没法卸载,多是这个磁盘中还有文件对应的进程在运行,检查以下:
# fuser -m /dev/sdb1
/dev/sdb1 :   8800
接着检查一下8800端口对应的什么进程,
# ps –ef |grep 8800
检查后发现时apache没有关闭,中止apache
#/usr/local/apache2/bin/apachectl stop
# umount /www/data
# fsck –V –a /dev/sdb1
# mount /dev/sdb1/www/data

 

问题二、“Argument list too long”错误与解决方法

# crontab –emysql

编辑完后保存退出后,报错nospace left on devicelinux

根据上面的报错了解到是磁盘空间满了,那么首先是检查磁盘空间,nginx

# df –hweb

查看到是/var磁盘分区空间已经达到100%,至此定位了问题所在。是/var磁盘空间饱满致使,由于crontab会在保存时将文件信息写到/var目录下面,然而这个磁盘没有空间了,因此报错。sql

接着经过命令du –sh * 命令检查/var目录下面的全部文件或者目录的大小,发现/var/spool/clientmqueue目录占用了/var整个分区大小的90%,那么/var/spool/clientmqueue目录下的文件都是怎么产生的,可否删除,基本上都是邮件信息,能够删除shell

# rm *数据库

/bin/rm :argumentlist too longapache

当在linux 系统中试图传递太多参数给一个命令时,就会出现“argument list too long ”错误,这是linux系统一直以来都有的限制,查看这个限制能够经过命令“getconf ARG_MAX”来实现,

# getconf ARG_MAX

# more/etc/issue    查看版本

解决方法:一、

# rm [a-n]* -rf

# rm [o-z]* -rf

二、使用find命令来删除

# find/var/spool/clientmqueue –type f –print –exec rm –f {} \;

三、经过shell脚本

#/bin/bash

RM_DIR=’/var/spool/clientmqueue’

cd $RM_DIR

for I in `ls`

do

  rm –f $i

done

四、从新编译内核

须要手动增长内核中分配给命令行参数的页数,打开kernel source 下面的include/linux/binfmts.h文件,找到以下行:

#denfineMAX_ARG_PAGES   32

将32改成更大的值,例如64或者128,而后从新编译内核

 

问题三、inode耗尽致使应用故障

客户的一台Oracle数据库如武器在关机重启后,Oracle监听没法启动,提示报错 Linux error : No spaceleft on device

从输出信息看出来是由于磁盘耗尽致使监听没法启动,由于Oracle在启动监听时须要建立监听日志文件,因而首先查看磁盘空间使用状况

# df –h

从磁盘输出信息可知,全部的分区磁盘空间都还有剩余很多,而Oracle监听写日志的路径在/var分区下,/var下分区空间足够。

解决思路:

既然错误提示语磁盘空间有关,那就深刻研究关于磁盘空间的问题,在linux系统中对磁盘空间的占用分为三个部分:第一个是物理磁盘空间,第二个是inode节点所占用的磁盘空间,第三个是linux用来存放信号量的空间,而平时接触较多的是物理磁盘空间。既然不是物理磁盘空间的问题,接着就检查是不是inode节点耗尽的问题,经过执行命令“df -i”查看可用的inode节点。由输出结果看出确实是由于inode耗尽致使没法写入文件。

能够经过下面的命令查看某个磁盘分区inode的总数

# dumpe2fs –h/dev/sda3 |grep ‘Inode count’

每一个inode都有一个号码,操做系统用inode号码来区分不一样的文件,经过‘ls -i’命令能够查看文件名对应的inode号

若是要查看这个文件更详细的inode信息,能够经过stat命令来实现

# stat install.log

解决问题

# find/var/spool/clientmqueue/ -name “*” –exec rm –rf {} \;

 

问题四、文件已经删除,可是空间没有释放的缘由

运维监控系统发来通知,报告一台服务器空间满了,登录服务器查看,根分区确实满了,这里先说一下服务器的一些删除策略,因为linux没有回收站功能,因此线上服务器上全部要删除的文件都会先移到系统/tmp目录下,而后按期清除/tmp目录下的数据。这个策略自己没有什么问题,可是经过检查发现这台服务器的系统分区中并无单独划分/tmp分区,这样/tmp下的数据其实占用根分区的空间,既然找到了问题,那么删除/tmp目录下一些占用空间较大的数据文件便可。

# du –sh /tmp/* |sort –nr |head -3

经过命令发如今/tmp目录下有个66G大小的文件access_log,这个文件应该是apache产生的访问日志文件,从日志大小来看,应该是好久没有清理的apache日志文件了,基本断定是这个文件致使的根空间爆满,在确认此文件能够删除后,执行以下删除命令,

# rm/tmp/access_Iog

# df –h

从输出来看,根分区空间仍然没有释放,这是怎么回事

通常来讲不会出现删除文件后空间不释放的状况,可是也存在例外,好比文件进程锁定,或者有进程一直在向这个文件写数据,要理解这个问题,就须要知道linux下文件的存储机制和存储结构。

一个文件在文件系统中存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就能够被覆盖并写入新的内容,之因此出现删除access_log文件后,空间尚未释放,就是由于httpd进程还在一直向这个文件写入内容,致使虽然删除了access_Ilog文件,可是因为进程锁定,文件对应的指针部分并未从meta-data中清除,而因为指针并未删除,系统内核就认为文件并未被删除,所以经过df命令查询空间并未释放。

问题排查:

既然有了解决思路,那么接下来看看是否有进程一直在向access_log文件中写入数据,这里须要用到linux下的losf命令,经过这个命令能够获取一个仍然被应用程序占用的已删除文件列表

# lsof |grepdelete

从输出能够看出,/tmp/access_log文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据,最后一列的‘deleted’状态说明这个日志文件已经被删除,可是因为进程还在一直向此文件写入数据,所以空间并未释放。

解决问题:

到这里问题就基本排查清楚了,解决这一类问题的方法有不少,最简单的方法就是关闭或者重启httpd进程,固然重启操做系统也能够。不过这些并非最好的办法,对待这种进程不停对文件写日志的操做,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,具体能够经过以下命令完成:

# echo “ ”>/tmp/access_log

经过这种方法,磁盘空间不但能够立刻释放,也能够保障进城继续向文件写入日志,这种方法常常用于在线清理apache /tomcat/nginx等web服务产生的日志文件。

 

问题五、“too many open files”错误与解决方法。

问题现象:这是一个基于java的web应用系统,在后台添加数据时提示没法添加,因而登录服务器查看tomcat日志,发现以下异常信息,java.io.IOException: Too many open files

经过这个报错信息,基本判断是系统能够用的文件描述符不够了,因为tomcat服务室系统www用户启动的,因而以www用户登录系统,经过ulimit –n 命令查看系统能够打开最大文件描述符的数量,输出以下:

$ ulimit –n

65535

能够看到这台服务器设置的最大能够打开的文件描述符已是65535了,这么大的值应该够用了,可是为何提示这样的错误呢

解决思路,这个案例涉及ulimit命令的使用

在使用ulimit时,有如下几种使用方法:

一、      在用户环境变量中加入

若是用户使用的是bash,那么能够在用户目录的环境变量文件.bashrc或者.bash_profile中加入“ulimit –u128”来限制用户最多可使用128个进程

二、      在应用程序的启动脚本中加入

若是应用程序是tomcat,那么能够再tomcat的启动脚本startup.sh中加入‘ulimit –n 65535’来限制用户最多可使用65535个文件描述符

三、      直接在shell命令终端执行ulimit命令

这种方法的资源限制仅仅在执行命令的终端生效,在退出或者和关闭终端后,设置失效,而且这个设置不影响其余shell终端

 

解决问题:

在了解ulimit知识后,接着上面的案例,既然ulimit设置没有问题,那么必定是设置没有生效致使的,接下来检查下启动tomcat的www用户环境变量是否添加ulimit限制,检查后发现,www用户并没有ulimit限制。因而继续检查tomcat启动脚本startup.sh文件是否添加了ulimit限制,检查后发现也没有添加。最后考略是否将限制加到了limits.conf文件中,因而检查limits.conf文件,操做以下

# cat/etc/security/limits.conf |grep www

www soft nofile65535

www hard nofile65535

从输出可知,ulimit限制加在limits.conf文件中,既然限制已经添加了,配置也没有什么错,为什么还会报错,通过思考,判断只有一种可能,那就是tomcat的启动时间早于ulimit资源限制的添加时间,因而首先查看下tomcat启动时间,操做以下

# uptime

Up 283 days

# pgrep –f tomcat

4667

# ps –eopid,lstart,etime|grep 4667

4667 Sat Jul   6 09;33:39 2013 77-05:26:02

从输出能够看出,这台服务器已经有283没有重启了,而tomcat是在2013年7月6日9点启动的,启动了将近77天,接着继续看看limits.conf文件的修改时间,

# stat/etc/security/limits.conf

经过stat命令清除的看到,limits.conf文件最后的修改时间是2013年7月12,晚于tomcat启动时间,清楚问题后,解决问题的方法很简单,重启一下tomcat就能够了。

 

问题五、(Apache常见错误故障案例)”no space left on device “错误与解决方法

错误现象: 客户反映在执行”apachectl start “启动Apache是无报错信息,可是仍是不能访问网页,客户的网站是基于Apache+PHP+mysql 的在线交易平台,听到客户描述的现象后,第一反应就是防火墙屏蔽了HTTP端口或selinux的问题,因而登录服务器查看相关信息,从输出信息能够看出,防火墙全部的策略都处于开放状态,并未作出任何限制,而selinux也处于关闭状态,应该不是防火墙致使的。既然不是防火墙致使的,那么看看httpd进程是否存在及httpd端口是否正常启动

# ps –ef |grep httpd|grep –v “grep” |wc –l

0

# netstat –nultp|grep 80

# /usr/local/apache2/bin/apachectlstart

# ps –ef |grpe httpd |grep –v “grep” |wc –l

0

这个操做首先查看了服务器上的httpd进程,发现并无HTTP进程运行,同时httpd对应的端口80也并无启动,因而重启Apache,在启动Apache的过程当中并无报错,启动完成后发现仍然HTTP进程没有运行,由此看来,应该是Apache内部出现了问题

解决思路:

在判断Apache问题后,首先要看的就是Apache的启动日志,在查看Apache的error日志后,发现了一个可疑输出,内容为:

No space left ondevice : mod_rewrite: could not create rewrite_log_lock configuration failed

看到这个错误提示,感受应该是磁盘空间耗尽致使,因而赶忙查看系统系统全部磁盘分区,结果发现全部磁盘分区都还有不少可用空间,这就奇怪了,在前面的案例介绍中,详细介绍了linux对磁盘空间的占用分为三个部分:物理磁盘、inode节点磁盘空间和信号量磁盘空间。经过检查服务器的物理磁盘空间,发现仍有不少剩余,所以排除物理空间的问题,接着经过”df -i”命令查看系统可用的inode节点,发现每一个分区能够用的inode还有不少,这样inode节点问题也被排除了,那么应该是信号量磁盘空间耗尽致使的。

这里简单的介绍下linux信号量相关知识。信号量是一种锁机制,用于协调进程之间互斥的访问临界资源,以确保某种共享资源不被多个进程同时访问。Linux系统的信号量是用于进程间通讯的。它有两种标准实现,分别是POSIX及System v ,如今大多数linux系统都实现了这两种标准,这两种标准均可用于进行线程间的通讯,只是系统调用方式略有不一样。

System v 信号量经过系统调用semget来建立,经过linux命令ipcs便可显示进程间通讯用的system v 类型信号量及共享内存。

Posix 信号量可用于线程和进程间通讯,并可分为有名和无名两种,也能够理解为是否保存在磁盘上。

解决问题:

# cat/proc/sys/kernel/sem

# ipcs –s |grepdaemon

Daemon是启动Apache进程的用户,默认是daemon,也多是nobody用户,根据实际环境而定。解决信号量耗尽的方法很简单,经过ipcrm命令清除便可,最简单方法是执行以下命令组合:

# ipcs –s |grepnobody |perl –e ‘while (<STDIN>) { @a=split(/\s+/);print `ipcrmsem $a[1]`}’

问题六、linux系统没法启动的解决方法

这是linux最多见的故障,系统在掉电,以及执行配置更新、软件升级、内核升级后都有可能致使系统没法启动,究其缘由,可能有不少种,常见的以下几种:

1)      文件系统破坏,通常是linux的根分区文件系统遭到破坏,致使系统没法启动,这种状况通常是有系统忽然掉电或者非法关机引发的。

2)      文件系统配置不当,好比/etc/inittab文件、/etc/fstab文件等配置错误或丢失,致使系统错误,没法启动,这种状况通常是执行配置更新时人为致使的

3)      Linux内核文件丢失或者崩溃,从而致使系统没法引导启动,这种状况多是内核升级错误或者内核存在bug引发的

4)      系统引导程序出现问题,好比grub丢失或者损坏,致使系统没法引导启动,这种状况通常是人为修改错误或者文件系统故障致使的。

5)      系统硬件故障,好比主板、电源、硬盘等出现问题,致使linux系统没法正常启动,这种状况基本都是因为服务器硬件问题致使的。

文件系统破坏致使系统没法启动

Checking rootfilesystem

/dev/sda6 containsa file system with errors, check forced

An error occurredduring the file system check

这个错误能够看出,操做系统/dev/sda6分区文件系统出现了问题,这个问题发生的机率很高,一般引发这个问题的缘由主要是系统忽然断电,引发文件系统结构不一致,通常状况下,解决此问题的方法是采用fsck命令,进行强制修复。

# umount /dev/sda6

# fsck.ext3 -y /dev/sda6

访问权限问题

当某些服务不能访问的时候,必定要检查是否被linux本机防火墙iptables屏蔽了,能够经过iptables –L –n  命令检查iptables的配置策略。

# iptables –L –n

# iptables –AINPUT –i eth0 –p tcp --dport 80 –j ACCEPT

# iptables –AOUTPUT –p tcp --sport 80 –m state –state ESTABLISHED –j ACCEPT

相关文章
相关标签/搜索