Linux系统故障排查思路与常见案例

1、Linux系统日志与分类

内核及系统日志

这种日志数据由系统服务syslog统一管理,根据其主配置文件“/etc/syslog.conf”中的设置决定将内核消息及各种

系统程序消息记录到什么位置。

用户日志:

这种日志数据用于记录Linux系统用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。

程序日志:

有些应用程序运行会选择自己来独立管理一份日志文件(而不是交给syslog服务管理),用于记录本程序运行过程中的各种事件信息。

2、Linux下日志文件解读:

Linux系统本身和大部分服务器程序的日志文件默认情况下都放置在目录 /var/log 中。

/var/log/messages : 公共日志文件,记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。

对于未使用独立日志文件的应用程序或服务,一般都可以从该文件获得相关的事件记录信息。

/var/log/cron : 记录crond计划任务产生的事件消息。

/var/log/dmesg: 包含内核缓冲信息(kernel ring buffer)。在系统启动时,会在屏幕上显示许多与硬件有关的信息。此文件记录的信息是上次启动时的信息。

而用dmesg命令可查看本次系统启动时与硬件有关的信息,以及内核缓冲信息。

/var/log/maillog : 记录进入或发出系统的电子邮件活动。

/var/log/boot.log : 记录系统启动时的软件日志信息。

/var/log/secure : 记录用户远程登录、认证过程中的事件信息。

/var/log/wtmp : 记录系统所有登录进入和退出纪录。可执行last命令查看。

/var/log/btmp : 记录错误登录进入系统的日志信息,可执行lastb命令查看。

/var/log/lastlog: 记录最近成功登录的事件和最后一次不成功的登录事件。可执行lastlog命令查看。

export LANG=en_US (把shell终端变为英文。)

#lastlog (查看最近登录信息)

#locale (查看系统编码格式)

二、忘记linux root密码故障与解决案例

1、单用户模式

这个问题出现的几率是很高的,不过,在linux下解决这个问题也很简单,只需重启linux系统,然后引导进入linux的单用户模式(init 1),

由于单用户模式是不需要输入登录密码的,因此,可以直接登录系统,修改root密码即可解决问题。

进入单用户模式centos6.x和centos7.x不同。

centos6.x进入单用户模式:

在启动刚开机时有欢迎界面,马上按上、下、左、右键。进入GRUB界面,再按键盘上“e”键。进入新的界面。选择 “kernel ...”这行(内核),按键盘上“E”键。

进入新的界面,此时可以输入字符。输入“single”按回车。再次进入“kernel ...”界面,继续选择此行,按“b”键。开始自动引导,自动进入单用户模式。

此时可以修改密码: #passwd root(表示修改root用户密码)。 按提示输入密码,完成,reboot。完成密码修改。

#cd /etc/grub.cfg(centos6.9开机文件的设置)

centos7.x进入单用户模式修改密码:

在启动时的引导界面,选择“CentOS Linux....”内核,按键盘“E”键,进入到新的界面,把光标移动到“Linux16 /... root=UUID=...”这行,在这行加入内容,把光标放到这行最后,

...UTF-8这里,输入 “init=/bin/sh”加完后让继续引导,按Crt和x。进入到shell终端,开始重置密码。先把根分区变为可写,输入: # mount -o remount,rw /(把根分区重新挂载,让可读可写)。

更改密码 # passwd root(修改root用户密码),修改完成。进入#cd /etc/selinux/ 查看 #more config 。在根目录下常见一个文件: # touch /.autorelabel 或把 /etc/selinux下的config文件

里的 SELINUXTYPE的值改为 disabled。此时完成密码修改,重启系统。 使用 # exec /sbin/init (centos7单用户模式下用此命令重启。)

#cd /etc/grub2.cfg(centos7开机文件的设置)

三、系统无法启动故障案例

1、root文件系统破坏,导致系统无法启动故障案例。

这种情况多由于异常断电、不正常关机,引起文件系统结构不一致的。此种问题发生,在系统启动的时候,屏幕会显示:

checking root filesystem

/dev/sdb5 contains a file system with errors , check forced

/dev/sdb5: UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY

....

press enter for maintenance

(or type Control-D to continue):

give root password for maintenance

