mdb 파일을 이용하여 데이터를 표로 출력하는 방법입니다.
mdb파일을 추가합니다.
필요한 필드를 추가해 줍니다.
Tip: 위의 그림에서 빨간색으로 표시한 Main Report Preview를 클릭하면 결과를 미리 볼수 있습니다.
기본적으로 Save data in the report 가 체크되어 있는데 이부분은 해제합니다.
만약 계속 체크되어 있으면 데이터가 계속 저장되어있어서 mdb에서 데이터를 수정해도 보고서에는 적용되지 않을수도 있습니다.
VMware에 리눅스를 설치하여 사용하는 경우가 많은데 이때 공유 폴더를 설정하면 편리합니다.
공유폴더를 이용하기 위해서는 VMware Tools 를 설치하여야 합니다.
환경 :
Fedora Core 4
VMware Workstion 7.0.1
VMware 창에서 Install VMware Tools를 클릭하면 설치파일이 VMware에서 동작중인 페도라에 cd-rom에 마운트되어집니다.
이제부터 작업은 터미널에서 root 권한으로 작업하겠습니다.
[root@localhost /]# cd /media/cdrom
[root@localhost /]# cp VMwareTools-8.1.4-227600.tar.gz /home/
압축을 풀기 위해 설치파일을 /home 디렉토리로 복사하였습니다.
[root@localhost /]t# ar -xvf VMwareTools-8.1.4-227600.tar.gz
압축을 푼 디렉토리에 보면 vmware-install.pl<– 설치 실행 파일이 있습니다.
[root@localhost vmware-tools-distrib]# ./vmware-install.pl
실행시키면 설치가 시작되는데 몇가지 물어보는데 그냥 계속 엔터를 눌러주시면 됩니다. 이때 GCC가 설치되어 있어야 하는데 만약 설치되어 있지 않다면
[root@localhost vmware-tools-distrib]# yum install gcc
으로 gcc를 설치해주시면 됩니다.
설치도중에 아래처럼 메세지가 나오면 커널 소스가 맞지 않는것이므로 커널을 버전에 맞게 설치해주어야 합니다.
ctr+c로 설치를 중지 시킨 다음
[root@localhost vmware-tools-distrib]# yum install kernel-devel
설치가 완료되면 재부팅한뒤
[root@localhost vmware-tools-distrib]# ./vmware-install.pl
다시 실행 주면 됩니다.
계속 엔터만 누르다보면 display 설정하는 부분이 나옵니다.
원하시는 해상도 번호를 입력하시면 됩니다.
VMware Tools가 설치가 되었으면 VMware과 페도라 간의 공유폴더를 추가합니다.
이부분은 다른 OS(우분투나, 윈도우나 기타 등등) 설정 부분과 같습니다.
Add 버튼을 클릭하여 공유할 폴더를 추가합니다.
(간단한 작업이기 때문에 생략)
아래는 추가된 모습입니다.
이제 페도라에서 해당 공유 폴더에 접근하여 사용하면 됩니다.
페도라 상에서 해당 공유 폴도의 위치는 /mnt/hgfs 입니다.
===
Fedora 4는 오래되었지만 저사양에서 사용하기 위해 사용되는 경우가 있습니다.
하지만 이미 기본 저장소는 닫혀있는 상태이고 왠만한 미러사이트는 다 닫혀있었습니다.
(sayclub이랑 kaist 쪽 미러사이트는 살아있는거 같지만,,확실하지는 않습니다.)
조금 많이 느리지만 fedoraproject 아카이브에서 받는게 가장 나을것 같습니다.
/etc/yum.repos.d/fedora.repo
/etc/yum.repos.d/fedora-updates.repo
/etc/yum.repos.d/fedora-extras.repo
위 파일들의 baseurl을 수정해주면 됩니다.
[/etc/yum.repos.d/fedora.repo]
[base]
name=Fedora Core $releasever - $basearch - Base
baseurl=http://archives.fedoraproject.org/pub/archive/fedora/linux/core/4/i386/os/
#mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-$releasever
#mirrorlist=file:///etc/yum.repos.d/custom-base
enabled=1
gpgcheck=0
[/etc/yum.repos.d/fedora-updates.repo]파일
[updates-released]
name=Fedora Core $releasever - $basearch - Released Updates
baseurl=http://archives.fedoraproject.org/pub/archive/fedora/linux/core/updates/4/i386/
#mirrorlist=http://fedora.redhat.com/download/mirrors/updates-released-fc$releasever
#mirrorlist=file:///etc/yum.repos.d/custom-updates
enabled=1
gpgcheck=0
[/etc/yum.repos.d/fedora-extras.repo]파일
[extras]
name=Fedora Extras $releasever - $basearch
baseurl=http://archives.fedoraproject.org/pub/archive/fedora/linux/extras/4/i386/
mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-extras-$releasever
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-extras
gpgcheck=1
프로세스는 일반적으로 실행 상태에 있는 프로그램의 인스턴트라고 정의됩니다.
커널의 관점에서 보면 프로세스의 목적은 시스템의 자원을 할당받는 것이라고 할 수 있습니다.
이러한 프로세스는 부모프로세스와 자식프로세스로 나눌수 있는데, 부모와 자식은 프로그램 코드가 들어 있는 페이지는 공유를 하지만 데이터는 서로 별개의 복사본을 가집니다. 그렇기 때문에 부모프로세스에서 메모리의 데이터를 바꾼다 하여도 자식프로세스는 이를 알지 못하고 그 반대도 마찬가지입니다.
이러한 문제를 해결하기 위해 파이프와 같은 기술을 이용하여 자식프로세스와 부모프로세스를 연결하지만, 간단한 작업을 하는데에도 사용하기에는 프로세스는 너무 무겁습니다.
그렇기에 나온것이 경량프로세스인데, 경량프로세스는 부모프로세스와 자원을 공유하는 프로세스입니다. 이러한 경량 프로세스를 다른 말로 ‘쓰레드’라고 하며 리눅스에서는 프로세스라는 개념보다는 쓰레드라는 개념으로 사용합니다.
프로세스의 상태는 7가지로 나눌수 있습니다.
TASK_RUNNING
프로세스가 CPU를 할당받아 실행중이거나 실행되기를 기다리는 중인 상태
TASK_INTERRUPTIBLE
프로세스가 어떤 조건을 만족하기를 기다리면서 보류 중인 상태.
TASK_UNINTERRUPTIBLE
위에 TASK_INTERRUPTIBLE와 비슷한 상태,
하지만 TASK_INTERRUPTIBLE와는 다르게 잠들어있는 프로세스가 시그널을 받아도 깨어나지 않습니다. 보통 잘 사용되지 않지만, 프로세스가 특정한 이벤트가 발생하기를 기다리는 도중에 방해를 받으면 안되는 특수한 상황에서 유용합니다. (예를 들면 프로세스가 장치 파일을 열때 해당 장치 드라이버가 자신이 사용할 하드웨어를 검사하는 도중은 해당 하드웨어를 찾기전까지 활성화되서는 안됩니다. 이런 경우 유용할수 있습니다)
TASK_STOPPED
프로세스의 실행이 중단된 상태, SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU와 같은 시그널을 받으면 해당 프로세스는 이러한 상태가 됩니다.
TASK_TRACED
프로세스의 실행이 디버거에 의해 멈춘 상태입니다.
EXIT_ZOMBIE
프로세스가 종료되었지만, 부모 프로세스가 wait4() 또는 waitpid()와 같은 시스템 콜을 호출하여 종료 프로세스의 정보를 반환하지 않은 경우입니다. 부모프로세스가 wait() 계열의 시스템 콜을 호출하기전까지는 종료되었지만 종료한 프로세스의 프로세스 디스크립터에 들어 있는 데이터를 부모 프로세스에서 필요로 할 수도 있기 때문에 해당 프로세스를 완전히 종료시켜서는 안됩니다.
EXIT_DEAD
EXIT_ZOMBIE에서 부모 프로세스가 wait4() 또는 waitpid() 시스템 콜을 수행하여 시스템에서 제거되는 중인 상태.
이는 같은 프로세스에 대해 다른 스레드가 wait()콜을 수행함으로써 경쟁 조건을 피하기 위함입니다.
리눅스는 자신의 주소 공간에 NR_TASKS(해당 커널이 다룰 수 있는 프로세스의 수) 크가 만큼의 배열인 task를 전역 정적 변수로 정하고 있고, 이 배열의 각 항복은 프로세스 디스크립터의 포인터들입니다. 프로세스 디스크립터는 해당 프로세스에 대한 정보를 가지고 있는 자료구조입니다. 리눅스는 8KB 메모리 영역 하나에 각 프로세스에 대해 프로세스 디스크립터와 커널 모드 프로세스 스택을 합께 저장을 합니다.
스택은 위에서부터 저장하여 아래로 자라나며, 프로세스 디스크립터는 아래에서부터 저장을 합니다. 이렇게 스택과 디스크립터를 함께 저장하는 이유는 cpu가 현재 실행 중인 프로세스의 디스크립터 포인터를 가져오려고 할때 커널은 esp 레지스터 값을 이용하여 쉽게 가져올 수 있습니다. 실제로 메모리 영역의 크기는 8KB이므로 커널은 esp 레지스터의 뒤의 13비트만 지우면 프로세스 디스크립터의 시작 주소를 얻을 수 있습니다.
movl $0xffffe000, %ecx
andl %esp, %ecx
movl %ecx, p
이렇게 단 3가지 명령어로 p에 프로세스의 thread_info 자료구조 포인터를 가져 올 수 있습니다. 만약 프로세스 디스크립터의 주소를 가져오고 싶다면 current 매크로를 이용하면 되는데, 이는
movl $0xffffe000, %ecx
andl %esp, %ecx
movl (%ecx), p
로 구성되어있습니다. 예를들어 current->pid 이런식으로 현재 실행 중인 프로세스의 프로세스ID를 구합니다.
커널은 pid를 가지고 프로세스 디스크립터 주소를 알아야 하는 경우가 있습니다.
이때 프로세스 리스트를 순차적으로 검색하여 프로세스 디스크립터의 pid 필드를 확인하는것은 매우 비효율적이기 때문에 4개의 해시 테이블을 이용합니다.
해시 테이블이 4개인 이유는 프로세스 디스크립터는 PID의 다른 유형들을 표시하는 필드들을 가지고 있기때문입니다.
위에 그림에서는 TGID 해시 테이블이에서 70번째 필드에 있는 프로세스 디스크립터를 가져오는 것입니다.
TGID 필드는 pid_hash테이블의 두번째 필드 이므로 pids[1]의 값을 가져오게 되고, pids[1]에는 pid 번호과 4351인 프로세스 디스크립터를 가리키고 있습니다. pid가 4351인 스레드 그룹의 프로세스들이 pid_list으로 연결되어 있고, 만약 찾고자하는 프로세스 디스크립터의 nr이 4351이 아닌경우 pid_chain에 연결되어 있는 nr이 246인 프로세스 디스크립터로 찾아가면 됩니다.
최근 유닉스 커널은 세가지 방법으로 프로세스를 생성합니다.
‘Copy On Write’ : 부모와 자식이 모두 동일한 물리적 페이지를 읽을 수 있게 합니다. 둘 중 하나라도 페이지에 쓰려고 하면 커널은 프로세스에 새로운 물리적인 페이지를 할당하여 내용을 복사합니다.
경량 프로세스(Lightweight Process) : 페이지 테이블과 열린 파일 목록, 시그널 배열 등 프로세스에게 할당되는 많은 커널 자료 구조를 부모와 자식이 공유합니다.
vfork() : 부모의 메모리 주소 공간을 공유하는 프로세스입니다. 부모 프로세스가 자식이 필요로 하는 데이터를 덮어쓰지 않도록, 자식 프로세스가 종료하거나 새로운 프로그램을 실행하기 전까지 부모 프로세스는 수행을 잠시 중단합니다.
서버와 클라이언트 환경 둘 다 우분투 9.04이다.
서버에 vsftp 서버를 돌려놓고 클라이언트 컴퓨터에서 콘솔로 ftp 접속을 하였는데, 리스트도 보여지고 파일도 다운이 가능한데 파일 업로드만 되지 않았다. (윈도우에서 알ftp로 접속시에는 파일 업로드와 다운로드 모두 잘 되었다)
200 PORT command successful. Consider using PASV.
553 Could not create file.
서버쪽 문제인가 해서 vsftp.conf를 몇번이고 보았지만 잘못 설정된 부분은 없었고, 해당 에러 메시지를 토대로 검색을 하였다.
위 처럼 에러 메세지가 뜨는 경우는 2가지, passve모드와 active 모드 설정 문제인 경우와 SuSelinux 정책 때문이란다.
결론은 접근 디렉토리의 권한이 root로 되어 있어서 접근 아이디의 소유권 문제였다.
chown, chogrp 명령어를 이용해 소유권을 해당 접근 아이디로 바꾸어주니 해결 되었다..-_-;;
하지만 후에 해당 문제가 발생할 수 있으므로 위의 2가지 문제에 대해 포스팅 해놓는다.
# setenforce 0 <-- 일식적으로 SuSeLinux 정책을 끔
# setenforce 1 <-- 일식적으로 SuSeLinux 정책을 끔
# setsebool -P ftpd_disable_trans 1<--일시적으로 SuSeLinux 정책을 끔
# /etc/rc.d/init.d/vsftpd restart
ps: 우분투9.04에서는 SuSeLinux 정책을 사용하지 않는것 같다.
해당 명령어를 입력하면 해당 패키지가 없다고 하고, 해당 패키지를 설치하여 명령어를 수행해도 이미 SuSeLinux는 적용되어 있지 않다고 뜬다.
ftp 프로토콜에서는 Active모드와 Passive 모드, 이렇게 2가지 모드를 지원한다.
이는 서버와 클라이언트 중에서 어느 것이 연결 요청을 하는 것이냐의 차이다.
연결을 하기 위해선 IP주소와 포트가 필요하다. Active모드에서는 클라이언트와 서버 둘 다 서로의 대한 Ip주소와 포트 번호를 모두 알고 있고 클라이언트에서 서버측으로 정해진 포트로 연결을 요청한다.
하지만 Passive모드에서는 서버 측에서 클라이언트 측으로 자신의 아이피와 포트 번호로 연결을 요청한다.
이는 공유기처럼 가상 아이피를 사용하는 경우나 유동 아이피인 경우 유용하게 사용 될 수 있다.
$sudo gedit /etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=50001
pasv_max_port=51000
현재 vsftp 2.0.7 버전에서는 기본적으로 PASV 모드로 전송하는 것 같다.
vsftpd.conf에 pasv_enable 부분 자체가 없는데 ftp 접속해보면 200 PORT command successful. Consider using PASV.<– 이렇게 뜬다.
물론 pasv_enble 부분을 추가해줘도 변화는 없다.
vmware를 이용하여 커널 디버깅하기 위한 환경 설정 하는 자료는 구글링을 하시면 쉽게 찾을수 있습니다. 하지만 옵션이라던가 세부 설정 몇가지가 조금씩 달라 잘 안되는 경우가 있어, 후에 제가 다시 참고하기 위해 정리하고자 합니다.
Host 환경 : windows 7
Target환경 : windows XP SP3(vmware)
vmware : VMware Workstation 7.01
WinDbg : 6.12.0002( 낮은 버전에서는 windows 7을 지원 안할수도 있습니다)
vmware에 설치한 XP에 시리얼 포트를 추가해줍니다.
(이 시리얼 포트를 이용하여 windbg와 vmware가 통신합니다)
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - Debug" /fastdetect /debugport=com1 /baudrate=115200
설정 결과
재부팅하시면 부팅시
이렇게 뜨시면 성공…. vmware 셋팅은 끝났습니다.
C:\WinDDK\7600.16385.1\Debuggers\windbg.exe -k com:port=\\.\pipe\com1,baud=115200,pipe,reconnect
이렇게 셋팅을 한후 실행시키면
이렇게 연결이 되기를 기다리는 상태가 됩니다.
이 상태에서 vmware에서 디버거 모드로 부팅시키면
이렇게 연결이 된것을 볼 수 있습니다.