시스템 엔지니어 - 컴퓨터를 잘 하기 위해서는 컴퓨터를 꺼 놓아야 한다

저자: 김인성(iskim @ bigfoot.com)

필자는 리눅스 시스템 엔지니어이다.

현업에서 리눅스 시스템 엔지니어로 인정 받으려면 대개 팔방미인이어야 한다. 리눅스가 주로 인터넷 서버로 사용되기 때문에 서버/클라이언트 환경에서의 프로그래밍(C,C++ 또는 java)은 기본이다.

또한 아파치 등의 각종 데몬 컴파일, 최적화, 문제 해결 능력도 수행해야 하며, 서버 관리를 위해서 /etc 아래에 있는 기동 파일을 조작하기 위해서는 어느 정도의 셸스크립트에 대한 지식도 있어야 한다. 그에 따라 각종 필터 프로그램(grep, sed, awk등)을 사용할 줄 알아야 한다. 물론 간단한 작업을 손쉽게 처리하기 위해서는 익숙한 스크립트 언어(php, perl, tcl, python등)도 한 개 정도는 있어야 한다.

서버 프로그래머, 시스템 관리자, 시스템 엔지니어

유닉스 프로그래머는 php 등을 이용해서 웹 응용 프로그램을 작성하는 사람들, 한글 패치를 하는 사람들, 배포판 프로그래머 등이 있다. 물론 데몬 프로그래밍을 하는 프로그래머도 있고 리눅스를 임베디드 플랫폼에 포팅하는 경우도 있지만 한국에서는 손꼽을 정도다.

서버 프로그래머, 시스템 관리자, 시스템 엔지니어를 구별하는 요소는 간단히 말하자면 "문제 해결을 시스템적으로 생각하는가" 하는 여부의 차이라고 말할 수 있다. 이 글의 핵심은 바로 여기에 있다. 긴 글이지만 끝까지 읽어주기 바란다. 핵심은 뒤에 있기 때문이다.

적성에 맞다. 재미도 있다. 또한 수명도 길다.

한국에서 소프트웨어 패키지로 성공한 업체는 거의 없다. 패키지가 아니라면 남는 것은 고객의 요구에 따라 부품 단위나 기능 단위의 소프트웨어 제작 용역인데, 마찬가지로 용역당 수익이 크기는 하지만 일년 단위로 나누어 보면 이익이 남지 않는다.

프로그래머라는 직업 자체도 수명이 짧다. 30대 후반이 되면 프로젝트 매니저를 하거나 경영 쪽으로 전향해야 하는데 두 가지 다 내가 원하는 것이 아니다. 하지만 시스템 엔지니어는 세월이 갈수록 오히려 그 가치가 증가한다. 60이 넘어서도 이 직업을 유지할 수 있을 것으로 생각한다.

시스템 엔지니어는 지휘자이다.

시스템 엔지니어는 일부의 인식과 달리 프로그래머, 시스템 관리자의 다음 버전이다. 프로그래머가 만든 소프트웨어를 부품으로 사용하고 시스템 관리자가 맹신하는 소프트웨어 운영, 관리 매뉴얼의 수준을 넘어서야 한다. 거기에 매력이 있다.

특히 리눅스는 모든 소스가 공개되어 있어서 더욱 그렇다. 프로그램의 모든 옵션을 최대한으로 쥐어 짜내고 원하는 기능이 없으면 또 다른 소프트웨어로 대체하고 그래도 안되면 직접 소스를 고칠 수 있다. 프로그램을 조합하고 스크립트 언어로 이들을 엮어서 또 다른 기능을 만들어 낸다. 시스템 엔지니어는 거대한 서버 집단을 조화롭게 동작하도록 만드는 지휘자와 같다.

이 분야는 일정 정도 중독성이 있다. 나에게 이 일을 시작하게 된 동기는 담배를 피게 된 동기와 같이 들린다. 담배는 젊은 시절 언젠가 친구 앞에서 꿇리기 싫어서 피웠을 수도 있고, 멋있어 보여서 시작했을 수도 있지만 그 동기는 전혀 중요하지 않다. 결국은 끊고 싶어도 끊을 수 없도록 중독되기 마련이기 때문이다.

시스템 엔지니어도 마찬가지다. 어쩌다 서버들 간의 관계 설정, 최적화를 해야 했던 날이 있었고 이 것이 재미 있음을 발견하는 순간, 그 마력에 빠져 벗어나지 못하게 될 뿐이다. 오늘도 나는 "어떻게 하면 수백 대 리눅스 서버들의 커널 업그레이드를 자동화 할 수 있을 것인가?" 에 대해서 고민하고 있다.

재미 있는가? 재미 있다. 미치도록.

전공과 나의 직업

컴퓨터 안에는 세상과 격리된 새로운 세상이 있다. 내가 지배하는 세상, 그 세상에 우연히 빠져 들었고 아직도 헤어나지 못하고 있다. 솔직하게 말해서 나는 컴퓨터 중독자다. 놀러 갈 때도 노트북을 가지고 가야 안심이 되고 술자리가 길어지면 노트북을 펼쳐 보고 싶은 생각이 더 간절해진다. 이런 심한 비유를 해도 되는지 모르겠지만 감옥에 가더라도 컴퓨터만 쓸 수 있다면 견딜 수 있을 것이다.

컴퓨터 안에 있는 세상은 언제나 조화롭다. 그러나 윈도우 세상은 별로 조화롭지 않다. 그래서 그런지 컴퓨터를 처음 시작할 때부터 도스 환경보다는 유닉스 환경이 좋았다. 또한 채팅도 별로 좋아 하지 않는다. 내가 지배하는 세상 건너편에 나의 즉각적인 반응을 요구하는 인간이 있다는 것이 마음에 들지 않았기 때문이다. 내가 지배하는 세상, 나는 이 것을 컴퓨터 속에서 찾았다.

컴퓨터 분야는 전공자와 비전공자의 차이가 별로 없는 것 같다. 기초 과학과 같이 반드시 알고 있어야 하는 근본 원리도 별로 없는 것 같고 항상 새로운 이론이 등장하기 때문이다. 자료구조나 알고리즘, 오토마타이론 등이 있기는 하지만 관련된 책을 쉽게 구해서 읽어 볼 수 있고, 대부분은 라이브러리에 최척화된 상태로 구현이 되어 있어서 가져다 쓰기만 하면 되고, 파서 등은 정규식만 제대로 만들면 전용 프로그램이 훌륭한 결과물을 만들어 주기 때문이다.

하지만 컴퓨터를 전공한 것이 빠른 이해에 도움이 되기는 한다. 학교에서 강제로 공부해야 했던 것들이 결국에는 기초를 이루게 하고 새로운 개념이나 방법론을 받아 들일 때 훌륭한 무기가 되기 때문이다. 독학으로는 얻기 힘든 이런 부분은 "배울 시기에 배워 놓은" 것의 장점을 보여 준다. 한국 축구의 고질적인 문제점처럼 개인기는 나이 들어서 습득하기 힘든 것이다.

시스템 엔지니어(SE)가 되고 싶은가?

필자는 SE로서 인터넷 업체를 지원하면서 어느 정도 엔지니어들 사이에서는 인정을 받고 있는 편이다. 대부분의 사이트에서 호소하는 웬만한 문제는 쉽게 해결할 수 있다.

문제 처리는 단순하다

필자가 문제를 처리하는 방식은 매우 단순하다. 시스템을 살펴보고 에러 메시지를 확인한다. /var/log/messages를 살펴본다. 또한 프로그램이 로그를 만든다면 대부분 로그에 에러의 원인이 나와 있다.

여기에 쓸만한 정보가 없으면 ps를 때리고 그 프로세스에 strace를 걸어서 시스템 콜이나 open하는 파일을 살펴 본다. 한 95% 정도는 이 단계에서 문제가 해결된다. 그래도 안되면 debug 위에서 프로그램을 돌린다. gdb 명령어는 복잡하지만 쓰는 것은 몇 개 되지 않는다.

이로써 99% 정도의 문제는 처리할 수 있다. 나머지는 대부분 시스템 설정의 문제이거나 방화벽 코드 이상, 옵션값 없음 등이다. 물론 성능 튜닝이나 구조 재설계 등이 필요한 경우도 있지만 크게 어려운 일이 아니다. 여태까지 시스템적인 문제에서 벽에 부딪힌 기억은 없다.

인터넷 업체 기술 지원을 시작하면서 나는 이런 해결책은 리눅스/유닉스를 사용하는 사람이면 누구나 다 할 수 있을 것으로 생각했다.

하지만 틀렸다. 그래서 당구를 시작했다

필자는 대학 시절부터 당구를 쳤지만 큰 흥미를 느끼지 못했고, 친구들과 사교의 의미 밖에 두지 않았기에 현재 120에 머무르고 있다. 배울 때 배우지 않은 탓일까?

그림1
[그림 1] 예술구 대회 11점 문제 : 당구 집대성, p247, 로버트 바이런, 박용수 번역, 오성 출판사, 1993}

[그림1]은 세계 예술구 대회에서 가장 고난도로 치는 11점을 획득할 수 있는 문제이다. 극심한 끌어치기를 해야 한다. 공은 첫번째 적구까지 미끌어진 다음, 첫번째 공을 맞고 뒤로 끌리며 휘어진 후 첫번째 긴 쿠션을 맞는다. 그 다음부터는 회전력으로 굴러서 건너편 구석까지 가야 한다. 강력한 스트로크, 끝까지 살아 있는 회전이 생명이다.

자, 독자 여러분도 이제 이 문제를 알았으니 예술구 대회를 나갈 수 있을 것이다. 나머지 허접한 1-2 점짜리는 [그림1]의 참고 도서에 자세한 그림이 다 나오니 연습하면 익힐 수 있다. 더구나 예술구 대회는 3번까지 같은 공을 시도할 수 있다지 않은가!

허접하게 왜 당구 이야기를 하는 것일까? 개구리 올챙이적 시절을 기억하지 못하기에 필자의 SE에 대한 이야기는 현재로 과거를 날조하는 성공담 밖에 되지 않는다. 그 보다는 당구 이야기가 훨씬 설득력이 있기 때문이다.

당구의 달인들에게 [그림1]의 공을 어떻게 치면 되는지 물어보면 "잘 치면 된다" 라고 답할 것이다. 물론 나에게 어떻게 하면 좋은 SE가 될 수 있는지 물어 보면 이렇게 대답할 것이다. "잘--"

시스템을 버려라

당구에는 여러 가지 시스템이 있다. 대표적인 것이 [그림 2]에 나오는 파이브앤하프 시스템이고 이를 보완한 플러스투 시스템, 맥시멈 잉글리시 시스템, 노잉글리시 시스템 등이 있다. 물론 스리온투 시스템이니 리버스 시스템이니 하는 것도 있고 고수들은 자신만의 시스템을 가지고 있기도 하다.

그림2
[그림 2] 파이브엔하프 시스템 : 아카데미 4구 p207, 손형복, 삼호 미디어, 1997

사실 이런 시스템을 전혀 몰라도 당구는 칠 수 있다. 사실 고수가 된 사람들 중에는 처음부터 시스템을 무시한 사람도 많다. 중요한 것은 시스템을 알든 모르든 고수가 되고 나면 시스템을 버린다는 사실이다. 시스템을 잊어야 진정한 고수가 되는 것이다. 때문에 우리가 첫번째 쿠션의 포인트로 2.3에 보내야 하는지 3.1에 보내야 하는 지 물어도 고수들은 답을 할 수 없는 것이다. 정답은 "대충 보내면 된다".

필자 같은 당구 초보자는 항상 이 시스템을 적용해 보고자 노력한다. 당구는 당점, 회전, 치는 속도, 칠 때의 큐 동작에 따라 다양한 결과가 나오기 때문에 아무리 시스템을 적용해서 첫번째 쿠션의 2.3에 보내도 공이 맞지 않는 경우가 많다.

초보와 고수의 차이는 정확한 스트로크 - 셸스크립트이다

초보자와 고수의 차이는 이런 곳에 있지 않다. 양귀문의 당구 교실 비디오에 보면 밀어치기, 중앙치기, 끌어치기를 설명하는 부분이 있다. 놀랍게도 양귀문씨가 직접 치는 부분에서 밀어치기를 한 공은 적구가 돌아와서 정확하게 다시 맞고, 중앙치기를 한 공은 제자리에 머물러 있고 적구가 다시 와서 이 공을 쳤고, 끌어치기를 한 공은 적구가 돌아 올 동안 짧은 쿠션을 맞고 올라가 적구와 정확하게 부딪혔다.

그림3
[그림 3] 기본 공치기 : 양귀문의 당구 교실(비디오) : 양귀문, 비엠코리아, 1993

바로 고수와 초보자의 차이는 얼마나 정확한 스트로크를 하는가에 달린 것이다. 서초동에 있는 아카데미 당구교실에서 300점이 되기 전까지는 시스템, 포지션 플레이 등을 가르치는데, 그 이상의 고수가 되고자 하면 비디오 카메라를 사용하여 스트로크 자세를 고치는 일부터 다시 한다고 한다.

SE로서 가장 중요한 기초가 무엇인가를 나에게 묻는다면 나는 셸스크립트라고 대답할 것이다. 수많은 컴파일 언어, 스크립트 언어가 있지만 가장 중요한 것은 셸스크립트라고 나는 자신할 수 있다. 고수가 되고 싶은가? 셸스크립트를 익혀라.