从这个错误可以看出,系统根分区文件系统出现了问题,系统在启动时无法自动修复,然后进入到了一个交互界面,提示用户进行系统修复。

解决方法: 输入root密码后进入系统修复模式,在修复模式下,可以执行 fsck命令,如:

#fsck .ext4 -y /dev/sdb5 (文件系统是ext4,就用.ext4格式修复)

加入boot分区出现问题,先卸载该分区。# umount /boot

修复 #fsck /dev/sda1(/dev/sda1为boot分区对应的路径)

2、/etc/fstab文件丢失,导致系统无法启动案例

/etc/fstab文件存放了系统中文件系统的相关信息,在linux启动时,系统会读取此文件,自动挂载linux的各个分区,如果此文件配置错误,

或者丢失,就会导致系统无法启动,具体的故障现象是在检测mount partition时出现: starting system logger .此后系统启动就停止了。

解决方法:

利用Linux rescue 修复模式登录系统,进而获取分区和挂载点信息,重构/etc/fstab文件。

Linux系统无法启动的通用解决方案。

1,进入单用户模式或援救模式(rescue),修复分区错误或者备份数据,然后修复或重新安装系统。

进入援救(rescue)模式方式:通过iso磁盘或者U盘,选择到其启动,选择troubleshooting 。进入新的界面,选择 Rescue a CentOS system进入,

等进入新的界面,根据情况选择,continue ,第一个为continue,输入1.到新的界面,可以输入命令。#df -h。进入 #cd /mnt/sysimage/ 再进入#cd /etc .

#vi /etc/fstab。

如果fstab文件丢失,则系统不能正常启动。

四、“Read-only file system”错误与解决案例

如现象: java.lang.RuntimeException:Cannot make directory:file:/www/data/html/2021-01-24

思路:可能是服务器磁盘故障(磁盘空间满了或者磁盘无法写入了)

原因:磁盘分区出现了问题,导致文件系统结构不一致,文件系统关闭了写功能,需要修复文件系统结构:

#umont /www/data (先卸载出现问题的分区)

#fsck -y /dev/sda7(修复出问题的分区对应的硬件分区地址)

#mount /dev/sda7 /data1(修复完成后,重新挂载该分区)

五、su命令切换用户带来的问题

故障现象: su:warning:cannot change directory to /home/oracle: Permission denied

解决思路:

用户目录/home/oracle权限问题

su程序执行权限问题

程序依赖的共享库权限问题

selinux问题导致

系统跟空间问题

产生原因: 根目录权限问题导致,修改根目录权限即可。 #chmod 555 /

#ldd /bin/ls (查看ls命令依赖的库文件),ldd命令用来查看系统命令依赖的库文件。

#more /etc/selinux/config (查看selinux配置文件。)

#stat / (查看目录或文件的权限信息)

六、“Too many open files”错误与解决方法:

如现象: java.io.IOException: Too many openfiles

思路:这个案例涉及到linux下ulimit命令的使用,ulimit主要是用来限制进程对资源的使用情况的,它支持各种类型的限制。

ulimit -a

-a :显示当前系统所有的limit资源信息。

-H :设置硬资源限制,一旦设置不能增加。

-S :设置软资源限制,设置后可以增加,但是不能超过硬资源设置。

-c : 最大的core文件的大小,以blocks为单位。

-f : 进程可以创建文件的最大值,以blocks为单位。

-d : 进程最大的数据段的大小,以kbytes为单位。

-m : 最大内存大小,以kbytes为单位。

-n : 可以打开的最大文件描述符的数量。

-s : 线程栈大小,以Kbytes为单位。

-P : 管道缓冲区的大小,以kbytes为单位。

-U : 用户最大可用的进程数。

-v : 进程最大可用的虚拟内存,以kbytes为单位。

-t : 最大CPU占用时间,以秒为单位。

-l :最大可加锁内存大小,以kbytes为单位。

#ulimit -n 655360 (修改可打开最大文件描述的数量为655360)此处修改为临时生效的。

需要永久保存需进入/etc/security/limits.conf 文件中配置,此处设置系统级的资源配置。

vi /etc/security/limits.conf

处理/etc/security/limits.conf文件还有一个/etc/security/limits.d/20-nproc.conf文件,此文件在centos7中。

前后两个文件以后面的文件设置为准。