솔라리스 메모리 덤프 생성 & 분석

솔라리스에서는 메모리 덤프를 위해 dumpadm, savecore 와 같은 명령을 제공하고 있으며 코어 덤프 형태로 덤프 이미지를 생성합니다.

1. 덤프 설정

메모리 덤프를하기에 앞서 dumpadm 명령을 통해 현재 덤프와 관련된 설정 확인 및 수정이 가능합니다.

-주요 옵션

옵션

설명

-c

contents

덤프할 내용을 설정한다.

-kernel : 커널 페이지

-curproc : 커널 페이지 + 최근 실행된 프로세스 페이지

-all : 모든 페이지

-d

device

덤프에 사용할 장치를 설정한다.

-n

no

savecore 사용을 비활성화 한다.

-y

expert

savecore 사용을 활성화 한다.


아무런 옵션을 주지 않으면 아래와 같이 현재 설정된 내용을 출력해줍니다.

 # dumpadm
      덤프 컨텐트: 커널페이지
       덤프 장치: /dev/dsk/c0d1s1(스왑)
Savecore 디렉토리: /var/crash/unknown
  Savecore 사용: 예
   Save compressed: 켜기

기존적으로 덤프 장치는 스왑 영역이 설정되어있는데 스왑 영역 크기가 작은 경우 모든 메모리 페이지를 덤프하려고 시도하면 아래와 같이 용량 부족 에러가 발생합니다.

 # dumpadm -c all

dumpadm: 덤프 장치 /dev/dsk/c0d1s1이(가) 너무 작아서 시스템 덤프를 보관할 수 없습니다.

덤프 크기 782004224바이트, 장치 크기 551093760바이트

따라서 좀 더 사이즈가 큰 장치로 변경해주어야 하는데 해당 장치는 다음과 같은 조건을 만족해야 합니다.

 -해당 장치는 시스템에 의해 사용되고 있지 않아야 합니다. (유휴 장치)

 -덤프 크기보다 장치 크기가 커야합니다.

※ 주의 : Backup slice 영역을 덤프 장치로 지정할 경우 boot 영역을 포함한 디스크 영역들을 덮어써 데이터가 파괴되기 때문에 주의가 요구됩니다.

slice 확인하기 – 열기

format 명령을 이용하면 해당 디스크의 slice 정보를 확인 및 수정이 가능합니다.

먼저 format 명령을 실행하면 아래와 같이 먼저 작업할 디스크를 선택합니다.

# format

Searching for disks…done

AVAILABLE DISK SELECTIONS:

       0. c0d1  infosec

          /pci@0,0/pci-ide@7,1/ide@1/cmdk@1,0

       1. c1t0d0

          /pci@0,0/pci15ad,1976@10/sd@0,0

Specify disk (enter its number): 

디스크 선택이 끝나면 verify 명령을 통해 볼륨명, slice 등의 정보를 확인할 수 있습니다.

format> ver

Primary label contents:

Volume name = < infosec>

ascii name  =

pcyl        = 2087

ncyl        = 2085

acyl        =    2

bcyl        =    0

nhead       =  255

nsect       =   63

Part      Tag    Flag     Cylinders        Size            Blocks

  0       root    wm      70 – 1263        9.15GB    (1194/0/0) 19181610

  1       swap    wu       3 –   69      525.56MB    (67/0/0)    1076355

  2     backup    wm       0 – 2084       15.97GB    (2085/0/0) 33495525

  3 unassigned    wm       0               0         (0/0/0)           0

  4 unassigned    wm       0               0         (0/0/0)           0

  5 unassigned    wm       0               0         (0/0/0)           0

  6 unassigned    wm       0               0         (0/0/0)           0

  7       home    wm    1264 – 2083        6.28GB    (820/0/0)  13173300

  8       boot    wu       0 –    0        7.84MB    (1/0/0)       16065

  9 alternates    wu       1 –    2       15.69MB    (2/0/0)       32130

위와 같이 테스트 시스템은 root, swap, home 에서 디스크를 할당받아 사용중이며 2번 slice인 backup은 boot 영역을 포함한 모든 디스크 영역을 가지고 있는 것을 확인 할 수 있습니다.

따라서, 해당 backup slice를 덤프 장치로 지정하는경우 심각한 시스템 장애를 유발하게 될 수 있으니 조심하시기 바랍니다.

