Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1182559
  • 博文数量: 128
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 4870
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-19 14:28
文章分类

全部博文(128)

文章存档

2010年(2)

2009年(22)

2008年(104)

我的朋友

分类:

2008-11-13 15:20:42

solaris系统崩溃管理

 

    当操作系统发生致命的错误时,它会生成一个crash dump文件,当一个进程发生致命的错误时,它生成一个core file.几个核心术语:
崩溃指crash,转储指dump,核心指core,内核指kernel.
   
    一、管理Crash Dump:

    发生一个致命的操作系统错误时,操作系统会打印一个描述该错误的消息到控制台,接着会产生一个crash dump,把物理内存内容的一部分写到预定义的dump device,此dump设备通常是一个本地磁盘分片,可以通过dumpadm命令来配置dump device.操作系统把crash dump写到dump device后就重新启动,Crash Dump用来帮助事后分析系统发生致命错误的原因。
    当操作系统崩溃时,savecore命令在系统引导期间被自动执行。savecore命令把崩溃转储的内容从转储设备重新写回到文件系统的一对文件中:
    (1). savecore命令把内核核心信息写在/var/crash/nodename/vmcore.X文件中,nodename是运行"uname -n"命令返回的名字,X是一个依次递增的整数,用来区分不同的dump文件。
    (2). savecore命令把名字列表(name list)信息和符号表信息(symbol table)放在/var/crash/nodename/unix.X文件中。
    在存放崩溃转储的目录中,会创建一个bounds的文件,该文件中保存有一个数字,该数字是保存下一个dump时使用的文件名的后缀(vmcore.Xunix.X中的X)
    转储设备的位置和savecore的目录配置可以使用dumpadm来配置,转储设备通常是被保留作为存放系统崩溃转储信息的磁盘空间(默认情况下,是一个swap分区)。应尽量选用一个备用的磁盘分区(单独的硬盘)作为一个专用的转储设备,可提供崩溃转储更高的可靠性,而且在系统发生故障时,能够缩短重启时间。
    (3). 显示当前的Crash Dump配置:
         [root@node01 /]#dumpadm
         Dump content: kernel pages(仅转储内核内存页)
         Dump device: /dev/dsk/c0t0d0s1 (swap) (Dump device是一个swap)
         Savecore directory: /var/crash/node01 (savecore文件的存放目录是/var/crash/node01)
         Savecore enabled: yes (savecore命令设置成重新启动时自动运行)
         Crash Dump的默认配置文件存放在/etc/dumpadm.conf文件中,不要手工编辑这个配置文件:
         [root@node01 /]#cat /etc/dumpadm.conf
        #
        # dumpadm.conf
        #
        # Configuration parameters for system crash dump.
        # Do NOT edit this file by hand -- use dumpadm(1m) instead.
        #
        DUMPADM_DEVICE=/dev/dsk/c0t0d0s1
        DUMPADM_SAVDIR=/var/crash/node01
        DUMPADM_CONTENT=kernel
        DUMPADM_ENABLE=yes
    (4). 修改Crash Dump配置:
         dumpadm的选项说明如下:
         -n/-y     是否在重启时自动运行savecore命令
         -u     根据/etc/dumpadm.conf文件的内容强行更新kernel dump configuration
         -c content-type   指定crash dump的内容:allkernelcurproc;kernelkernel memory pages.
         -d dump-device
         -m mink/m/%    savecore命令存放转储文件的目录下创建一个minfree文件,该文件说明savecore命令至少应在目录所在的文件系统保留多少空间,参数写法:10m,10k,10%,此项不在/etc/dumpadm.conf中。
         -s savecore-dir   默认的目录为/var/crash/hostname/,hostname"hostname -n"的输出值。
         -r root-dir    Alternativ root directory,默认根目录是"/",指定dumpadm命令应在那个根目录下创建文件。
         例一:指定专用的转储设备:
         [root@node01 /]#dumpadm -d /dev/dsk/c0t1d0s0
               Dump content: kernel pages
                Dump device: /dev/dsk/c0t1d0s0 (dedicated)
               Savecore directory: /var/crash/node01
               Savecore enabled: yes
         例二:指定swap为转储设备:
         [root@node01 /]#dumpadm -d swap            
              Dump content: kernel pages
               Dump device: /dev/dsk/c0t0d0s1 (swap)
              Savecore directory: /var/crash/node01
              Savecore enabled: yes
         例三:转储当前在线系统,并立即执行savecore把转储的内容保存到转储文件中:
  [root@node01 /]#savecore -L
  dumping to /dev/dsk/c0t1d0s0, offset 65536, content: kernel
  100% done: 12558 pages dumped, compression ratio 2.78, dump succeeded
  System dump time: Wed Nov 12 10:27:37 2008
  Constructing namelist /var/crash/node01/unix.1
  Constructing corefile /var/crash/node01/vmcore.1
  100% done: 12558 of 12558 pages saved
         例四:查看转储文件:
         [root@node01 /]#ls /var/crash/node01/
  bounds    unix.0    unix.1    vmcore.0  vmcore.1
  [root@node01 /]#file /var/crash/node01/vmcore.0
  /var/crash/node01/vmcore.0:     SunOS 5.10 Generic_127127-11 64-bit SPARC crash dump from 'node01'
  [root@node01 /]#file /var/crash/node01/vmcore.1
  /var/crash/node01/vmcore.1:     SunOS 5.10 Generic_127127-11 64-bit SPARC crash dump from 'node01'
  [root@node01 /]#file /var/crash/node01/unix.0 
  /var/crash/node01/unix.0:       ELF 64-bit MSB executable SPARCV9 Version 1, UltraSPARC1 Extensions Required, statically linked, not stripped, no debugging information available
   [root@node01 /]#file /var/crash/node01/unix.1
  /var/crash/node01/unix.1:       ELF 64-bit MSB executable SPARCV9 Version 1, UltraSPARC1 Extensions Required, statically linked, not stripped, no debugging information available
  [root@node01 /]#more /var/crash/node01/bounds
  2

    二、管理core files:
        当一个进程异常终止时,它会产生一个core files,可用coreadm命令来指定生成core files的位置。
        (1). 显示当前的core files配置:
         [root@node01 /]#coreadm
         global core file pattern:
         global core file content: default
         init core file pattern: core
         init core file content: default
            global core dumps: disabled
         per-process core dumps: enabled
         global setid core dumps: disabled
         per-process setid core dumps: disabled
         global core dump logging: disabled 
         查看配置文件:
         [root@node01 /]#cat /etc/coreadm.conf
  #
  # coreadm.conf
  #
  # Parameters for system core file configuration.
  # Do NOT edit this file by hand -- use coreadm(1) instead.
  #
  COREADM_GLOB_PATTERN=        //放在全局目录下的全局核心文件使用的命名规范
  COREADM_GLOB_CONTENT=default
  COREADM_INIT_PATTERN=core    //per-process file必须使用的文件名规则,这里分配给init进程,意味着其他所有进程都继承此规则。
  COREADM_INIT_CONTENT=default
  COREADM_GLOB_ENABLED=no
  COREADM_PROC_ENABLED=yes     //激活在当前工作目录生成core file,权限为600,只有进程的拥有者可访问此core file
  COREADM_GLOB_SETID_ENABLED=no//禁止有setuidsetgid权限的进程生成core file
  COREADM_PROC_SETID_ENABLED=no
  COREADM_GLOB_LOG_ENABLED=no
     注意:拥有setuidsetgid的进程在它的地址空间里可能包含有敏感信息,而这些敏感信息是不能被这些无特权的进程拥有者访问的。出于这种安全考虑,在默认情况下,系统不会生成setuid files.
        (2). 修改core files配置:
         coreadm能够控制如何生成core文件。Pre-processglobal这两个核心文件的路径均可独自配置为激活或禁用。如果一个全局核心文件按路径激活并被设置为/corefiles/core,那么接着每个异常终止的进程都生成两个核心文件:一个存放在当前工作目录(pwd返回的路径),一个存放在