리눅스 시스템의 대부분의 동작은 셸스크립트로 이루어져 있다. /usr/bin에는 수많은 셸스크립트가 존재한다. 시스템 기동 스크립트는 모두 셸스크립트로 짜여져 있다. 셸스크립트를 이해하지 않고는 시스템에 접근할 수 없다.

왜 셸스크립트가 중요한가?

사실 셸스크립트 문법은 매우 단순하다. 몇 가지 자료형과 몇 가지 제어문 밖에 없다. 그런데 왜 셸스크립트가 중요한 것일까?

유닉스는 "작은 것이 아름다운" 전통 때문에 /usr/bin에 있는 대부분의 프로그램이 단순한 동작밖에 할 수 없도록 되어 있다. 그러나 이들은 표준 입력과 표준 출력을 재지정할 수 있도록 되어 있고 시스템에서 파이프를 지원하기 때문에 프로그램의 조합이 가능하다. 셸스크립트를 한다는 것은 이런 단위 프로그램을 조합하여 내가 원하는 작업을 처리한다는 뜻이다. 즉 셸스크립트의 미약한 성능 때문에 오히려 전통적인 유닉스 필터 프로그램에 대한 지식을 넓힐 수 있게 되는 것이다.

파일 소팅이 필요한가? sort를 사용하라. sort는 수십 년간 다듬어져 왔으면 최신 정렬 이론이 그대로 구현되어 있다. 당신이 아무리 뛰어난 프로그래머라도 유닉스의 sort보다 더 뛰어난 소팅 프로그램을 만들 수 없다. 아니다. 잘못 말했을 수도 있다. 당신이 매우 훌륭한 프로그래머라서 더 좋은 프로그램을 만들 수 있을지도 모른다. 하지만 왜 바퀴를 새로 개발하려고 하는가? sort 프로그램을 그냥 사용하면 되는데,,,

유닉스 필터 프로그램의 정확한 사용법과 활용법을 익히는 것은 당구의 스트로크를 연습하는 것과 같다. ls에도 수많은 옵션이 있다. 나는 지금 옵션을 외우라고 말하고 있는 것이 아니다. 필터 프로그램의 사용법을 한 번은 보고 실행해서 그 결과를 알고 있어야 한다는 뜻이다.

안정된 자세와 정확한 스크로크는 하루 아침에 이루어지지 않는다. 정확한 스트로크를 익히는 것은 몸이 그 동작을 기억하도록 하는 시간의 함수이다. 반복, 또 반복을 거듭해서 어떤 상황에서라도 안정된 스트로크를 구사할 줄 알아야 실력이 느는 법이다.

apache, mysql, samba, bind, sendmail, inet, nfs 등에 관한 경험은 그 다음이다. 마치 [그림 4]의 공모으기를 위해서 제1적구를 두껍게 치고 수구에 오른쪽 회전을 줘서 제1적구가 왼쪽 회전으로 돌아 오도록 세게 쳐야 한다는 것을 알게 되는 것과 같다. 스트로크가 안정되어 있지 않다면 이런 지식을 가지고 있어도 실전에서는 제2적구가 맞지 않을까 두려워 대부분 수구를 살짝 굴려 우선 한 개 치는 것에 급급하게 된다.

그림4
[그림 4] 공모으기 : 당구 매니아 64p, 최명호, 일신서적출판사, 2000년

몸에 익히는 기술은 세월이 필요하지만 익힐수록 더 쉬워지고 세월이 가도 잊어 먹지 않으며 고급 기술을 익히는 데 남들보다 더 적은 시간이 필요하게 되며 새로운 상황에 대응하는 능력이 길러진다. 소위 각조립이 가능한 것이다. 초구 끌어치기, 밀어치기 3쿠션도 이 단계에서는 더 이상 엽기가 아니다.

셸스크립트를 사용하면서 /usr/bin의 필터 프로그램을 익혀 놓으면 웬만한 문제는 필터 프로그램으로 해결 가능하다. 이런 단계에 다달았다면 필터 프로그램에 없는 기능을 스스로 만들어도 된다. 원하는 기능이 필터 프로그램들에 없다는 확신을 가질 수 있을 정도의 수준이 되기 위해서는 수많은 세월이 필요하겠지만.

유닉스 전통을 역행하고 있는 펄을 사용한다면 이 모든 작업에 펄을 사용 할 수 있다. 하지만 내가 원하는 모듈이 없을 때 필연적으로 상상력에 제약을 받을 수 밖에 없다. 원하는 기능을 하는 모듈이 나올 때까지 기다리든지 내가 직접 만들어야 한다. 이 문제는 최근에 유행하는 파이썬도 마찬가지다.

SE는 시스템에 대한 지식을 가지고 있어야 하는데 시스템에 대한 지식이란 다양한 프로그램에 대한 사용 경험에서 나온다. 물론 스크립트 언어도 사용할 줄 알아야 하지만 셸스크립트를 잘 쓸 줄 모른다면 아무리 훌륭한 스크립트 언어라도 SE를 가두는 감옥일 뿐이다.

필자는 시간이 있을 때 /usr/bin에 가서 ls를 치는 취미가 있다. 적지 않은 세월 동안 리눅스를 사용했지만 아직도 /usr/bin에는 내가 모르는 프로그램이 더 많다. 그 안에 있는 셸스크립트 프로그램을 뒤져 보면서 필터 프로그램의 또 다른 활용법에 감탄하고는 한다. 고수가 되고 싶은가? 셸스크립트를 익혀라.

시스템적으로 생각하자

리눅스에 대한 경험이 많다면 리눅스 시스템을 거대한 필터 프로그램의 조합이라고 생각할 수 있게 될 것이다. 웬만한 문제는 몇 개의 프로그램 조합과 셸스크립트로 해결할 수 있다.

기존 프로그램과 언어를 활용하자

두 개의 웹 서버에 생기는 아파치 로그를 한 서버로 옮겨서 분석을 하고 싶다고 하자. 아파치에는 로그를 syslog로 보내는 기능이 있다. 이렇게 해서 syslog의 원격 전송 기능을 활용하면 두 서버의 로그를 syslog를 통해서 받을 수 있다. syslog는 UDP를 사용하는데 부하가 걸리면 소실되는 부분이 생긴다. C로 소켓을 이용해서 TCP 전송을 하게 하면 아파치가 로그 전송을 위해서 대기하기 때문에 웹 서버 성능이 급격하게 떨어진다.

최종적으로 가장 효과적인 방법은 지정 시간마다 아파치 로그 파일을 아파치에서 분리하고(USR1 시그널 이용) rsync를 사용해서 전송하는 것이다. rsync는 어떤 프로그램보다 원격 데이터 전송에 효율적이고 아파치는 로그 전송에 신경 쓸 필요도 없기 때문에 성능 감소가 없다. 이 과정에서 스크립트 언어를 사용하여 소켓 프로그래밍을 하고 분리한 아파치 로그를 전송하는 간단한 네트워크 파일 전송 서버/클라이언트 데몬을 만들 생각을 할 수도 있겠지만 개발에 편자일 뿐이다.

당신이 어떻게 만들어도 rsync의 능력을 뛰어 넘기 힘들고 시간비용이 너무 크다. rsync를 사용하면 된다는 생각을 해내는 것이 바로 시스템적으로 생각하기의 전형이다. 새로운 프로그램을 만들지 않고 기존 프로그램의 기능을 활용하고 여기에 부수적인 시스템 동작 방식을 조립하여(아파치에 USR1 시그널을 날려 로그 분리해 내기) 문제를 해결한다.

다시 로그를 생각해 보자. 두 개의 시스템에서 로그를 보내 왔는데 이들을 합쳐서 분석하고 싶다. 분석 프로그램이 각각의 로그라인의 시간을 읽어 들여서 이들 시간을 기록해 놓았다가 처리하면 될 것이다. 즉 a 서버의 로그를 모두 읽어서 시간 배열(혹은 연결리스트)을 만들어 내고 두번째 b 서버의 로그를 읽어서 각각 라인의 시간값을 읽어서 시간 배열의 적절한 위치에 삽입해서 처리한다고 생각하고 프로그램을 작성하면 된다.

물론 적절한 위치를 찾기 위해서 프로그래밍을 해야 하는데 당연히 sort보다 느릴 것이다. 또한 전송 과정에서 잘못되어 무한히 긴 라인이 들어왔다든지, 처리의 기준이 되는 시간 데이터 형식이 잘못되었다든지, 웹 서버가 동작 중에 재부팅했고 바이오스 시간이 잘못되어 있어서 로그의 시작에는 오늘 날짜로, 재부팅한 중간 지점에는 어제 날짜로 바뀌어 날아왔다든지 하는 문제를 해결하기 위해서는 수많은 경우에 대처할 수 있도록 코드를 작성해야 한다.

문제 처리 시간은 점점 늘어나고 해결책은 점점 멀어지고 성능을 위해서 다시 알고리즘 책을 들여다 보게 된다. 프로그래머적인 관점에서 문제를 해결한다는 것은 때로는 문제 해결을 복잡하게 만들고 더 어려운 길로 가면서 지엽적인 부분에 얽매이는 경향이 있다.

신뢰할 수 있는 기초 작업 후에 필요 작업을 찾자

시스템 엔지니어는 어떤 경우에도 "반드시 생각대로 동작할 것"이라고 가정해서는 안된다. 시스템은 언제나 시간이 잘못될 수 있다. ntp를 사용하여 시간을 정확하게 맞추고 있었더라도 시스템 시간이 항상 정상일 것이라고 생각해서는 안된다. 시간을 보내 주는 타임 서버가 비정상적으로 동작할 수도 있다. 때문에 시간을 가져오는 서버를 여러 개로 설정해서 문제를 해결했다고 생각해서도 안된다. 모든 타임 서버가 잘못될 수도 있기 때문이다.

사실 지금 필자가 말하고 있는 사항들은 실제로 필드에서 겪었던 일들이다. 필자도 모든 부분에서 완전한 해결책은 하나도 가지고 있지 않다. 다만 가능한 모든 사항에 대한 고려를 함으로써 에러 발생률을 최소한으로 줄일 수 있을 뿐이다. 시스템은 원래 그렇다.

예를 통해 살펴보자. 아파치에 부하가 걸리면 로그에 쓰레기 값을 적는 경우가 발생한다. 그러므로 날아온 로그를 처리하기 전에 다음과 같은 코드를 사용하여 로그를 유효한 데이터로 변환시켜야 한다.

아파치 로그 형태(combined 포맷)

211.178.82.98 - - [01/Jan/2001:01:01:01 +0900] "GET /img2/today_eval_small.gif
HTTP/1.1" 200 - "http://a.com/" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;
DigExt; Hotbar 2.0)"

grep "^[0-9]*.[0-9]*.[0-9]*.[0-9]*" | \
grep "\[[0-9][0-9]/[A-Z][a-z][a-z]/[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9] \
[+-]*[0-9][0-9][0-9][0-9]]" > ${LOG_FILE.NORMAL}

물론 이렇게 걸러내도 무의미한 라인이 100% 걸러지는 것은 아니다. 하지만 99%는 확신할 수 있으므로 그 다음 단계로 넘어 갈 수 있다.

로그 분석을 위한 프로그램은 어떤 것이라도 상관없다. 상용일 수도 있고 오픈 소스일 수도 있다. 이들은 NCSA에서 정한 공통 로그 포맷을 사용하므로 이 포맷으로 된 한 개의 소팅된 로그 파일을 만들어 내기만 하면 된다. 프로그램 자체에서 로그를 소팅하는 일은 무의미한 시간 낭비일 뿐이다. 때문에 sort 필터를 사용하기로 하자.

날아온 로그 파일을 cat *.log > log.total 로 통합하고 sort 프로그램을 돌리면 된다. 문제는 sort 프로그램은 한 개의 필드 구분자(FS)를 사용한다는 것이다. 또한 아파치 로그의 시간 포맷이 소팅하기에 그렇게 적절한 형태가 아니다.

Perl 등의 소트 함수도 마찬가지이다. sort 프로그램의 소스가 있으므로 FS를 여러 개 쓸 수 있도록 만들기 위해서 뒤져 보았는데 효율성을 위해서 엄청나게 복잡하게 짜여져 있어서 고치는데 많은 시간이 들 것으로 판단되었다. 더구나 sort 프로그램이 업그레이드 되면 또다시 업그레이드 된 sort에 맞게 패치해야 하고 다른 시스템에 동작하게 할 때 변경된 GNU sort를 포팅해야 하는 문제가 발생한다.

가장 간단히 문제를 해결하는 방법은? sort가 원하는 형태로 데이터를 변환하는 간단한 프로그램을 만들면 된다. 파일을 읽어서 첫번째 "["를 "/"로 바꾸고 둘째 "/" 세째 "/"를 카운트 한 후에 그 다음에 나오는 ":"를 모두 "/"로 바꾸면 된다. 이렇게 바꾸고 나면 다음과 같다.

211.178.82.98 - - /01/Jan/2001/01/01/01 +0900] "GET /img2/today_eval_small.gif
HTTP/1.1" 200 - "http://a.com/" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;
DigExt; Hotbar 2.0)"

sort 프로그램은 이제 "/"를 단 한개의 필드 구분자로 인식하여 2,3,4,5,6,7 번째 필드를 기준으로 소팅을 할 수 있다. 소팅 루틴은 다음과 같을 것이다(sort의 플래그는 매뉴얼 페이지를 참고 할 것).

sort -T ${LOG_DIR} -t / -k 4n -k 3M -k 2n -k 5n -k 6n -k 7n < ${LOG_INPUT} > ${LOG_OUTPUT}

