Linux 中异常是如何处理的?

Linux 中异常是如何处理的?,第1张

在程序的执行过程中,因为遇到某种障碍而使 CPU 无法最终访问到相应的物理内存单元,即无法完成从虚拟地址到物理地址映射的时候,CPU 会产生一次缺页异常,从而进行相应的缺页异常处理。基于 CPU 的这一特性,Linux 采用了请求调页(Demand Paging)和写时复制(Copy On Write)的技术

1. 请求调页是一种动态内存分配技术,它把页框的分配推迟到不能再推迟为止。这种技术的动机是:进程开始运行的时候并不访问地址空间中的全部内容。事实上,有一部分地址也许永远也不会被进程所使用。程序的局部性原理也保证了在程序执行的每个阶段,真正使用的进程页只有一小部分,对于临时用不到的页,其所在的页框可以由其它进程使用。因此,请求分页技术增加了系统中的空闲页框的平均数,使内存得到了很好的利用。从另外一个角度来看,在不改变内存大小的情况下,请求分页能够提高系统的吞吐量。当进程要访问的页不在内存中的时候,就通过缺页异常处理将所需页调入内存中。

2. 写时复制主要应用于系统调用fork,父子进程以只读方式共享页框,当其中之一要修改页框时,内核才通过缺页异常处理程序分配一个新的页框,并将页框标记为可写。这种处理方式能够较大的提高系统的性能,这和Linux创建进程的 *** 作过程有一定的关系。在一般情况下,子进程被创建以后会马上通过系统调用execve将一个可执行程序的映象装载进内存中,此时会重新分配子进程的页框。那么,如果fork的时候就对页框进行复制的话,显然是很不合适的。

在上述的两种情况下出现缺页异常,进程运行于用户态,异常处理程序可以让进程从出现异常的指令处恢复执行,使用户感觉不到异常的发生。当然,也会有异常无法正常恢复的情况,这时,异常处理程序会进行一些善后的工作,并结束该进程。也就是说,运行在用户态的进程如果出现缺页异常,不会对 *** 作系统核心的稳定性造成影响。 那么对于运行在核心态的进程如果发生了无法正常恢复的缺页异常,应该如何处理呢?是否会导致系统的崩溃呢?是否能够解决好内核态缺页异常对于 *** 作系统核心的稳定性来说会产生很大的影响,如果一个误 *** 作就会造成系统的Oops,这对于用户来说显然是不能容忍的。本文正是针对这个问题,介绍了一种Linux内核中所采取的解决方法。

在读者继续往下阅读之前,有一点需要先说明一下,本文示例中所选的代码取自于Linux-2.4.0,编译环境是gcc-2.96,objdump的版本是2.11.93.0.2,具体的版本信息可以通过以下的命令进行查询:

$ gcc -v

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs

gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)

$ objdump -v

GNU objdump 2.11.93.0.2 20020207

Copyright 2002 Free Software Foundation, Inc.

处理问题时必定不能盲狙,将所有解决办法都试上一遍。这生产环境中,解决出现的问题是最优先的事情,当然前提是这问题会影响用户的使用或即将影响到的。

处理每个问题必然可按具体问题进行分类,根据每一类按对应的解决思路来执行。

但像处理一个网络问题的时候,上至系统防火墙的配置、下至硬件故障。如果处理一个问题都按固定流程来进行的话,那必然效率将非常低下。下为处理网络故障的一般流程。

1、网络硬件问题检查。                     (机率较低)

2、检查网卡能否正常工作。            (较高、主要表现为人为配置错误)

3、检查局域网之间联机是否正常。(非常高)

4、检查DNS是否设定正确。            (较低)

5、服务是否正常打开。                     (低)

6、检查访问权限是否打开。            (较高)

假如从1至6是标准的处理网络问题的流程,这样的处理方式效率低下。处理问题可以有整体的流程,但是实际 *** 作中可先对出现机率更高的步骤进行检查、或采取2分法缩小产生问题的范围,虽然上述较的两个方法不一定对所有问题都试用,但对于大多数的网络问题来说处理效率有者显著的提升。

个人总结的情况如下。