/corefiles/core目录,如果指定的核心文件目录还未创建,必须手工创建该目录。
 coreadm命令的语法以及参数说明:
 -p pattern 指定进程核心文件转储时的命名规范,重启消失
 -g pattern 指定全局核心文件转储时的命名规范,保存在/etc/coreadm.conf
 -i pattern 相当于-p pattern 1,init进程进行设置,保存在/etc/coreadm.conf
 -p content 指定进程核心文件转储的内容,关键词下祥
 -G content 指定全局核心文件转储的内容
 -I content 指定init进程核心文件转储的内容
 -e option 激活globalprocessglobal-setidpro-setid核心文件转储及log
 -d option 禁用如上选项
 -u   根据/etc/coreadm.conf文件的配置更新当前core file dump的配置,并使二者同步
 pattern中的可用变量:
 %p PID
 %g EGID(组名)
 %n 节点名(uname -n)
 %u EUID(用户名)
 %f 执行文件名
 %m 机器名(uname -m)
 %% Literal%
 %t 1970-1-1午夜至今的时间(按秒计)
 Solaris10特有的pattern变量:%z Zonename;%d 可执行文件目录或名字
  Content的变量
 使用以下标记来表明core file应包括一个进程的二进制映像的那些部分,默认的组合是:stack+heap+shm+ism+dism+text+data+rodata+anon+shanon+ctf;可用"+-"符号串联标记,比如default+ism,从默认的设置中取出ism.还可以使用all(以下所有标记都包括)none(不包括mapping).
 Content变量可用的关键词如下所示:
 anon 匿名专用映射,包括非主线程堆栈的线程堆栈
 ctf 被加载的对象文件的CTF类型信息部分
 data 可写的专用文件映射
 dism DISM映射
 heap Process heap
 ism ISM映射
 rodata 只读的专用文件映射
 shanon 匿名的共享映射
 shfile 被文件回退的共享映射
 shm System V的共享内存
 stack 进程堆栈
 symtab 被加载的对象文件的符号表部分(symbol table section)
 text 可读且可执行的专用文件映射
  coreadm例子
      (A)普通用户设置核心文件名格式(core file name pattern)
  当从一个用户的$HOME/.profile$HOME/.login文件中执行时,下面的命令为在登录会话期间运行的所有进程设置核心文件命名规则。-p指定pre-process core file的命名规则,没以"/"开始表示存放路径为当前有效工作路径。非特权用户只能对自己拥有的PID进程进行设置。