외장 하드를 덤프 장치로 사용하기 – 열기

※ 파일 시스템 생성 작업은 실서버에서 진행하지 않고 VM머신의 솔라리스 시스템에서 생성하여도 무관합니다.

우선 rmformat 명령을 이용하여 시스템에 외장 하드가 정상적으로 인식이 되었는지 확인합니다.

# rmformat
장치 조회 중…
     1. Volmgt Node: /vol/dev/aliases/cdrom0
        Logical Node: /dev/rdsk/c0t0d0s2
        Physical Node: /pci@0,0/pci-ide@7,1/ide@1/sd@0,0
        Connected Device: NECVMWar VMware IDE CDR10 1.00
        Device Type: DVD Reader/Writer
     2. Volmgt Node: /vol/dev/aliases/rmdisk0
        Logical Node: /dev/rdsk/c2t0d0p0
        Physical Node: /pci@0,0/pci15ad,790@11/pci15ad,770@4/storage@1/disk@0,0
        Connected Device: Seagate  Portable         SF06
        Device Type: Removable

Seagate 외장 하드가 /dev/rdsk/c2t0d0p0으로 정상 인식이 된 것을 확인할 수 있습니다.

그 다음, 솔라리스 시스템에 마운트 하기위해 fdisk 명령으로 포맷을 진행합니다.

# fdisk -B /dev/rdsk/c2t0d0p0
fdisk: Cannot open device /dev/rdsk/c2t0d0p0.
# svcadm disable volfs
# fdisk -B /dev/rdsk/c2t0d0p0

-B 옵션을 이용하여 손쉽게 디스크 전체를 솔라리스 파일 시스템으로 사용하도록 해줄 수 있습니다.

만약 fdisk 실행시 위와 같은 에러가 발생하면 volfs를 중지하여주면 정상적으로 동작합니다.

파일 시스템 생성이 완료되면 slice를 생성해주어야하는데 덤프 장치로 사용할 slice와 덤프 파일을 저장할 slice로 나누도록 하겠습니다.

# cat /slice.txt 

slices: 0 = 0, 16GB, “wm” :

           1 =  16GB,500GB, “wm” :

           2 = 0, 516GB, “wm”, “backup” 

# rmformat -s slice.txt /dev/rdsk/c2t0d0p1

0번 slice에는 16GB를 할당하고 1번 slice에는 16GB에서부터 500GB만큼 할당하고 2번 slice는 두 slice를 합친 영역을 할당하여 backup slice로 사용합니다.

rmformat의 -s 옵션으로 slice 설정 파일을 지정해주고 slice를 생성할 장치를 선택해줍니다.

(p0은 장치 전체, p1은 첫번째 파티션을 의미합니다.)

slice 생성이 끝나면 devfsadm 명령을 통해 장치 정보를 갱신시켜주고 newfs 명령으로 생성한 slice를 초기화해줍니다.

# devfsadm
# devfsadm -C
# newfs /dev/rdsk/c2t0d0s0 
newfs: 새 시스템 파일 /dev/rdsk/c2t0d0s0을(를) 구성하시겠습니까: (y/n)? y
경고: 마지막 실린더의 4096 섹터가 할당되지 않았습니다
/dev/rdsk/c2t0d0s0:     48 트랙, 128 섹터의 5462 실린더에 있는 33554432 섹터
        16384.0MB (342 실린더 그룹) (16 c/g, 48.00MB/g, 5824 i/g)