1、lsmod | grep ip            查看相关的网卡模块是否已加载

2、ifconfig -a                    能使用该命令查找到对应网卡配置信息,则说明网卡驱动程序正常

3、使用ping命令、依次ping自己、ping局域网主机、ping网关

        ping自己异常,问题:服务异常、网卡配置未生效

        ping局域网主机异常,问题:配置文件有误、网卡配置未生效、网线损坏

        ping网关异常,问题:配置文件有误、网卡配置未生效

4、当前3步还不能正常上外网的话。所有route查看默认路由表。

        处理方法:删除不必要的路由信息,并保证默认路由是从对应网关地址出去的。

5、临时停止iptables服务、SELinux服务、NetworkManager服务

6、如能上网但访问域名有异常时,那将需要检查/etc/hosts、/etc/resolv.conf两个配置

7、假如以上6步检查完毕之后,还发现不能上网。有如下可能。

        7.1、主机MAC地址被路由器禁止上网

        7.2、外网服务异常。如宽带账号欠费、光纤被挖断等物理攻击。

【摘要】

当Linux系统出现故障无法正常启动系统时,Linux准备了单用户模式、救援模式等方式可以让我们有效的处理这类问题。本文简单分享一个利用救援模式解决Redhat系统无法启动的案例。

【正文】

一、   问题背景

1)    问题描述

一台部署了RHEL 7.2的物理服务器,突发死机故障,在尝试重启时,发现服务器无法正常进入 *** 作系统,直接进入emergency mode。本文主要分享 *** 作系统启动异常的问题排查过程。(服务器死机据后续日志分析,确定为内核的bug所致,本文不进行累述)

2)   故障现象

系统启动后,提示无法找到/dev/mapper/rhel-root,并直接进入emergency mode。

二、   排查思路

1)    收集系统启动异常的相关提示信息,获取到问题关键点:

Warning:/dev/rhel/root does not exist

初步定为配置文件问题或者逻辑卷root本身问题;

2)    尝试在应急模式下检查逻辑卷状态,发现当前情况并不稳定,常用命令无法使用、显示多为乱码;

3)    尝试进入单用户模式,发现情况和应急模式一样;

Redhat 7.2进入单用户模式:

1、开机启动至内核选择界面,选择第一项,按e进行编辑

2、定位到linux16这一行,找到ro,修改其为rw init=/sysroot/bin/sh

3、按ctrl+X启动至单用户模式

4)    利用系统安装光盘,进入Linux救援模式,进行排查。

Redhat 7.2救援模式启动方法:

1、把光盘加入光驱,然后启动,以光盘进行引导,选择救援模式(中间具体的步骤不再细说)

2、文件系统挂载到/mnt/sysimage目录下,这时切换到此目录下使用chroot /mnt/sysimage这条命令即可

5)    在救援模式下,首先查看服务器lv的情况,发现所有lv

status均为未激活状态。

查看lv

#Lvdisplay

修改lv

#vgchange -a y /dev/docker/root

6)    在尝试修改root的lv status时,发现root所在的vg名和启动时所指定的vg名不一致,基本确定问题点;

7)    修复

l  编辑文件/etc/default/grub

l  修改此文件中GRUB_CMDLINE_LINUX一行中rd.lvm.lv为合适的值

l  再执行以下命令重做grub :

n UEFI: grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

n  非UEFI:grub2-mkconfig -o /boot/grub2/grub.cfg

l  查看文件grub.cfg中是否修改为rd.lvm.lv=rhel/root

l  修改/etc/grub2.cfg中root=后接的lv路径改为实际的路径。

8)    系统启动后,通过history日志,确定为该系统业务部署时,使用了vgrename命令修改了vg名。

三、   总结

对于Linux的问题处理,需要对Linux的运行原理有所理解,这此前提下才能根据有限的提示信息判断问题方向、确定排查范围、找到解决方法。同时,提醒各位初学linux的同事么,在进行linux的一些 *** 作时,需要充分考虑这些 *** 作可能造成的影响,避免类似上述的问题发生。

转自 嘉为教育-rhce认证_rhce培训_linux培训_linux认证_linux考证


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8238321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存