[ftpuser@node01 /]$coreadm -p core.%f.%p $$  //%f指进程的执行文件名,%pPID,$$当前shellPID.
  [ftpuser@node01 /]$coreadm $$
  1083:   core.%f.%p      default
  [ftpuser@node01 /]$whoami
  ftpuser
  [ftpuser@node01 /]$pgrep -l bash -u ftpuser
   1083 bash
  如果没有使用$$,因为省略了PID,所以pre-process核心文件命名规则会应用给当前运行的shell(PID)及被所有的子进程所继承。所有对具体进程的配置没保存在/etc/coreadm.conf文件中,重启后消失。
      (B)把一个用户的核心文件转储到子目录
  [candon@node01 ~]$coreadm -p $HOME/corefiles/%n.%f.%p
  [candon@node01 ~]$coreadm $$
  1187:   /export/home/candon/corefiles/%n.%f.%p  default
  如果一个用户使用不同的系统,但只有一个家目录在多个系统间共用时,以上配置非常有效。
      (c)激活并设置核心文件全局命名规范
  "-g"选项设置全局核心文件命名规范,路径必须是绝对路径。
  [root@node01 /]#coreadm -g /var/core/core.%f.%p -e global
  [root@node01 /]#coreadm
       global core file pattern: /var/core/core.%f.%p
       global core file content: default
         init core file pattern: core
         init core file content: default
             global core dumps: enabled
         per-process core dumps: enabled
        global setid core dumps: disabled
   per-process setid core dumps: disabled
       global core dump logging: disabled
      (d)设置初始核心文件命名规范。"-i""-g xxxx 1"作用基本相同,唯一区别是-i保存配置文件在/etc/coreadm.conf重启后不消失。
  [root@node01 /]#coreadm -i $HOME/coref/%n.%f.%p
  [root@node01 /]#coreadm
      global core file pattern: /var/core/core.%f.%p
       global core file content: default
         init core file pattern: //coref/%n.%f.%p
         init core file content: default
             global core dumps: enabled
        per-process core dumps: enabled
        global setid core dumps: disabled
   per-process setid core dumps: disabled
       global core dump logging: disabled
  [root@node01 /]#cat /etc/coreadm.conf
  #
  # coreadm.conf
  #
  # Parameters for system core file configuration.
  # Do NOT edit this file by hand -- use coreadm(1) instead.
  #
  COREADM_GLOB_PATTERN=/var/core/core.%f.%p
  COREADM_GLOB_CONTENT=default
  COREADM_INIT_PATTERN=//coref/%n.%f.%p
  COREADM_INIT_CONTENT=default
  COREADM_GLOB_ENABLED=yes
  COREADM_PROC_ENABLED=yes
  COREADM_GLOB_SETID_ENABLED=no
  COREADM_PROC_SETID_ENABLED=no
  COREADM_GLOB_LOG_ENABLED=no
      (e)根据PIDs检查core file的配置:
  [root@node01 /]#coreadm 1 297 312
  1:      //coref/%n.%f.%p        default
  297:    //coref/%n.%f.%p        default
  312:    //coref/%n.%f.%p        default
  只有进程的拥有者或超级用户可以查询进程的corefile配置.

 三、配置实例:
     1.立即转储实例(dumpadm)
     (1).配置专用崩溃转储设备:
  [root@node01 /]#dumpadm -d /dev/dsk/c0t1d0s0
                Dump content: kernel pages
                Dump device: /dev/dsk/c0t1d0s0 (dedicated)
                Savecore directory: /var/crash/node01
                Savecore enabled: yes
  [root@node01 /]#sync
     (2).强迫内核把当前系统运行状态快照以灾难转储方式保存到指定文件:
   [root@node01 /]#savecore -L
    dumping to /dev/dsk/c0t1d0s0, offset 65536, content: kernel
    100% done: 12558 pages dumped, compression ratio 2.78, dump succeeded
    System dump time: Wed Nov 12 10:27:37 2008
    Constructing namelist /var/crash/node01/unix.1
    Constructing corefile /var/crash/node01/vmcore.1
     100% done: 12558 of 12558 pages saved
            (3).查看崩溃转储的内容:
  [root@node01 /]#cd /var/crash/node01/
  [root@node01 node01]#ls
  bounds    unix.0    unix.1    vmcore.0  vmcore.1
  [root@node01 node01]#cat bounds
  2
  [root@node01 node01]#file vmcore.0
  vmcore.0:       SunOS 5.10 Generic_127127-11 64-bit SPARC crash dump from 'node01'
  [root@node01 node01]#file unix.0
  unix.0:         ELF 64-bit MSB executable SPARCV9 Version 1, UltraSPARC1 Extensions Required, statically linked, not stripped, no debugging information available
     (4).查看日志:
  [root@node01 node01]#grep 'crash dump' /var/adm/messages
  Nov  3 13:29:38 node01 savecore: [ID 748169 auth.error] saving system crash dump in /var/crash/node01/*.0
  Nov 12 10:27:44 node01 savecore: [ID 748169 auth.error] saving system crash dump in /var/crash/node01/*.1
  Nov 12 10:33:51 node01 savecore: [ID 748169 auth.error] saving system crash dump in /tmp//*.0
     2.core files配置实例(coreadm)
       (1)配置core files
  [root@node01 node01]#coreadm
       global core file pattern:
       global core file content: default
        init core file pattern: core
        init core file content: default
             global core dumps: enabled
         per-process core dumps: enabled
       global setid core dumps: disabled
   per-process setid core dumps: disabled
       global core dump logging: disabled
  [root@node01 node01]#mkdir /var/core
  [root@node01 node01]#coreadm -e global -g /var/core/core.%f.%p
  [root@node01 node01]#coreadm -e log                          
  [root@node01 node01]#coreadm
       global core file pattern: /var/core/core.%f.%p
       global core file content: default
         init core file pattern: //coref/%n.%f.%p
         init core file content: default
             global core dumps: enabled
         per-process core dumps: enabled
        global setid core dumps: disabled
   per-process setid core dumps: disabled
       global core dump logging: enabled
      (2)新建一个目录作为当前目录:
  # mkdir /var/tmp/dir
  # cd /var/tmp/dir
  # bash
      (3)人为产生一个核心陷阱。发送8(SIGFPE)bash进程,终止bash shell.SIGFPE会强制发生一个核心陷阱,并且可能导致当前终端窗口连接被终止。
  [root@node01 dir]#ps 
         PID TTY         TIME CMD
                1226 pts/3       0:00 ps
           1224 pts/3       0:00 bash
               1221 pts/3       0:00 sh
        1105 pts/3       0:00 bash
  [root@node01 dir]#kill -8 1224
  Arithmetic Exception - core dumped
      (4)查看生成的文件:
  # pwd
  /var/tmp/dir
  # ls -l
  total 0
  # cd /var/core
  # ls
  core.bash.1224
  # ls -l
  total 7552
  -rw-------   1 root     root     3854282 Nov 13 15:30 core.bash.1224
      (5)查看日志:
  #  tail /var/adm/messages|grep core
  Nov 13 15:30:08 node01 genunix: [ID 603404 kern.notice] NOTICE: core_log: bash[1224] core dumped: /var/core/core.bash.1224

四、查询core文件信息:

   一些proc工具可以像检测活动的进程一样检测core文件。比如,/usr/proc/bin/pstackpmapplddpflagspcred工具能管理core文件。更详细的请参考proc(1)的帮助。

阅读(2478) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~