2010年11月9日 星期二

Core & Dump @ Solaris


managing crash dumps and core files
当操作系统崩溃的时候,savecore命令在启动的时候自动执行,并将内核信息存放在/var/crash/nodename/vmcore.X文件里面,将名字列表存放在/var/crash/nodename/unix.X文件里面.
在crash dump目录下,还创建了一个bounds的文件
# dumpadm
# cat /etc/dumpadm.conf
注意尽量使用dumpadm命令而避免直接编辑/etc/dumpadm.conf文件
dumpadm的一般语法格式是:
/usr/sbin/dumpadm [nuy] [-c content-type] [-d dump-device] [-m mink| minm| min%]
[-r root-dir] [-s savecore-dir]
其中-n是禁止重启之后自动运行savecore命令,-u是执行更新,-y是允许重启之后自动运行savecore命令.content-type包括三种类型:kernel,all,curproc.-r是指定根目录,如果没有这个参数那么默认是"/"目录.
当一个core文件发生的时候,要创建两个core文件的副本,分别是global core file,per-process core file,global core file只有root用户可以操作.后一个文件只有所有者可以操作.
# coreadm
# cat /etc/coreadm.conf
带-p参数的coreadm命令任何用户都可以使用,而带其他参数的coreadm命令则只有root用户可以使用.
coreadm -i pattern命令和coreadm -p pattern命令大同小异,区别在于前者在系统重启之后才生效.coreadm -i pattern命令的作用是设定per-process core文件名模式
coreadm -e包含四项:global,process,global-setid,proc-setid,log
coreadm -d:让设定的选项失效
coreadm -u:更新
coreadm -g pattern:设定global core文件名模式

使用coreadm命令p选项的一些参数:
%u:EUID;%g:EGID;%f:可执行文件名;%n:系统标示名;%m:机器硬件名;%t:自1970.1开始运行的秒数
$$ shell's pid
使用coreadm命令的一些实例:
# coreadm -p core.%f.%p $$
# coreadm -p $HOME/corefiles/%n.%f.%p $$
# coreadm -g /var/core/core.%f.%P -e global
# coreadm 278 5678


1 Core
core檔是系統軟體出現問題後產生的資訊記錄。它對軟體發展者和系統管理者的工作有很大的幫助作用。本節主要對Core檔產生和管理做一些初步介紹。

(1) 管理core文件概述
core檔在進程或者應用程式異常終止時產生。我們可以使用coreadm命令來管理core檔。比如,你可以使用coreadm命令來設定所有的core檔都放在一個目錄中。這樣,就會很容易通過測試找到問題的痕跡。

有兩種類型的core檔:

單個進程的core檔,在默認情況下是啟動的。當進程異常終止時,單個進程的core檔就在異常終止進程的目錄中產生。產生後,單個進程的core檔的擁有者就是進程的擁有者。只有擁有者才能查看這個檔。
全局core檔,它默認的情況下是不開啟的。如果啟動了全局core檔,它產生在引起全局core檔產生的目錄。全局core文件的擁有者就是超級用戶。非特權用戶不能查看全局core檔。
當進程異常終止時,默認在當前目錄產生core檔。如果這時全局core檔路徑也開啟著,每個異常終止的進程就會有兩個檔產生:一個在當前的工作目錄;另一個在全局core檔目錄。
默認時,setuid進程既不產生全局core檔也不產生單個core檔。
如果全局core檔是開啟的,core檔可以用表17-3中的變數所描述。

表17-3 描述Core檔的變數

變 量 名 變數描述
%d 執行的檔目錄名
%f 執行的檔案名
%g 組的ID
%m 機器名稱
%n 系統節點名
%p 進程ID
%t 十進位的時間
%u 有效的用戶ID
%z 進程運行的分區(xone)名
%% 百分比


舉例說明,全局core檔路徑設置為:

/var/core/core.%f.%p

