- 论坛徽章:
- 0
|
第13章 系统级故障诊断
- 13.4 系统崩溃
- 系统崩溃是指在没有卸下文件系统或未进行其它清理操作的情况下出现系统停机。也
- 称为"非正常关机"。系统崩溃有三种类型:
- ·告急 当系统遇到硬件问题或核心不一致,以至系统不能继续起作用,系统出
- 现"告急"。
- ·电源故障 当系统的电源失效时,即使很短时间系统也会崩溃。
- ·操作崩溃 如果系统由于操作员出错而"挂起",通常需要将系统复位并且重新引导
- 来解决这种问题。从操作员引起的崩溃中恢复与从系统告急中恢复类似。
- 注意,如果一个系统中包含有从一个已关闭的系统中安装的 NFS文件,
- 那么此系统就好像它已被挂起;在这种情况下,重新引导那个已关闭的
- 系统,或者在可能情况下,从你的系统把那个文件系统卸下来,就能解决
- 这个问题。
- 当系统正常关闭时,shutdown (ADM)程序终止所有精灵进程,杀死活动进程,卸下所有
- 已安装上的文件系统,运行sync(ADM)命令,并且告诉init(M)使系统进入相应的状态(或单
- 用户状态或"安全关闭电源")。
- 如果系统在这个关闭过程完成之前关闭,那么文件系统就有可能被破坏,从而导致数据
- 丢失。有些数据会由于高速缓存未被刷新到磁盘而丢失。操作系统会十分频繁地将缓冲区的内容刷新到磁盘中,所以因为非正常关闭而造成丢失的数据量也很少。不过,文件系统被破坏是普遍问题。如果根文件系统被破坏了,那么系统便不能正常工作。
- 当系统出于某种原因崩溃时,在系统日志本中记录一些数据并重新引导系统。
- 13.4.1 从系统告急中恢复
- 要从系统告急状态中恢复:
- (l)从控制台屏幕上将完整的 PANIC消息和 EIP值(正在执行的指令地址)抄录到系统日
- 志本中。关于确定EIP数值的操作,参见13.5.3节"获取EIP值"。
- (2)复位或重新开机,在Boot:提示符下按< Enter>重新引导系统。
- (3)当出现系统提示时,回答 yes保存PANIC时的内存副本。
-
- 注意: 我们建议将这些信息转储到磁带中,这样你就对这次告急有一个记录,以备需要时将
- 它与以后再次发生PANIC是的信息进行比较. 还可以把转储的数据送到SCO支持部门,如在13.6.2节"从SCO获得更多帮助"中所讨论的那样.
- 下面说明了如何将数据转储到磁带上。这个例子用的是/dev/rct0,但是如果系统上有
- /dev/rctmini这样的设备,使用它也能工作。
-
- There may be a system dump memory image in the swap device.
- Do you want to save it ? (y /n) y
-
- Use Floppy Drive 0 (/ dev /rfd0 ) by default
- Press ENTER to use default device.
- Enter valid Floppy Drive number to use if different
- Enter "t" to use tape
- >t
- Enter choice of tape drive:
- 1 - / dev / rct0
- 2 - / dev / rctmini
- n - no , QUIT
- >1
-
- Insert tape cartridge and press return ,or enter q to quit >
- <insert tape
- Wait
- Dd if = / dev / swap of = dev / rct0 / bs /=120b count =751 skip = 0
-
- Done . Use / etc /ldsysdump to copy dump from tape of diskettes
- Press return to sontinue>
-
- 我们强烈推荐你使用磁带而不是软盘来保存系统转储映像。典型的 SCO系统有很多兆
- 内存,所以要好几张软盘才能保存一个内存映像。如果没有足够的软盘,或者你插盘的
- 顺序弄错了就会出问题。可以在dumpdev设备转储出的数据上执行crash(ADM)命令,
- 或者重新引导系统并且将这些数据复制到磁盘上进行研究。参见"13.6节"用 CRASH
- 命令(ADM)检查内存转储"。
- 当系统告急时,系统将核心映像写到dumpdev设备上,它通常和swap设备一样。一旦
- 系统出现分页,数据就会马上被重写。详见(SCO OpenServer系统管理指南>(本系列丛
- 书之三)中"定义默认转储设备")一节。
- (4)如果你想用crash(ADM)命令研究转储映像,那么就要用ldsysdump (ADM)命令将映像复
- 制到磁盘。在下面的对话样本中,06May94就是将要复制的内存转储映像的文件名,不
- 过你可以使用任何具有某种含义的名字:
- # cd / tmp
- # ldsysdump 06May 94
-
- Use Floppy Drive 0( / dev /rfd0) by default
- Press ENTER to use the default
- Enter valid Floppy Drive number to use if different than default
- Enter "t"to use tape drive
- >t
- Enter choice of tape drive
- 1- / dev /rct0
- 2- /dev /rctmini
- n -no,QUIT
- >1
- Insert tape cartridge and press return ,or enter q to quit . >
- Wait.
- Dd if =/dev / rct0 bs = 120b count = 751
- System dump copied into image,Use crash(ADM)to analyze the dump
- (5)在提示检查根文件系统时,回答"y". 这样就能检查出, 并且在大多数情况下修复根文
- 件系统所遭受的破坏. 在极少数的情况下, 操作系统完全损坏了, 必须进行恢复或重
- 装. 详见10.1.3节"清理文件系统".
- (6)对那些系统出现告急时已安装上的文件系统,执行fsck(ADM)命令. 系统在进入多用
- 户时,将自动对所有标记为有问题的文件系统执行这个过程, 但是通过人工执行fsck
- 命令,可以控制对所发现问题的回答. 详见fsck (ADM)手册页.
- (7)确证安全系统的完整性. 进一步信息参见<SCO OpenServer系统管理指南>(本系列丛
- 书之三)中"系统文件完整性检查: 完整性(ADM)".
- 13.4.2 掉电后的恢复
- 如果没有配置不间断电源 UPS,那么在掉电时要关闭机器. 这样在电源波动时减少对系统可能的损坏。
- 一旦重新通电,如10.1.3节"清理文件系统"所述, 必须清理文件系统.
- 13.4.3 自动重新引导
- 可以把 SCO OPenServer系统配置成在告急或掉电后自动重新引导,有关内容在10.5.1节"改变系统重新启动选项"中叙述。
- 注意: 如果把系统设置成出现告急后自动重新引导,那么就会失去可以帮助你分析故障原
- 因的内存转储数据
- 13.5 分析系统故障
- 除了恢复系统,分析系统故障的原因是十分重要的,这样你可以在发生另一次系统故障前排除这些故障。 SCO系统提供许多工具帮助进行这种分析。
- 13.5.1 自陷、故障及异常
- 自陷、故障和异常是 CPU在为某个用户进程(在用户态或系统态执行)、在系统态执行的系统进程(例如,sched , vhand或bdflush之类系统精灵进程)或者中断例程执行指令时检
- 测到的特殊条件。这些特殊条件使 CPU切换到系统态,并且执行核心的的自陷处理程序。
- 如果自陷发生在用户态(换句话说,如果自陷由用户进程造成),核心通常向该进程发一
- 个信号。例如,如果一个进程执行了一条引起被零除错误的指令, CPU就产生一个被零除异常,自陷处理程序最终要向该进程发出一个SIGFPE(浮点出错)信号(参见signal ( S)手册贝
- 可得到所支持的信号的完整清单)。某些用户异常是合法的,不产生信号。例如,一个进程
- 可能要重新引用一个有效的指针,而该指针标识的是该进程数据段中一片已调出了主存储
- 器的数据。CPU则产生一个页故障,自陷处理程序就将此页数据从对换区装人内存,并且重新开始执行引起出错的指令。在这种情况下,自陷处理程序就不向进程发出信号。
- 然而,如果一个进程引用一个无效的指针(该指针可能已被破坏或未初始化),自陷处理
- 程序将确定不能从文件系统或对换区中装人相应的分页,并且向该进程发出一个SIGSEGV
- (段损坏)信号。
- 除了在少数特殊场合下,不允许核心(换句话说,在执行系统调用、系统进程和中断例程时)"自已"产生自陷、故障和异常。如果核心不产生出错消息,那么情况就很严重,系统不能继续运行。自陷处理程序调用核心内部的一个特殊panic ( )例程,此例程中止系统执行。
- 当系统由于寻址错误而产生告急时, CUP寄存器的当前内容将显示在控制台上,该机器存储器的内容写到dumpdev设备(通常是对换设备)中,并且系统产生一个对核心 haltsys( )
- 函数的内部调用.
- 13.5.2控制台告急信急
- 写到控制台上的信息通常包括CPU寄存器的当前内容,以及核心出错消息和自陷号,为分析告急情况提供了有价值的信息。同样的显示信息也可以通过在已转储的设备上执行
- crash(ADM)命令的panic功能得到。注意某些系统崩溃并不产生寄存器的转储。
- 系统出现告急时控制台的显示和下面的内容相似。行号仅作参考,并不出现在实际的显示内容中。
- 1 PANIC: NEED NEW DISPLAY
- 2 cr0 0x FFFFFFEB cr2 0x0 0FFFFFF cr3 0x00002000 tlb 0x00500E80
- 3 ss 0x00000038 uesp 0xD0119554 ef1 0x00010282 ipl 0x00000000
- .......
- 8 PANIC : Kernel mode trap . Type ox0000000E
- 9 Trying to dump NNNN pages
- 10 &..........................................................
- 11&.............................................................
- 12 NNNN pages dumped
- 13 * * safe to power off
- 14 - or -
- 15 * * press Any key to reboot
- NNNN的值取决于系统所配置的内存总量,在屏幕上显示的每个点都对应一个64K
- 的内存块(或者16个4K的页)。因此,内存配置较多的系统就比内存配置较少的系统有更
- 多的点。
- 13.5.3获取EIP值
- EIP(指令指针)值可以通过系统告急时显示在控制台上的 CPU寄存器的内容计算得出。EIP值是核心在出现告急时正在执行的指令的地址。
- 要计算EIP值,将代码段(寄存器)和指令指针(eip寄存器)的寄存器值联起来成为一对数值,该值用逗号分隔,去掉前面的零。在上面的样本中,这两个值在第4行。cs的值为0xc00000158,eip的值为0xD007448, 因此,EIP值为158: D 0070488。
- 可以比较几次告急的值来确定该告急是由软件还是硬件原因造成的。三次或更多次同样的EIP值通常表示一个软件上的问题;连续几次告急具有不同的EIP值,表示硬件上的问
- 题,如内存板损坏。这并没有固定的规则,例如,有缺陷的RAM能产生多次具有相同的EIP
- 值的告急。
复制代码 |
|