当前位置: 首页 > news >正文

Linux故障排查思路

一、Linux日志分析

1、Linux系统日志与分类    

1)内核及系统日志

这种日志数据由系统服务syslog统一管理,根据其主配置文件"/etc/syslog.conf"中的设置决定将内核消息及各种系统程序消息记录到什么位置。

2)用户日志

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

3)程序日志

有些应用程序运会选择自己来独立管理一份日志文件(而不是交给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命令查看。

 dmesg:

secure:

last:

lastb:

lastlog:

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

1、单用户模式

这个问题出现的几率是很高的,不过,在linux下解决这个问题也很简单,只需重启linux系统,然后引导进入linux的单用户模式(init 1),由于单用户模式是不需要输入登录密码的,因此,可以直接登录系统,修改root密码即可解决问题。

重点内容:如何重启系统,进入单用户模式(centos6.x和centox7.x方式不同)

1、CentOS6单用户模式

按e进入如下界面:

选中第二行再次按e进行编辑:

 

输入quiet single回车,返回上一界面:

按b进入单用户模式:

重置密码然后reboot。 

2、CentOS7单用户模式

 选中对应的内核,同样按e:

在linux16一行,最后添加init=/bin/sh:

 Ctrl+X保存,自动引导:

 进入的终端不可写,重新挂载根分区:

单用户下中文无法显示,export切换为英文:

 

修改密码要生效,需要在根目录下创建隐藏文件autorelabel,否则在selinux启用状态下重启无法登陆系统。

单用户找不到reboot重启命令,exec /sbin/init 重启:

 

2、/boot/grub/grub.conf 文件解读    

CentOS6系统内核引导文件: 

default=0:  定义了没有选择内核菜单的启动项时选择第一个内核启动。
timeout=5 : 定义了没有任何操作时5s的超时时间。
splashimage=(hd0,0)/grub/splash.xpm.gz   定义了开机时内核选择菜单的背景图片,可以不写这一行,但是写错也会导致机器无法启动!
hidemenu:   隐藏内核选择菜单,按任意键出现选择菜单,可以不写这一行。
title:内核名字标题。
root(hd0,0) :  相对下面的内核和initrd全局定义root为第一块磁盘的第一个分区,此处的root不是真的root,而是开机时的/boot 分区,因为bootloader开机还没有加载内核以及/分区。加载的内核需要通过/boot分区加载/分区和内核。
kernel :  定义内核文件位置,向内核文件传递必要的参数。并且指定  /  分区所在的位置
initrd:  包括加载根分区的必要的驱动以及可以在内存当中解压释放出虚根用于加载真正的内核文件

CentOS7系统内核引导文件/etc/grub2.cfg: 

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

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

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

checking root filesystem
/dev/sdb5 contains a file system with errors, check forced
/dev/sdb5: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY
(i.e., without -a or -p options)  FAILED
Press enter for maintenance
(or type Control-D to continue):
give root password for maintenance

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

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

[root@localhost /]# fsck .ext4 -y  /dev/sdb5

修复完成,reboot即可。 

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

/etc/fstab文件存放了系统中文件系统的相关信息,在linux启动时,系统会读取此文件,自动挂载linux的各个分区,如果此文件配置错误,或者丢失,就会导致系统无法启动,具体的故障现象是在检测mount partition时出现:

starting system logger

 此后系统启动就停止了。

解决方法:

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

进入单用户:

单用户下命令无法执行:

进入援救模式,需要单独的引导光盘,选择troubleshooting:

选择第二项,进入援救模式:

 

选择1,以读写模式将根分区挂载到/mnt/sysimage:

/是iso安装介质虚拟根目录,/mnt/sysimage才是服务器下对应的数据:

 查看/etc/fstab挂载信息:

修改完,将iso引导介质拔掉,reboot让从硬盘启动:

CentOS6下援救模式使用:

 

选择默认配置:

选择continue,以读写模式挂载:

 

输入fdisk -l查看分区信息:

查看挂载点信息: 

可以看到最后一个挂载点信息:

挂载文件系统,查看里面有什么文件: 

把引导光盘拔掉,reboot重新启动。 

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

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

(2)如果是linux的引导程序出现问题,那么也可以通过光盘引导的方式进入linux修复模式,然后修改对应的引导程序或者重新安装引导程序。

(3)如果linux内核崩溃或者丢失,同样可以先进入linux rescue模式下,然后加载root分区,最后重新编译内核。

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

现象:

java.lang.RuntimeException: Cannot make directory: file:/www/data/html/2018-03-21

思路:

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

原因:

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

[root@localhost ~]# umount /www/data
[root@localhost ~]# fsck -y  /dev/sdb1

修复完成后,再重新挂载回去:

 

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

故障现象:

su: warning: cannot change directory to /home/oracle: Permission denied

解决思路:

1. 用户目录/home/oracle权限问题;

2. su程序执行权限问题;

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

4. selinux问题导致;

5. 系统根空间问题;

产生原因:

查看su依赖的系统库文件,看看有没有丢失:

系统库文件没有丢失。

发现根目录root没有执行权限,二进制文件要有执行权限。

 

查看根目录详细信息:

根目录权限问题导致,修改根目录权限即可。

[root@localhost ~]#chmod 555 /

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

现象:

Web无法正常访问,查看Tomcat日志:

java.io.IOException: Too many open files

思路:这个案例涉及到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限制的添加时间晚于tomcat最后一次的启动时间,而在此期间内,tomcat服务一直未重启过,操作系统也一直未重启过,那么ulimit资源限制对于tomcat来说始终是不生效的。

解决过程:

[root@tomcatserver ~]# pgrep –f  tomcat                     
12031
[root@tomcatserver ~]#  ps -eo pid,lstart,etime|grep 12031
12031 Tue Apr 17 14:25:48 2018       47:03
[root@tomcatserver ~]# stat /etc/security/limits.conf

Java进程是www用户启动的,切换用户查看:

临时修改最大打开文件数为655460:

永久修改:

 

修改了/etc/security/limits.conf,还要看/etc/security/limits.d/20-nproc.conf是否有设置,会以20-nproc.conf为主。

 

 tomcat进程启动时间与修改配置文件时间对比:

重启tomcat即可正常访问web页面。

七、Linux网络故障处理思路和经验

1、检查网线状态

到机房里检查网线两端是否都亮灯,普通服务器的话应该是绿灯常亮为正常,交换机绿灯闪烁表示正在传输数据。

也可以通过命令ethtool ethX来查看某一网卡的链路是否物理连通。

2、检查网卡状态

查看网卡驱动是否加载正常,可用命令有:

ethtool -i ethX
lsmod
ifconfig
lspci|grep  Ethernet

ethtool:

可以查看网卡驱动:

 

有了驱动,通过lsmod查看是否加载驱动:

 

ifconfig查看网卡状态是否为UP:

 

查看服务器网卡硬件信息:

3、检查网卡配置文件

/etc/sysconfig/network-scripts/ifcfg-eth0、em1、enp0s3
/etc/sysconfig/network
/etc/hostname

RHEL/Centos7.0以及之后的系统版本中,所有网络设置和管理都统一由NetworkManager服务来维护,相对于旧的/etc/init.d/network脚本管理方式,NetworkManager是动态的、事件驱动的网络管理服务。

关闭NetworkManager服务的命令如下:

[root@localhost network-scripts]# systemctl  stop NetworkManager
[root@localhost network-scripts]# systemctl  disable  NetworkManager
ip<-----ifconfig
ss<-----netstat

4、检查DNS解析文件是否设置正确

/etc/resolve.conf:可指定需要的域名服务器(注意NetworkManager会自动管理DNS解析文件)。
nslookup命令诊断DNS解析功能。

5、检查系统防火墙iptables和selinux的状态

iptables -L -n
more  /etc/selinux/config    (setenforce 1|0)

6、检查网络连通性以及路由信息

(1)通过ping命令查看网络连通性

ping www.ixdba.net

(2)通过route命令检查系统路由表信息是否正确

route -n

(3)通过mtr、traceroute命令检查远程路由信息

mtr www.163.com

(4)通过telnet、netstat命令检查主机端口与服务状态

telnet www.ixdba.net 80
netstat -antlp

相关文章:

  • 【@EnableAspectJAutoProxy为符合切点的目标 bean 自动创建代理】
  • 【多式联运】基于帝国企鹅算法+遗传算法+粒子群算法求解不确定多式联运路径优化问题【含Matlab源码 2073期】
  • 2022年0902Maven的继承和利用Idea创建Maven工程的内容<第五课>
  • SQL 3小时快速入门 学习b站的笔记
  • jQuery表单属性过滤器:过滤<input>标签、<select>标签
  • unity官方教程 -- Hi Shader学习笔记 Chapter 1
  • 什么是优化
  • 基于Springboot+vue的论坛管理系统 elementui
  • 大量if else的优化方案
  • 牛客 NC24755 [USACO 2010 Dec S]Apple Delivery
  • Git做版本管理及CHANGELOG
  • python经典编程100例(1)
  • GO语言 | go work 神一般的管理 多个module没烦恼
  • 【C语言】指针数组
  • 基于51单片机数字电压表仿真设计_数码管显示
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • echarts的各种常用效果展示
  • Electron入门介绍
  • git 常用命令
  • Invalidate和postInvalidate的区别
  • JavaScript 一些 DOM 的知识点
  • java中具有继承关系的类及其对象初始化顺序
  • Js基础知识(一) - 变量
  • log4j2输出到kafka
  • Mocha测试初探
  • 离散点最小(凸)包围边界查找
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 排序(1):冒泡排序
  • 深度学习中的信息论知识详解
  • 小试R空间处理新库sf
  • (1) caustics\
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (5)STL算法之复制
  • (6)设计一个TimeMap
  • (C++17) optional的使用
  • (C++17) std算法之执行策略 execution
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (八)c52学习之旅-中断实验
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (转)项目管理杂谈-我所期望的新人
  • .Net 4.0并行库实用性演练
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net core 6 redis操作类
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net连接MySQL的方法
  • @Autowired 与@Resource的区别
  • @TableLogic注解说明,以及对增删改查的影响
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [2016.7 day.5] T2
  • [30期] 我的学习方法