수퍼 블록 백업 (fsck -F ufs -o b=#의 경우):
 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
실린더 그룹 초기화 중:
……
마지막 10개 실린더 그룹에 대한 수퍼 블록 백업:
 32638496, 32736928, 32835360, 32933792, 33032224, 33130656, 33229088,
 33327520, 33425952, 33524384

# newfs /dev/rdsk/c2t0d0s1
newfs: 새 시스템 파일 /dev/rdsk/c2t0d0s1을(를) 구성하시겠습니까: (y/n)? y
경고: 마지막 실린더의 2048 섹터가 할당되지 않았습니다
/dev/rdsk/c2t0d0s1:     48 트랙, 128 섹터의 170667 실린더에 있는 1048576000 섹터
        512000.0MB (10667 실린더 그룹) (16 c/g, 48.00MB/g, 5824 i/g)
수퍼 블록 백업 (fsck -F ufs -o b=#의 경우):
 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
실린더 그룹 초기화 중:
…………………………………………………………………….
…………………………………………………………………….
……………………………………………….
마지막 10개 실린더 그룹에 대한 수퍼 블록 백업:
 1047629984, 1047728416, 1047826848, 1047925280, 1048023712, 1048122144,
 1048220576, 1048319008, 1048417440, 1048515872

backup slice는 newfs를 수행하지 않고 0~1번 slice만 수행해줍니다.

덤프 장치 설정 및 mount 시에는 /dev/rdsk 가 아닌 /dev/dsk 로 지정해주어야 정상적으로 설정 및 마운팅이 가능합니다.

 # dumpadm -d /dev/dsk/c2t0d0s0
      덤프 컨텐트: 커널페이지
       덤프 장치: /dev/dsk/c2t0d0s0(전용)
Savecore 디렉토리: /var/crash/unknown
  Savecore 사용: 예
   Save compressed: 켜기
# dumpadm -c all                           
      덤프 컨텐트: 모두페이지
       덤프 장치: /dev/dsk/c2t0d0s0(전용)
Savecore 디렉토리: /var/crash/unknown
  Savecore 사용: 예
   Save compressed: 켜기
# mkdir /mnt/dump
# mount /dev/dsk/c2t0d0s1 /mnt/dump

2. 덤프 생성

덤프 설정이 완료되면 savecore 명령을 통해 쉽게 덤프가 가능합니다.

-주요 옵션

옵션

설명

-L

Live

Live 시스템을 덤프한다.

-f

dumpfile

vmdump.* 파일의 압축을 해제하여 vmcore.* unix.* 파일을 생성한다.


# savecore -L /mnt/dump
dumping to /dev/dsk/c2t0d0s0, offset 65536, content: all
 1:04 100% done
100% done: 383887 pages dumped, dump succeeded
savecore: System dump time: Thu Oct  4 18:00:12 2012

savecore: Saving compressed system crash dump in /mnt/dump/vmdump.0
savecore: Decompress the crash dump with
‘savecore -vf /mnt/dump/vmdump.0’

3. 덤프 분석

coredump의 분석은 mdb를 이용하여 진행됩니다.

vmdump.* 파일은 unix.*, vmcore.* 두 파일을 압축한 파일이기 때문에 savecore의 -vf 옵션을 이용해 압축을 해제해주어야 mdb에서 정상적으로 인식이 가능합니다.

압축을 해제한 뒤 mdb의 인자로 해당 dump 번호를 입력해주면 됩니다.

# ls

bounds    vmdump.0

# savecore -vf vmdump.0

savecore: System dump time: Fri Oct  5 23:30:33 2012

savecore: saving system crash dump in /var/crash/unknown/{unix,vmcore}.0

Constructing namelist /var/crash/unknown/unix.0

Constructing corefile /var/crash/unknown/vmcore.0

 1:28 100% done: 383887 of 383887 pages saved

7527 (1%) zero pages were not written

1:28 dump decompress is done

# ls

bounds    unix.0    vmcore.0  vmdump.0

# mdb 0

mdb: failed to read panicbuf and panic_reg — current register set will be unavailable

Loading modules: [ unix krtld genunix specfs dtrace uppc pcplusmp cpu.generic ufs sockfs ip hook neti sctp arp usba uhci fcp fctl nca lofs audiosup md mpt cpc random crypto zfs fcip logindmux ptm sppp nfs ipc ]

mdb는 수 많은 명령을 제공해주는데 유용하게 사용 가능한 명령은 아래와 같습니다.

명령

설명

::statusdump 파일의 간략한 정보를 출력해줍니다. 
::netstat네트워크 정보를 출력해줍니다. 
::ps 프로세스 정보를 출력해줍니다. 
::ptree 프로세스 트리를 출력해줍니다. 
[address]::pmep해당 프로세스의 프로세스 맵을 출력해줍니다.
::fsinfo 마운트된 파일시스템 정보를 출력해줍니다. 
::dcmds 사용가능한 dcmd 목록을 출력해줍니다. 
::help [command name] 명령 사용법을 출력해줍니다. 


댓글 남기기

바로가기