這時,如果sendmail的PID為12345的進程發生異常終止,將產生下列core檔:

/var/core/core.sendmail.12345

我們可以使用coreadm命令設定進程產生的core檔的目錄和名稱。這將取代原來的默認設置。

# coreadm -i /var/core/core.%f.%p

全局core的屬性值存儲在/etc/coreadm.conf文件中。

(2) 管理core檔的實例

1.顯示當前core檔的設置
例17-2 使用不帶任何參數的coreadm命令顯示當前core的設置情況。

$ coreadm
global core file pattern:
global core file content: default
nit 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

2.設置core檔案名的樣式
將當前Shell運行的所有進程所產生的core檔命名:

$ coreadm -p $HOME/corefiles/%f.%p $$
對全局檔設置core檔命名需要超級用戶許可權:
# coreadm -g /var/corefiles/%f.%p

3.啟用單個進程core檔的路徑
# coreadm -e process
$ coreadm $$
1180: /home/kryten/corefiles/%f.%p

4.啟用全局core檔的路徑
# coreadm -e global -g /var/core/core.%f.%p

(3) 查詢core檔資訊
一些proc工具可以像檢測活動的進程一樣檢測core檔。比如,/usr/proc/bin/pstack、pmap、pldd、pflags和pcred工具能管理core文件。更詳細的資訊請查看porc(1)的幫助。

例17-3 使用proc工具檢查core檔。
$ ./a.out
Segmentation Fault(coredump)
$ /usr/proc/bin/pstack ./core
core ’./core’ of 19305: ./a.out
000108c4 main (1, ffbef5cc, ffbef5d4, 20800, 0, 0) + 1c
00010880 _start (0, 0, 0, 0, 0, 0) + b8 

2 系統crash資訊的管理

crash主要回饋主機能否正常運行等比較嚴重的問題。系統管理員需要特別關注crash資訊。
(1) 系統崩潰概述
系統崩潰(crash)發生在硬體故障、I/O問題或軟體錯誤的情況下。如果系統崩潰發生了,它將在控制臺上顯示錯誤資訊,並將實體記憶體的拷貝寫入轉儲設備。這時,系統將自動重新啟動。當系統重啟後,savecore 命令運行將資料從轉儲設備中找回,並存儲到savecore目錄。這些資料為系統診斷提供了依據。

系統崩潰轉儲檔
當savecore命令自動運行將崩潰資訊從轉儲設備中找回,並寫成兩個檔:unix.X和vmcore.X。其中X為轉儲的次序號碼。這些檔一起用於表現系統的崩潰轉儲資訊。
崩潰轉儲檔存儲在預先設定好的目錄中,默認情況下是/var/crash/hostname。在以前的Solaris版本中,崩潰轉儲檔將在系統重新啟動的時候不寫在特定的目錄,除非你手動啟動,將記憶體的映射存儲到崩潰轉儲檔中。不過現在就自動存儲崩潰轉儲檔了。

dumpadm命令
我們可以用dumpadm命令來在Solaris系統中管理系統崩潰轉儲資訊。
dumpadm命令能使你在作業系統上設置崩潰轉儲。這個命令的設置參數包括轉儲的內容、轉儲的設備和崩潰轉儲資訊的存儲路徑。
轉儲資料是以壓縮的形式被存在轉儲設備中的。內核的崩潰轉儲映射可能達到4GB,壓縮資料就意味著更快的轉儲速度和更小的轉儲設備磁碟空間。
保存崩潰轉儲檔是在後臺運行的崩潰轉儲檔的任務。系統啟動的時候不需要等待savecore命令完成就可以進行下一步。當然,大的記憶體數量是有利於savecore完成任務的。
系統崩潰轉儲檔是由savecore命令產生的,保存一般也是按默認路徑進行的。
savecore –L命粗體令是新的屬性,它使你能在系統運行的時候崩潰轉儲。當系統記憶體存儲有問題的時候,這個命令試圖在系統運行的時候調試記憶體的快照。如果系統是啟動的,並且有些命令還能執行,你可以運行cavecore –L命令來存儲系統轉儲設備的快照到崩潰轉儲目錄。

