본문 바로가기

Enginius/Linux

[리눅스] Virtual Serial Port와 SecureCRT를 이용한 VMware Linux 커널 디버깅

출처: http://blog.naver.com/softgear?Redirect=Log&logNo=100091959181

"리눅스 콘솔에서 커널 패닉이 나면 화면 스크롤로 인해 원하는 정보를 볼수 없다. 콘솔을 시리얼로 바꾸면 이 문제를 해결 할 수 있다. 여기서는 그 응용인 VMware를 사용하는 경우를 보인다."

 

VMware내의 Linux에 Serial 장치를 추가함으로써,

Kernel Panic 메시지를 포함한 모든 텍스트를 시리얼 포트로 뽑아낼수 있다.

 

VMware내의 시리얼포트를 Host PC의 물리적인 Com포트에 연결시킬수 있다. 이 물리적인 포트와 통신하기 위해서는 또하나의 PC가 필요하고 이것을 시리얼포트에 연결해야 한다. 다음 그림이 이와 같은 환경을 보인다. 하지만, 보시다시피, 무척 복잡하다.

 

시리얼 포트 에뮬레이터를 이용하면, 다음 그림과 같이, 보다 단순하게 개발(디버깅)환경을 구성할 수 있다. 시리얼 포트 에뮬레이터는 여러 회사의 제품이 있는데, 유료도 있고 무료도 있다. 여기서는 무료인 VSPE라고 불리우는 Virtual Serial Ports Emulator가 있다. (64비트용은 유료라고 나오는데, 일단은 써볼수는 있다.) 이 프로그램은 http://www.eterlogic.com/Products.VSPE.html에서 다운로드 받을수 있다.

 

먼저, 다음과 같이, VSPE를 띄워서 가상 포트를 2개 만든다. VPSE에서 오른쪽 클릭, Create/Connector/ComX를 차례로 선택하면 된다. 여기서는 COM1, COM2로 만들었다. 이미 물리적 포트가 있다면 다른 번호를 사용해야 한다.

 

이어서 두 가상 포트를 Bridge 시킨다. VPSE에서 오른쪽 클릭, Create/Bridge를 선택하고, Stream 1의 Settings을 눌러 COM1을 선택한다. Stream 2의 Setting를 눌러 Serial 을 선택한다. 그런데 COM2가 보이지 않는다. 버그인 듯한데, 직접, Port란에 COM2 라고 입력하면 된다. VPSE는 종료시키지 말고 계속 동작 띄워 놓아야 한다.

 

 

이제 VMware에서 Virtual Machine에 Serial 포트를 추가한다. VMware는 5.5.8 workstation을 사용하였다. 다음 그림과 같이, Virual Machine Setting에서 "Add"를 누르고, Serial Port를 선택한다. Use physical serial port on the host를 선택한다. 그리고 COM1을 선택한다.

 

SecureCRT등의 터미널 프로그램을 띄워, COM2 에 접속한다.

 

VMware에서 Guest OS인 Linux 실행한다. 여기서는 CentOS 5.3를 사용하였다. Grub에서 잠시 중단 시킨다. e 를 눌러 에디트 모드로 간 다음, 두번째 kernel /vmlinux-2... 라인을 선택후 e를 눌러 에디트 모드로 들어간다. 여기에 console=ttyS0,115200 을 입력한 다음(vga=옵션은 지워도 된다) 엔터를 누르고, b를 눌러 부팅한다.

 

 

SecureCRT에서 올라가는 글씨가 보이면, 거의 성공한 것이다. 이제 SecureCRT에서 로그인을 해 보아라. 이제 커널 패닉 상황을 만들면 된다. 화면이 넘어가는 것을 걱정하지 않아도 된다.







printk()로 커널 컴파일 하기

1. printk() 함수

- printk() 함수는 디바이스 드라이버를 작성하고 테스트할 때 가장 편하고 강력한 디버깅 도구이다.

- 사용방법은 printf() 함수와 유사하지만, 커널의 메시지를 출력하고 관리할 수 있는 특성이다.

  • 메시지 기록관리를 위한 로그 레벨의 지정
  • 원형 큐 구조의 관리
  • 출력 디바이스의 다중 지정

2. 로그 레벨지정

- /linux/kernel.h

- 로그레벨 지정 define

 

 상수 선언문  의미
 KERN_EMERG  "<0>"
 KERN_ALERT  "<1>"
 KERN_CRIT  "<2>"
 KERN_ERR  "<3>"
 KERN_WARNING  "<4>"
 KERN_NOTICE  "<5>"
 KERN_INFO  "<6>"
 KERN_DEBUG  "<7>"

 

- 예제 : KERN_INFO의 동일한 표현

printk(KERN_INFO "system ok\n");

printk("<6>" "system ok\n");

printk("<6>system ok\n");

 

- 레벨에 대한 표시를 하지 않는다면 default 레벨은 "KERN_WARNING" 이다.

 

3. 커널 메시지 관리 데몬

- klogd : 커널에서 발생하는 메시지를 기록하고 관리한다.

- syslogd : 커널에서 발생한느 메시지와 응용 프로그램에서 요청한 시스템 정보를 기록하고 관리한다.

- /var/log/messages 파일에 모든 커널메시지가 저장된다.

 

4. 로그 정보보기

- dmesg

- cat /proc/kmsg : 커널 메시지가 발생할 때 즉시 출력.