결과물을 다시 공통 로그 포맷으로 바꾸기 위해서는 "/"를 "["와 ":"로 역변환 해주면 된다.

그 외 로그 파일의 시간처리 문제, 일정 시점에서 로그를 보내지 않은 시스템의 로그를 대기해야 하는 문제등의 복잡한 상황이 발생한다. 시스템은 항상 불안정하고 모든 동작은 시간의 함수와 상관관계가 있다. 지정된 시간에 발생해야 하는 사건이 발생하지 않았을 때 단순히 기다릴 수도 없고 무시할 수도 없다.

예를 들어 1시에서 2시까지 정상 동작하던 웹 서버가 2시 5분에 죽었다가 2시 10분에 살아 났다고 할 때, 로그 처리 서버가 2시 6분에 로그 전송 여부를 검사하는 루틴에서 전송되지 않은 서버를 무시할 수 없다. 한 시간 분량의 유효한 로그를 처리하지 않는다면, 그날 페이지뷰가 정확해지지 않기 때문이다. 그렇다고 무한히 기다릴 수도 없다. 로그가 올 때까지 기다렸을 경우 금요일 저녁에 관리자가 퇴근하여 월요일 아침에 출근할 때까지 시스템에 쌓인 로그가 파일 시스템을 다 채울 수 있기 때문이다. 이와 같이 시스템 동작과 정확한 로그데이터 처리 사이의 상관관계를 고려한다면 문제가 복잡해지지 않을 수 없다.

이런 복잡한 얘기를 계속하는데 질렸을 독자를 위해 결과 스크립트의 일부를 보여 주겠다.

# 모든 웹 서버가 로그를 보냈는지 체크
LOG_COMPLETE=1
check_log $*

# 로그를 안 보낸 서버가 있을 경우 처리를 유보한다.
if [ ${LOG_COMPLETE} -eq 0 -a ${CHECK_FORCE} -ne 1 ]; then
   return   
fi   
   
# 임시 파일을 지운다.   
rm -f ${LOG_TOTAL} ${LOG_TOTAL_TMP} ${LOG_EARLY} 2>/dev/null   
   
# 웹 서버가 보낸 로그를 모은다.   
   