通過dumpadm命令,轉儲設置參數存儲在/etc/dumpadm.conf文件中。注意不要手動編輯這個檔,這樣做可能會帶來不一致的轉儲設置。

dumpadm命令如何工作
當系統啟動的時候,dumpadm命令調用svc:/system/dumpadm:default服務來設置基於/etc/dumpadm.conf文件的的崩潰轉儲參數。

dumpadm命令通過/dev/dump介面來初始化轉儲設備和轉儲內容。

(2) 管理系統崩潰轉儲資訊

在管理系統崩潰資訊中,你必須要記住以下幾點:
你必須是超級用戶或具有管理系統崩潰功能的用戶。
不要關閉保存崩潰轉儲資訊的屬性。系統崩潰轉儲檔提供了導致系統崩潰的很珍貴的資訊。
不要輕易刪除系統崩潰資訊。

1.如何顯示當前的崩潰轉儲設置
# dumpadm
Dump content: kernel pages
Dump device: /dev/dsk/c0t3d0s1 (swap)
Savecore directory: /var/crash/venus
Savecore enabled: yes

上面輸出的意義如下:
轉儲內容是內核記憶體的換頁。
內核記憶體將轉儲到swap設備中,就是/dev/dsk/c0t3d0s1。
系統崩潰轉儲檔存在/var/crash/venus目錄。
系統的崩潰轉儲功能是啟動著的。

2.如何修改當前的崩潰轉儲設置
命令介紹

# dumpadm -c content -d dump-device -m nnnk | nnnm | nnn% -n -s savecore-dir

dumpadm命令的各個參數具體意義列在表17-4中。

表17-4 dumpadm命令的參數列表

轉儲參數
描 述

-c content
轉儲的資料類型。默認的轉儲內容是內核的記憶體。使用all關鍵字是指所有記憶體

-d dump-device
系統崩潰時,臨時存儲的專門設備

-m nnnk | nnnm | nnn%
在savecore目錄中為了存儲崩潰轉儲檔所留的專門空間。這個參數有可能是kb(nnnk),也有可能mb(nnnm),也有可能是百分比(nnn%)

-n 或-y
是否自動進行崩潰轉儲,y為是,n為否

-s savecore-dir
用來改變崩潰轉儲檔的路徑。默認路徑是/var/crash/hostname


 例17-4 轉儲內容改為所有記憶體,轉儲目錄改為/dev/dsk/c0t1d0s1,轉儲空間最大為這個檔系統的10%。

先查看原來的轉儲設置:

# dumpadm
Dump content: kernel pages
Dump device: /dev/dsk/c0t3d0s1 (swap)
Savecore directory: /var/crash/pluto
Savecore enabled: yes

更改轉儲設置:

# dumpadm -c all -d /dev/dsk/c0t1d0s1 -m 10%
Dump content: all pages
Dump device: /dev/dsk/c0t1d0s1 (dedicated)
Savecore directory: /var/crash/pluto (minfree = 77071KB)
Savecore enabled: yes

3.如何檢查崩潰轉儲檔內容
例17-5 使用mdb工具輸出崩潰轉儲檔內容,其中包括系統資訊和在/etc/system檔中可調用的一些參數。

# /usr/bin/mdb -k unix.0
Loading modules: [ unix krtld genunix ip nfs ipc ptm ]
> ::status
debugging crash dump /dev/mem (64-bit) from ozlo
operating system: 5.10 Generic (sun4u)
> ::system
set ufs_ninode=0x9c40 [0t40000]
set ncsize=0x4e20 [0t20000]
set pt_cnt=0x400 [0t1024] 

沒有留言:

張貼留言

文章分類