솔라리스에서는 메모리 덤프를 위해 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 /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 |
Seagate 외장 하드가 /dev/rdsk/c2t0d0p0으로 정상 인식이 된 것을 확인할 수 있습니다.
그 다음, 솔라리스 시스템에 마운트 하기위해 fdisk 명령으로 포맷을 진행합니다.
# 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 # newfs /dev/rdsk/c2t0d0s1 |
backup slice는 newfs를 수행하지 않고 0~1번 slice만 수행해줍니다.
덤프 장치 설정 및 mount 시에는 /dev/rdsk 가 아닌 /dev/dsk 로 지정해주어야 정상적으로 설정 및 마운팅이 가능합니다.
# dumpadm -d /dev/dsk/c2t0d0s0 |
2. 덤프 생성
덤프 설정이 완료되면 savecore 명령을 통해 쉽게 덤프가 가능합니다.
-주요 옵션
옵션 |
설명 | |
-L |
Live |
Live 시스템을 덤프한다. |
-f |
dumpfile |
vmdump.* 파일의 압축을 해제하여 vmcore.* unix.* 파일을 생성한다. |
# savecore -L /mnt/dump savecore: Saving compressed system crash dump in /mnt/dump/vmdump.0 |
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는 수 많은 명령을 제공해주는데 유용하게 사용 가능한 명령은 아래와 같습니다.
명령 | 설명 |
::status | dump 파일의 간략한 정보를 출력해줍니다. |
::netstat | 네트워크 정보를 출력해줍니다. |
::ps | 프로세스 정보를 출력해줍니다. |
::ptree | 프로세스 트리를 출력해줍니다. |
[address]::pmep | 해당 프로세스의 프로세스 맵을 출력해줍니다. |
::fsinfo | 마운트된 파일시스템 정보를 출력해줍니다. |
::dcmds | 사용가능한 dcmd 목록을 출력해줍니다. |
::help [command name] | 명령 사용법을 출력해줍니다. |