if [ $# -eq 1 ]; then   
   LOG_SERVER_NUMBER_IS_ONE=1   
   treat_this_log $1   
else   
   LOG_SERVER_NUMBER_IS_ONE=0   
   while [ $# -ne 0 ]; do   
      treat_this_log $1   
      shift   
   done   
fi   
   
# 합쳐진 로그 파일이 없으면 실행을 중단한다.   
if [ ! -s ${LOG_TOTAL} ]; then   
   rm ${LOG_TOTAL} 2>/dev/null   
   return   
fi   
   
# 지난 번 시점에 공통 부분보다 시간이 나중이었던 로그를 합친다.   
cat ${LOG_LAST} >> ${LOG_TOTAL} 2>/dev/null   
   
#########################################################   
# 각 서버의 최종 시간 중에서 가장 빠른 로그 한 줄을 추출한다.   
#   
rm -f postsort.tmp presort.tmp 2>/dev/null   
   
LOG_EARLY_INSTANCE=""   
   
if [ -s ${LOG_EARLY} ]; then   
   if [ ${IS_TOTAL} -ne 1 -a ${IS_UP} -ne 1 ]; then   
      presort ${LOG_EARLY}   
   fi   
   sort -T ${LOG_DIR} -t / -k 4n -k 3M -k 2n -k 5n -k 6n -k 7n < ${LOG_EARLY} > ${LOG_EARLY}.tmp   
   mv ${LOG_EARLY}.tmp ${LOG_EARLY}   
   LOG_EARLY_INSTANCE=$(head -n 1 ${LOG_EARLY}|cut -b1-49)   
   rm -f ${LOG_EARLY}   
fi   
   
#########################################################   
# 공통 시간의 최종 시간을 추출하여 이전 로그만 처리한다.   
# 뒷부분은 다음 처리 시점에 합치게 된다.
#   
rm -f postsort.tmp presort.tmp 2>/dev/null   

if [ ${IS_TOTAL} -ne 1 -a ${IS_UP} -ne 1 ]; then   
   presort ${LOG_TOTAL}
fi
   
sort -T ${LOG_DIR} -t / -k 4n -k 3M -k 2n -k 5n -k 6n -k 7n < ${LOG_TOTAL} > ${LOG_TOTAL_TMP}   
   
if [ "${LOG_EARLY_INSTANCE}" != "" ]; then   
   TOTAL_LINE_NUM=$(wc ${LOG_TOTAL_TMP} |awk '{print $1}')   
   LINE_NUM=$(grep -n -F -a "${LOG_EARLY_INSTANCE}" ${LOG_TOTAL_TMP} |awk -F: '{print $1}' |head -n 1)   
   
   head -n ${LINE_NUM} ${LOG_TOTAL_TMP} > ${LOG_TOTAL}   
   tail -n $(( $TOTAL_LINE_NUM - $LINE_NUM )) ${LOG_TOTAL_TMP} >${LOG_LAST}   
   
   if [ ${IS_TOTAL} -ne 1 -a ${IS_UP} -ne 1 ]; then   
      postsort ${LOG_LAST} ${LOG_LAST}.tmp   
      mv ${LOG_LAST}.tmp ${LOG_LAST}   
   fi   

   mv ${LOG_TOTAL} ${LOG_TOTAL_TMP}   
fi   
   
if [ ${IS_TOTAL} -ne 1 ]; then   
   cp ${LOG_TOTAL_TMP} ${LOG_UP}/access.${LOG_HOSTNAME}.$(date +%Y%m%d%H%M)   
fi   
   
postsort ${LOG_TOTAL_TMP} ${LOG_TOTAL}

참고로 이 스크립트는 현재 하루 페이지뷰 1300만 정도인 사이트의 100여대 웹 서버에서 보내오는 로그를 1시간 단위로 처리하고 있다. 스크립트의 길이는 600여 라인 정도 되는데 설명과 공백을 빼면 500라인 조금 못된다.

또한 이 스크립트는 사이트의 요구에 따라 subsub1.com, subsub2.com, subsub3.com, subsub4.com 각각의 페이지 통계 처리를 하고 다시 각각의 결과 로그를 통합해서 sub1.com, sub2.com 에 대한 페이지 통계를 만들어 낸 다음, total.com 이라는 회사 전체의 모든 통계를 만들어 낸다.

즉 subsub1.com에서 작업하는 사람들은 subsub1.com에 대한 히트카운트, 페이지뷰를 볼 수 있으며 subsub1.com, subsub2.com 둘 다 관련된 사람들은 sub1.com의 통계를 보면 되고 회사 전체의 페이지뷰에 관심 있는 사람들은 total.com의 페이지뷰를 볼 수 있도록 되어 있다.

예를 들고 보여준 모든 로그와 프로그램에서 특정 회사와 관련된 부분과 시간 값은 중립적인 값으로 변경한 점도 말해둔다.

시스템적으로 생각하기가 무엇인지 알기 위해 너무 복잡한 이야기를 한 것 같다. 간단히 정리하면 다음과 같다.
  • 큰 작업을 위해 훌륭한 언어가 필요한 것은 아니다.
  • 모든 것을 개발할 필요는 없다. 리눅스는 거대한 필터 프로그램의 집합이며 가능한 이미 발명된 바퀴를 굴려서 문제를 해결할 수 있다.
  • 시스템이 불변의 어떤 것을 제공할 것이라고 믿어서도 안된다. 항상 신뢰할 수 있을 정도의 기초 작업을 한 후에 필요한 작업을 진행하도록 해야 한다.
  • 현재의 특정한 상황만을 고려하여 작업을 한다면(sort 소스 고치기와 같은) 나중에 더 많은 시간을 투여해서 또 다른 상황에 맞추는 작업을 해야 할 수도 있다. 변경은 최소화하고 어디서나 사용 가능한 상태로 문제를 해결하는 것이 가장 좋은 방법이다.
무의미한 것에 답이 있다

어느 날 당구 아카데미에서 혼자 연습하고 있는 양귀문씨를 본 적이 있다. 대부분의 공을 맞추었지만 내가 잘치는 공을 못치는 경우도 있었다. 연습 중이어서 그랬는지 자세도 대충 잡고 치기도 했다. 나는 그 모습을 보면서 고수 혹은 도통한 사람들의 일반적인 모습이 이럴 것이라고 생각했다. 시스템을 익히고 나면 시스템을 버리고 스트로크를 몸에 익히고 나면 스트로크의 자세까지 버리는 모습. 고수가 되면 오히려 더 평범한 모습을 띄게 되는 것이다.

80/20 이론이란 것이 있다. 사회 인구의 20%가 부의 80%를 차치하고, 회사 인력의 20%가 80%의 수익을 발생시킨다는 이론이다. 이 이론을 책으로 낸 저자는 대학 시절 교과서의 20% 부분만 공부해서 80 점 이상을 받아 냈다고 자랑하고 있다. 필자도 점수의 80%는 고작 20% 정도의 기본 공 형태에서 얻고 내가 치는 차례의 80%는 점수를 못내고 있다는 것을 알고 있다. 또한 일반적으로 잘 나오는 형태의 공을 몇 개만 집중적으로 연습하면 금방 200 이상을 칠 수 있음을 알고 있다.

그러나 이 이론은 진정한 고수가 되는 방법에 대한 통찰력은 없는 듯하다. 실생활에서 충분히 응용할 수 있는 이론이지만 모든 것을 경험한 사람에게서 느낄 수 있는 인간의 깊이라는 부분이 빠져 있는 것이다.

고수가 되기 위해서는 비록 외우지는 못하더라도 시간을 내서 ls의 모든 옵션은 살펴 볼 필요가 있다. 처음부터 이럴 필요는 없다. 하지만 당신이 여러 해 동안 노력했음에도 실력에 변화가 없을 때 혹시 알고 있는 것만을 알고 있고, 사용하던 것만을 사용하고 있는 것은 아닌지 의심해 보아야 한다. 필요 없다고 무시했던, 80%에 속한, 무의미한 것이라고 간과하고 있었던 것에서 진짜 답이 있을 수 있기 때문이다.

그림5
[그림 5] 스트로크 연습용 끌어치기 : 김인성

필자는 [그림 5]와 같은 끌어치기 쓰리쿠션을 자주 연습한다. 이 공을 연습하는 동안 스트로크에 대한 감을 잡을 수 있기 때문이다. 하지만 오늘도 친구와 당구를 쳤는데 2패였다. 현재 필자의 구력은 170점 정도 된다. 잘 칠 때는 200과 같이 치고 보통 때는 150정도이므로 올릴 수도 그대로 있을 수도 없어서 이렇게 생각하고 당구를 치고 있다. 하지만 맨날 지고 있으니 정말 소 한 마리 잡아야 300이 되는 날이 올 것 같다.

부록 - 내가 읽은 책들

마지막으로 내가 읽은 책들에 대해 이야기하고자 한다. 필자에게도 특별한 방법이 있는 것은 아니다. 배울 시기에 부지런히 읽어두자는 의미에서 정리했다.

나오며

시간을 내서 스트로크 연습하러 가야 하는데 마음의 여유가 없어서 가지 못하고 있다. 여러분은 어떤가? 혹시 책상 앞에 보고 싶은 책 사놓고도 몇 달 째 인터넷 서핑하는 데 바빠서, 모질라 새 버전 테스트 하느라고 바빠서, 그놈 데스크탑 커스터마이징 하는 데 바빠서 아직도 못 읽고 있지는 않은가?

컴퓨터를 잘 하기 위해서는 컴퓨터를 꺼 놓아야 한다는 진리를 기억하기 바란다.


출처 : 한빛미디어, 2004  http://network.hanb.co.kr/view.php?bi_id=965

by atomicgun | 2007/07/26 00:20 | 트랙백 | 덧글(1)

비슷한 기능을 하는 linux / dos 명령어

          비슷한 기능을 하는 linux / dos  명령어

 

list 보기                                ls          /          dir

디렉토리 생성                       mkdir        /          mkdir , md

디렉토리 삭제                       rmdir        /          rmdir , rd

디렉토리 트리                       ls -R         /          tree

파일 삭제                              rm          /          del , erase

파일 복사                              cp          /          copy

파일 이동                              mv         /          move

이름 변경                              mv         /          rename

change directory                   cd          /          cd

현재 디렉토리 표시                 pwd          /          cd

화면 정리                              clear       /          cls

명령어 해석기                    sh, csh, bash /          command.com

파일 내용 표시                      cat           /          type

도움말, 메뉴얼                      man          /          help

쉘 종료, 도스창 종료               exit           /          exit

시간 표시                             date         /          time

그대로 출력                          echo         /          echo

환경변수 표시                     set,env        /          set

경로 보기                        echo $PATH    /          path

버전 정보                         uname -a      /           ver

 

 

예전에 도스를 배울 때

내부 명령, 외부 명령 나눠서 배웠습니다.

제 기억에 위에 나열한 것은 내부 명령이 될 것이고

아래에 나열하는 명령은 외부 명령이 될 겁니다.

대부분 linux 에 있는 이름과 동일하거나 비슷하고 기능도 같거나 유사합니다.

 

< network 관련 프로그램 >

사용자 정보 출력                                     finger       /      finger
ping                                                      ping       /       ping
라우팅 테이블                                       route -n     /       route print
네임서버 쿼리 툴                                 nslookup       /       nslookup
telnet                                                 telnet       /       telnet
ftp                                                         ftp       /       ftp
네트워크 경로 trace                          traceroute       /       tracert

 

< 파일, 디렉토리 , 문자열 관련 >
파일 안의 문자열 찾기                                   find       /      find

파일 안의 문자열 찾기                                  grep       /      findstr
긴 화일 한 화면씩 출력                                 more       /       more

2개 파일 내용 비교                                        diff       /       fc, comp
라인 에디터                                                 ed       /       edlin
문자열, 라인별 정렬                                    sort        /       sort

하위 디렉토리까지 복사                               cp -R       /       xcopy

file 속성 표시                                          lsattr        /       attrib

현재 경로를 저장 후 이동                            pushd       /        pushd
pushd로 저장한 경로로 이동                         popd       /        pupd

화일 감추기                                                   mv file .file       /       ATTRIB +h or -h

압축                                                               tar , zip          /          pkzip

 

< 시스템 관련 >
프로세스 정보                                       ps, top       /       taskmgr
컴퓨터 호스트명                                 hostname       /       hostname

scheduling                                         at, cron       /       at

프로세스 종료                                    kill , killall        /       tskill
시스템종료                        shutdown, halt, init 0       /       shutdown

file system 관련                                    mke2fs       /       format

ip표시,interface표시, 설정                        ifconfig       /       ipconfig

fdisk                                                      fdisk       /       fdisk

디스크검사                                              fsck        /        chkdsk

free memory 보기                                free, top       /       mem

scandisk                                         fsck, debugfs   /       scandisk

 

< 기타 >

파일 인쇄                                                 lpr          /       print

프린트 큐 보기                                           lpq         /        print

윈도우즈 시작(windows 3.1), X-window 시작    startx     /        win

 

아래 링크는 redhat linux 문서 중

DOS와 LINUX 간에 비슷한 명령을 표로 나타낸 문서입니다.

 

http://203.249.6.162/doc/starting-ko/ch-doslinux.html

 

또 아래 링크를 보면 DOS 와 Linux 의 명령을 나열하고

기능상의 차이점이나 성능상의 차이점을 설명하고 있습니다.

 

http://wiki.kldp.org/wiki.php/LinuxdocSgml/Dos-Win-to-Linux-HOWTO


아래 링크는 명령이 몇 개 없지만

각 리눅스/유닉스 명령을 클릭하면 설명을 볼 수 있습니다.

 

http://linux.sarang.net/paper/unix_help/DOStoUNIX.html

 

by atomicgun | 2007/06/11 02:17 | 긁적이(잡다한것) | 트랙백 | 덧글(0)

하드 디스크 오류 증상별 응급대처법


데이터손상원인
1.   booting 안됨(구동이 안 될 경우)
 
데이터손상증상
 하드디스크 인식 불가
 
조치요령
 일반 사용자가 복구하기 어려으므로 전문업체에 의뢰
 
하드디스크가 구동이 안 될 경우

1. System Power Supply 문제 / Power Connector 문제

2. 하드디스크의 PCB 문제 정상적으로 작동하는 System Power Supply 나 power Connector, PCB 등으로 교체 (하드디스크의 PCB는 다양한 Model과 용량, Model 별 version을 맞추어서 교체해 보아야 하므로 쉽게 해결되지 않는 경우가 많다)

3. Spindle Motor 문제 / Sticktion (Head가 Media에 붙어서 Spindle Motor작동불능 상태) 이런 경우  일반 사용자가 해결할 수 없으므로 전문가와 상의 하여야 한다.
 


2.  booting 안됨(구동이 될 경우)
 
데이터손상증상
 하드디스크가 정상 동작을 하지 않음
 
조치요령
 일반 사용자가 복구하기 어려으므로 전문업체에 의뢰
 
소음이 심한 경우  

Media 문제 : Media 표면이 head에 의해 긁히는 경우  

Spindle Motor 문제 : Motor의 베어링이 마모되거나 파손되었을 경우   

=> 이런경우는 가장 심각한 문제라고 볼 수가 있으며. 두가지 경우 모두 하드디스크가 더이상 손상되지 않도록 Power를 끄고 전문업체에 의뢰

특별한 소음이 없을 경우

PCB 문제 , Head 문제,  Media 문제 : servo 정보가 파손된 경우    

Spindle motor 문제, Vibration 문제 

=> 이런 경우  데이터복구 전문가들도 여러 가지 데이터 복구 TOOL을  가지고 작업을  해보아야지 만 알 수 있는 증상이므로 반드시 데이터 복구 전문가와 상의하는 것이 좋다.

CMOS 에서는 정상적으로 잘 인식하나 부팅 하려 할 때 "Hard disk fail"  경우  하드디스크로 부팅 안 되며 diskette은 부팅이 되나 OS가 시작 안될 경우 드라이브 내부는 진공은 아니지만 아주 높은 청정구역으로  만약 일반 공기에서 Cover를 열 경우 많은 먼지와 정전기로 인하여 드라이브가 완전히 손상 되는  경우가 많이 있다. 

하드웨어는 전문가들도 상당히 신중을 기하는 작업으로  어떠한 경우라도 드라이브의 Cover를 열어서는 안된다.
 


3 . Data Delete
 
데이터손상증상
 필요한 파일이 삭제됨
 
조치요령
 즉시 더 이상의 작업을 중지하고 전문 복구 업체에 의뢰
 
데이터가 지워졌을 때 데이터는 완전히 지워지는 것이 아니다. 파일의 위치에 있는 정보는 다른 작업을 하여 저장이 되기까지 남아 있다. 단지 드라이브에서 파일의 이름과 FAT (file allocation table)의 정보가 없어져서 컴퓨터상에서는 데이터 지워진 것으로 인식하는 것이다.

만약 Delete 시킨 후 더 이상의 저장을 하지 않은 경우는 상용으로 판매되고 있는 복구용 소프트웨어나 Disk 유틸리티 등으로 대부분 복구가 가능하다.

하지만 Delete후 컴퓨터를 오래도록 사용하였거나 다른 프로그램을 Install 혹은 파일을 복사하여 Overwrite한 경우는 원래 데이터가 있던 자리에 새로운 데이터가 이미 덮어 씌워지므로 대부분 복구가 어렵다. 특히 사용자가 복구 프로그램을 잘못 실행하여 복구된 데이터를 잘못 저장하거나 원본 드라이브에 프로그램을 설치하는 경우 지워진 데이터에 프로그램이 install되어 복구가 안 되는 경우가 있다.

중요한 데이터를 Delete시킨 것을 깨달은 즉시 더 이상의 작업을 중지하고 문제를 혼자서 해결할 수 없다면 전문 복구 업체에 의뢰해야 한다.
 

4.  Hard Disk Format
 
데이터손상증상
 모든 파일이 삭제됨
 
조치요령
 포맷한 드라이브를 더이상 사용하지 말고 복구
 
포맷을 하면 FAT와 Root 디렉터리가 모두 지워지는등 데이터를 지우는 경우와는 다른 현상이 나타난다. 파일을 관리하는 FAT와 Root부분이 없어지므로 드라이브는 내용을 전혀 볼 수 없고 FAT에서 사용한 용량을 알려주지 못하기 때문에 드라이브의 여유 공간은  드라이브의 전체가 되며 최상위 드라이브인 Root가 없어지기 때문에 하위 디렉터리는 전혀 볼 수 없어지게 된다.

하지만 데이터 영역은 손상이 되지 않으므로  시중에 상용화된 프로그램도 손상이 되지 않은 데이터 영역을 이용하여 복구를 하고 있다. 포맷 시킨 후 Overwrite 작업을 하지 않은 경우라면 상용으로 판매되고 있는 복구용 소프트웨어나 유틸리티 등으로 대부분 복구가 가능하지만  복구용 소프트웨어로 작업이 되지 않은 경우가 있는데 이런 경우 드라이브정보가 변화가 생겨서 예전의 드라이브 정보가 아닌 새로운 정보로 드라이브가 인식되기 때문에 프로그램이나 유틸리티로 복구가 안 될 수도 있다.

이런 경우는 전문가에게 의뢰는 해야 한다.

Low-level 포맷을 100% 완료한 상태에서는 복구가 불가능 하나 포맷  중간에 중단하는 경우는 일부 복구가 될 수 있다. 

하드디스크 드라이브를 포맷했을 경우 드라이브를 더 이상 사용하지 말고사용한 드라이브의 데이터를 다른 저장매체에 저장을 한 후 복구 작업을 실시한다. 드라이브에 복구 프로그램을 설치하거나 복구된 데이터를 저장하면 필요한 데이터가 손상되어 복구가 불가능하게 될 수 있다.

만약 문제를 혼자서 해결할 수 없다면 전문 복구 업체에 의뢰하는 것이 좋다
 


5.   MBR이 손상된 경우
 
데이터손상증상
 "Invalid drive specification"라는 메시지가 나타남
 
조치요령
 사용자가 할 수 있는 작업이 아니므로 전문업체에 의뢰
 
우리가 많이 사용하는 DOS, Windows 9x 등의 구조는 MBR (Master Boot Record), Boot Record, FAT (File Allocation Table), Root directory, data 영역 등으로 세분 할 수가 있다.

이 각각의 영역에 소프트웨어적인 문제 발생시 그 원인이 되는 것은 90%이상이바이러스에 의한 것이라고 볼 수 있다. 부분별로 손상이 되면 증상은 다음과 같다. MBR은 O.S(Operating System)에서 Partition 정보를 저장하는 곳이다.

손상되었을 경우 하드디스크로 부팅이 안 되며, Diskette으로 부팅해서 C:드라이브로 들어갈 경우 "Invalid drive specification" 라는 메시지가 나타난다.
 


6.  boot Record가 손상된 경우
 
데이터손상증상
 "Invalid media type reading drive C, Abort, Retry, Fail?"
 
조치요령
 사용자가 할 수 있는 작업이 아니므로 전문업체에 의뢰
 
우리가 많이 사용하는 DOS, Windows 9x 등의 구조는 MBR (Master Boot Record), Boot Record, FAT (File Allocation Table), Root directory, data 영역 등으로 세분 할 수가 있다. 이 각각의 영역에 소프트웨어적인 문제 발생시 그 원인이 되는 것은 90%이상이바이러스에 의한 것이라고 볼 수 있다.

부분별로 손상이 되면 증상은 다음과 같다.Boot Record 만 손상된 경우

증상

하드디스크로 부팅이 안 되며 "Missing operating system" 메시지가 출력되고, Diskette으로 부팅해서 C:드라이브로 들어갈 경우 "Invalid media type reading drive C , Abort, Retry, Fail ?"란 메시지가 나타난다.
 


7.  FDISK
 
데이터손상증상
 MBR, BOOT, FAT, ROOT 정보, 데이터영역의 정보가 손상
 
조치요령
 작업을 중단하고 복구 업체에 의뢰하는 것을 권장
 
Fdisk는 드라이브의 파티션 정보를 새로 설정하고 새로운 드라이브로 사용을 하기 위하여 실행하는 프로그램이다.

Fdisk를 실행하면 MBR, BOOT, FAT, ROOT의 정보, 일부 데이터영역의 정보가 모두 없어지게 된다. 하지만 단 시간에 작업이 이루어지기 때문에 모든 부분을 완전히 지우는 것이 아니라 일정한 간격을 두고 데이터가 지워진다.

데이터 복구는 지워지지 않은 부분의 정보를 이용하여 예전의 정보를 찾아 나가는 작업을 진행한다. 

만약 Fdisk를 실행하고 Format를 실행하지 않은 경우라면 Format을 한 경우보다 복구 율이 높다. 이 경우는 Delete, Format와는 다른 방법으로 작업이 진행된다.

또한 손상되는 부분이 Delete, Format와는 다르기 때문에 복구프로그램이나 유틸리티를 사용하는 것보다 복구가 더 잘 될 수 있다. 만약 Fdisk만 진행한 경우라면 작업을 중단하고 복구 업체에 의뢰해야 한다

일부 프로그램에서 작업을 하기 위해서 포맷을 해야 하는 경우가 있는데 이런 경우는 드라이브의 모든 정보가 없어지기 때문에 포맷을 하면 안된다

 

by atomicgun | 2007/05/31 11:13 | 트랙백 | 덧글(1)

CentOS 3.x 버전에서 yum update가 안되는 경우

아래와 같이 RPM-GPG-KEY를 import 시켜서 update 해준다.
rpm --import http://mirror.centos.org/centos-3/3.8/os/i386/RPM-GPG-KEY-CentOS-3

by atomicgun | 2007/05/31 11:03 | - CentOS | 트랙백 | 덧글(0)

[Mysql] password설정 및 변경, root 비번 잃어버렸을 경우 변경법


1. 초기 mysql root 패스워드 설정하기
mysql 서버에 패스워드 없이 로그인 하게되면 서버에 만들어진 데이터베이스나 테이블
기타 이곳에 저장된 자료가 외부인에게 노출될 수 있다. 따라서 이러한 보안을 목적으로
root 패스워드를 지정하면 mysql 서버를 안전하게 보호할 수 있다.

mysql> use  mysql;
mysql> update  user  set  password=password('123456') where user='root';
Query OK, 2 rows affected (0.03 sec)
Rows matched: 2  Changed: 2  Warnings: 0
mysql> flush  privileges; <--- 적용
flush privileges; 를 하지 않으면 mysql에서 빠져나와서 root 로그인이 안된다.
확인한다.
mysql> select  host, user, password  from  user;
+----------------------------------------------------------------+
| Host                          user              password       |
+----------------------------------------------------------------+
| localhost                     root          2e01146f5c065853   |
| localhost.localdomain         root          2e01146f5c065853   |
+----------------------------------------------------------------+

mysql> \q
Bye
------------------------------------------------------------------------------------
[주의]# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
그대는 mysql 을 shutdown 하거나 reload 하면 된다.
# /usr/local/mysql/bin/mysqladmin -u root -p shutdown
하면 패스워드를 묻는데 이때 입력하면 설정한 mysql이 적용이된다.
# /usr/local/mysql/bin/mysqladmin -u root -p reload;
------------------------------------------------------------------------------------

# mysql -u root -p [Enter]       //  root 패스워드로 로그인
Enter password: ******

※ Mysql 서버에 root 패스워드가 설정되면 이제 부터는 mysql 서버에 접속하기 위해서는
위와 같이 -u 뒤에 root입력하고 -p 옵션을 사용하여 패스워드를 사용한다는 것을 명시해야 한다.
그리고 엔터를 치면 root 패스워드를 입력받기 위해 커서가 멈춘다.
(mysql 명령어만 입력하고 엔터를 치면 패스워드를 묻지 앟고 바로 mysql> 프롬프트가 나온 옛 시절을 생각해 보면 금방 차이를 느낄수 있음) 

2. 루트 비번 변경
mysql> use  mysql;
mysql> update  user  set  password=password('123456') where user='root';
mysql> flush  privileges;

3. root 패스워드를 분실한 경우(응급조치)

mysql을 오랫동안 사용하지 않았을 경우에 간혹 root패스워드가 기억나질않아서 당황할 때가 있습니다.  시스템관리자라면 시스템의 root나 MySQL의 root의 암호를 잊어 버렸을 때를 대비해서 패스워드를 새로 설정하는 방법을 반드시 숙지하고 있어야 할 것입니다.

① 실행중인 msyql 종료

# ps -ef | grep mysqld
root      9567     1  0 Mar16 ?        00:00:00 sh ./mysqld_safe
root      9576  9567  0 Mar16 ?        00:00:00 /usr/local/mysql/libexec/mysqld
root      9578  9576  0 Mar16 ?        00:00:00 /usr/local/mysql/libexec/mysqld
root      9579  9578  0 Mar16 ?        00:00:00 /usr/local/mysql/libexec/mysqld

# killall mysqld

② grant-table 미사용모드로 mysql시작(권한 테이블을 사용하지 않는 옵션으로 데몬 실행)

# ./safe_mysqld  --skip-grant-tables &
[1] 12084
# Starting mysqld daemon with databases from /usr/local/mysql/data
#

# ./mysql -u  root  mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.22.24
Type 'help' for help.
mysql>

※ mysqld_safe 명령어는 mysql 데몬을 실행시킨다.

③ update문으로 root사용자 패스워드 갱신

mysql> update user set password=password('123') where user = 'root';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> \q         
Bye

④ 실행중인 mysql 다시 종료(권한 테이블을 사용하지 않는 데몬을 종료)

# ps -ef | grep mysqld
root     12084 11558  0 20:10 pts/2    00:00:00 sh ./mysqld_safe --skip-grant-ta
root     12090 12084  0 20:10 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
root     12092 12090  0 20:10 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
root     12093 12092  0 20:10 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
#
# killall mysqld
mysqld daemon ended
[1]+  Done                    ./mysqld_safe --skip-grant-tables
#

⑤  Mysql 데몬 재 실행 후 갱신된 패스워드로 로그인

# ./safe_mysqld &
[1] 12102
# Starting mysqld daemon with databases from /usr/local/mysql/data
#

# ps -ef | grep mysql
root     12102 11558  0 20:13 pts/2    00:00:00 sh ./mysqld_safe
root     12108 12102  0 20:13 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
root     12110 12108  0 20:13 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld
root     12111 12110  0 20:13 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld

# mysql -u  root  -p
Enter Password: ***************

by atomicgun | 2007/05/28 21:03 | 리눅스 | 트랙백(136) | 덧글(0)

DSO - Dynamic Shared Object

DSO - Dynamic Shared Object

 

동적모듈이란 무엇인가?

아파치 헬기를 예로 들어보자.

아파치 헬기는 대전차 공격용 헬리콥터로 일반인에게도 유명하다.

헬기가 전투에 투입될때 항상 동일한 무기를 장착하는가?

아니다.

탱크를 사냥할대는 대전차 로켓을 장착하고,

교량을 폭파할때는 또 다른 무기를 장착할 것이다.

물론 모든 무기를 장착하면 좋겠지만 연료소비가 많아지고 순발력이 떨어질것은 분명하다.

 

아파치 서버역시 원하는 모듈(무기?)만을 장착하고 실행시킬수 있다.

이를 DSO 방식이라 하고 장착할수 있는 모듈을 DSO모듈이라 부른다.

PHP모듈도 DSO 방식으로 올리고 내릴수 있다.

 

DSO 모듈을 만드는 방법은 두가지가 있다.

첫번째, 아파치를 컴파일할때 DSO로 만들 모듈을 지정하는 방식.

두번재, 아파치 컴파일후 apxs (APache eXtenSion) 라는 유틸리티를 이용하여 모듈을 만드는 방식. (예: /usr/local/apache2/bin/apxs -i -a -c /usr/local/src/httpd-2.0.48/modules/mappers/mod_rewrite.c)

DSO모듈은 아파치root디렉토리(/usr/local/apache) 및 "moduldes" 디렉토리에 생성된다.

 

STATIC, DSO 방식의 결정은 아파치를 컴파일할때 결정되며

# ./configure --enable-so

옵션이 있냐, 없냐에 따라 DSO냐, STATIC이냐가 결정된다.

 

모듈장착은 아파치서버 설정화일인 httpd.conf에

LoadModule php4-module modules/libphp4.so

이런식으로 모듈이름을 적어주면 아파치가 시작하면서 모듈을 적재한다.

출처 : Tong - e돌람바님의 WEB서버통

by atomicgun | 2007/05/27 16:29 | 리눅스 | 트랙백 | 덧글(0)

apxs 에 대해서...

# apxs -a -i -c mod_rewrite.c

이렇게 하면 됨.
-a : active
-i : install

by atomicgun | 2007/05/27 15:50 | 리눅스 | 트랙백 | 덧글(0)

아파치 설정팁 모음

브라우징 제거

아파치의 디폴트세팅은 브라우징이 enable되어 있다.
브라우징이란 웹브라우저에서 URL입력시 index.html과 같은 정확한 파일명을
생략하고 디렉토리만 적었을 경우, 디렉토리내 파일목록이 출력되는 현상을 말한다.
http.conf의 디렉토리 디렉티브내 다음줄 추가

Options -Indexes


아파치 인증창 사용

http.conf에서 인증을 걸 디렉토리 디렉티브내 다음줄 추가

    AllowOverride AuthConfig

해당 디렉토리에 다음과 같이 .htaccess파일(텍스트파일) 생성
[root@ns mrtg]# cat .htaccess
AuthName "MRTG를 위한 인증"
AuthType Basic
AuthUserFile /webhosting/mrtg/.auth
require valid-user

AuthName: 인증창 타이틀
AuthType: 인증형태
AuthUserFile: 인증자들의 리스트를 가진 파일(htpasswd명령어로 생성)

-c(create)는 처음 파일을 생성할때 필요하다.
[root@ns mrtg]# htpasswd -c .auth kang
New password:
Re-type new password:
Adding password for user kang
[root@ns mrtg]# ls -l .auth
-rw-r--r--    1 root     root           19 May  3 16:54 .auth


외부 IP접근제어

http.conf의 디렉토리 디렉티브내 다음줄 추가

 AllowOverride AuthConfig
    Order Allow,Deny
    Deny from 211.43.134.128/24 xxx.xxx.xxx.xxx/24
    Allow from all
   
Deny from 에 접근차단할 ip대를 입력.
슬래쉬(/)뒤의 숫자들은 net mask지정(생략하면 single ip에 대한 차단)


위의 내용을 종합한 예는 다음과 같다.   


    Options -Indexes FollowSymLinks MultiViews

    AllowOverride AuthConfig

    Order allow,deny
    Allow from all
    Deny from 211.43.134.128/24 xxx.xxx.xxx.xxx/24

 


가상호스트/Redirect

아래의 예는 dbakorea.pe.kr로 오면, www.dbakorea.pe.kr로 redirect시킨다.
본인은 아파치말고, packet filtering으로 처리하려했으나 실력부족과 게으름으로 인해
그만두었다.

    ServerName          dbakorea.pe.kr
    Redirect    /       http://www.dbakorea.pe.kr


가상호스트의 전형적인예

    ServerAdmin         kang@dbakorea.pe.kr
    DocumentRoot        /webhosting/dbakorea-mobile
    ServerName          mobile.dbakorea.pe.kr
    ErrorLog            /usr/local/apache/logs/mobile.dbakorea.pe.kr-error_log
    CustomLog           /usr/local/apache/logs/mobile.dbakorea.pe.kr-access_log common
    ScriptAlias /cgi-bin/ /webhosting/dbakorea-mobile/cgi-bin/
 DirectoryIndex      login.html


아파치 정보출력제어
80포트로 telnet후 get / http/1.0하면 나오는 정보제어

ServerTokens Prod[uctOnly]
: Apache 만 보여줌
ServerTokens Min[imal]
: Apache 버젼만 보여줌
ServerTokens OS
: 아파치 버젼과 운영체제를 보여줌
ServerTokens Full (또는 지시하지 않았을때)
: 모두 보여줌


Offline Browser서비스 거부(출처: http://www.apache.kr.net)
WebZip만 테스트해봤지만 %{User-agent} 라는 변수에 'MSIE 6.0b'와 같이 찍힌다.
한마디로 안된다. 다른 용도로 사용될 지 몰라도,..

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    Deny from env=go_out
</Directory>

#CustomLog /usr/local/apache/logs/access_log common
#CustomLog /usr/local/apache/logs/referer_log referer
#CustomLog /usr/local/apache/logs/agent_log agent
CustomLog /usr/local/apache/logs/access_log combined

<IfModule mod_setenvif.c>
    BrowserMatch "Mozilla/2" nokeepalive
    BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    BrowserMatch "RealPlayer 4\.0" force-response-1.0
    BrowserMatch "Java/1\.0" force-response-1.0
    BrowserMatch "JDK/1\.0" force-response-1.0
    BrowserMatch "WebZIP" go_out
    BrowserMatch "Teleport" go_out
    BrowserMatch "GetRight" go_out
    BrowserMatch "WebCopier" go_out
</IfModule>

<VirtualHost *>
     ServerAdmin         kang@dbakorea.pe.kr
     DocumentRoot        /webhosting/dbakorea
     ServerName          www.dbakorea.pe.kr
     ServerAlias        dbakorea.pe.kr
     ErrorLog            /usr/local/apache/logs/www.dbakorea.pe.kr-error_log
     CustomLog           /usr/local/apache/logs/www.dbakorea.pe.kr-access_log combined
</VirtualHost>


아파치 로그 rotate
디폴트로 아파치로그는 wtmp, lastlog등과 같이 일정 시간, 크기..등등에 따라 로그의 순환이 이루어지지 않는다.
logrotate로 3개의 로그를 1달단위로 순환하려면 /etc/logrotate.conf파일의 마지막에 다음과 같이 추가한다.

# system-specific logs may be configured here
/usr/local/apache/log/www.dbakorea.pe.kr-access_log {
        monthly
        rotate 2
}


바이러스등에 대한 아파치로그 제거

# CodeRed Worm등의 로그제거
SetEnvIf Request_URI default\.ida CodeRed
SetEnvIf Referer \.ida CodeRed
SetEnvIf Request_URI cmd\.exe CodeRed
SetEnvIf Referer cmd\.exe CodeRed
SetEnvIf Request_URI root\.exe CodeRed
SetEnvIf Referer root\.exe CodeRed


     ServerAdmin         kang@dbakorea.pe.kr
     DocumentRoot        /webhosting/dbakorea
     ServerName          www.dbakorea.pe.kr
     ServerAlias        dbakorea.pe.kr
     ErrorLog            /usr/local/apache/logs/www.dbakorea.pe.kr-error_log
     CustomLog           /usr/local/apache/logs/www.dbakorea.pe.kr-access_log combined env=!CodeRed

by atomicgun | 2007/05/27 10:19 | 리눅스 | 트랙백 | 덧글(0)

qmail로 메일서버 구축

먼저, 이 문서은 개인적인 기록의 목적으로 작성한 것이며, 모든 내용은 http://kldp.org,
http://chaosclub.net 그리고  기타 여러문서에서 종합해 일부 수정을 했음을 밝혀둔다.

 
1. 설치파일 준비 

qmail을 설치하는 필요한 패키지는 다음과 같다. 아래의 대부분의 파일은
http://www.qmail.org에서 받을 수 있거나 링크를 찾을 수 있다.

 

qmail
wget http://cr.yp.to/software/qmail-1.03.tar.gz

ucspi-tcp
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz

daemontools
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz

checkpasswd
wget http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz

SMTP 인증패치 Mrs. Brisby의
wget http://www.nimh.org/dl/qmail-smtpd.c

qmail-103.patch  : Christopher K. Davis의 oversize DNS packets patch
wget http://www.ckdhr.com/ckd/qmail-103.patch

qmail-queue 패치
wget http://www.qmail.org/qmailqueue-patch

Maildrop 1.4.0 
http://download.sourceforge.net/courier

qmail-scanner 
http://qmail-scanner.sourceforge.net 

참고로 rblsmtpd 패키지는 설치할 필요가 없다. 현재 rblsmtpd는 ucspi-tcp에 포함되어 있다. 예전에 작성된 문서에는 rblsmtpd도 설치하라고 나오는 경우가 있는데, 현재에는 신경 쓸 필요 없다. 그리고 아랫 부분에 있는 3개의 파일(qmail-queue 패치, Maildrop, qmail-scanner)은 바이러스 메일 차단 기능을 원하는 경우에 필요한 파일들이다. 해당 링크가 깨졌거나 파일을 찾을 수 없으면, http://filewatcher.org 에서 찾아보길 바란다.

 

 

 

2. 압축풀기

 

모든 설치 작업은 root 권한에서 한다. 필요한 파일들을 임시 디렉토리(필자의 경우는 /root/temp/)로 복사한후 압축을 해제한다.

 

[/root/temp]# tar xzvf qmail-1.03.tar.gz
[/root/temp]# tar xzvf ucspi-tcp-0.88.tar.gz

[/root/temp]# tar xzvf daemontools-0.76.tar.gz

 

checkpasswd 는 qmail 설치가 성공해야 pop3를 설치할 수 있으므로, qmail 설치후에 다루겠다.

 

 

 

3. 설치 및 설정

 

qmail이 설치 될 디렉토리를 만들어준다. 기본적으로 /var/qmail/ 디렉토리에 설치하도록 되어있다.

 

[/root/temp]# mkdir /var/qmail

 

그 다음엔 qmail 운영에 사용될 계정들을 만들어 주어야 하는데, /root/temp/qmail-1.03/INSTALL.ids 파일을 이용하면 된다. 그 파일을 편집하여 자신의 운영 체제와 맞는 부분만 남기고 주석을 풀어준다. 필자는 리눅스에 설치하고 있으므로 다음과 같은 부분만 남기고 모두 삭제하였다.

 

groupadd nofiles
useradd -g nofiles -d /var/qmail/alias alias
useradd -g nofiles -d /var/qmail qmaild
useradd -g nofiles -d /var/qmail qmaill
useradd -g nofiles -d /var/qmail qmailp
groupadd qmail
useradd -g qmail -d /var/qmail qmailq
useradd -g qmail -d /var/qmail qmailr
useradd -g qmail -d /var/qmail qmails


그리고는 다음과 같이 이 파일의 내용을 실행해준다.

[/root/temp/qmail-1.03]# sh INSTALL.ids

 

groupadd useradd 라는 명령어가 없다고 나오는 경우가 있는데, 그 경우에는 다음과 같이 PATH 변수를 갱신해 주면 된다.

 

[/root/temp/qmail-1.03]# PATH=/usr/sbin:$PATH

[/root/temp/qmail-1.03]# export PATH

 

이번에는 oversize DNS 패치를 적용한다. 이 패치는 RFC의 권고안을 무시하고 512바이트보다 큰 UDP DNS 응답을 되돌려주는 일부 ISP업체들(AOL, hanmail.net 등) 때문에 필요한 것이다. qmail의 DNS resolve 라이브러리는 RFC와 호환되도록 되어 있으므로 RFC와 호환되지 않게 전달되는 메시지에는 응답하지 못한다. 다음의 패치는 qmail이 그러한 불법적인 DNS의 응답에 정확하게 수행하도록 한다. 패치는 qmail소스 디렉토리에서 다음과 같이 한다.

 

[/root/temp/qmail-1.03]# patch -p1 < ../qmail-103.patch
patching file dns.c

 

그 다음엔 SMTP 인증 기능을 위해 패치할 차례이다. 이것은 아웃룩 익스프레스 등으로 편지를 보낼 때에도 인증을 필요하도록 하는 것인데, 스팸 메일 서버로 이용당하는 것을 원치 않는다면 꼭 필요한 기능이다. 최신 버전의 sendmail에서도 이런 기능을 기본적으로 지원한다. 이 패치는 qmail의 소스 파일 중 qmail-smtpd.c 파일을 덮어 쓰면 된다. 이 기능을 원치 않으면 안 해도 상관은 없다.

[/root/temp/qmail-1.03]# cp ../qmail-smtpd.c ./
cp: overwrite `./qmail-smtpd.c'? y

사실 최근에는 CRAM-MD5라는 방식도 지원되는 좀더 좋은 SMTP 인증 패치도 있다. 그러나 설치 방법도 좀 더 복잡하고 해서 간단한 것(설치 방법과 성능 모두 간단한)을 택했다.

그리고 바이러스 메일 차단을 넣고 싶다면 다음 패치도 해야 한다. 이 기능이 필요없다면 그냥 넘어가도 된다. 그러나 이 기능 없이 메일 서버를 운영해보면 바이러스 메일이 엄청나게 올 것이다.

 

[/root/temp/qmail-1.03]# patch -p1 < ../qmailqueue-patch
(Stripping trailing CRs from patch.)
patching file Makefile
(Stripping trailing CRs from patch.)
patching file qmail.c


qmail과 다른 다른 프로그램들도 컴파일하고 설치한다.

 

[/root/temp/qmail-1.03]# make

[/root/temp/qmail-1.03]# make setup check

 

[/root/temp/qmail-1.03]# cd /root/temp/ucspi-tcp-0.88/

[/root/temp/ucspi-tcp-0.88]# make

[/root/temp/ucspi-tcp-0.88]# make setup check

 

[/root/temp/ucspi-tcp-0.88]# cd /root/temp/daemontools-0.76/

[/root/temp/daemontools-0.76]# ./package/install

 

daemontools를 설치할 때에는 install이라는 스크립트를 실행하면 저절로 컴파일 및 설치가 된다. 주의할 점은 위에서처럼 admin/daemontools-0.76 디렉토리에서 ./package/install과 같이 실행해야 된다는 것이다. package 디렉토리 안에서 install을 실행하면 안된다.

그리고 daemontools를 설치하면 /command 디렉토리가 만들어지고, 그 안에 여러 심볼릭 링크 파일들이 daemonstools의 소스 디렉토리 안을 가리키게 된다. 그래서 qmail 설치가 끝나고 daemontools 소스 디렉토리를 지워버리면 qmail이 작동되지 않게 된다. qmail 설치가 끝난 다음에 daemontools 소스 디렉토리를 지워버리고 싶다면 다음과 같이 한다.

[/command]# rm -f /command/*
[/command]# cp /root/temp/admin/daemontools/command/* /command/

다음에는 qmail의 소스 디렉토리에서 config를 실행시켜, 설정을 해 준다.

[/command]# cd /root/temp/qmail-1.03
[/root/temp/qmail-1.03]# ./config

 

그러나 만약 여기서 "Sorry, I couldn't find your host's canonical name in DNS." 이런 메시지를 내면서 에러가 난다면 Network 설정 및 DNS 설정에 문제가 있는 경우이다. DNS 서버에 이름이 정상적으로 등록되어 있다면, Network 설정을 잘 살펴보아야 한다. 아래와 같이 파일을 확인 및 수정한다.

 

/etc/resolv.conf

..............................................................

search yourdomain.com

nameserver 168.126.63.1
nameserver 168.126.63.2

 

/etc/hosts

..............................................................

127.0.0.1 localhost.localdomain localhost
123.234.123.234 oracle.yourdomain.com oracle

123.234.123.231 other.yourdomain.com other

 

/etc/sysconfig/network

..............................................................

HOSTNAME=yourhostname

DOMAINNAME=yourdomain.com

 

만약에 그래도 안된다면 "./config-fast hostname.domain.com"과 같이 해준다. 여기서 뒷부분의 hostname.domain.com은 FQDN으로 호스트 이름과 도메인 이름으로 구성된 주소를 써주면 된다.

다음에는 qmail 데몬을 위한 디렉토리와 파일들을 생성해준다.

# mkdir -p /var/qmail/supervise/qmail-send/log
# mkdir -p /var/qmail/supervise/qmail-smtpd/log
# chmod +t /var/qmail/supervise/qmail-send
# chmod +t /var/qmail/supervise/qmail-smtpd

그리고 몇가지 파일들을 만들고 각각 다음 내용을 써 준다.

/var/qmail/supervise/qmail-send/run

..............................................................
#!/bin/sh
exec /var/qmail/rc

/var/qmail/supervise/qmail-send/log/run
..............................................................
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail

/var/qmail/supervise/qmail-smtpd/run
..............................................................
#!/bin/sh
export QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
ALIASUID=`id -u alias`
ALIASGID=`id -g alias`
exec /usr/local/bin/softlimit -m 10000000 \
/usr/local/bin/tcpserver -v -p -x/etc/tcp.smtp.cdb \
-u $ALIASUID -g $ALIASGID 0 25 /var/qmail/bin/qmail-smtpd 2>&1

위에서 export QMAILQUEUE=... 부분은 바이러스 메일 차단 기능을 사용할 때에만 넣고, 그 기능을 사용하지 않으려면 뺀다.

softlimit -m 10000000 부분은 조절 가능하다. 바이러스 메일 필터링 기능을 사용하지 않을 것이라면 2000000으로 해도 작동할 것이다. 그러나 바이러스 메일 필터링 기능을 사용한다면 그것으로는 부족할 수 있다. 만약 이 수치가 부족하면 아웃룩 등으로 메일을 보낼때 451 qq temporary problem (#4.3.0)와 같은 메시지가 나올 것이다. 다른 문서에는 6000000으로 나오기도 하는데, 필자의 경우엔 그렇게 하니 에러가 나서 아예 10000000으로 해 주었더니 잘 작동했다.

/var/qmail/supervise/qmail-smtpd/log/run
..............................................................
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd

위의 파일들을 모두 만들었으면 퍼미션 조정을 해 준다.

# chmod 755 /var/qmail/supervise/qmail-send/run
# chmod 755 /var/qmail/supervise/qmail-send/log/run
# chmod 755 /var/qmail/supervise/qmail-smtpd/run
# chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

 

qmail의 로그 파일이 저장될 디렉토리를 만들어 준다.

# mkdir -p /var/log/qmail/smtpd
# chown qmaill /var/log/qmail /var/log/qmail/smtpd

 

root, postmaster 등 관리자 계정으로 수신되는 메일을 특정 일반계정으로 forward 하도록 설정한다. 만약 여러분이 root로 수신되는 메일을 chaos라는 계정으로 받기를 원한다면 다음과 같이 설정한다.

 

# cd ~alias
# echo chaos > .qmail-mailer-daemon
# echo chaos > .qmail-postmaster
# echo chaos > .qmail-root

그리고 /var/qmail/control/locals 파일과 /var/qmail/control/rcpthosts 파일에 여러분이 사용하기 원하는 도메인 주소를 모두 써 주어야 한다. 두 파일의 내용은 같게 하면 된다. 예를들어

email@domain.com, email@www.domain.com, email@email.domain.com 과 같은 형식의 메일 주소로 편지를 받기를 원한다면 이 파일들에 다음과 같이 써주면 된다. 물론, 여기서는 이미 www.domain.com 이나 email.domain.com과 같은 주소의 DNS 설정이 되어 있다고 가정했을 경우이다.

domain.com
www.domain.com
email.domain.com

설사 chaos.domain.com과 같은 주소가 여러분의 호스트에 할당되어 있다고 하더라도 이 파일에 주소를 써주지 않으면 email@chaos.domain.com과 같은 주소로 온 편지는 받아들이지 않는다.

그리고 qmail 기동 스크립트를 준비한다. /etc/rc.d/init.d/qmail 이라는 파일을 만들고, 그 안에 아래의 스크립트를 복사해 넣으면 된다. 

 

# vi /etc/rc.d/init.d/qmail
..............................................................

#!/bin/sh
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 80 80
# description: 빠르며, 안정적이고, 유연한 MTA

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
export PATH

case "$1" in
  start)
    echo -n "Starting qmail: svscan"
    cd /var/qmail/supervise
    env - PATH="$PATH" svscan &
    echo $! > /var/run/svscan.pid
    echo "."
    ;;
  stop)
    echo -n "Stopping qmail: svscan"
    kill `cat /var/run/svscan.pid`
    echo -n " qmail"
    svc -dx /var/qmail/supervise/*
    echo -n " logging"
    svc -dx /var/qmail/supervise/*/log
    echo "."
    ;;
  stat)
    cd /var/qmail/supervise
    svstat * */log
    ;;
  doqueue|alrm)
    echo "Sending ALRM signal to qmail-send."
    svc -a /var/qmail/supervise/qmail-send
    ;;
  queue)
    qmail-qstat
    qmail-qread
    ;;
  reload|hup)
    echo "Sending HUP signal to qmail-send."
    svc -h /var/qmail/supervise/qmail-send
    ;;
  pause)
    echo "Pausing qmail-send"
    svc -p /var/qmail/supervise/qmail-send
    echo "Pausing qmail-smtpd"
    svc -p /var/qmail/supervise/qmail-smtpd
    ;;
  cont)
    echo "Continuing qmail-send"
    svc -c /var/qmail/supervise/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /var/qmail/supervise/qmail-smtpd
    ;;
  restart)
    echo "Restarting qmail:"
    echo "* Stopping qmail-smtpd."
    svc -d /var/qmail/supervise/qmail-smtpd
    echo "* Sending qmail-send SIGTERM and restarting."
    svc -t /var/qmail/supervise/qmail-send
    echo "* Restarting qmail-smtpd."
    svc -u /var/qmail/supervise/qmail-smtpd
    ;;
  cdb)
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
    chmod 644 /etc/tcp.smtp*
    echo "Reloaded /etc/tcp.smtp."
    ;;
  help)
    cat <<HELP
   stop -- stops mail service (smtp connections refused, nothing goes out)
  start -- starts mail service (smtp connection accepted, mail can go out)
  pause -- temporarily stops mail service (connections accepted, nothing leaves)
   cont -- continues paused mail service
   stat -- displays status of mail service
    cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
  queue -- shows status of queue
   alrm -- same as doqueue
    hup -- same as reload
HELP
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}"
    exit 1
    ;;
esac

exit 0

..............................................................

 

그리고 다음과 같이 실행될 수 있도록 퍼미션 조정을 해준다.


# chmod 755 /etc/rc.d/init.d/qmail

 

레드햇 리눅스의 경우 ntsysv를 실행시켜 sendmail의 체크를 제거하고 리부팅시 qmail 데몬이 실행되도록 qmail에 체크를 해준다. 만약, 여기에 qmail 항목이 나타나지 않는다면 다음과 같이 한다.

# chkconfig --add qmail

이것도 안 되면 그냥 /etc/rc.d/rc.local 파일 맨 끝에 /etc/rc.d/init.d/qmail start 라고 한줄 써주면 된다. 목적은 부팅될때 자동으로 실행하는 것이니까, 어떻게 하든 상관없다.


그리고 설치가 모두 끝난 다음에는 압축을 풀어놓았던 소스 파일 디렉토리들은 모두 삭제해도 된다.(단, daemontools 관련 파일들을 /command 디렉토리로 모두 복사했다는 가정하에)

 

 

 

4. 바이러스 메일 차단 기능

 

 

1) Perl module Time::HiRes 설치


이 부분은 바이러스 메일 차단 기능을 원하는 사람만 필요한 부분이다. 필요하지 않다면 그냥 넘어가면 된다.

# perl -e 'use CPAN; install Time::HiRes'

이렇게 하면 자동 설치를 할 것이냐, 수동 설치를 할 것이냐를 묻는데, 처음에 yes라고 대답하여 수동 설치를 하기를 권한다. 물론 거의 100%의 질문에 그냥 엔터만 치면 된다. 다만 중간에 대륙과 국가를 고르는 부분이 나오는데, 그 부분에서 한국으로 골라야 인터넷에서 필요한 파일을 다운로드받아서 설치할 때 빠르게 진행된다. 이것을 설치할때 중간에 필요한 파일을 자동으로 다운로드하는 단계가 있다. 인터넷 접속 속도에 따라 다르겠지만 2~3분이면 설치가 완료된다.


2) Maildrop 설치

[/root/temp]# tar xzvf maildrop-1.4.0.tar.gz
[/root/temp]# cd maildrop-1.4.0
[/root/temp/maildrop-1.4.0]# ./configure
[/root/temp/maildrop-1.4.0]# make
[/root/temp/maildrop-1.4.0]# make install-strip
[/root/temp/maildrop-1.4.0]# make install-man


3) qmail-scanner 설치

[/root/temp]# tar xzvf qmail-scanner-1.14.tgz
[/root/temp]# cd qmail-scanner-1.14
[/root/temp/qmail-scanner-1.14]# ./configure
[/root/temp/qmail-scanner-1.14]# ./configure --install

위와 같이 하면 qmail-scanner-queue.pl 파일이 생성되고 기본적으로 /var/qmail/bin/에 설치가 될 것이다.

 

 


6. 기타 설정

 

1) 릴레이 설정

기본적인 릴레이 설정을 해준다.

# vi /etc/tcp.smtp

127.0.0.1:allow,RELAYCLIENT=""
:allow


설치를 할 때에 SMTP 인증 기능을 패치했기 때문에 localhost에서 보내는 편지만 relay하도록 설정해 놓으면 충분하다. 만약 다른 ip 주소도 무조건 relay를 허가해주고 싶다면 127.0.0.1:allow,RELAYCLIENT="" 다음 줄에 원하는 ip 주소나 대역을 추가해 주면 된다. 자세한 사항은 다른 문서를 참고하기 바란다. SMTP 인증 패치를 한 이상, 위의 설정만으로도 충분하다. 이 파일에 기록된 ip 주소에서 릴레이를 요청할 때에는 인증 없이 무조건 relay를 허가해 주고, 만약 이 파일에 ip 주소가 등록되어 있지 않다면 그때는 SMTP 인증을 해야만 relay 허가가 된다.

그리고 /etc/tcp.smtp 파일을 수정하였다면 다음 명령을 수행하여 데이터베이스를 갱신할 필요가 있다.

# /etc/rc.d/init.d/qmail cdb
Reloaded /etc/tcp.smtp.


2) /var/qmail/rc 생성하기

/var/qmail/rc 파일은 qmail 파일중에서 가장 중요한 파일중의 하나이다. 이것은 qmail을 책임지고 시작하게 한다. 보다 중요한 것은 qmail이 항상 메일을 수신할 수 있도록 한다. rc 의 내용은 qmail을 위한 기본적인 전송 명령으로 되어 있다. /var/qmail/boot 디렉토리에 가면, 여러 경우에 대한 rc 파일의 예제가 파일별로 준비되어 있다. procmail을 이용하여 메일을 처리할 것이기 때문에, 다음과 같이 한다.

# cp /var/qmail/boot/proc /var/qmail/rc

그리고 /var/qmail/rc 파일을 열어서 다음과 같이 수정한다. 맨 아랫 줄에 ./Maildir/ 만 추가되었다. 이것은 Maildir 형태로 메일이 저장되도록 한다.

/var/qmail/rc

..............................................................
#!/bin/sh

# Using splogger to send the log through syslog.
# Using procmail to deliver messages to /var/spool/mail/$USER by default.

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start '|preline procmail ./Maildir/' splogger qmail

 


3) Maildir 디렉토리 만들기

이제 이 서버로 도착하는 메일은 각 사용자의 홈 디렉토리 아래에 Maildir이라는 디렉토리 안에 저장되게 된다. 따라서 모든 사용자의 홈 디렉토리 아래에 이 디렉토리가 실제로 있어야 한다. qmail은 이 디렉토리 및 서브 디렉토리를 자동으로 만들어주는 스크립트를 제공하며, 다음이 그 사용 예이다.

# su - chaos
$ /var/qmail/bin/maildirmake $HOME/Maildir
$ echo ./Maildir/ > ~/.qmail

기존 모든 계정에 대해 위와 같은 일을 해주어야 한다. 그러나, 다음과 같이 /etc/skel 디렉토리를 수정해 주면, 앞으로 생성할 사용자에 대해서는 이런 작업을 해주지 않아도 된다.

# cd /etc/skel
# /var/qmail/bin/maildirmake Maildir
# echo ./Maildir/ > .qmail

이제부터는 추가되는 모든 사용자에게 자동으로 Maildir 디렉토리와 .qmail 파일이 생기게 될 것이다.

출처 : Tong - 낯선남자님의 낯선남자통

by atomicgun | 2007/05/18 15:18 | 리눅스 | 트랙백 | 덧글(0)

윈도우명령어

mstsc - 원격데스크탑 접속
cmd - 도스창

compmgmt.msc : 컴퓨터 관리 devmgmt.msc : 장치관리자
diskmgmt.msc : 디스크 관리 dfrg.msc : 디스크 조각모음
eventvwr.msc : 이벤트 뷰어 fsmgmt.msc : 공유폴더
gpedit.msc : 로컬 컴퓨터 정책 lusrmgr.msc : 로컬 사용자 및 그룹
perfmon.msc : 성능모니터뷰 rsop.msc : 정책의 결과와 집합
secpol.msc : 로컬 보안설정 services.msc : 서비스

cmd 또는 command : 도스 모드창을 띄우는 명령어
ipconfig : ip구성창을 나타냄 (현재 ip주소 확인과 갱신 가능)
일단 도스창으로 나가셔서 ipconfig하시면 확인 가능하고
ipconfig/renew를 치면 갱신
윈98과 me버전은 실행창에서 winipcfg 하시면 같은 역할

DXDIAG : 컴퓨터 각종 사양보기
regedit : 레지스트리편집기
ping : 핑테스트.. ping daum.net 이렇게 치시면 다음넷과 서버 연결 상태(ip확인가능)

msconfig :시스템 구성 유틸리티(윈도우가 부팅될때 읽어들일 것들을 목록으로 만들어 놓은 것)

msconfig(시작프로그램 제어등 많은기능 제공)
단, 윈2000은 지원 안함
regedit(레지스트리 편집기)

sfc(시스템 파일 검사및 복원)
단, 윈2000은 cmd - sfc 혹은 sfc /scannow
-윈2000의 경우 시디를 넣었음에도 불구하고 시디인식이 제대로 안될때 리부팅후 다시 해본다. 파일복구미지수
-위 방법보다는 윈2000시디부팅 후 설치화면상의 콘솔복구방법을 강추천한다.

winipcfg(인터넷에 접속된 자신의 아이피 주소를 보여줌)
단, 윈2000은 ipconfig로 변경됨

dxdiag(다이렉트X진단도구 및 그래픽과 사운드의 세부정보를 보여줌)
sysedit(autoexec.bat , config.sys ,win.ini, system.ini 시스템구성편집기)

command(도스명령프롬프트 실행)
윈2000은 cmd도 가능

telnet open 사이트주소(텔넷접속명령어)

netstat -na(현재 열린포트와 TCP/IP 프로토콜정보를 보여줌)
-열린포트로 트라이목마형 바이러스 침투 유무확인가능

systray(사운드 볼륨설정 노란색 스피커 아이콘을 트라이목록에 띄움)
ping 사이트주소(핑테스트 해당 사이트의 인터넷연결 유무 확인)

=윈2000&윈xp=
taskmgr.exe 또는 shift+ctrl+esc : 작업관리자 열기단축키
gpedit.msc : 로컬 컴퓨터 정책 ㅡ 관리템플릿[바탕화면, 작업표시줄및 시작메뉴, 제어판, 시스템등 사용자가 기능을 제어할 수 있다.
lusrmgr.msc : 로컬 사용자 및 그룹
compmgmt.msc : 컴퓨터 관리
devmgmt.msc : 장치관리자
diskmgmt.msc : 디스크 관리
dfrg.msc : 디스크 조각모음
eventvwr.msc : 이벤트 뷰어
fsmgmt.msc : 공유폴더
perfmon.msc : 성능모니터뷰
rsop.msc : 정책의 결과와 집합
secpol.msc : 로컬 보안설정
services.msc : 서비스

inetmgr - iis(인터넷 정보 서비스)

excel - 엑셀

powerpnt - 파워포인트
winword - MS워드
wordpad - 워드패드
notepad - 메모장

calc - 계산기

mspaint - 그림판

outlook - 아웃룩

mstsc - 원격데스크탑
gom - 곰플레이어

==========================================================================
Windows 명령어 정리
==========================================================================

1. drwatson or drwtsn32 로그파일뷰어

2. msconfig 시스템구성유틸리티

3. netstat -na 현제 내컴에 접속되어 있는 IP와 포트를 디스플레이

4. conf 원도우에서 기본제공하는 원격관리 툴인 netmeeting를 실행시켜주는 프로그램.

5. ping 상대방 컴퓨터의 네트워크 연결 확인

6 ipconfig 명령프롬프트에서 실행시키면 내컴의 IP를 알수 있음.
/all, /release, /renew
7. winipcfg IP 확인하는 명령.. 98과 me에서만 사용가능

8. sfc /scannow 컴퓨터의 시스템 파일을 검색하여.. 원본 파일로 바꾸어주는 명령어.

9. regedit / regedt32 레지스트리 편집기

10. oobe/msoobe /a 원도우 정품인증 확인 명령어

11. scandisk c: 도스에서.. 하드디스크 스켄하는 명령어
(원도의 하드디스크 검사와 동일, 98에서만)

12. chkdsk c: 옛날 도스모드에서 쓰던 하드디스크 스켄 명령(XP에서 사용)

13. sysedit 시스템 구성 편집기 (win.ini, system.ini, autoexec.bat, config.sys)

14. shutdown -a xp에서 바이러스등에 컴이 자동종료안되게 막아줌, 시스템종료 취소

15. dxdiag 컴퓨터의 다이렉트x 버젼확인하기

16. deltree 도스에서. 디렉토리까지 포함하여.
삭제 가능한 명령어.. del이나 erase 보다 막강한 기능제공

17. mstsc.exe 원격 데스크톱 연결

18. doskey 명령어 History 기능(98에서 사용)

19. msinfo32 시스템정보를 확인하는 명령어

20. XP에 있는 관리도구를 실행할 수 있는 명령어.


compmgmt.msc : 컴퓨터관리 devmgmt.msc : 장치관리자 diskmgmt.msc : 디스크관리

dfrg.msc : 디스크 조각모음 eventvwr.msc : 이벤트뷰어 fsmgmt.msc : 공유폴더

gpedit.msc : 로컬 컴퓨터 그룹정책 lusrmgr.msc : 로컬 사용자 및 그룹 perfmon.msc : 성능모니터

rsop.msc : 정책의 결과와 집합 secpol.msc : 로컬 보안설정 services.msc : 서비스 관련 명령어


21. 제어판의 모듈실행명령어(XP용이나 98에서도 일부 가능함)

[Access.cpl] 내게 필요한 옵션 [Mmsys.cpl] 사운드 및 오디오장치 등록정보

[Appwiz.cpl] 프로그램추가/제거 [Nusrmgr.cpl] 사용자계정

[Desk.cpl] 디스플레이 등록정보 [Nwc.cpl] Client Service for NetWare

[Hdwwiz.cpl] 하드웨어추가마법사 [Odbccp32.cpl] ODBC 데이터 원본관리자

[Inetcpl.cpl] 인터넷등록정보 [Powercfg.cpl] 전원옵션 등록정보

[Intl.cpl] 국가 및 언어옵션 [Sysdm.cpl] 시스템등록정보

[Joy.cpl] 게임콘트롤러 [Telephon.cpl] Phone and Modem Options

[Main.cpl] 마우스등록정보 [Timedate.cpl] 날짜 및 시간 등록정보


22. IPv6 스택(프로토콜) 설치

Windows XP(2003)에는 IPv6 스택이 내장되어 있으므로, 이를 활성화합니다.

Windows XP는 CMD창에서 "ipv6 install"을 실행. 지울때는 "ipv6 uninstall“


23. tsshutdn.exe (available at Windows 2000 and Windows XP)

TSSHUTDN [대기 시간] [/SERVER:서버 이름] [/REBOOT] [/POWERDOWN] [/DELAY:로그오프 지연] [/V]

대기 시간 사용자에게 알린 후 모든 사용자 세션을 종료하기 전까지 기다리는 시간(초)(기본값은 60).

/SERVER:서버 이름 종료할 서버(기본값은 현재 서버). /REBOOT 사용자 세션이 종료된 후 서버를 다시 부팅.

/POWERDOWN 서버가 전원 꺼짐을 준비함. /V 수행 중인 동작에 대한 정보를 표시.

/DELAY:로그오프 지연 연결된 모든 세션을 로그오프한 후 기다리는 시간(초)(기본값은 30).

지금 즉시 컴퓨터를 종료시키고 싶다면. 'tsshutdn 0'과 같이 입력. 여기서 '0'은 대기시간을 의미하며 단위는 '초'(second)이다.

따로 대기시간을 입력하지 않는다면 기본값으로 60초 후에 종료된다. 대기시간 단위가 '초'라는 점만 유의한다면 그리 어렵지 않게 사용할 수 있을 것이다.

10분후에 컴퓨터를 종료하고 싶다면 'tsshutdn 600', 30분 후는 'tsshutdn 1800' 이런식으로 입력하면 된다.

reboot 라는 옵션을 사용할 수 있는데 다들 알겠지만 재부팅을 할때 사용되는 것이다.

tsshutdn 0 /reboot 라는 명령를 내린다면 엔터를 치는과 동시에 컴퓨터가 꺼졌다 다시 부팅 된다.

shutdown.exe (availabe at Windows XP Only)

shutdown.exe는 tsshutdn.exe 를 좀더 확장해 놓은 명령어라고 생각하면 된다.

shutdown [-l | -s | -r | -a] [-f] [-m 컴퓨터 이름] [-t xx] [-c "설명"] [-d up:xx:yy]

No args 이 메시지를 표시합니다.(-?와 동일)

-i GUI 인터페이스 표시합니다.(처음 옵션이어야 합니다.)로그오프합니다.

(-m 옵션과 함께 사용될 수 없음)

-s 시스템을 종료합니다.

-r 시스템을 종료한 후 다시 시작합니다.

-a 시스템 종료를 중단합니다.

-m 컴퓨터 이름 원격 컴퓨터를 종료/다시 시작/중단합니다.

-t xx시스템 종료의 만료 시간을 xx초로 설정합니다.

-c "설명" 시스템 종료 설명을 지정합니다. (최대 127 문자)

-f 실행 중인 응용 프로그램을 경고 없이 강제로 종료합니다.

-d [u][p]:xx:yy 종료에 대한 이유코드를 지정합니다.

u: 사용자 코드

p: 계획된 종료 코드

xx: 주 이유 코드 (256 보다 작은 양수)

yy: 부 이유 코드 (65536 보다 작은 양수)


이 명령어는 반드시 옵션을 사용해야 하는데... 자주 사용되는 것으로서는 '-s', '-r', '-t xx', '-i' 정도일 것이다.


대기시간을 의미하는 '-t' 옵션을 사용하지 않는다면 기본값은 30초이다. 즉 'shutdown -s' 명령을 내리면 30초 후에 종료된다.

'-t xx'옵션의 xx는 역시 '초'(second)를 의미한다. 그러므로 'shutdown -s -t 3600'이라는 명령를 내린다면 1시간 후에 컴퓨터가 종료된다.

자주 사용되진 않겠지만... '-a' 옵션은 -s', '-r' 옵션을 통해 종료 또는 재부팅 명령어를 내린 후에 갑자기 마음이 바뀌어 이를 해제하고자 할 때 사용하는 옵션이다.

by atomicgun | 2007/05/17 12:34 | 긁적이(잡다한것) | 트랙백 | 덧글(2)

원격데스크탑 포트 변경하기

1. 시작-실행-regedit

 

2. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp 에서

PortNumber REG_DWORD 0x00000d3d(3389) 값을

10진수를 선택하고 다른 포트번호(7777)을 입력한다.

 

3. 위와 동위치..\Terminal SErver\WinStations\RDP-Tcp 에서

PorNumber REG_DWORD 0x00000d3d(3389) 값을

10진수를 선택하고 다른 포트번호(7777)을 입력한다.

 

4. 재부팅(Win2003의 경우) 후 ip:포트번호 형식으로 접속

 

  참고 : mstsc /console : 로컬에서 내가 작업했던 환경인 단일세션을 여는 명령

by atomicgun | 2007/05/17 09:30 | 윈도우 | 트랙백 | 덧글(0)

YUM 설치 및 사용법 & 로그확인

 YUM 설치

  

 [root@www ~]#rpm -Uvh yum-2.0.8-1.noarch.rpm

 

■ YUM 사용법

 

  1) yum list

    <!--StartFragment--> →전체 패키지를 출력할때 사용한다.

        일반적으로 리스트중 업데이트가능한 항목은 updates 

        업데이트 할 항목이 없는경우 base 라고 출력된다.

        

[root@linux230 root]# yum list

Gathering header information file(s) from server(s)

Server: Red Hat Linux 3ES - i386 - Base

Server: Red Hat Linux 3ES - Updates

Finding updated packages

Downloading needed headers

cpio-0-2.5-3e.3.i386.hdr 100% |=========================| 3.1 kB 00:06

net-tools-0-1.60-20E.7.i3 100% |=========================| 5.5 kB 00:03

bzip2-0-1.0.2-11.EL3.4.i3 100% |=========================| 3.6 kB 00:06

                               ․

                               ․

                               ․

cups-libs-1-1.1.17-13.3.2 100% |=========================| 6.0 kB 00:06

vim-minimal-1-6.3.046-0.3 100% |=========================| 2.4 kB 00:03

libuser-0-0.51.7-1.EL3.3. 100% |=========================| 8.3 kB 00:06


vte                                               i386     0.11.10-11          updates

vte-devel                                     i386     0.11.10-11          updates

w3c-libwww                                i386     5.4.0-5               base

w3c-libwww-apps                       i386     5.4.0-5               base

xsane-gimp                                  i386     0.89-3                base

                  ․

                  ․

                  ․

xscreensaver                                i386     1:4.10-8.WB1     updates

yp-tools                                        i386     2.8-6                 updates

ypbind                                           i386     3:1.12-5.21.6     updates

ypserv                                           i386     2.8-13               updates

zip                                                 i386     2.3-16.1            updates

zlib-devel                                      i386     1.1.4-8.1           base


  2) yum update [package]

     →<!--StartFragment-->뒤에 패키지를 지정하지 않고 yum update를 실행하면

          업데이트가능한 항목들과 새로 설치될 항목들의 리스트(헤더파일)만 다운 받고

          설치할것인지 물어보며

          Y  를 누르면 모든 항목을 자동 설치한다( 의존성검사하여 필요한 화일까지 같이 설치)

<!--StartFragment--> 

[root@linux236 src]# yum update

Gathering header information file(s) from server(s)

Server: Red Hat Linux 4ES - i386 - Base

Server: Red Hat Linux 4ES - Updates

Finding updated packages

Downloading needed headers

Resolving dependencies

.Dependencies resolved

I will do the following:

[install: kernel 2.6.9-5.0.5.EL.i686]

[install: kernel-smp 2.6.9-5.0.5.EL.i686]

[update: libaio-devel 0.3.103-3.i386]

[update: postgresql-docs 7.4.7-2.RHEL4.1.i386]

[update: php-mysql 4.3.9-3.6.i386]

               ․

               ․

               ․

               ․

[update: php-mbstring 4.3.9-3.6.i386]

[update: krb5-devel 1.3.4-12.i386]

[update: xorg-x11-devel 6.8.1-23.EL.WB1.i386]

[update: libtiff 3.6.1-8.i386]

[update: postgresql-python 7.4.7-2.RHEL4.1.i386]

I will install/upgrade these to satisfy the dependencies:

[deps: httpd 2.0.52-9.ent.WB1.i386]

[deps: mysql 4.1.10a-1.RHEL4.1.i386]

[deps: whitebox-logos 1.1.25-1.WB1.noarch]

Is this ok [y/N]: y

Downloading Packages

Getting postgresql-docs-7.4.7-2.RHEL4.1.i386.rpm

postgresql-docs-7.4.7-2.R 100% |=========================| 1.1 MB 03:42

Getting php-mysql-4.3.9-3.6.i386.rpm

php-mysql-4.3.9-3.6.i386. 100% |=========================| 33 kB 00:23

Getting exim-doc-4.43-1.RHEL4.3.i386.rpm

exim-doc-4.43-1.RHEL4.3.i 1% | | 48 kB 25:36 ETA

 

<!--StartFragment-->

[root@linux236 ~]#yum update telnet       // telnet만 업데이트하여 설치할경우

Gathering header information file(s) from server(s)

Server: Red Hat Linux 4ES - i386 - Base

Server: Red Hat Linux 4ES - Updates

Finding updated packages

Downloading needed headers

Resolving dependencies

Dependencies resolved

I will do the following:

[update: telnet 1:0.17-31.EL4.2.i386]

Is this ok [y/N]: y

Downloading Packages

Getting telnet-0.17-31.EL4.2.i386.rpm

telnet-0.17-31.EL4.2.i386 100% |=========================| 52 kB 00:19

Running test transaction:

Test transaction complete, Success!

telnet 100 % done 1/2

Completing update for telnet - 2/2

Updated: telnet 1:0.17-31.EL4.2.i386

Transaction(s) Complete

 

  3) yum remove [package]

     → 패키지를 삭제 하고자할경우 remove 를 통해 삭제시킬수 있다.

 

[root@linux230 yum]# yum remove telnet       //telnet 을 지우고자할경우

Gathering header information file(s) from server(s)

Server: Red Hat Linux 3ES - i386 - Base

Server: Red Hat Linux 3ES - Updates

Finding updated packages

Downloading needed headers

Resolving dependencies

Dependencies resolved

I will do the following:

[erase: telnet 1:0.17-26.i386]

Is this ok [y/N]: y

Downloading Packages

Running test transaction:

Test transaction complete, Success!

Erasing: telnet 1/1

Erased: telnet 1:0.17-26.i386

Transaction(s) Complete

 4) yum install [package]

   → 설치되어있지않은 새패키지의 경우 install 을 사용하여 설치한다.

       의존성에 걸린 화일들까지 찾아서 자동으로 같이 설치해준다.

 

<!--StartFragment-->

[root@linux230 yum]# yum install telnet                //telnet 을 새로 설치할경우

Gathering header information file(s) from server(s)

Server: Red Hat Linux 3ES - i386 - Base

Server: Red Hat Linux 3ES - Updates

Finding updated packages

Downloading needed headers

telnet-1-0.17-26.i386.hdr 100% |=========================| 3.0 kB 00:00

Resolving dependencies

Dependencies resolved

I will do the following:

[install: telnet 1:0.17-26.i386]

Is this ok [y/N]: y

Downloading Packages

Getting telnet-0.17-26.i386.rpm

telnet-0.17-26.i386.rpm 100% |=========================| 47 kB 00:00

Running test transaction:

Test transaction complete, Success!

telnet 100 % done 1/1

Installed: telnet 1:0.17-26.i386

Transaction(s) Complete

 

■ YUM 로그확인

 

  [root@www root]#cat /var/log/yum.log

     9?? 14 11:07:23 Installed: telnet-server 1:0.17-26.i386

9?? 14 11:09:07 Installed: caching-nameserver 7.2-7.noarch

9?? 14 11:20:05 Installed: vsftpd 1.2.0-4.i386

9?? 14 15:11:50 Erased: telnet 1:0.17-26.i386

9?? 14 15:12:12 Installed: telnet 1:0.17-26.i386

9?? 15 09:56:35 Installed: cvs 1.11.2-10.i386

9?? 15 09:57:45 Installed: dhcp 1:3.0pl2-6.14.i386

9?? 15 14:05:32 Updated: ntp 4.1.2-4.EL3.1.i386

9?? 15 14:07:14 Erased: ntp 4.1.2-4.EL3.1.i386

9?? 15 14:07:14 Erased: firstboot 1.1.19-1.noarch

 

※ 테스트버전 2.0.8 입니다 2.1 버전부터는 약간씩 틀립니다.

by atomicgun | 2007/05/16 16:34 | 트랙백 | 덧글(2)

리눅스 접속환경관련 작업명령어들(mstsc, ping)

윈도우 시작버튼 > 실행 >
> mstsc   // 원격데스크톱 연결
> cmd     // DOS화면
  cmd 모드에서 ipconfig /all   // 윈도우에서 네트웍상태를 확인하는 명령

by atomicgun | 2007/05/06 17:11 | 리눅스 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