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中。
前后两个文件以后面的文件设置为准。