'유닉스'에 해당되는 글 1건

  1. 2008.02.12 Linux를 배우자 by ㉡ㅐ꼬

출처 : http://www.lipumo.com/ 

Linux를 배우자
- 리눅스의 탄생배경에서부터 기본명령어 익히기를 통해 리눅스와의 만남을 시작합니다.


목차


     

     

     

     

     

     

     
  1. 시스템 보안 - "레드헷 리눅스 6 - 김선영/김기영 공저"를 바탕으로 쓴겁니다...

     
  2. 커널과 커널 컴파일
    - 리눅스 한글문서 프로젝트(KLDP)의 커널 컴파일 관련 링크

리눅스(Linux)란 무엇인가? 리눅스란 운영체제이다. 운영체제란 무엇인가? 운영체제란 컴퓨터 하드웨어 를 바로 쓸 수가 없기 때문에, 컴퓨터 하드웨어와 사용자 또는 응용 프로그램간에 위치하면서, 사용자가 요구할 때, 하드웨어 또는 소프트웨어 자원을 관리해주는 프로그램이다. 흔히 쓰이는 MS-DOS도 PC의 하드웨어를 직접 쓸 수 없기 때문에, 즉 CPU를 손으로 돌려서 계산을 할 수가 없기 때문에, 응용 프로그램을 돌려서 CPU를 제어하는 프로그램인 것이다. 그럼 리눅스란 MS-DOS와 어떻게 다른가? 그것은 리눅스의 역사를 보면서 이해하는 것이 편한데, 리눅스는 크게 보아서는 UNIX라는 운영체제의 PC용이라고 볼 수 있기 때문에, UNIX의 역사에 대해서 먼저 살펴보기로 하자.


  1. 리눅스와의 만남

    1. 1969년 UNIX 탄생

      UNIX는 1969년 미국의 벨 연구소(Bell telephone Laboratories)에서, Ken Thompson등에 의해 개발되었다. 벨 연구소는 현재 AT&T 전화회사의 연구소로 되어 있는데, 당시에도, 20,000여명의 연구원과, 18,000건의 특허를 가진 연구소로, 기초 연구와 미국 통신망의 계획 및 운영, 모회사인 벨 시스템에서 필요한 통신용 시스템과 기기 개발 등의 업무를 수행하고 있었다.

      UNIX라는 이름이 생기게 된 동기에 대해 살펴보면, MIT에서 여러 연구자들이 만들어 낸 Multics라는 운영체제 에서 기인하는데, Ken Thompson 역시 MIT의 Multics 개발 프로젝트에 참여하고 있었다. 하지만, 도중에 하차해서, 벨 연구소로 돌아와서 만든 운영체제가 여럿이 아닌 혼자의 뜻을 가진 Unics 즉 UNIX인 것이다.

      잠깐 Multics에 대해 소개를 하면, MUltics는 여러 좋은 특징을 가지고 있었는데, 다 사용자 인터렉티브 시스템(multiuser interactive system)이라는 점이다. 즉 시분할 시스템(time sharing system)이라는 점인데, 그 당시만 해도 펀치카드에 프로그램을 찍어서 계산하는 형태였음을 기억할 때, 놀랄만한 기능이다. 다사용자 인터렉티브 시스템이란 글자 그대로, 여러 명의 사용자가 동시에 여러 프로그램을 똑같은 컴퓨터 에서 처리할 수 있도록 해주는 시스템이라는 의미이다. 아뭏튼 1980년 후반기만 해도, 우리나라의 대부분의 컴퓨터가 punch card로 작업했음을 생각해보면 선견지명이라고 할 수도 있겠다. 아뭏튼 MIT에서 Multics 에 대해 연구한 Thompson은 돌아와서, UNIX를 만들었는데, 만든 이유에 대해서는 여러가지 설이 있지만, 유력한 하나를 들면 Thompson이 좋아하는 우주전쟁게임이 있었는데, PDP-7이라는 기종에서는 돌아가지가 않고 해서, PDP-11용으로 운영체제를 개발한 것이라고 한다. 결국 Thompson이 우주전쟁 게임을 가지고 즐겁게 놀았을 것이다. 하지만, 주위의 연구원들도, 우주전쟁 게임에 관심을 갖게 되고, 자기도 UNIX를 깔아서, 게임을 즐기고 싶어했으며, 결국 많은 사용자를 지원하게 됨에 따라, 다양한 요구 사항들이 나오고 개발자가 바로 옆의 연구실에 있으므로, 시간 나는대로 고쳐주고 하는 가운데, UNIX는 비교적 온실에서 바로 성장햇다고 볼 수 있다. 또한, 필요는 발명의 어머니다 하는 말을 실감할 수 있는 또다른 예가 있다. 즉, UNIX를 개발한 다른 목적이라고 하는데, UNIX를 처음 얹은 PDP-7은 프로그램을 개발할 수 있는 환경이 되지 못했다. 따라서, 메인프레임 컴퓨터인 GE에서 작업한 후에, 다시 PDP-7을 종이테이프를 이용하여 옮겨야 하는 번거로움이 있었다. 따라서, 그럴 바에야 차라리, 독자적인 운영체제와, 어셈블러, 기타 유틸리티 프로그램을 직접 만들게 되었는데, 이것이 바로 UNIX가 되었다는 이야기이다.

      그 이후에, UNIX는 벨 연구소 안에서, 다양한 요구를 수용하면서, 또한 다양한 조언을 들으면서, 점차 발전하게 되었다. 또한 UNIX를 원하는 다른 사람에게도 무료로 제공되었다. 따라서, 많은 사람들이, 특히 대학을 중심으로 UNIX를 많이 이용하게 되었으며, 심지어는 UNIX의 소스코드를 한줄한줄 설명한 책도 출판이 되었다고 한다. 아뭏튼 대학에서 UNIX를 써왔던 사람들은 상대적으로 익숙치 않은 타 기종보다는 UNIX를 선호하게 되었고, 결국 AT&T가 벨 연구소를 인수하게 되고, UNIX를 상용으로 공급함에 따라, 이미 학교를 졸업하고, 기업체나 연구소에 있던 사람들은 UNIX를 구입하게 되었다. 거의 마지막 UNIX가 버젼 7이라고 볼 수 있는데, 아직도 버젼 7이 가장 잘 만들어졌다고 하는 사람들도 많다. 바로 여기서 AT&T판과 캘리포니아 버클리 분교에서 BSD(Berkeley Software Distribution)계열의 UNIX를 발표하게 된다.

      그후, 세월은 흘러, UNIX는 점차로 더 복잡해지고 어느덧 커널 자체도 많은 부분이 확장된 운영체제가 되었는데, 이는 커널은 간단하고, 거의 모든 서비스들을 사용자 프로그램에 할 당한 초기의 UNIX 철학과는 대조적인 결론이 되었다. 이러한 커널의 크기 증대는 결국, 이식성(portability)측면에서도 좋지 못하고 특히, 분산환경이나 다중 프로세스, 실시간 시스템의 경우에 커널이 크다는 단점은 치명적이 되었다. 바로 여기서, 다시 커널이 작아지게 되는 붐이 일어났는데, 대표적인 UNIX 커널들로는 카네기 멜른 대학에서 만든 MACH 운영체제와 네덜란드 브리제 대학에서 만든 AMOEBA가 있다. MACH는 다중 프로세서 시스템에, AMOEBA는 분산환경 체제에 유리하다고 평하고 있으며, 근래 개발되는 시스템의 경우, 다중 프로세스, 실시간, 분산환경의 특성을 어느 정도는 가지는 것이 일반적인 상황이기 때문에, 위의 운영체제를 채택하고 있다.

    2. 1969년 UNIX 동기 동창생: 인터넷

      UNIX의 면모를 바꾼 또한 측면은 1969년 동년생인 Internet이라고 볼 수 있다. Internet은 1969년 ARPANET에서 시작이 되었는데, 초기의 몇개의 컴퓨터를 연결하던 시기에서, 점차 많은 컴퓨터를 연결하게 되었는데, 싼 값에 얻을 수 있는 UNIX를 이용하여 다양한 프로그램을 개발하던 시기와 일치하고 있다. 이는 곧 인터넷을 통하여, 자기의 프로그램을 다른 컴퓨터에 주게 되었으며, 둘 사이가 시너지(synergy) 효과를 일으켜서 결국은 인터넷은 UNIX라고 생각하는 사람이 있을 정도의 현실이 되었다.

    3. 1980년 그래픽 환경: X 윈도우

      1980년대는 사람들이 미적인 감각이 증가한 시기라고 볼 수 있는데, 미적인 사용자 환경이 좋은 컴퓨터는 매킨토시 컴퓨터를 꼽을 수 있다. 사람들은 질문하기 시작했다. 왜 매킨토시는 저렇게 사용자 환경이 좋은데, UNIX는 왜 명령이 암호 같고, 사용하기 불편한가? 최소한 겉으로라도 잘 보이게 할 수 없는가? 이런 이유에서인지는 모르겠지만, 결국 MIT의 X 윈도우 시스템이 개발되게 되는데, X 윈도우 시스템은 두 가지 목표를 가지고 개발되었다. 첫째, UNIX는 대체로 크게는 Internet에 연결되지만, 작게는 지역 네트웍(LAN)에 물려서 동작한다. 따라서 분산환경에서 동작해야 한다는 점이었다. 따라서, X 윈도우 시스템은 클라이언트/서버라는 개념을 지원하게 되는데, 사용자의 프로그램은 호스트 컴퓨터에서 클라이언트로 동작하고, 사용자가 위치한 터미널에는 서버가 떠서, 고운 얼굴로, 클라이언트가 계산한 결과를 화면에 보여주게 되는 것이다.(여기서, 클라이언트와 서버의 개념이 혼동한 것이 아니냐고 질문할 수도 있는데, X 윈도우 에서는 흔히 말하는 개념과 반대로 되어 있다.)


      < X 윈도우의 client/server 구조>

      또 왜 이름이 X냐고 질문하시는 분에게....

      MIT에서 개발한 X윈도우 시스템은 스탠포드에서 개발한 W라는 윈도우 시스템에서 따왔기 때문이며, 왜 W 냐고 하면, W가 분산환경인 V라는 시스템 위에서 동작하기 때문이다.

    4. 1991년 리눅스 탄생

      쉽게 말하자면 리눅스는 웍스테이션(Workstation)급에서나 사용할 수 있었던 유닉스를 인텔 80X86 계열 마이크로 프로세서 기반의 PC에서도 사용할 수 있도록 만든 유닉스의 한 변종(變種)이라고 할 수 있다. 그렇게 때문에 PC에서도 리눅스를 통하여 유닉스에 대한 갈증을 충분히 해소시킬수 있을 것이다.

      리눅스는 현재 컴퓨터에서 사용되고 있는 OS 중에서 가장 특이한 과정을 통해 태어난 OS라고 할 수 있다. 일반 사용자들에게 널리 알려진 DOS,Windows95/98/NT, OS/2 등과 같은 OS는 거대한 기업에 의해 탄생된 값비싼 녀석들이다. 리눅스는 그러한 거대 기업에 의해 태어난 OS는 아니지만, 요란한 잔치를 벌이며 태어난 고귀한 태생의 OS들과 충분히 대적하고도 남을 만큼 강력하다.

      리눅스는 Linus Torvalds라는, 당시 23살의 핀란드 헬싱키 대학의 한 청년에 의해 그 탄생의 준비가 시작 되었다.(리눅스는 1991년 8월, 리누스 토발즈가 처음 개발한 리눅스 버젼 0.0.1을 기초로 하여 만들어졌으며 공식적으로는 0.0.2부터 발표가 되었다.) 리눅스가 탄생하기 전까지 PC에서 유닉스를 사용하고자 하는 사람들 사이에서는 유닉스를 PC에서 사용 할 수 있도록 축소, 수정한 MINIX가 가장 널리 쓰여졌다. 그는 이러한 MINIX보다 더 강력하고, 더 쉽게 일반 PC에서도 접할 수 있는 유닉스를 만들 생각을 하게 되었다. 그래서 리눅스의 커널이 만들어지기 시작하였고, 그 후 전 세계의 많은 유닉스 프로그래머들과 사용자들의 도움을 받아 계속해서 수정, 발전되어 지금의 리눅스가 탄생된 것이다. 지금 이 순간에도 많은 사람들이 계속 그 소스를 수정되고, 버그가 보고되고, 고쳐지고 있다. 그리고 바로 여러분도 리눅스의 버그를 잡고, 수정하며 직접 리눅스의 개발에 참여할 수 있다.

      리눅스는 이렇게 한 사람에 의해 시작되었지만, 그 후 인터넷을 통해 배포되기 시작하면서 많은 사람들의 손을 거쳐서 탄생하게 된 것이다. 또한 일명 최후의 해커 리처드 스톨만이 만든 FSF(Free Software Foundation)에 기반을 둔 GNU(Gnu's Not Unix)의 후원을 받아, 고가의 상용 애플리케이션보다도 뛰어난 성능을 가진 GNU의 수많은 애플리케이션들을 사용할 수 있게 되었으며, 유닉스의 GUI 환경인 X window도 이미 리눅스용으로 포팅되어 있기 때문에 유닉스 못지 않은 강력한 기능과 환경을 갖추고 있다고 할 수 있는 것이다. (곧 리눅스 커널2.4가 발표될 예정이다.)

    5. 리눅스의 기능상 특징

      • 멀티태스킹, 멀티유저

        다른 유닉스 버젼과 같이 진정한 멀티태스킹 시스템이며, 한 시스템에서 여러 사용자가 많은 프로그램을 동시에 사용할 수 있다. 486-50 Mhz 시스템에서의 성능은 중하 정도의 Sun이나 DEC에 적당한 유닉스를 설치한 웍스테이션과 비교된다. 리눅스는 또한 완벽한 32bit 운영체제이며, 인텔의 80386, 80486 프로세서의 보호모드를 이용한다.

      • GNU 소프트웨어 제공

        리눅스는 GNU 프로젝트에 의해 개발된 GNU C, C++ 컴파일러, gawk, groff 등과 같은 상당한 공개 소프트웨어를 제공한다. 리눅스에서 사용되는 필수적인 유틸리티는 모두 GNU 소프트웨어이며, 소스도 포함되어 제공된다.

      • X Window

        리눅스에서는 X Window System의 공개버젼인 XFree86을 사용한다. X Window System은 다양한 어플리케이션을 제공하는 매우 강력한 그래픽 사용자 인터페이스이다. 예를 들면, 한 화면에 동시에 여러개의 윈도우로부터 다중 로그인 할 수 있으며, 통신 프로그램인 Seyon, 포스트스크립트 언어 처리기인 Ghostscript, X window 버젼의 XTetris등의 어플리케이션들이 있다. 그리고 최근 GTK, Qt 등의 그래픽 툴킷을 사용한 다양한 어플리케이션들이 계속 개발되고 있다.

      • TCP/IP 네트워킹

        TCP/IP는 인터넷을 통한 100만개 이상의 대학이나 회사를 연결하는 프로토콜이다. 인터넷으로 연결되어 있다면, 리눅스 시스템으로부터 랜이나 인터넷을 액세스할 수 있으며, SLIP이나 PPP를 사용하여 모뎀을 통한 인테넷 액세스도 가능하다.

      • 가상 메모리와 공유 라이브러리

        리눅스는 하드 드라이브를 가상메모리로서 사용할 수 있어 실제의 RAM 용량을 확장시킨다. 또한 리눅스는 공유 라이브러리를 구현한다. 이것은 프로그램이 표준 서브루틴을 사용하는 프로그램이 라이브러리 안의 서브루틴을 실시간으로 찾을 수 있게 해준다. 이것은 각각의 응용 프로그램이 공통되는 루틴을 별도로 저장하지 않아 시스템의 많은 하드 공간을 줄여준다.

      • 윈도우 엑셀러레이터 및 Super VGA 지원

        ET4000/6000. CIRRUS, Paradise, Trident, S3, ATI 등 대부분의 VGA가 지원되며, HGC, CGA, EGA등도 물론 지원된다.

      • 기타 하드웨어

        Sound Blaster, ProAudio, Spectrum 16, Gravis, Ultrasound 등 대부분의 사운드 카드와 WD80x3, ne1000, ne2000, 3com503, 3com509 등의 네트웍카드가 지원된다. 이밖에, 수치연산 프로세서 에뮬레이션, SCSI 및 VESA, PCI 버스 지원, 도스 에뮬레이션, 다중 부트 기능등을 지원한다. 지원가능 하드웨어의 종류는 지속적으로 추가되며 현재 거의 대부분의 하드웨어가 지원된다.

    6. 다양한 배포본

      리눅스는 엄밀하게는 커널 부분만을 정의한 것이며, 그 다음에 작동을 하는 인스톨러, 커맨드, 툴, GUI 등에 무엇을 선택할 것인지는 자유이다. 그래서 개인이나 각 단체가 아이디어를 내서 각각의 배포판, 즉 디스트리뷰션 (distribution)을 작성하고 있다. 사용하기 편한 것을 추구한 것, 초급자에서 상급자까지 폭넓은 유저의 지원을 목적으로 한 것, 더욱이 서버 업무만으로 목적을 좁힌 것 등 다양한 종류가 있다. 특히 최근들어 리눅스에 대한 관심이 높아짐에 따라 국내에서도 배포본을 작성하는 업체및 단체가 많이 생겨나고 있는 상황이다. 이런 자유도가 높은 것이 리눅스의 매력이나, 입문자에게 있어서는 오히려 당황하게 되는 원인이 되고 있다. 슬랙웨어(Slackware), 레드헷(RedHat), 터보(Turbo) 리눅스 등등 입문자에게 있어서는 전혀 다른 OS와 같이 보이는 디스트리뷰션이 전부 같은 리눅스라는 이름을 가지고 있다. 어느것이 진짜 리눅스인가 라고 생각하는 입문자도 많을 것이다. 그래서 이번에는 이렇게 많은 배포본의 배경과 특징을 살펴봄으로써 이런 혼란에서 벗어나 자신에게 알맞는 배포본을 선택할 수 있도록 하고자 한다. (가장 초창기 배포본이라 할 수 있는 SLS는 현재 사용자가 많지 않으므로 여기서는 생략함.)

      1. [개요]

        슬랙웨어(Slackware)는 Patrick Volkerding씨가 중심이 되어 개발하고 있는 선발 디스트리뷰션이다. 처음의 릴리즈는 1993년 6월로, 당시 보급되어 있던 SLS라는 디스트리뷰션에 비해서

        첫째, 인스톨러가 잘 되어 있다.
        둘째, 네트워크상에서 소스코드가 공개되어 있다.

        등의 장점이 있었기 때문에 보급이 빠르게 이루어졌다.(
        사실 저는 1992년말 경에 리눅스를 처음 접했는데..그 당시 제컴의 사양은..386DX, RAM 4M, modem 2400 bps, HDD 170M, VGA 가산 한글마당, no cdrom, SynMaster 14"에서 윈3.1 사용중이었는데..멀티태스킹은 거의 생각도 못하고 있는 상황였는데..리눅스를 알게되어..2400bps 모뎀으로 3.5" 디스켓 63장 되는 Slackware 1.2를 받았습니다.. 지금 생각하면..무식의 극치 - 밤에 다운실행시켜 놓구..아침에 확인하구를 며칠..^_^..(당시엔 쉽게 공짜 CD도 거의 나오지 않은 상태였기 때문에..)
        겨우 다 받아서 설치... 지금이야 엄청 쉬워졌지만..설치가 장난이 아녔습니다..며칠을 헤메어 설치를 완료하고..X-window까지.. 설치한 다음..멀티태스킹 확인을 해 봤져..잘 되더라구요..... 엄청난 고생을 한후..처음 X가 떴을때 그 기분이란..정말 이루 말루 할 수가 없었습니다.. 비록 파란 바탕에.X 글짜가 하나 뜬거 였지만..지금 하도 오래되서..그당시 기억이 잘은 나지 않지만.. 엄청난 열정이었습니다..^_^..)


        리눅스의 최초 개발자인 Linus가 comp.os.minix로 처음에 리눅스를 발표한 것이 1991년이었다는 것을 생각하면, 1993년 이라는 공개시기는 상당히 빠른 것이라고 할 수 있을 것이다.
        Slackware의 최근 버젼은 Slackware 7.0 이다..Slackware 7.0

        최근 슬랙웨어는 다른 디스트리뷰션에게 인기를 빼앗기기 시작하고 있다. 특히 패키지 관리를 난점으로 지적하는 사람도 적지 않으나, 이것은 일장 일단이 있는것이며, 그렇게 나쁜 면만 있는 것도 아니다. 사실 아직까지도 Slackware 사용자는 전세계적으로 많으며 주변에 '리눅스를 한 사람' 은 대개 슬랙웨어를 사용하고 있거나, 과거에 사용한 경험이 있을 정도이다.

        [구하는 방법]

        네트워크 환경이 잘 되어 있다면
        FTP 싸이트(http:/www.slackware.com) 에서 구해도 좋으나, 요즘은 잡지나 서적의 부록 CD-ROM에 다양한 종류의 배포본들이 딸려 있으니 쉽게 구할 수도 있다.

        [Slackware 인스톨]
        Slackware 7.0 Installation Guide

        인스톨 소스로는 CD-ROM, 하드 디스크, NFS 경유, 플로피 디스크 등이 지정 가능하다. 통상 인스톨에서는 이들과는 별도로 2장의 플로피 디스크(bootdisk, rootdisk)가 필요하게 된다. 인스톨러는 메뉴형식으로, 질문에 답을 해가면 비교적 간단하게 인스톨을 할 수가 있다. 표시 언어가 영어이긴 하나, 그다지 어려운 것은 없으며, 이 부분을 해설한 서적도 많이 있으므로 문제는 없을 것이다.


      2. Red Hat    

        [개요/특징]

        레드헷 리눅스(이하, 레드헷)는 현재 세계적으로 유저 수가 가장 많은 리눅스 디스트리뷰션이라고 해도 과언이 아닐 정도로 인기있는 배포판이다. 레드헷은 Red Hat Software사에 의해 릴리즈되고 있는 배포판으로, 역사적으로 보아도 비교적 새로운 배포판이라고 할 수 있다. 그러나, 후발이면서 다음에 나타나 있는 것과 같은 특징으로 말미암아 지금은 선구자인 슬랙웨어를 능가하는 기세이다.

        • 관리기능이 좋다.
        • 그리픽컬하여 알기 쉬운 인스톨러와 관리툴
        • 준비된 다수 바이너리 패키지
        • 패키지의 조립이 간단하다.

        그 가운데에서도 인스톨러에 의해 익숙하지 않은 초보자도 리눅스를 쉽게 접할 수 있게 한 것이 가장 큰 장점이라 할 수 있다. 대부분의 인기 디스트리뷰션이 레드헷 인스톨러 RPM 패키지 형식을 채용하고 있는 것에서도 얼마나 레드헷이 지지를 받고 있는지를 알 수가 있다.

        • 현재까지의 경위

          레드헷은 1997년 12월에 새로운 버젼 5.0을 발표했다. 표준 C 라이브러리가 libc(libc5)에서 GNU의 라이브러리인 glibc2(libc6) 으로 이행했기 때문에 상당한 혼란이 있기는 했으나, 98년 여름에 백픽스판이라고 할 수 있는 5.1이 발표되고, 11월에는 보다 안정된 버젼인 5.2가 발표되었다. 최근의 버젼은 Red Hat 6.0으로 커널 2.2.x, glibc2.1을 채택하고 있다.
          현재(2000년 1월 16일) 가장 최신 버젼은
          RedHat 6.1(download)이다.

        • 다양한 CPU Architecture에의 대응

          레드헷이 지지를 받고 있는 이유 중 하나로 많은 CPU 아키텍쳐에의 대응이라는 점을 들 수 있다. 인텔사와 그 호환 프로세서(i386) 뿐만 아니라, DEC의 Alpha(alpha), 선 마이크로 시스템즈의 SPARC(sparc), 모토롤라의 PowerPC(ppc) 등에도 대응하고 있다.

        • Red Hat사의 상용 패키지와 프리 패키지

          레드헷사는 GPL에 따라서 디스트리뷰션을 무료로 배포하는 것 외에, 상용 소프트웨어나 전화 등에 의한 서포트를 포함한 상용 버젼을 판매하고 있다. 즉, 상용 패키지와 무료판의 차이는, 상용 소프트웨어가 포함되어 있는지, 전화 , 메일 등에 의한 서포트를 받을 수 있는지의 차이이며, 그밖의 수록 패키지는 차이가 없다.

          여기서 잠깐....GPL(General Public License)에 대해서...
          리눅스는 GNU의 GPL(General Public License)에 의해 배포된다. GPL은 소프트웨어의 상업적인 저작권을 나타내는 Copyright에 반대하는 Copyleft의 개념과도 일맥 상통한다고 볼 수 있다. GPL에 의해 보호되는 소프트웨어는 상업적인 행위를 배제한 자유로운 배포와 수정에 그 의의를 둔다. 그렇지만 이렇게 공개된 소프트웨어라고 해서 저작권에 대한 개념이 전혀 없는 것은 아니다. 그리고 GPL 소프트웨어는 판매로 인한 이익을 남기는 것도 허용한다. 이것은 어떻게 보면 Copyright 개념과 다를 것이 없는 것처럼 들리겠지만 그렇지 않다. GPL 소프트웨어는 판매할 수도 있지만 그와 동시에 그 소프트웨어를 구입한 사람이 또 다시 어떤 수정, 보완을 하여 자유로이 재판매를 할 수 있도록 허용한다는 차이점을 갖고 있다. 모든 사람이 인터넷을 통하여 소프트웨어를 얻을 수 없을 뿐 아니라 리눅스와 같이 덩치가 큰 소프트웨어는 오히려 이러한 판매망을 이용하는 것이 더 편할 수도 있으며 이러한 off line 방식의 배포에는 당연히 시간과 노력과 돈이 들기 때문에 그 만큼의 대가를 치러야 하는 것은 당연한 것이라고 볼 수 있다.


        [인스톨러의 특징]

        정평이 나있는 레드헷의 인스톨러는 다음과 같은 특징이 있다.

        • 알기쉬운 인스톨러

          레드헷의 큰 특징은 인스톨러가 칼라풀해서 알기 쉽고 조작이 간단하다는 것이다. 인스톨러의 지시에 다라서 작업을 진행하면 누구라도 인스톨을 행할 수 있도록 설계되어 있다.
          인스톨 클래스는 Red Hat 5.2의 큰 특징이다. Workstation, Server, Custom이라는 3가지 클래스가 있어, Workstation, Server를 선택하면 디스크의 파티션에서 인스톨까지 모두 자동으로 이루어 진다. 네트워크 카드, 그래픽 카드의 디바이스 드라이버의 조립도 인스톨시에 이루어져 간편하게 인스톨할 수가 있다. 물론, 파워 유저는 Custom를 선택하여 임의의 팩키지를 선택한다는 인스톨도 가능하다.(어느정도 설치에 자신이 있으면 Custom을 선택하는 것이 여러모로 좋다..)

        • 인스톨러로 업데이트, FTP 인스톨 등이 가능

          신규 인스톨 뿐만 아니라, 업그레이드가 가능한 것도 레드헷의 특징이다.
          인스톨 모체는 CD-ROM 뿐만 아니라 하드디스크에 있는 패키지군 외에, 삼바(Samba)를 이용해서 윈도즈머신(서버)에서 인스톨 할 수가 있다. 더욱이 FTP에도 대응하고 있기 때문에, 수중에 패키지가 없어도 인터넷 상의 FTP 서버에서 직접 패키지를 찾으러 가서 인스톨 할 수도 있다.

        • 자동 인식 기능
          (네트워크 카드, 그래픽 카드)

          Red Hat 5.2에서 하드웨어의 자동인식 기능은 상당히 진전되었다. 초보자가 우선 고생하는 것이 그래픽 카드에 대한 X 서버의 선택과 설정이나, 레드헷에서는 Xconfigurator라는 툴로 인스톨 작업중에 카드가 자동검출되도록 되었다. (이 기능은 예전에 제가 X를 설정하기 위해 고생했던 것을 생각하면 아주 유용한 기능이자 특징으로 생각된다.)

          이 툴을 사용하면, 대부분의 카드는 자동검출할 수 있다. 또한, 사용하는 모니터에 대해서 수평/수직주사 주파수대를 입력하면, 해상도나 색수도 디폴트치를 설정해 준다. 마우스도 자동적으로 검출된다.
          네트워크 카드도 어느 정도라면 자동 검출할 수 있다. 네트워크(LAN) 설정에서 네트워크 카드의 자동인식이 실행되어, 대응하는 드라이버가 선택된다.

        • 노트북의 대응

          노트북의 경우는 PC 카드를 사용해 CD-ROM 드라이브나 네트워크 경유로 보조 인스톨 플로피 디스크도 준비해 둔다. 예를 들어, PC 카드 경유, 혹은 FTP 경유에서의 인스톨을 선택하면 보조 플로피디스크를 요구하기 때문에, 디스크를 삽입하면 된다. 노트북에서 문제가 되는 그래픽 카드의 대응이다. XFree86의 최신판인 3.3.3에서는 Neo Magic사의 카드에도 대응하고 있다. 단, 최근 노트북에서 많이 채용되고 있는 ATI RageLT Pro는 3.3.3에서 서포트되고 있기 때문에, 상용 X 서버의 구입을 생각해 볼 필요가 있다.

        [RPM을 이용한 패키지 관리기능]

        RPM 이란 Red Hat Package Manager의 약칭으로, 바이너리, 설정파일, 라이브러리, 다큐멘트 등을 일괄 관리하는 툴이다. 인텔 프로세서용 패키지를 예로 들면, 마지막에 i386.rpm이라는 확장자가 붙기 때문에 금방 알 수 있을 것이다.
        RPM은 아래와 같은 특징들이 있다.
        • 인스톨, 업그레이드, 언인스톨이 용이하다.
        • 데이터베이스를 검색해서 패키지나 특정 파일을 찾아내는 강력한 기능을 가지고 있다.
        • 패키지에 필요한 파일, 의존성 등의 유무 등을 조사하는 기능을 갖고 있다.


        사용예를 보면, xfishtank-2.0-5mdk.i586.rpm라는 패키지가 있다고 할 때...
        [root@bluestar /root]# rpm -Uvh xfishtank-2.0-5mdk.i586.rpm < -- 설치시 -Uvh 옵션으로..
        [root@bluestar /root]# rpm -e xfishtank < -- 제거시 -e 옵션(제거시는 패키지명만 주면 된다.)

        [풍부한 Red Hat 툴]

        레드헷은 여러가지 다양한 툴을 제공하고 있는데...여기서는 지면상 생략하고, 시스템의 설정/관리를 집중적으로 행하는 linuxconf에 대해서만 알아보자..
        linuxconf를 실행하면 아래와 같은 화면이 나온다
        [root@bluestar /root]# linuxconf
        linuxconf 실행화면
        linuxconf는 Red Hat 5.2에서 안정되게 이용할 수 있게 된 것으로, 강력한 설정, 관리 툴이다. 위의 그림에서 보듯이 설정, 관리 할 수 있는 항목은 Config/Control, Networking/User accounts/File systems/Miscellaneous services/boot mode 등이다. 예를 들어, Networking에서는 LAN 관련의 주소나 호스트명(/etc/hosts)의 설정을 비롯하여 게이트웨이 설정, PPP 설정 등, 거의 대부분의 설정이 가능하다.

        이 linuxconf의 가장 큰 특징은 다른 머신의 웹브라우져에서도 linuxconf를 조작할 수 있다는 것이다. 이를 위해서는 먼저 linuxconf 측에서 [네트워크 액세스 가능]에 설정해 둘 필요가 있다.
        다른 머신의 웹브라우져에서 레드헷 리눅스 서버에 액세스하기 위해서는 URL로써 http://linuxconf설정할 서버명:98 과 같이 지정한다. 액세스 하면, 웹브라우져의 엔트리 화면에서 우선 유저명과 패스워드 입력이 요구된다. 여기서 유저인증이 끝나면 설정화면이 표시되어, 리모트 환경에서 웹브라우져를 통해서 리눅스 서버의 설정이 가능해진다.
        리모트 환경에서 시스템의 정지나 재작동도 행할 수 있기 때문에, 특히 모니터를 뺀 상태의 서버머신에 대해서는 위력을 발휘할 것이다. 아래에 192.168.1.10의 IP를 갖는 윈머신에서 192.168.1.11의 리눅스 서버에 접속하여 linuxconf를 실행하는 모습을 보여준다.
        Remote configuration for linuxconf

      3. Debian GNU/Linux(이하, Debian)은 리눅스를 커널로 한 자유로운 OS이다. 다른 디스트리뷰션과 비료하면, 강력한 패키지 관리시스템이 특징이나, 이 개발모체로 되어있는 Debian Project의 열린 개발방법이나 개발방침에 대해 언급하지 않고는 데비안을 이야기 할 수 없다.

        [Debian Project]

        데비안 프로젝트는 Ian Murdock에 의해 1994년에 설립된 비영리 조직이다. 데비안 프로젝트에 등록되어 있는 개발자는 전세계에 존재하고 있으며, 활동 거점을 인터넷으로 하고, 연락수단으로 mailling list와 IRC가 사용되고 있다.
        데비안 프로젝트의 특징 중 하나로 민주적인 프로젝트의 운영방침을 들 수 있다. 프로젝트 리더의 선출이나, 중요한 방침의 결정 등은 개발에 종사하는 멤버에 의한 투표로 결정된다. 또한, 데비안 프로젝트의 방침이나 목표는 [사회계약(Debian Social Contact)] 이라 불리는 규약으로 정해져 있어, 이것이 프로젝트의 성격을 강하게 좌우하고 있다. 규약의 내용은 아래와 같다.

        • Debian이 100% 자유 소프트웨어라는 것을 유지한다.
        • Debian으로 작성한 프로그램은 무료로 라이센스를 공개한다.
        • 보고된 문제를 숨기지 않고, 버그 추적 시스템에 따라서 언제라도 열람이 가능하다.
        • Debian을 바탕으로 한 파생시스템의 작성을 방해하지 않는다.
        • Debian 자유 소프트웨어 가이드라인에 일치하지 않는 소프트웨어도 서포트한다.


        데비안 프로젝트의 기본이념인 [사회계약]에 '100% 자유 소프트웨어일 것을 유지한다.'라는 조항이 있는 것을 보았는데, 한마디로 자유 소프트웨어라고 해도 여러가지 의미가 있으나 데비안 프로젝트에서는 [Debian 자유 소프트웨어 가이드라인( DFSG)]이라는 기준을 정해 자유 소프트웨어를 명확히 정의 하고 있다. 아래를 보라...

        • 자유로운 재배포
        • 소스코드의 배포
        • 파생 소프트웨어 작성의 허가
        • 사용자, 목표 분야의 평등

        DFSG(Debian Free Software Guideline)에 적합하지 않는 패키지를 non-free라고 불러, 적합한 것이 그 자체로서는 완결되지 못한 패키지를 contrib이라고 불러 Debian과는 구별해서 배포하고 있다.

        Debian-KR 데비안 한글 웹페이지: 데비안 프로젝트에 관한 뉴스, 패키지, 메일링 리스트, 버그추적 시스템을 제공한다.

      4. OpenLinux(Caldera Systems)
        Open Linux 2.3 - 9.95 오픈 리눅스는 한국에서 그다지 알려지지 않았으나(예전에는 칼데라로 알려졌던 것으로 기억됨..), 미국에서는 기업에 도입이 되어 이용되고 있는 젊은 비즈니스맨을 의식한 패키지이다.

        • NetWare와의 높은 친화성

          오픈 리눅스가 미국에서 인기가 높은 이유로서 Novell사의 네트워크 OS인 NetWare와 접속성이 뛰어나다는 것을 들 수 있다. 구체적으로는, NetWare에 탑재되어 있는 디렉토리 서비스인 NDS(Novell Directory Service)의 클라이언트 기능을 갖추고 있다. 그렇기 때문에, 네트워크 내의 서버나 프린터 등, NDS가 지닌 정보를 이용할 수가 있다.
          더욱이 최신 버전인 ver 2.3에서는 NDS의 관리 툴도 갖추어져 있어, 조직내에 있어서 어카운트 정보나 서비스명, 서비스정보 관리가 오픈 리눅스에서 통일적으로 행할 수 있게 되어 있어, 더욱더 NetWare와의 친화성이 높아지고 있다.

        • 윈도즈에 가까운 조작성

          최신 버젼인 ver 2.3에서 표준 윈도 관리자로서 KDE가 채용되고 있다(이전 버전의 윈도 관리자, Looking Glass도 1g 코멘드에서 사용가능). KDE는 윈도즈에 가까운 조작서을 가지고 있어, 처음 사용하는 사람이라도 윈도즈를 사용한 경험만 있으면 직관적으로 조작방법을 알 수 있을 것이다.

         
      5. Linux-Mandrake 6.1

        [Linux-Mandrake의 개관]

        Linux-Mandrake는 단순함을 추구한다. Linux-Mandrake 배포판은 Red Hat 등과 같은 베스트 리눅스 대열에 올랐다. 이 배포판은 설치가 쉽고 또한 미려하고, 안정적이며, 친근한 고급 그래픽 데스크탑 매니저 KDE를 제공한다. Linux-Mandrake에는 KDE 뿐만 아니라 GNOME(GNU Network Object Model Environment), AfterStep, Windowmaker, IceWM 등 사용자의 기호에 맞게 선택할 수 있는 다양한 그래픽 환경이 포함되어 있다. 단지 Linux-Mandrake를 설치하는 것만으로 모든것이 끝난다(?)고 Linux-Mandrake는 광고하고 있다. 리눅스를 설치하고 사용 환경설정을 하기 위해 많은 시간과 비용을 소비하지 않아도 여러분은 Mandrake를 쉽게 설치하고 사용할 수 있다.
        Red Hat과 100% 호환 가능한 데스크탑 매니저와 많은 향상된 기능들...
        리눅스에 관심을 갖는 많은 윈도우 사용자들에게도 Linux-Mandrake는 친숙한 윈도우 환경을 제공한다.

        사실 리눅스를 설치하는 것이 그리 쉬운일 만은 아니다. 특히 초보자의 경우에는 더욱 그렇다
        Linux-Mandrake는 설치나 사용 환경설정에 많은 시간을 들일 필요가 없으며 다른 배포판들과 마찬가지로 자유롭게 FTP 싸이트에서 구할 수 있다.

        < Mandrake FTP 싸이트 >
        ftp://ftp.kreonet.re.kr/pub/Linux/Mandrake(Taejon, Korea)
        ftp://ftp.nuri.net/pub/Linux/mandrake(Korea)

        [Linux Mandrake 6.0(Venus) 외관]

        Linux-Mandrake는 32bit의 멀티태스킹 환경을 제공하며, 인텔 기반의 프로세서(펜티엄, 펜티엄 프로, 펜티엄 MMX, 펜티어II, 펜티엄III와 모든 호환 CPU)에서 동작한다. Linux-Mandrake는 UNIX 기반의 유연하고 강력한 그래픽 환경 KDE, GNOME, AfterStep, Windowmaker, IceWM, fvwm등을 지원한다. 또한 아파치 웹서버, Gimp, 넷스케이프 커뮤니케이터와 많은 보조 소프트웨어를 제공한다. Linux-Mandrake는 자유롭게 사용할 수 있고, 자유롭게 배포할 수도 있다.
        Linux-Mandrake의 버젼은 Red Hat 리눅스 버전과 거의 동일하다. 예를 들어 Linux-Mandrake 6.x는 Red Hat 6.x와 같다.
        현시점에서 가장 최신버젼은 Linux-Mandrake 7.0이다.

        [개선되거나 추가된점]

        • 21개국어로된 인스톨러를 제공한다.
        • 설치중에 특별한 권한(예를 들면 root 등)이 없어도 설치 가능하다.
        • 설치중에 X 윈도우를 테스트할 수 있으며, 설치후 곧바로 X윈도우로 부팅할 수 있다.
        • ISDN, CD 레코더, PC 스피커 드라이버, 윈도우 키 등의 지원이 개선.
        • CD-ROM, 플로피 디스크의 마운트에 특별한 권한이 필요 없으며 CD-ROM 아이콘을 클릭하는 것만으로도 쉽게 마운트 할 수 있다.
        • KDE, GNOME, AfterStep, WindowMaker 등의 다양한 그래픽 환경을 제공하고 IceWM으로 KDM과 GDM의 선택이 가능하다.
        • 모든 X 어플리케이션에서 스칼라 폰트와 벡터 폰트를 지원한다.
        • 인스톨시에 지원되는 언어가 KDE와 GNOME에도 동일하게 지원된다.
        • 다양한 KDE 테마를 지원한다.
        • 프린터 아이콘에 드래그 앤 드롭 만으로 문서를 인쇄할 수 있다.
        • KDE 환경에서 절전모드를 지원한다.
        • KDE 환경에서 휴대용 콘드롤을 지원한다.
        • X 윈도우와 콘솔 모드에서 이전에 비해 더 많은 문자기호를 지원한다.
        • $LANG 환경변수에 더 많은 로케일을 지원한다.
        • 그래픽 환경에서 자동으로 업데이트가 가능하다.
        • ext2compr 지원으로 디스크 공간을 절약할 수 있다.
        • VGA 호환 모든 비디오 카드에 VESA 2.0을 지원한다.
        • 그 외에도 많은 버그 및 보안 관련 내용이 수정되었다.


        [포함 어플리케이션]

        • KDE와 GNOME 어플리케이션 상에서 실행되는 ktop, kvirc, knetmon, kpackage, klyx, gaddr, gtkzip 등의 많은 보조 프로그램
        • 확장된 오피스 팩(Killustrator, Gnumeric, Maxwell, Check Book Balancer, sane-1.0.1 ...)
        • kBeroFTPD를 이용 쉽게 설치할 수 있는 BeroFTPD 와 BeroList
        • 넷스케이프 4.6
        • Gimp 1.0.4
        • Apache 1.3.6 with PHP integrated
        • Wine 990518
        • Xemacs 20.4
        • Sendmail이 기본 설치된 Postfix

        [스피드 최적화]

        • Ultra-DMA IDE hard-drives optimized for speed
        • 모든 패키지와 핵심 컴포넌트들은 다음의 펜티엄 클래스에 대해 다시 컴파일 되었고 약 5-30% 정도 스피드 성능 향상을 기대할 수 있다.(펜티엄, 펜티엄II, 펜티엄III, 셀러론, AMD K6/K6-2, Cyrix 6x86, Cyrix MII등..)

        [탑재된 소프트웨어]

        • Linux Kernel version 2.2.9
        • ld.so version 1.9.5
        • Glibc 2.1.1
        • RPM 3.0.1
        • Bash 2.03
        • pgcc version 1.1.3(egcs 2.91.66 기반)
        • RedHat Linux version compatibility: 6.0
        • KDE version 1.1.1(확장판)
        • XFree86 3.3.3.1
        • Gimp version 1.0.1
        • Gnome(built from 1.0.4 -> 1.0.9 versions)
        • Windowmaker 0.52
        • AfterStep 1.7.90


         
      6. SuSE Linux 6.3 - 9.95

        SuSE Linux는 독일에서 개발된 배포판이다. SuSE Linux 6.2(현시점에서 가장최신버젼은 SuSE Linux 6.3이다.) 는 SuSE Linux 엔지니어링팀에 의해 테스트되어 그 가치와 유용성을 인정받은 1,300여개의 어플리케이션과 유틸리티를 가지고 있다. 설치가 용이하고 설치된 각 패키지를 한눈에 볼 수 있도록 구성된 것이 특징이다.

        구성된 내용중 일부를 살펴보면 다음과 같다.

        • 이미지 관련: Gimp, blender, Image Magick
        • 프로그래밍: C/C++, Fortran, Pascal, Java
        • 사운트: CD-Player, MODPlayer, MP3-Player, MIDI-Sequencer, OSS, ALSA
        • 멀티미디어: MPEG Video Player(mtv/mtvp) and Xaudio MP3 Player by MpegTV
        • 타입셋팅: teTeX/LaTeX, Ghostscript
        • 웹서버: Apache
        • 네트웍: TCP/IP, NFS, UUCP, PPP, IPX, Appletalk, HAM radio, ISDN, SMB(samba: Windows), ARCnet, Internet
        • 데모: ADABAS D Personal Edition relational database, IBM via Voice(Voice recognition software), Vmware
        • 인터넷: WWW, mail, IRC, News, DNS, Firewall
        • 메일: Sendmail 8.9.3
        • 데이타베이스: Sybase ASE, Informix SE(developer version), MySQL
        • 유닉스 툴: awk, sed, grep, find, res, make, mgroff, bison, flex, perl, m4
        • 비디오: RealPlayer 5.0
        • 에뮬레이터: DOS, Atari ST, Amiga, C64, C128, VIC20, PET, ZX Spectrum, Gameboy, Nintendo Entertainment System, Atari VCS2600, Coleco Vision, ZX81

        SuSE Linux Office Suite'99는 워드프로세싱, 프리젠테이션, 스프레드쉬트, 그래픽스, HTML 빌더, email 클라이언트 등의 패키지를 포함하고 있으며 특히 MS Word 95/97과 MS Excel 95/97의 문서를 "Microsoft Import Wizard" 메뉴를 이용 오피스 수트상에서 불러올 수 있다. 또 Applix Builder는 약간의 노력만으로 OOP 환경의 사용자 어플리케이션을 쉽게 개발할 수 있으며, Applix Data는 이기종간의 SQL 데이타 베이스를 빠르고 쉽게 변환할 수 있다.


      7. Plamo Linux

        Plamo Linux(이하, Plamo)는 슬랙웨어와 PJE를 결합해서 진화시킨 것으로, 고지마 미쓰히로씨를 중심으로 개발되고 있다. 최근 릴리즈된 때는 1997년으로, 최신판은 Plamo Linux 1.4.1이다. 이 버젼은 Slackware 3.6.0과 PJE0.1.5를 베이스로 개발 되고 있다. 또한, 커널의 버전은 2.0.36, XFree86의 버전은 3.3.3.1dlek.
        기본적으로 libc의 버젼 등은 Slackware 3.6.0에 준한다.
        Plamo의 주된 특징에는 인스톨이 간단하다는 것, 노트북에의 대응에 충실하다는 것, 일본어 대응이 충실하다는 것, NEC PC-98 시리즈에 대응하고 있는 유일한 리눅스 디스트리뷰션이라는 것 등을 들 수 있다.

      8. 터보 리눅스는 퍼시픽 하이테크 주식회사가 개발, 판매하고 있는 디스트리뷰션이다. 버전 1.0이 97년 2월에 릴리즈된 이래 착실하게 유저를 획득하고 있어, 현재의 라인업은,

        • TurboLinux 일본어판 3.0(standard판)
        • TurboLinux Pro 일본어판 3.0
        • TurboLinux Server 1.0
        이라는 세가지 제품으로 되어 있다.

      9. Vine 리눅스는 Porject Vine에 의해 개발되어 릴리즈된 디스트리뷰션이다. 이 Project Vine는 Vine 리눅스를 개발하기 위해서 결성된 개발팀으로 전원이 자원 봉사로서 작업하고 있다.
        Vine 리눅스는 초보자에 대해서는 인스톨에서 일본어 어플리케이션의 이용까지 용이하게 할 수 있도록 하고, 중급자 이상의 유저에게는 사용이 편리하고 안정된 OS를 제공하는 방향으로 개발되었다.


      10. 파워 리눅스는 리눅스 전문업체인 리눅스코리아(대표: 한동훈)에서 엔터프라이즈급의 성능으로 개발한 배포판으로 레드헷 리눅스와 호환성을 유지하며, 한글 지원을 대폭 강화한 6.0을 얼마전에 발표했다.(커널 2.2 탑재..)
        파워 리눅스 6.0은 최대 16개의 프로세서를 지원하며, 원격으로 2,048명의 사용자가 동시에 접속할 수 있다. 아울러 최근 새로운 데스크탑 환경으로 폭발적인 인기를 끌고있는 GNOME과 KDE가 포함되어 있어 리눅스에 익숙하지 않은 사용자도 편리하게 사용할 수 있게 되었고, 하드웨어 장치에 대한 지원도 강화되어 대부분의 하드웨어를 지원한다. 설치 과정 중 웹을 통한 설치 방법도 새롭게 도입되었으며 암호화 방식도 강화되어 기본으로 256문자까지 암호에 사용할 수 있으며, 암호 유출을 방지하기 위해 쉐도우 패스워드를 기본으로 지원한다. 아울러 아파치 웹서버 최신 버젼을 탑재, 커널 트래픽 감시 기능이 포함되어 대역폭을 제어할 필요가 있는 ISP에게 유용하다.

        한글 파워 리눅스 6.0을 구입하면 기본 리눅스 OS와 함께 웹기반의 메일 서버인 쓰리알소프트의 메일스튜디오2000과 웹BBS 소프트웨어인 인터테크의 웹스테이션, 이이너스 기술의 비주얼 제작툴인 CMeister, 웹 접속 분석 통계 도구인 장원 그래픽스의 웹로그, 노브레이크 테크놀러지스의 웹 게시판 크레이지 보드, 넷사랑컴퓨터의 X 매니저 등 6여종의 국산 리눅스용 소프트웨어의 번들 및 데모 버전이 포함된다. 이와 함께 240쪽 분량의 설치 설명서, 130쪽 분량의 사용 설명서, 60일 간의 메일을 통한 설치 지원이 포함되어 있다.
        파워 리눅스에 대한 자세한 정보는
        http://power.linuxkorea.co.kr 을 통해 알 수 있으며 여기에서 400쪽 분량의 파워 리눅스 6.0 설명서를 다운받을 수 있다.


      11. K-리눅스는 (주)리눅스 인터내셔널에서 릴리즈하는 배포판으로 리눅스 사용자들에게 보다 편리한 한글화된 OS를 제공하기 위한 목적으로 개발되었으며, Red Hat 리눅스 배포판을 기반으로 만들어 졌다.

      12. 알짜 리눅스는 1996년 리눅스 통신 동호회(나우누리) 활동의 노력으로 시작되었다. 처음은 그 당시 대중적이었던 리눅스 배포판 Slackware를 기반으로 기존 한글 개발자들의 성과와 패치맨(Patch Man: 알짜리눅스팀의 별칭)의 통합 노력으로 [알짜웨어 (알짜 슬랙웨어)]라는 국내 최초의 대중적인 배포판으로 탄생하였다.
        1997년 알자 리눅스는 보다 향상된 패키지 기술 RPM(Red Hat Package Manager) 기술을 선보인 레드헷 리눅스 4.0을 계기로 슬랙웨어에서 레드헷 리눅스 배포판으로 교체하였다.
        그 후 4.1, 4.2.5(알짜 중간버젼), 5.0, 5.1, 5.2버젼을 레드헷 리눅스의 발표와 함께 진행 발표하였다. 또한 지난 98년 12월부터 리눅스의 시장 진출을 개척하기 위해 한국 리눅스 비즈니스(주)(알짜 메인테이너, 대표 이만용)를 설립, 본격적인 알짜 리눅스 배포판 사업을 시작하였다.
        6.0버전은 첫번째 알짜리눅스가 발표되었던 1996년 여름 커널 버전 2.0 발표후 2년 반이 넘는 기간 동안 리눅서와 많은 커널 개발자들의 노력속에 발표된 커널 2.2 신버전과 GNOME, KDE 데스크탑 환경 성과를 담아낸 최신 버젼이다.
        얼마전에 알짜 6.1이 발표되었다...

      13. 미지-리눅스

        미지 리눅스 OS는 미지 리서치가 개발하는 리눅스 배포판으로 데스크탑 환경에서 사용할 수 있는 배포본을 목표로 개발하고 있습니다. KDE를 채택하여 친숙한 사용자 환경을 제공합니다.
        현재 미지 리눅스 OS 1.0버전이 나와 있으며,
        미지 리서치 FTP 사이트에서 받을 수 있습니다. 설치하여 사용하면서 이상한 점을 발견하신다면 저희에게 알려 주십시오. 미지 리눅스 OS의 데스크탑 화면의 updates 아이콘을 실행하시면 개선된 패키지를 설치할 수 있습니다.



  2. Copyright (C> 1985 Richard M. Stallman (Copying permission notice at the end.)

    1. GNU란 무엇인가? Gnu's Not Unix!

      GNU는 유닉스와 완벽하게 호환하는 소프트웨어 시스템이며 사용가능한 모든이가 무료로 사용하도록 작성한 것이다. 몇몇 다른 자원자들의 도움이 있었으며, 많은 시간적, 금전적 지원과 프로그램과 장비가 절실히 필요한 상태이다.

      우리는 문서 형식기로 TeX를 사용할 것이며, nroff도 여전히 사용될 것이다. 또한, X 윈도우 시스템도 사용할 것이다. 이런 후에 Common Lisp, Empire, 스프레드시트 등과 수많은 다른 프로그램을 온라인 문서를 포함하여 추가할 것이다. 우리는 결국, 일반적인 유닉스 시스템의 모든 기능을 갖추게 될 것이다.

      지금까지 우리는 편집명령을 작성하기 위한 리스프를 갖춘 Emacs 문서 편집기, 소스수준의 디버거, yacc 호환 파서(parse) 생성기, 링커 등 35개 가량의 유틸리티를 만들어 왔으며, 쉘(명령어 번역기)은 거의 완벽한 수준에 이르렀다. 최적화된 포터블 C 컴파일러가 새로이 제작되었으며 이번 해에 배포될 것이다. 이미 처음의 커널이 있기는 하지만 유닉스를 구현 하기 위해서는 보다 많은 사양들이 추가되어야 할 것이다. 커널과 컴파일러가 완성되면 프로그램 개발에 적합한 GNU 시스템을 배포할 수 있을 것이다.

      GNU는 유닉스 프로그램들을 사용할 수 있게 해주지만 유닉스와 동일한 것은 아니다. 우리는 다른 운영체제에서의 경험을 살려 가능한 사용하기 편리하도록 향상을 꾀했다. 특히, 긴 파일명을 쓸수 있게 하고, 파일 버젼넘버를 달고, 견고한 파일시스템을 구축하고, 터미널 비의존적인 디스플레이 장치를 만들 계획이며 최종적으로 몇개의 리스프 프로그램과 일반적인 유닉스 프로그램이 한 화면을 나누어 쓸 수 있는 리스프 기반의 윈도우 시스템을 만들 것이다. 시스템 프로그래밍 언어로 C와 리스프 두가지를 다 사용할 수 있을 것이다. UUCP, MIT Chaosnet, 인터넷 프로토콜을 지원할 것이다.

      GNU는 본래 가상 메모리를 가진 68000/16000 계열의 컴퓨터를 겨냥하고 제작되었다. 그 까닭은 그 기계들에서 GNU를 가장 쉽게 작동시킬 수 있기 때문이다. 보다 작은 컴퓨터에서 작동 시키기 위해서는 사용하고자 하는 사람이 특별한 노력을 기울여야 할 것이다.

      심각한 혼돈을 야기할 수 있기 때문에 'GNU'가 이 프로젝트를 지칭 할 때는 반드시 'G'를 발음해주기 바란다.

    2. 나는 누구인가?

      나는 리처드 스톨맨이란 사람이며 Emacs 에디터의 고안자이다. 나는 컴파일러, 에디터, 디버거, 명령어 해석기, 시분할체제와 리스프머신 운영체제에 관해 광범위한 작업을 해왔으며, ITS에서 터미널 비의존적인 출력장치를 개발했다. 그런 다음 리스프기계를 위한 견고한(crashproof) 파일 시스템 하나와 두개의 윈도우 시스템을 구현했고, 지금은 세번째 윈도우 시스템을 구상했으며, 이것은 GNU는 물론 다른 많은 시스템에 이식될 것이다.

    3. 왜 GNU를 작성해야만 했는가?

      어떤 프로그램을 좋아 한다면 당연히 그것을 좋아하는 사람들과 함께 나누는 것이 황금률(대우 받고자 하는 데로 대하라. - 성서)이라고 생각한다. 소프트웨어를 판매하는 사람들은 사용자를 각각 구분하고, 그들위에 군림하고, 사용자 서로가 프로그램을 공유하는 것을 거부한다. 나는 올바른 양심으로 비 공개 협정이나 소프트웨어 라이선스 협약에 서명할 수 없다. 여러해동안 인공지능 연구소에서 일하면서 그러한 경향과 다른 박정한 일들에 저항해 보았지만 결국에는 그들의 승리로 끝나고 말았다. 내의지에 역행하는 그런 일들이 일어나는 연구소에 나는 더이상 머무를 수가 없었다.

      내가 계속해서 명예를 손상시키지 않고 컴퓨터를 사용하기 위해, 공개되지 않은 소프트웨어를 더이상 사용하지 않고도 작업을 해나갈 수 있는 충분한 공개 소프트웨어의 본체를 만들 결심을 했다.

    4. 유닉스와 호환성을 가지는 이유

      유닉스가 이상적인 체제라고 생각하지는 않지만 제법 쓸만하다고 할 수 있다. 유닉스체제의 골자는 훌륭한 것이며 나는 유닉스의 장점을 해치지 않고도 부족한 점을 메울 수 있을리라 생각했다. 그리고 유닉스와 호환을 가지면 다른 많은 사람들이 적응하기에도 편리할 것이다 생각햇다.

    5. GNU를 사용하는 방법

      GNU를 사용하는데 지역적인 제한을 받는 것은 아니다. 누구나 GNU를 수정하고 배포할 수 있지만 어떤이도 GNU가 보다 널리 배포되는 것을 제한할 수 없다. 즉, 변경한 내용을 독점할 수 없다는 것이다. 나는 모든 버젼의 GNU가 공개된채로 남아있기를 보장 받고 싶은 것이다.

    6. 많은 다른 프로그래머들의 동참을 바라는 이유

      나는 그동안, GNU에 흥미를 느끼고 돕고자 하는 많은 프로그래머들을 찾을 수 있었다. 많은 프로그래머들은 시스템 소프트웨어가 상용화된 것을 불쾌하게 생각한다. 이렇게 함으로 해서 보다 더 많은 돈을 벌 수는 있겠지만 일반적으로 이런 상황에서는 프로그래머들이 서로를 동지로 느끼기 보다는 투쟁해야할 대상으로 느끼게 된다. 프로그래머들 사이의 우정을 나타내는 가장 기본적인 행동은 프로그램을 나누는 것이다. 이제는 전형적인 핵심으로 여기는 마케팅 협정은 프로그래머들이 친구로서 다른 프로그래머를 대하는 것을 금하고 있다. 소프트웨어를 구입한 자는 우정과 준법중 하나를 선택해야만 한다. 물론 자연적으로 많은 이들이 우정을 보다 중요시한다. 그러나 법의 존재가치를 인정하는 사람들은 어떤 결정을 내리든 편한 마음을 가질 수 없다. 그들은 냉소적이 되어 프로그래밍은 단지 돈을 버는 수단이라고 생각하게 된다.

      그러나 독점적인 프로그램들 대신 GNU를 사용하게 되면, 우리는 모든이에게 온정을 가질 수 있으며, 법도 준수하게 된다. 게다가 GNU는 영감을 주는 예와 다른이가 우리와 나누는 일에 동참하도록 고무하는 깃발 노릇도 한다. 이는 우리가 상용프로그램을 쓸 때는 느낄 수 없는 조화로운 느낌을 갖게한다. 나와 대화한 프로그래머들중 거의 반 정도는 이것은 돈이 대신할 수 없는 중요한 행복이라는데 공감했다.

    7. 당신이 기여할 수 있는 방법

      나는 제조업자들에게는 기계와 돈을, 개인들에게는 프로그램과 노동을 지원해 줄 것을 요청한다. 컴퓨터를 기증해서 기대할 수 있는 중요한 점은 GNU가 머지않아 그 기계에서 작동 할 것이란 점이다. 기증된 컴퓨터는 완전해질 것이며, 따라서 시스템을 사용할 준비를 모두 갖추게 되어 파워와 효율을 과대 포장할 필요가 없을 것이다.

      나는 GNU를 위해 시간제로 일하기를 갈망하는 많은 프로그래머들을 찾을 수 있었다. 대부분의 프로젝트에서 그러한 시간제로 배치된 작업을 통합하고 조정하는 일은 매우 어려웠다. 독립적으로 쓰여진 부분들은 함께 동작하지 않았다 그러나 특정한 작업인 유닉스를 대치하는 과정에서는 그러한 문제가 생기지 않았다. 완전한 유닉스 시스템은 개별적인 설명이 포함된 백여개의 유틸리티를 포함한다.

      대부분의 인터페이스 사양은 유닉스에 호환되도록 맞추어 진다. 만약 각각의 프로그래머가 유닉스 유틸리티 한개를 유닉스에 호환하도록 재구현하고 본래의 유닉스 시스템에서 충분히 작동하게 할 수 있으면, 이것들은 함께 묶어 놓아도 올바르게 작동할 것이다. 만일 누군가가 예기치 못했던 문제를 야기시키다 해도, 전체적인 구성요소들을 통합하는 작업은 충분히 가능할 것이다. (커널을 만드는 작업은 세밀한 대화가 필요할 것이며, 소수의 호흡이 잘 맞는 집단이 적당할 것이다.)

      만일 내가 금전적인 지원을 얻은다면, 약간의 인원을 전시간 또는 시간제로 고용할 수 있을 것이다. 일반적인 프로그래머 수준의 봉급을 줄 수는 없겠지만, 돈이 가지는 것 만큼 공동체 의식을 정립하는 일도 중요한 의미를 가진다고 생각하는 사람들을 찾아 볼 것이다.

    8. 모든 컴퓨터 사용자가 이득을 얻게되는 이유

      일단 GNU가 작성되니까, 마치 공기처럼, 모든 사람들이 훌륭한 시스템 소프트웨어를 무료로 얻을 수 있게 되었다. 이것은 단지 모든 이에게 유닉스 저작권에 대한 비용을 덜어 주는 것보다 훨씬 더 많은 의미를 가진다. 이는 시스템 프로그래밍에 드는 노력이 불필요하게 중복되는 것을 피할 수 있음을 의미한다. 대신, 절약된 노력은 기술 수준을 향상시키는데 사용될 것이다.

      완벽한 시스템 소스가 모든 사람들에게 제공될 것이다. 결과적으로, 시스템에 변화를 주고자 한다면 언제든지 스스로 자유롭게 수정할 수 있을 것이다. 혹은 적당한 프로그래머나 업체에 의뢰할 수도 있을 것이다. 사용자들은 더이상 프로그램 소스를 가진 프로그래머나 회사에 의존하지 않아도 될 것이며 독자적으로 수정을 가할 수 있을 것이다.

      학교는 모든 학생들이 시스템 코드를 배우고 향상시키도록 장려함으로써 보다 나은 교육 환경을 조성할 수 있을 것이다. 하버드 컴퓨터 연구소에서는 어떤 프로그램이든지 그 소스가 공개 전시 되지 않으면 시스템에 설치하지 못하게 하는 정책을 쓰곤 했다. 실제로 어떤 프로그램들을 설치하지 못하게 함으로써 이 정책을 고수 했다. 나는 이것에서 커다란 영감을 받게 되었다. 결국에는, 누가 시스템을 소프트웨어를 소유하고 있으며 누구에게 사용할 수 있는 자격을 부여할 것인지 아닌지를 고려하는 제 비용은 상승하게 될 것이다.

      복사 라이센스를 포함하여 프로그램 사용에 대한 지불을 준비 할때는 언제나 개인이 지불해야할 돈이 얼마인가를 알아내야 하는 필요성을 통하여 사회에 많은 비용을 야기시킨다. 그리고 오직 경찰 당국 만이 모든 사람이 그것을 따르게 하도록 힘을 행사할 수 있다. 막대한 비용을 들여 공기를 생산하는 우주정거장을 생각해보자. 이런 경우 각각의 개인은 자신이 호흡하는 공기에 대해 리터단위로 요금을 지불 하는 것이 합당할 것이다. 그렇다고 해도 호흡하는 공기의 양을 계측하기위해 메터기가 달린 방독면을 밤낮으로 쓰고 있어야 한다면 그런 방식은 타당한 것이 아니다. 그리고 TV 카메라는 당신이 마스크를 벗는 불법을 행하는지 어디서나 지켜 보아야 할 것이며 따라서, 이것 보다는 사람수에 따라 일정한 세금을 부과하고 마스크를 벗어던지는 것이 현명하다.

      프로그램의 일부 혹은 전체를 복사하는 행위는 프로그래머에게 있어서는 숨을 쉬는 것만큼이나 자연스러운 일이며 생산적이다. 따라서, 프로그램은 마땅히 공개되어야 한다.

    9. 몇가지 GNU의 목표에 대한 반대 의견

      "무료라면 아무도 그것을 쓰지 않을 것이다. 왜냐하면 무료라는 것은 어떠한 지원도 기대할 수 없다는 것을 의미하기 때문이다."
      "당신은 그 프로그램에 대한 지원과 도움을 제공하는 댓가로 이에 관한 비용을 부과해야만 한다."

      만약 사람들이 돈을 지불하고서 GNU에 대한 서비스를 받기를 희망한다면, GNU를 무료로 얻은 사람들에 그런 서비스를 제공하는 회사도 이익을 얻을 수 있을 것이다.

      우리는 반드시 실제 프로그래밍 작업과 단순 관리 작업은 구별해야 한다. 전자는 때때로 소프트웨어 판매 회사에게 의존할 수가 없다. 만일 당신의 문제가 충분한 사람에 의해 나누어지지 않는다면, 회사는 잊어비리라고 말할 것이다.

      만일 당신의 사업이 지원에 대한 의존이 필요하다면, 가능한 필요한 모든 소스와 도구를 갖추어야 할 것이다. 그러면, 당신은 당신의 문제를 해결해 줄 수 있는 사람을 고용할 수 있으며, 이것은 다른 어떤 사람의 자비를 받는 것은 아니다. 유닉스상에서, 소스의 가격은 대부분 고려되지 않으며, GNU는 더 쉬울 것이다. 이것은 여전히 유능한 사람이 필요없을 수는 있으나, 이 문제는 배포에 따른 비난을 할 수 없다. GNU는 모든 세계의 문제를 제거하는 것은 아니며, 단지 그중 하나이다.

      한편, 컴퓨터에 대해 전혀 모르는 사용자들은 여전히 단순한 관리 서비스를 필요로 한다. 이러한 일은 사용자 스스로 능히 처리할 수 있는 종류의 일이지만 그러한 방법을 모르기 때문이다.

      이런 서비스들은 단순한 수작업이나 복구 서비스를 지원하는 회사들이 제공할 수 있다. 사용자들이 제품을 사고 그에 대한 서비스를 받는 방식을 받아들인다면, 제품을 무료로 받고 서비스에 대한 비용을 지불하는 방식에도 기꺼이 동의할 것이다. 서비스를 제공하는 회사들은 가격과 질적인 면에서 모두 완벽을 기할 수 있을 것이며 사용자들은 어떤 특정한 업체에 얽메일 필요는 없을 것이다. 또한, 그러한 서비스가 필요하지 않은 사람들은 서비스에 대한 비용을 들이지 않고도 프로그램들을 쓸 수 있을 것이다.

      "광고를 하지 않고는 많은 사람들에게 알릴 수 없을 것이며, 그러기 위해서는 필히 프로그램에 가격을 매겨야 한다. " "무료로 제공되는 프로그램을 광고하는 것은 무의미하다."

      GNU 같은 프로그램을 많은 컴퓨터 사용자들에게 알릴 수 있는 방법에는, 무료, 혹은 극히 적은 비용으로 사용할 수 있는 다양한 공공 정보 전파 방식이 있다. 그러나 광고를 하는 것이 보다 많은 마이크로 컴퓨터 사용자에게 알릴 수 있는 방법일지도 모른다. 만일 실제로 이런것이 사실이라면, 복사와 배포를 하는데 돈을 받음으로써 능히 광고와 그외의 부수적인 비용을 감당할 수 있을 것이다. 이런 방식에서는, 광고를 보고 배포본을 구입해서 이익을 얻을 수 있는 사용자가 광고 비용을 부담하게 되는 것이다.

      반면, 많은 사람들이 GNU를 그 친구들을 통해서 구한다면, 이런 종류의 회사들은 성공할 수 없을 것이다. 이는 GNU를 보급하는데 광고가 필요한 것은 아님을 보여준다. 그렇다고 한다면 무료로 보급되고 있다는 사실이 무료로 알려지는 것을 바라지 않을 만한 이유가 있겠는가?

      "나의 회사는 경쟁사들에 대한 우위를 차지하기 위해 독점적인(고유의) 운영체제가 필요하다."

      GNU는 시스템 소프트웨어 경쟁이라는 범주에서 제외될 것이다. 당신의 회사가 우위를 차지할 수 없는 것처럼, 당신의 경쟁사들도 그점에 있어서는 마친가지일 것이다. 당신과 당신의 경쟁사들 모두 이 분야에서는 별반 이득을 볼 수 없겠지만, 다른 분야에서 서로 경쟁하는 것은 가능할 것이다. 당신의 사업이 운영체제를 판매하는 것이라면, GNU가 마땅치 않게 생각 될 것이다. 당신의 사업이 이런 종류가 아니라면, GNU는 시스템 소프트웨어에 관련된 막대한 비용을 절감해 줄 것이다.

      나는 제작자와 사용자들이 GNU의 발전에 기여해 나감으로써 서로의 비용을 절감할 수 있기를 희망한다.

      "프로그래머는 그의 참의력에 대한 보상을 받을 자격이 있지 않은가?"

      보상받을 만한 일이란 사회적 공헌을 말한다. 창의성이란 그 결과물을 사회가 댓가 없이 사용할 수 있을때 사회적 공헌이 되는 것이다. 어떤 혁신적인 프로그램을 제작한 사람이 그에 대해 보상을 받아야만 한다면, 같은 맥락에서 그것을 자유롭게 사용하지 못하게 한다면 그때는 제재를 받아야 할 것이다.

      "프로그래머는 그의 창의력에 대한 보상을 요구할 수 없는가?"

      유해한 수단을 사용하지 않는다면, 노동에 대한 보수와 자신의 소득이 극대화 되기를 바라는 것은 아무 문제가 없다. 그러나 지금까지 소프트웨어 산업에서 보편화된 수단은 유해한 방법이다.

      프르그램을 사용하는 것에 제한을 둠으로써 돈을 벌어들이는 행위는 프로그램이 사용되는 범위와 방식을 제한하기 때문에 유해한 것이다. 이는 인간들이 프로그램으로부터 얻을 수 있는 전체적인 풍요로움을 감소시키는 것이다.

      선량한 시민이라면 자신이 보다 부유해지기위해 그런 수단을 쓰지 않는다. 그 까닭은, 만일 모든 사람들이 그렇게 한다면 상호간의 유해한 행위로 인해 결과적으로 우리 모두는 보다 빈곤해질 것이기 때문이다. 이것은 칸트의 윤리학이나 황금율같은 분명한 것이다. 나는 모든 사람들이 자기만의 정보를 축적해나가는 것은 바람직하다고 여기지 않기 때문에, 누군가 그런 일을 한다면 나는 그것이 잘못된 일이라고 생각할 필요를 느끼게 되었다. 특히, 한 개인의 창의성을 보장 받고자하는 욕구가 일반적으로 전체의 창의성이나 혹은 그 일부분을 저하시키는 행위를 정당화 시키지는 않는다.

      "프로그래머들의 밥줄이 끊기지 않을까?"

      나는 모든 사람이 프로그래머가 될 필요는 없다고 답하고 싶다. 아마 우리들 대부분은 거리에 나가 인상을 써서 간신히 약간의 돈을 벌어 살아갈 수는 없을 것이다. 그러나 결과적으로, 우리는 거리에 나가 인상 써서 돈을 번다고 비난 받을 필요도 없고, 또한 빈궁해질 필요도 없을 것이다. 우리는 그와는 다른일을 할 수 있을 것이다.

      그러나 이것은 프로그래머는 소프트웨어를 소유하지 않으면 단 한푼도 벌 수 없다 라는 질문하는 사람의 독단적인 가정을 받아 들였다는 점에서 오답이라 할 수 있다. 아마도, 이런 생각은 극단적일 것이다.

      프로그래머가 생계에 지장을 받지 않을 것에 대한 진정한 이유는, 지금과 같은 정도는 아니겠지만 여전히 프로그래밍으로 돈을 벌 방법들이 있기 때문이다.

      프로그램 복사를 제한하는 것이 소프트웨어 사업의 유일한 기본 방침은 아니다. 이런 방침이 보편화된 것은 이렇게 함으로써 가장 돈을 많이 벌 수 있기 때문이다. 고객들에 의해 이런 방식이 거부되거나 금지된다고 해도, 소프트웨어 사업은 지금까지 흔하지 않았던 새로운 조직체계로 전환해 나갈 길을 모색할 수 있을 것이다. 여러가지 사업을 한데 묶어 조직화하는 방법은 무궁 무진할 것이다.

      아마 새로운 기반하에서의 프로그래밍은 지금처럼 수익성이 높은 일은 아닐 것이다. 하지만 이것이 변화의 쟁점은 아니다. 지금의 판매 사원들이 그들의 봉급을 버는 방식이 불합리한 것이라고 생각하지는 않는다. 프로그래머들이 그와같은 방법으로 소득을 올린다해도 하등 정당하지 못할 이유가 없다. (실제적으로 프로그래머들은 여전히 그들보다 월등히 많은 소득을 올리고 있다.)

      "누구든 그들의 창의력이 사용되는 방법을 지배할 수 있지 않은가?"

      "인간 생각의 쓰임새를 지배하는 것"은 실제적으로는 그의 인생을 지배하는 것이다. 이는 자신의 인생을 보다 어렵게 만들곤 한다.

      지적 소유권에 관해 상세하게 공부한 사람들(변호사 등)은 그 자체로서 완벽한 지적 소유물을 없다고 말한다. 정보가 인정하는 추상적인 지적소유권들은 특정 목적을 위한 특정 법률 조항으로부터 발생한 것이다.

      예를 들어, 특허제도는 발명가가 그의 고안품의 세부사항을 공개하는 것을 장려하고자 설립된 것이다. 시간의 측면에서 보면, 특허가 갖는 17년간의 유효기간은 기술이 발전하는 비율과 비교해 볼대 짧다. 특허권은 생산업자들 사이의 문제이고, 생산을 향상시키는 것과 비교해서 특허권 계약에 드는 비용과 노력은 작다고 보기 때문에, 특허권은 일반적으로 그다지 해악하게 작용하지는 않는다. 또한, 그것은 대부분의 특허 받은 제품을 사용하는 것을 제한하지는 않는다.

      고대에는 저작권이라는 것이 존재하지 않았으며 그 시대에 작가들은 빈번하게 다른 이의 작품 상당량을 실제의 (허구가 아닌) 작품에 복제하기도 햇다. 이런 작업들은 유용한 것이었으며, 비록 그 일부분이기는 하지만 많은 사람들의 작품이 계속해서 전수되는(존재해 나가는) 유일한 방법이었다. 저작권 제도는 작가 의식을 고취 시키고자 급집적으로 만들어진 것이다. 이것이 처음 만들어 질 때 주로 염두에 두었던 책의 범주에서 보면 책은 실용적인 측면에서 인쇄기를 사용해서만이 복사가 가능 하기 때문에 저작권은 그다지 해롭지는 않았다. 또한, 대다수의 사람들이 책을 읽는 것을 제한하지도 않았다.

      모든 지적 소유권은, 그것들이 어떻던지 그를 허용함으로써 사회전체에 이득이 된다고 여겨져서, 사회가 허용할 때만 정당하게 되는 것이다. 그러나 어떤 특정 상황에서든 우리는 "그런 인가를 내주는 것이 정말로 우리에게 유익한가?" 어떤 종류의 인가를 내줄 것인가?" 하는 질문을 해보아야만 한다.

      오늘날의 프로그램들의 경우는 백여년전의 책의 경우와 크게 다르다. 프로그램이 이웃간에 손쉽게 복사될 수 있다는 사실, 소스 코드와 목적코드로 구분된다는 점, 읽기 위한 것이 아니라 즐기기 위한 것이라는 사실들이 묶여져서, 저작권을 강요하는 사람들이 전체사회에 정신적, 물질적으로 해를 끼치는 상황을 만들고 있다.

      "경쟁 함으로써 보다 나은 결과를 얻을 수 있는가?"

      모범적인 경쟁방식은 경주(race)이며, 승자에게 상을 줌으로써 주자들이 더욱 빨리 달리도록 장려할 수 있는 것이다. 만약 자본주의가 실제로 이런 방식을 따른다면 이는 바람직한 것이다 그러나 자본주의 옹호론자들은 실제로 항상 이런 방식으로 움직인다고 단정짖는 잘못을 범한다. 만일, 주자들이 상이 주어지는 이유를 망각한채 승리에만 집착한다면, 말할것도 없이 그들은 다른 주자를 공격한다든지하는 색다른 전략을 찾게 될 것이다. 주자들이 먼저 싸우기 부터 한다면, 그들은 결국 모두 늦어질 수 밖에 없는 것이다.

      독점적이고 비밀에 싸인 소프트웨어는, 도덕적으로 먼저 싸우기 부터하는 주자들과 동일하다. 슬픈 일이지만, 우리의 유일한 심판은 그다지 공평해 보이지 않으며, "매 10 야드마다 한번씩 상대방을 가격할 수 있다" 는 규정을 적용하는 정도일 것이다. 그러한 싸움이 있을 때는, 그들을 떼어놓고 벌칙을 주어야하는데도 말이다.

      "금전적인 장려가 없다면 아무도 프로그래밍을 하지 않을 것이다."

      실제적으로, 많은 사람들이 분명한 금전적인 장려가 없이도 프로그래밍을 할 것이다. 프로그래밍은 어떤 사람들에게는 저항할 수 없는 매력인 것이며 보통 프로그래밍에 능숙한 사람에게 더욱 그렇다. 비록 생활의 기반이 될 가망이 없더라도 꾸준히 계속해가는 직업적인 음악인들이 많이 있다.

      그러나 실제로 질문은, 비록 일반적으로 많이 제기 되지만, 상황에 적합하지 못하다. 프로그래머들의 소득원이 없어지는 것이 아니라 단지 수입이 줄어드는 것일 뿐이다. 따라서 올바른 질문은 "금전적인 보상이 줄어 들더라도 사람들이 프로그래밍을 하게 될까?" 일 것이다. 내 경험에 의하면 그렇게 할 것이다.

      십년 이상 동안, 세계 정상급 프로그래머들이 인공지능 연구소에서 일햇었지만, 그들이 받은 보수는 다른 어떤 곳에서 기대할 수 있는 것보다 훨씬 적은 것이었다. 그들은 명성이나 감사 같은 다양한 종류의 비 금전적인 보상을 받았다. 그리고 창의력은 그 자체 안에 보상이라는 개념을 가지고 있다는 점에서 흥미로운 것이다.

      그 후, 그들 대부분은 이전의 작업처럼 그들이 흥미롭게 생각하는 일을 높은 보수를 받으며 할 수 있는 기회가 주어지자 연구소를 떠났다.

      이 사실에서 알 수 있는 것은 사람들은 부유해기기 보다는 어떤 까닭을 위해서 프로그래밍을 한다는 것이며 그런 조건위에 상단한 보수까지 받을 기회가 주어진다면, 그를 예상하고 요구하게 되는 것이다. 보수가 낮은 조직은 높은 보수를 받는 조직과의 경쟁에서 뒤지겠지만, 만일 높은 보수를 받는 조직과는 상호이동이 없는 완전히 개별적인 집단이라면 그들 나름대로 훌륭하게 활동할 것이다.

      "우리는 프로그래머가 절대적으로 필요하다. 만일 그들이 우리의 이웃을 돕지말라 하면 우리는 따를 수 밖에 없다."

      당신들은 결코 그런 종류의 요구에 복종해야할 만큼 절박하지 않다. 명심하라. 열 장정이 도둑 하나를 막지 못하는 법이다.

      프로그래머들도 어떤식으로든 그들의 생계를 꾸려 나가야 하지 않은가?"

      요컨데 이것은 진실이다. 그러나 프로그램의 사용에 대한 권리를 파는 것이외에도 생계를 꾸릴 수 있는 수많은 방법들이 있다. 현재 사용에 대한 권리를 파는 것이 보편적으로 받아 들여지는 것은 그런 방식으로 프로그래머나 사업자들이 보다 많은 돈을 벌 수 있기 때문이지, 결코 이것이 생계를 유지하는 유일한 방법이기 때문은 아니다. 다른 방법을 찾고자 한다면, 얼마든지 가능할 것이다. 여기 여러가지 예들이 있다.

      새로운 컴퓨터를 내놓는 제조업자는 새 기계에 운영체제를 이식하기 위한 비용을 지불하게 된다. 교육, 단순관리 작업, 지속적인 서비스들을 제공하는 회사에서도 역시 프로그래머는 필요할 것이다.

      사용자의 마음에 흡족하다면 그에 대한 보수를 지불해달라고 요구하는, 프리웨어라는 새로운 아이디어로 프로그램들을 배포하는 사람들도 있다. 혹은 단순 관리 서비스를 제공하고 보수를 받는 사람들도 있다. 나는 이미 이런 방식으로 성공한 사람들을 만났다.

      도움이 필요한 사용자들은 사용자 그룹을 결성하고 회비를 조성할 수 있을 것이다. 그룹은 프로그래밍 회사와 계약을 맺고 회원들이 원하는 프로그램을 주문 제작할 수 있을 것이다.

      모든 종류의 발전에 필요한 기금은 소프트웨어 세로 조성할 수 있을 것이다. 만약, 컴퓨터를 구입하는 모든 사람들이 가격의 x 퍼센트를 소프트웨어 세금으로 지불한다면, 정부는 그 돈을 소프트웨어 발전에 쓰여 지도록 NSF 같은 단체에 지원할 수 있을 것이다.

      그러나 컴퓨터 구입자가 개별적으로 소프트웨어 발전에 공헌을 한바가 있다면, 그는 세금을 면제 받게 될 것이다. 그는 스스로 어느 프로젝트에 기부할 것이지를 결정할 수 있을 것이며, 때론 그 결과를 쓸 수 있을 것이란 기대를 품고 결정을 내리게 될 것이다. 얼마를 기부하든지 지불해야 할 세금 전액을 대신할 수 있을 것이다. 세금의 전체적인 세율은 납세자들이 투표를 해서 결정할 수 있을 것이며, 지불할 액수에 따라 차등 조정될 것이다.

      결론:

      • 컴퓨터 사용자 공동체는 소프트웨어 발전을 지원한다.
      • 어는 수준의 지원을 할 것인가는 이 공동체가 결정한다.
      • 자신의 몫이 어떤 프로젝트에 쓰일 것인가에 관심있는 사용자들은 이를 스스로 결정할 수 있을 것이다.


      결국에는, 프로그램을 무료로 보급하는 것은 더이상 단지 생계를 위해 고되게 일할 필요가 없는 풍요로운 세계로 가는 한 단계인 것이다. 사름들은 프로그래밍 같은 자신이 흥미를 가질 수 있는 일에 몰입할 수 있는 자유를 갖게될 것이다. 법률이 규정하는 주당 열 시간 정도의 시간을 마친 후엔, 가족들과 담소한다든지, 로보트를 수리 한다든지, 천체를 관측하는 일 따위를 하게 될 것이다. 더이상 프로그램을 생계의 수단으로 삼을 필요가 없게 될 것이다.

      우리는 이미, 실제적인 생산성을 향상 시키기 위해 전체 사회가 부담애햐할 작업의 분량을 많이 감소 시켰다. 이중 매우 적은 부분은 단지 프로그래머들의 유희를 위해서 작성되었다. 그 까닭은 비 생산적인 활동은 생산적인 활동을 하기우해 필요한 것이기 때문이다. 이런 일을 하게된 주된 이유는 경쟁을 대신할 수 있는 관료 정책이며 그와 동일한 부피를 갖는 몸부림인 것이다. 프리 소프트웨어는 소프트웨어 생산 분야에서 생산력이 낭비되는 것을 크게 감소 시킬 수 있을 것이다. 우리는 이러한 작업을 해나가야 하며, 생산성을 위한 기술 습득은 적은 노력으로 가능할 것이다.

      Copyright (C) 1985 Richard M. Stallman

      이 문서의 저작권과 배포 허용에 관한 주의사항을 전제하기만 한다면, 누구나 이 문서를 요약해서 배포하거나 부분적으로 인용할 수 있으며, 이 글과 같은 방법으로 자신의 문서가 재 배포되는 것을 허용할 수 있을 것이다.
  3. 이제 리눅스의 세계로 들어가기 위한 첫번째 단계인 설치를 해 봅시다.
    (아래 설치는 레드헷 6.0 기준이며, 국내에서 인기있는 Alzza, Mandrake, 파워, K-Linux 등은 모두 레드헷을 기반으로 하기 때문에 비슷한 설치과정을 거치게 된다...)
    레드헷은 리눅스중에서도 설치하기 가장 쉬운 리눅스중 하나이다. 하지만 쉽다는 것이 손가락 까딱 까딱 몇번으로 다 설치되는 그런 것은 아니다. 이것은 옛날 리눅스에 비해서 쉽다는 것이지 윈95/98 보다 쉽다는 것은 아니다.(사실 예전에 slackware 1.2 를 설치해본 저로서는 지금의 설치환경은 정말 손가락 몇번 까딱 까딱 정도이다..^_^) 따라서 많은 인내를 가지고 설치해야 한다..그렇다고 너무 겁부터 먹을 필요는 없다... 대부분의 리눅스 유저는 설치/업그레이드 등을 하면서 수십번의 설치를 한다..그렇게 수십번의 설치를 하면서 설치과정의 이모저모를 자연히 알게 되는것이다..
    설치는 플로피를 통한 설치, CD-ROM을 통한 설치, 네트웍을 통한 설치가 있는데.. 대부분의 사용자가 플로피 또는 CD-ROM으로 설치를 하므로 이에 대해서 먼저 설명하고, 나중에 네트웍을 통한 설치에 대해 설명하기로 한다.

    우선 플로피를 통한 설치는 간단하지만 시간이 좀 걸리고 3.5" 디스켓이 필요하다. 또한 방법에 따라서 추가 디스켓을 요구하는 경우도 있다. CD-ROM을 통한 설치는 도스로 부팅하면서 CD-ROM을 인식시킨뒤 레드헷 CD에서 곧바로 부팅하는 방법으로 추가 디스켓은 필요가 없고 CD에서 읽으므로 매우 부팅속도가 빠르다. 이미 자신의 PC에 윈95/98이나 도스가 설치되어 있고 CD-ROM이 정상적으로 인식이 되는 상황에서 리눅스를 설치하고자 할 경우 CD-ROM을 통한 설치가 가장 효율적이다.
    (플로피를 통한 설치는 CD-ROM이 인식되지 않는 경우에 사용하고, 대부분의 경우는 CD-ROM을 통한 설치를 한다.
    경우별로 간략히 정리하자면, 하드가 하나이고 윈95/98을 사용하고 있는 경우 남는 영역에 설치할 경우 자료를 백업한 후 도스로 부팅하여 CD-ROM을 인식시킨후 fdisk로 파티션을 세개를 만든다. win영역/리눅스루트영역/리눅스 스왑 영역 이렇게 만든후 win영역에 win95/98을 설치한다. 그다음에 아래의 과정을 거쳐 리눅스를 설치한다.
    하나의 하드에 윈95/98을 사용중이고 새로운 하드를 추가하여 여기에 리눅스를 설치할 경우는 좀더 쉬운데 이 경우는 새로운 하드에 파티션을 설정하고 CD-ROM을 통한 설치를 수행하면 된다.)



    1. 어떤 경우의 설치이든 설치과정에 필요한 몇가지 자신의 컴 환경에 대한 정보가 필요하다. (네트웍 설정을 제외한 나머지 부분은 대부분 자동 검출을 하지만 혹시 그렇지 않을 경우를 위해 아래의 정보를 알아둔다.)
      • CPU는 어느회사의 제품이고 클럭수는?
      • 메인보드의 제조업체명과 모델명은?
      • RAM 용량은?
      • 하드 드라이브는 몇개이고 각각 용량은?
      • 하드의 타입은?
      • Primary 하드 드라이브는 어떤 하드 드라이브인가?
      • 비디오카드의 제조업체명과 칩셋은 어떤것인가?
      • 모니터의 제조업체명과 모델명은?
      • 모니터의 수평, 수직 rate는?
      • 네트웍 설정사항은? (네트웍 환경이 아닌 경우는 필요 없다.)
        - 네트웍 카드의 제조업체명과 모델명
        - 컴퓨터에 할당된 IP 주소
        - 넷 마스크
        - 게이트웨이 주소
        - 도메인 네임서버 주소
        - 속해있는 도메인 네임
        - 호스트 이름

      위의 정보를 알았으면 아래를 기억하면서 설치에 들어가자.
      • 리눅스를 설치할 공간을 확보하고 설치과정을 노트한다.
      • 리눅스를 단번에 설치하고 사용한다는 생각을 버린다.
      • 설치가 안되더라도 행하는 모든 과정을 노트해 둔다.


       




     
  4. 이제 설치를 다 하셨으니 본격적으로 리눅스의 세계로 ....

    설치를 완료한후 시스템을 재부팅하면 만약 Lilo를 설치하였다면..(대부분이 그렇겠죠??) 아래와 같은 화면이 나옵니다..

    LILO boot:

    여기서 리눅스로 부팅하려면 그냥 가만히 두면 자동으로 리눅스로 부팅이 됩니다..(lilo 설치시 default booting이 리눅스로 됩니다.) 만약 default booting을 win(dos)로 바꾸려면 root로 로긴후..
    [root@bluestar /root]#lilo -D win
    하시면 됩니다...(lilo 설치시 Windows의 label을 win으로 한 경우에요..만약 label을 dos로 하셨다면...#lilo -D dos)


    만약, lilo설치할때 각각의 OS에 대한 label을 보려고 할때는 위의 [LILO boot] 상태에서 [TAB]키를 누르면 label이 나옵니다..

    이제 압축된 커널이 풀리면서..부팅이 됩니다...
    Loading Linux ......
    Uncompressing......
    Linux version 2.2.9-19mdk (root@data.mandrakesoft.com) (gcc version pgcc-2.91.66 19990314 (egcs-1.1.2 release)) #1 Wed May 19 19:53:00 GMT 1999
    Detected 149691006 Hz processor.
    Console: colour VGA+ 80x25
    Calibrating delay loop... 149.09 BogoMIPS
    Memory: 63236k/65536k available (956k kernel code, 408k reserved, 888k data, 48k init)
    VFS: Diskquotas version dquot_6.4.0 initialized
    CPU: Intel Pentium Pro stepping 02
    Checking 386/387 coupling... OK, FPU using exception 16 error reporting.
    Checking 'hlt' instruction... OK.
    POSIX conformance testing by UNIFIX
    mtrr: v1.34 (19990310) Richard Gooch (rgooch@atnf.csiro.au)
    PCI: PCI BIOS revision 2.10 entry at 0xfb2b0
    PCI: Using configuration type 1
    PCI: Probing PCI hardware
    PCI: 00:00 [8086/1237]: Passive release enable (00)
    Linux NET4.0 for Linux 2.2
    Based upon Swansea University Computer Society NET3.039
    NET4: Unix domain sockets 1.0 for Linux NET4.0.
    NET4: Linux TCP/IP 1.0 for NET4.0
    IP Protocols: ICMP, UDP, TCP, IGMP
    Initializing RT netlink socket
    Starting kswapd v 1.5
    Detected PS/2 Mouse Port
    . Serial driver version 4.27 with MANY_PORTS MULTIPORT SHARE_IRQ enabled
    ttyS00 at 0x03f8 (irq = 4) is a 16550A
    ttyS01 at 0x02f8 (irq = 3) is a 16550A
    pty: 256 Unix98 ptys configured
    apm: BIOS version 1.2 Flags 0x07 (Driver version 1.9) PCSP 1.3 measurement: maximal samplerate 79545 Hz, 18356 Hz used
    RAM disk driver initialized: 16 RAM disks of 4096K size
    Uniform Multi-Platform E-IDE driver Revision: 6.19
    .... 중략

    ALzzA Linux release 6.0-kr
    Kernel 2.2.10 on an i686

    login:

    위와 같이 로긴화면이 뜬다..시스템에 처음으로 로긴하는거니깐 다른 유저는 만들어져 있지 않으므로 root로 login 합니다.. (패스워드는 설치시에 설정한 root 패스워드를 입력합니다..)

    login:root
    password:xxxxxxxx

    [root@darkstar /root]#

    프롬프트가 떴습니다...이제 리눅스를 본격적으로 사용하실 준비가 되신겁니다...

    만약, 설치시에(아마도 대부분 그렇겠지만..) 부팅을 위와같은 console로 하지 않고 X window로 설정한 경우 아래와 같은 X window base의 로긴화면이 뜨게 됩니다..여기서도 X window based 로긴화면입니다..
    위와 같은 X window based 로긴화면이 뜨면 마찬가지로 처음 로긴이므로 root로 로긴을 한다.
    로긴을 하면 아래와 같은 X window가 뜨게된다. X window 화면은 리눅스 버젼의 종류와 Window manager의 종류에 따라 다소 차이가 있을 수 있다.
    X window 화면

    위의 X window 화면을 보면 아래와 같은 hanterm이라는 터미널이 있는데..이는 xterm에서 한글을 쓸 수 있게 패치한 터미널입니다... 대부분의 작업은 이 터미널 상에서 이루어 집니다..

    한글 터미널 한텀(hanterm)
    이제 본격적으로 시작해보자..




    1. 시스템에 제일 처음 로긴을 하면.. 아래와 같은 루트 쉘이 뜨게 되는데..루트는 그야말로 절대 권한의 사용자이기 때문에... 어느정도 시스템에 대해 알지 못한 상태에서 작업을 하다보면..여러가지 문제가 발생할 수도 있으므로 처음에는 루트가 아닌 새로운 사용자를 만든후 그 사용자로 로긴하도록하자..
      (일반계정으로 사용하다가 root로 작업할 필요가 있을때마다..$su 명령으로 루트가 될 수 있다.)
      새로운 사용자를 만들려고 할 때는 adduser 명령을 사용한다.
      [root@darkstar /root]# adduser
      Adding a new user. The username should not exceed 8 character in length, or you may run into problems later.
      Enter login name for new account (^C to quit): bluesky   <- 계정이름 입력
      Editing information for new user [bluesky]
      Full Name: Park Jeong Keun
      GID[100]: [Enter]  <- 그룹 ID이다..그냥 Enter한다..
      Group 'users', GID 100
      First unused uid is 501
      UID[501]:[Enter]  <- 유저 ID이다..역시 그냥 Enter한다..
      Home Directory[/home/bluesky]:[Enter]  <- bluesky 유저에 대한 홈 디렉토리이다..
      Shell[/bin/bash]:[Enter]
      Password[bluesky]:xxxxxxxx
      Information for new user[bluesky]:
      Home directory:[/home/bluesky] Shell:[/bin/bash]
      uid:[501] gid:[100]
      Is this correct?[y/N]:y
      Adding login [bluesky] and making directory [/home/bluesky]

      Adding the files from the /etc/skel directory:
        ./.kermrc -> /home/bluesky/./.kermrc
        ./.less -> /home/bluesky/./.less
        ./.lessrc -> /home/bluesky/./.lessrc
        ...

      위에서 GID(group ID)는 사용자(bluesky)가 속해있는 그룹을 구분하기 위한 ID이고,
      UID(user ID)는 사용자마다 부여된 고유한 ID이며, 시스템은 사용자를 계정이름으로 사용자를 구분하는게 아니고 바로 이 UID로 사용자를 구분한다.


      이제 새로운 사용자를 생성하였으므로 새로운 사용자로 접속하여 작업을 하도록 한다.

      ALzzA Linux release 6.0-kr
      Kernel 2.2.10 on an i686

      login: bluesky
      password:xxxxxxxx
      [bluesky@bluestar bluesky]$

      자신의 패스워드를 바꾸려고 할 경우, 아래와 같이 passwd를 사용한다.
      [bluesky@bluestar bluesky]$passwd
      Changing password for bluesky
      (current) UNIX password:xxxxxxxx
      New UNIX password:xxxxxxxx
      Retype new UNIX password:xxxxxxxx

      [시스템 정보와 관련된 기본 명령어]
      1. who
      - 현재 컴퓨터에 로그인 되어있는 사용자와 터미널 그리고 시간을 모두 볼수 있도록 해준다.

      [bluesky@bluestar bluesky]$who
      root tty2 Apr 3 06:49
      bluesky :0 Apr 3 05:54
      bluesky ttyp1 Apr 3 05:55 (:0.0)
      bluesky ttyp2 Apr 4 12:14 (darkstar.linuxnet.ac.kr:0.0)

      더 자세한 정보를 보고자 할때는 w를 사용하면 된다
      [bluesky@bluestar bluesky]$w
      7:23pm up 2 days, 13:33, 4 users, load average: 0.00, 0.00, 0.00
      USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
      root tty2 - Mon 6am 2days 0.18s 0.09s -bash
      bluesky ttyp1 :0.0 Mon 5am 2days 0.32s 0.15s bash
      bluesky ttyp2 192.168.1.10:0.0 Tue12pm 0.00s 0.22s 0.06s w

      2. who am i
      - 현재 컴퓨터에 로그인 되어있는 자신만의 터미널 그리고 시간을 볼 수 있도록 해주는 명령이며, 그냥 자신을 계정 ID 만을 보고자 할 때는 $whoami를 사용한다.

      [bluesky@bluestar bluesky]$ whoami
      bluesky
      [bluesky@bluestar bluesky]$ who am i
      bluestar.linuxnet.ac.kr!bluesky ttyp2 Apr 4 12:14 (darkstar.linuxnet.ac.kr:0.0)
      [bluesky@bluestar bluesky]$

      3. finger
      - who와 기능은 같지만 다른점은 로그인 ID 이름과 사무실, 사무실 전화번호까지 나타내준다.

      [bluesky@bluestar bluesky]$finger
      Login Name Tty Idle Login Time Office Office Phone
      bluesky 박정근 *:0 Apr 3 05:54
      bluesky 박정근 *p1 2d Apr 3 05:55 (:0.0)
      bluesky 박정근 *p2 Apr 4 12:14 (192.168.1.10:0.0)
      root root *2 2d Apr 3 06:49

      [bluesky@bluestar bluesky]$ finger bluesky
      Login: bluesky Name: 박정근
      Directory: /home/bluesky Shell: /bin/bash
      On since Mon Apr 3 05:54 (KST) on :0 (messages off)
      On since Mon Apr 3 05:55 (KST) on ttyp1 from :0.0
      2 days 11 hours idle
      (messages off)
      On since Tue Apr 4 12:14 (KST) on ttyp2 from 192.168.1.10:0.0 (messages off)
      Last login Wed Apr 5 13:06 (KST) on ttyp3 from 192.168.1.10:0.0
      No mail.
      No Plan.
      [bluesky@bluestar bluesky]$

      4. id
      - 자신의 유저 ID와 그룹 ID를 출력 해준다.

      [bluesky@bluestar bluesky]$id
      uid=501(bluesky) gid=501(bluesky) groups=501(bluesky)

      5. date
      - 현재의 요일, 월, 일, 시간, 년도를 표시해준다.

      [bluesky@bluestar bluesky]$ date
      Wed Apr 5 20:29:29 KST 2000

      6. cal 월 년도
      - 지정해준 년도의 월에 해당하는 달력을 보여준다.

      [bluesky@bluestar bluesky]$ cal 1 2000
      January 2000
      Su Mo Tu We Th Fr Sa
                                      1
      2    3    4    5    6   7  8
      9   10   11 12 13 14 15
      16 17   18 19 20 21 22
      23 24   25 26 27 28 29
      30 31

      7. man
      - 지정된 명령어에 대한 도움말을 보여준다.

      LS(1) FSF LS(1)

      NAME
      ls - list directory contents

      SYNOPSIS
      ls [OPTION]... [FILE]...

      DESCRIPTION
      List information about the FILEs (the current directory by
      default). Sort entries alphabetically if none of -cftuSUX
      nor --sort.

      -a, --all
      do not hide entries starting with .

      -A, --almost-all
      do not list implied . and ..

      -b, --escape
      print octal escapes for nongraphic characters
      :

      지금까지 로긴과 시스템 정보를 보는 기본 명령까지 살펴 보았다. 이번에는 시스템을 끄는 명령에 대해 알아보자...

      [시스템 중지&재부팅 - halt/shutdown/reboot]
      유닉스/리눅스 시스템은 도스나 윈도우 처럼 단일 유저 시스템이 아니기 때문에 시스템을 끌때 그냥..아무렇게나 파워를 내리게 되면 현재 시스템에 연결되어 작업중이 많은 사람들의 작업 내용이 날아가는것 이외에 파일시스템에 손상을 입는등의 여러 문제가 발생하게 되므로 일정한 절차를 통해 시스템을 끄도록 해야한다.
      시스템을 혼자 사용하는 경우에는 그냥..shutdown이나 halt 등으로 바로 끄면 되지만..여러 사용자가 쓰고 있는 시스템인 경우 언제 시스템 가동을 중지할 것이라는 것을 wall 명령을 통해 broadcast로 연결된 모든 시스템 사용자에게 알려준후 시스템을 끄도록 해야한다.
      시스템을 끄는 기본적인 명령은 shutdownhalt이다.그리고 재부팅을 할 경우는 reboot이다.
      [bluesky@bluestar bluesky]$su
      Password:xxxxxxxx

      [root@bluestar bluesky]# wall
      금일 12:00 ~ 13:00까지 디스크 교체를 위해 시스템을 중지합니다..
      ^D
      [root@bluestar bluesky]#
      Broadcast message from root (ttyp2) Wed Apr 5 20:55:33 2000...

      금일 12:00 ~ 13:00까지 디스크 교체를 위해 시스템을 중지합니다..

      [root@bluestar bluesky]# halt
      [root@bluestar bluesky]#
      Broadcast message from root (ttyp2) Wed Apr 5 20:58:20 2000...

      The system is going down for system halt NOW !!

      shutdown을 사용할 경우
      [root@bluestar bluesky]# shutdown now

      또한 시스템을 끄고 다시 부팅하고자 할 경우는 reboot나 shutdown을 사용한다.
      [root@bluestar bluesky]# reboot
      or
      [root@bluestar bluesky]# shutdown -r now



    2. 해당 명령을 클릭하시면 빨리 보실 수 있습니다..
      ls
      사용법 : ls [옵션] [이름]

      디렉토리의 내용을 출력한다. 가장 기본적인 명령어에 속하는 것으로서 그만큼 옵션도 많아 디렉토리의 내용을 다양한 형식으로 출력 할 수 있다.

      옵션
      -1, --format=single-colum : 한줄에 한개의 파일만을 출력한다
      -a : 모든 파일을 출력한다. . 으로 시작하는 파일도 모두 출력한다
      -b, --escape : 화면으로 출력이 불가능한 문자도 나타낸다
      -c, --time-ctime, --time=status : 파일의 최근 변경 시간에 따라 보여준다
      -d, --directory : 경로 안의 내용을 나열하지 않고 그 경로를 보여준다. ( 이것은 쉘 스크립트에서 유용하게 쓰인다 )
      -f : 경로 내용을 정렬하지 않고 디스크에 저장된 순으로 보여준다.
      -a와 -U 옵션과 같은 뜻이며, -l,-s,-t 옵션과 반대 순서로 출력된다
      --full-time : 시간을 간략히 표시하지 않고, 모두 보여준다.
      -g : 무시, 유닉스 호환을 위해서 있슴.
      -i, --inode : 파일 왼쪽에 색인 번호를 보여준다.
      -k, --kilobytes : 파일 크기가 나열되면 kb 단위로 보여준다. 이 옵션은 POSIXLY_CORRECT 환경변수를 무신한다.
      -l, --format=long, --format=verbose : 파일 나열에 있어 파일 형태, 퍼미션, 하드 링크번호, 소유자 이름, 그룹이름, 파일크기, 시간 ( 따로 지정하지 않으면 파일이 만들어진 날짜)을 자세하게 나열한다. 시간은 여섯달 이전 것이면 시간이 생략되고, 파일의 연도가 포함된다.
      -m, --format=commas : 파일을 가로로 나열한다. 가로로 나열할 수 있는 만큼 최대한 나열한다.
      -n, --numeric-uid-gid : 이름의 나열에서 UID, GID 번호를 사용한다
      -p : 파일 현태를 지시하는 문자를 각 파일에 추가한다
      -q, --hide-control-chars : 파일 이름에 그래픽 문자가 아닌 것이 있으면 '?'로 표시한다
      -r, --reverse : 정렬 순서를 내림차순으로 한다
      -s, --size : 파일크기를 1KB단위로 나타낸다 POSIXLY_CORRECT 환경변수가 지정되면 512KB 단위로 지정된다.
      -t, --sort=time : 파일 시간순으로 정렬하다. 최근 파일이 제일 먼저.
      -u, --time=atime, --time=access, --time=use : 파일사용 시간순으로 정렬한다. 자세하게 나열할 때 시간표시는 만들어진 날짜대신 사용된 날짜를 보여준다.
      -x, --format=across, --format=horizontal : 정렬방식을 가로로 한다
      -A, --almost-all : '.','..' 경로를 제외하고 디렉토리 안의 모든 파일을 나열한다
      -B, --ignore-backups : 파일 끝이 '~'인 파일은 목록 나열에 제외된다. 보통끝에 ~이 붙는 파일은 백업파일이다.
      -C, --format=vertical : 정렬방식을 세로로 한다
      -F, --classify : 파일 형식을 알리는 무자를 각 파일 뒤로 추가한다. 일반적으로 실행파일은 "*", 경로는 "/", 심볼릭 링크는 "@",FIFO는 "ㅣ", 소켓은 "=", 일반적인 파일은 없다
      -G, --no-group : 자세한 목록 나열에서 group 정보는 제외한다.
      -L, --dereference : 심볼릭 링크파일들을 그냥 파일로 보여준다
      -N, --literal : 이름이 영문이 아닌경우 C에서 사용하는 역슬래시 문자('\')와 함께 사용하는 표기 대신 그대로 출력한다
      -Q, --quote-name : -N 옵션과 반대
      -R, --recursive : 하위 경로와 그 안에 있는 모든 파일들도 나열한다.
      -S, --sort=size : 파일크기가 가장 큰 것부터 정렬해서 나열한다.
      -U, --sort=none : 정렬을 하지 않고 디스크에 저장된 순서대로 보여준다. 이 옵션은 -f 옵션을 사용할 수 없다. 왜냐하면 유닉스용 ls -f는 -a 옵션은 가능하나 -l, -s, -t 옵션이 불가능하기 때문이다.
      -X, --sort=extension : 파일 확장자순으로 정렬한다. 확장자가 없는 파일이 제일 먼저 나열된다.
      -w, --width cols : 가로 길이를 값으로 지정한다. 기본적으로는 한 화면의 가로값이 된다. 또한 COLUMNS 환경 변수값으로 지정할수 있다. 초기값은 80이다.
      -T, --tabsize cols : 탭이 사용될때 cols값으로 지정한다. 초기갑은 8이다. 0으로 지정되면 탭 문자는 무시된다.
      -I, --ignore pattern : pattern 패턴으로 지정된 파일들은 목록에서 제외된다. 이때 명령행에서 그 파일이 지정되면 물론 나열된다.
      --color, --colour, --color=yes, --color=yes : 파일형태에 따라 그 파일의 색깔을 다르게 보여주는 기능을 한다. 자세한 이야기는 아래 컬러 사용하기 부분을 참조한다
      --color=tty, --colour==tty, --color 옵션과 같으나 단지 표준 출력에서만 색깔을 사용한다. 이 옵션은 컬러 제어 코드를 지원하지 않는 뷰어 프로그램을 사용하는 쉘 스크립트나 명령해 사용에서 아주 유용하게 쓰인다.
      --color=no, --colour=no : 색깔을 사용하지 않는다. 이것이 초기값이다. 이 옵션은 색깔 사용을 이미 하고 있다면 이 값을 무시한다. 이미 사용하고 있는 많은 리눅스 배포본에서는 alias를 이용해 ls 명령에서 컬러를 사요하도록 세팅되어 있으니 컬러를 사용하지 않으려면 alias를 변경시켜야 한다

      용례
      [bluesky@bluestar bluesky]$ ls
      Desktop hacking hanterm.gif nsmail x.gif
      deleted_file han.gif mbox public_html

      [bluesky@bluestar bluesky]$ ls -a <- .로 시작하는 히든화일까지 보기
      . .bashrc .netscape .xsession-errors mbox
      .. .gnome .rhosts Desktop nsmail
      .Xdefaults .gnome_private .screenrc deleted_file public_html
      .bash_history .inputrc .test.swp hacking x.gif
      .bash_logout .kde .wmrc han.gif
      .bash_profile .kderc .xchat hanterm.gif

      [bluesky@bluestar bluesky]$ ls -l <- 자세한 정보보기(long)
      total 49
      drwxr-xr-x 5 bluesky bluesky 1024 Feb 16 23:48 Desktop
      drwxr-xr-x 2 bluesky bluesky 1024 Feb 28 04:52 deleted_file
      drwxrwxr-x 3 bluesky bluesky 1024 Apr 2 13:59 hacking
      -rw-rw-r-- 1 bluesky bluesky 10089 Apr 3 07:57 han.gif
      -rw-rw-r-- 1 bluesky bluesky 9700 Apr 3 07:54 hanterm.gif
      -rw------- 1 bluesky bluesky 1074 Mar 2 02:04 mbox
      drwx------ 2 bluesky bluesky 1024 Mar 4 08:19 nsmail
      drwxr-xr-x 6 bluesky bluesky 1024 Feb 15 07:29 public_html
      -rw-rw-r-- 1 bluesky bluesky 21354 Apr 3 07:35 x.gif

      [bluesky@bluestar bluesky]$ ls -al
      total 94
      drwxr-xr-x 12 bluesky bluesky 1024 Apr 5 21:03 .
      drwxrwxrwx 9 root root 1024 Apr 3 05:27 ..
      -rw-r--r-- 1 bluesky bluesky 1422 Feb 15 04:48 .Xdefaults
      -rw------- 1 bluesky bluesky 9648 Apr 6 04:54 .bash_history
      -rw-r--r-- 1 bluesky bluesky 24 Feb 15 04:48 .bash_logout
      -rw-r--r-- 1 bluesky bluesky 492 Feb 17 22:01 .bash_profile
      ....

      [bluesky@bluestar bluesky]$ ls
      Desktop hacking hanterm.gif nsmail x.gif
      deleted_file han.gif mbox public_html x1.gif

      [bluesky@bluestar bluesky]$ ls -F
      Desktop/ hacking/ hanterm.gif nsmail/ x.gif
      deleted_file/ han.gif mbox public_html/ x1.gif@

      cd
      사용법: cd [dir] or chdir [dir]

      지정한 디렉토리로 이동한다.
      (디렉토리 이름을 주지 않으면 사용자의 홈 디렉토리로 이동하며, 이동하고자 하는 디렉토리는 자신에게 실행권한(execution permission:x)이 있어야 한다.)

      용례
      [bluesky@bluestar bluesky]$ pwd  <- 현재디렉토리 보기
      /home/bluesky
      [bluesky@bluestar bluesky]$ cd hacking
      [bluesky@bluestar hacking]$ pwd
      /home/bluesky/hacking

      [bluesky@bluestar hacking]$ cd ../nsmail  <- 상대 경로명 사용
      [bluesky@bluestar nsmail]$

      [bluesky@bluestar hacking]$ cd /home/bluesky/nsmail  <- 절대 경로명 사용
      [bluesky@bluestar nsmail]$ cd   <- 자신의 홈 디렉토리로 이동
      [bluesky@bluestar bluesky]$ pwd
      /home/bluesky
      [bluesky@bluestar bluesky]$

      • 절대경로명
        위에서 nsmail 디렉토리로 이동할때 $cd /home/bluesky/nsmail 과같이 루트 디렉토리에서 부터 시작하는 완전한 경로명을 말함.
      • 상대경로명
        마찬가지로 위에서 nsmail 로 이동할 때 $cd ../nsmail 과 같이 현재 디렉토리를 기준으로 하는 상대적인 경로명을 말함.

      pwd
      사용법: pwd

      현재 디렉토리를 보여준다.

      용례
      [bluesky@bluestar bluesky]$ pwd
      /home/bluesky
      [bluesky@bluestar bluesky]$ dirs  <- 상대경로를 보여준다.
      ~
      [bluesky@bluestar bluesky]$ dirs -l  <- 절대경로를 보여준다.
      /home/bluesky
      [bluesky@bluestar bluesky]$

      rm
      사용법 : rm [옵션] 파일(들)

      지정한 파일이나 디렉토리를 지운다.

      옵션

      -d, --directory : 디렉토리를 지운다. 디렉토리가 비어 있지 않을 때도 사용할 수 있다
      -f, --force : 쓰기 금지되어 있는 파일도 물어보지 않고 지워 버린다.
      -i, --interactive : 파일을 지울 것인지 물어 보면서 지운다.
      -r,-R, --recursive : 하위 디렉토리까지 모두 지운다.

      용례
      [bluesky@bluestar bluesky]$ ls
      Desktop hacking hanterm.gif nsmail x.gif x2.gif
      deleted_file han.gif mbox public_html x1.gif
      [bluesky@bluestar bluesky]$ rm x1.gif
      [bluesky@bluestar bluesky]$ rm -i x2.gif
      rm: remove `x2.gif'? y
      [bluesky@bluestar bluesky]$rm -rf ./deleted_file  <- 서브디렉토리까지 물어보지않고 바로 지운다.
      [bluesky@bluestar bluesky]$

      cp
      사용법 : cp [옵션] 파일1 파일2
      사용법 : cp [옵션] 파일(들) 디렉토리

      파일1을 파일2로 복사한다. 한 개 또는 그 이상의 파일(들)을 디렉토리에 복사한다. 만약 복사하려는 디렉토리에 같은 이름의 파일이 있을 경우 겹쳐 쓰여지게 된다.

      옵션

      -a, --archive : 가능한 한 원래 파일의 퍼미션을 보존한다. 옵션 -dpR과 같다
      -b, --backup : 백업본을 만든다

      용례
      [bluesky@bluestar bluesky]$ ls
      Desktop hacking han.gif hanterm.gif mbox nsmail public_html x.gif
      [bluesky@bluestar bluesky]$ cp x.gif x1.gif
      [bluesky@bluestar bluesky]$ ls
      Desktop han.gif mbox public_html x1.gif
      hacking hanterm.gif nsmail x.gif
      [bluesky@bluestar bluesky]$ ls -l
      total 70
      drwxr-xr-x 5 bluesky bluesky 1024 Feb 16 23:48 Desktop
      drwxrwxr-x 3 bluesky bluesky 1024 Apr 2 13:59 hacking
      -rw-rw-r-- 1 bluesky bluesky 10089 Apr 3 07:57 han.gif
      -rw-rw-r-- 1 bluesky bluesky 9700 Apr 3 07:54 hanterm.gif
      -rw------- 1 bluesky bluesky 1074 Mar 2 02:04 mbox
      drwx------ 2 bluesky bluesky 1024 Mar 4 08:19 nsmail
      drwxr-xr-x 6 bluesky bluesky 1024 Feb 15 07:29 public_html
      -rw-rw-r-- 1 bluesky bluesky 21354 Apr 3 07:35 x.gif
      -rw-rw-r-- 1 bluesky bluesky 21354 Apr 6 06:43 x1.gif
      [bluesky@bluestar bluesky]$

      mv
      사용법 : mv [옵션] 소스타겟

      파일이나 디렉토리의 위치를 바꾸거나 이름을 다른 것으로 바꾼다

      옵션

      -b, --backup : 이미 파일이 존재하고 있을 겨웅 백업본을 만든다
      -f : 이미 파일이 존재하고 있을 경우 물어보지 않고 그대로 덮어 쓴다
      -i, --interactive : 이미 파일이 존재하고 있을 때 사용자에게 어떻게 할것인지 물어본다
      -u, --update : 만약 지우려는 파일이 덮어 쓸 파일보다 더 최근에 수정된 것이라면 지우지 않는다

      용례
      [bluesky@bluestar bluesky]$ ls
      Desktop han.gif mbox public_html x1.gif
      hacking hanterm.gif nsmail x.gif
      [bluesky@bluestar bluesky]$ mv x1.gif ..
      [bluesky@bluestar bluesky]$ cd ..
      [bluesky@bluestar /home]$ ls
      bluesky crypt.c ftp hacker httpd jkpark linuxer samba test x1.gif
      [bluesky@bluestar /home]$

      mkdir
      사용법 : mkdir [옵션] 디렉토리

      디렉토리를 새로 만든다.

      옵션
      -m모드, --mode : 디렉토리를 만들때 모드를 결정한다. chmod를 참고할 것.
      -p, --parants : 상위 디렉토리가 없을때 상위 디렉ㅌ리도 함께 만든다. 예를 들어, mkdir -p ./dir1/dir2/dir3라고하면 dir1,dir2,dir3 디렉토리가 한꺼번에 만들어진다.

      용례
      [bluesky@bluestar /home]$ mkdir test
      [bluesky@bluestar /home]$ ls
      bluesky crypt.c ftp hacker httpd jkpark linuxer samba test
      [bluesky@bluestar /home]$ ls -l
      total 9
      drwxr-xr-x 11 bluesky bluesky 1024 Apr 6 08:36 bluesky
      -rw-rw-r-- 1 root root 459 Apr 3 05:27 crypt.c
      drwxrwxrwx 7 root root 1024 Mar 1 17:48 ftp
      drwxrwxr-x 2 bluesky bluesky 1024 Mar 23 04:05 hacker
      drwxr-xr-x 5 root root 1024 Feb 15 03:37 httpd
      drwxr-xr-x 5 jkpark jkpark 1024 Feb 17 11:04 jkpark
      drwx------ 5 linuxer linuxer 1024 Apr 2 16:06 linuxer
      drwxr-xr-x 2 root nobody 1024 Apr 22 1999 samba
      drwxrwxr-x 2 bluesky bluesky 1024 Apr 6 08:40 test
      [bluesky@bluestar /home]$ mkdir test1 -m 0700
      [bluesky@bluestar /home]$ ls -l
      total 10
      drwxr-xr-x 11 bluesky bluesky 1024 Apr 6 08:36 bluesky
      -rw-rw-r-- 1 root root 459 Apr 3 05:27 crypt.c
      drwxrwxrwx 7 root root 1024 Mar 1 17:48 ftp
      drwxrwxr-x 2 bluesky bluesky 1024 Mar 23 04:05 hacker
      drwxr-xr-x 5 root root 1024 Feb 15 03:37 httpd
      drwxr-xr-x 5 jkpark jkpark 1024 Feb 17 11:04 jkpark
      drwx------ 5 linuxer linuxer 1024 Apr 2 16:06 linuxer
      drwxr-xr-x 2 root nobody 1024 Apr 22 1999 samba
      drwxrwxr-x 2 bluesky bluesky 1024 Apr 6 08:40 test
      drwx------ 2 bluesky bluesky 1024 Apr 6 08:41 test1
      [bluesky@bluestar /home]$

      rmdir
      사용법 : rmdir [옵션] 디렉토리

      지정한 디렉토리를 지운다. 이 명령으로는 디렉토리가 비어 있어야 지울 수 있다

      옵션
      -p, --parents : 상위 디렉토리도 비어 있을 경우에 함께 지워버린다.

      용례
      [bluesky@bluestar /home]$ ls
      bluesky crypt.c ftp hacker httpd jkpark linuxer samba test test1
      [bluesky@bluestar /home]$ rmdir test
      [bluesky@bluestar /home]$ ls
      bluesky crypt.c ftp hacker httpd jkpark linuxer samba test1
      [bluesky@bluestar /home]$

      ln
      사용법: ln 파일이름 링크이름
      사용법: ln pathname... directory

      원본 파일에 대한 하드/심볼릭 링크화일을 만든다.

      옵션
      -f : 디렉토리에 대한 하드링크 생성(수퍼유저만 가능)
      -s : 심볼릭 링크 생성

      용례
      [bluesky@bluestar /home]$ ln crypt.c crypt   <- 일반 화일의 하드링크(똑같은 복사본이다.- inode가 같다)
      [bluesky@bluestar /home]$ ln -s test1 test  <- 디렉토리에 대한 심볼릭 링크
      [bluesky@bluestar /home]$ ls
      bluesky crypt.c hacker jkpark samba test1
      crypt ftp httpd linuxer test
      [bluesky@bluestar /home]$ ls -l
      total 10
      drwxr-xr-x 11 bluesky bluesky 1024 Apr 6 08:36 bluesky
      -rw-rw-r-- 2 root root 459 Apr 3 05:27 crypt
      -rw-rw-r-- 2 root root 459 Apr 3 05:27 crypt.c

      drwxrwxrwx 7 root root 1024 Mar 1 17:48 ftp
      drwxrwxr-x 2 bluesky bluesky 1024 Mar 23 04:05 hacker
      drwxr-xr-x 5 root root 1024 Feb 15 03:37 httpd
      drwxr-xr-x 5 jkpark jkpark 1024 Feb 17 11:04 jkpark
      drwx------ 5 linuxer linuxer 1024 Apr 2 16:06 linuxer
      drwxr-xr-x 2 root nobody 1024 Apr 22 1999 samba
      lrwxrwxrwx 1 bluesky bluesky 5 Apr 6 08:55 test -> test1
      drwx------ 2 bluesky bluesky 1024 Apr 6 08:41 test1
      [bluesky@bluestar /home]$ ls -i
      12693 bluesky 356366 ftp 303516 jkpark 35382 test
      35384 crypt 281068 hacker 2540 linuxer 266735 test1
      35384 crypt.c 133152 httpd 246078 samba

      하드링크와 심볼릭 링크
      - 하드 링크는 생성된 후에는 일반파일과 동일하게 보여진다(완전하게 똑 같은 파일이다.) 위에서 보면 하드링크 화일인 crypt와 crypt.c는 소유권/링크수/소유자/용량 모든면에서 같다.(파일을 구분하는 i-node가 같다.) 따라서 그냥 ls 해서는 링크파일이라는 것을 알기 힘들다. 리눅스 파일 시스템에서는 모든 파일들이 고유한 inode를 가지므로, ls -i 하여 inode를 확인하여 같으면 하드링크이다.. 심볼릭 링크는 inode가 다르면 용량도 다른다.. ls -F 하면 뒤에 @가 붙는다..

      chmod
      사용법 : chmod 옵션 파일

      화일의 접근권한(접근모드)를 변경한다.

      옵션 -u : 파일 소유자, 유저를 뜻한다.
      -g : 파일 소유자( 유저 )가 속한 그룹을 뜻한다
      -o : 파일 소유자 및 그룹뿐 아니라 모든 사용자를 뜻한다.
      -r : 파일에 대한 읽기 권한을 뜻한다.
      -w : 파일에 대한 쓰기 권한을 뜻한다
      -x : 파일에 대한 실행 권한을 뜻한다
      -+ : 권한을 주고 싶을때 사용한다.
      -- : 주어진 권한을 없애기 위해 사용한

      [화일 접근권한이란??]
      chmod를 설명하기 전에 파일의 접근권한(permission)에 대해서 먼저 잠깐 알아보자..
      [root@bluestar /home]# ls -l crypt
      -rw-rw-r-- 2 root root 459 Apr 3 05:27 crypt

      조금 자세하게 설명을 해 보겠습니다.
      첫번째 항목(-rw-rw-r--)은 권한을 뜻합니다.
      두번째 항목(2)은 링크된 숫자,
      세번째(root)는 파일 소유자,
      네번째(root)는 파일이 속한 그룹을 뜻합니다
      다섯번째(459)는 화일의 크기,
      여섯번째(Apr 3 05:27)는 화일을 마지막으로 수정한 날짜,
      일곱번째(crypt)는 화일명입니다

      위에서 도스와 다른 권한에 대한 것으로 첫번째 항목을 자세히 살펴 보겠습니다. -rwxr-x--x 에서 제일 앞에 있는 것은 디렉토리를 뜻하는 것입니다. 링크파일은 l로 표시하고, 블럭 디바이스는 b, 캐릭터디바이스 c로 표시합니다. 그리고 - (슬래시) 이면 일반 화일입니다. -rwxr-x--x 그 다음은 세개씩 나누어 생각합니다.
      각각 사용자, 그룹, 다른 유저(모두)의 권한을 뜻합니다. r,w,x 는 읽기, 쓰기, 실행의 권한을 뜻하는것입니다. 이 crypt라는 화일은 일단 일반 화일입니다. 그리고 유저 화일주인은 읽고 쓰고 실행을 할수가 있습니다. 그리고 유저가 속한 그룹내의 다른 사람들도 읽고, 쓰기가 됩니다. 그리고 그룹에 속하지 않은 이 시스템을 사용하는 모든 사람들은 읽는 권한만 있습니다..

      용례
      이제 간단한 용례를 통해 사용법을 익혀보도록 하자...
      chmod는 해당화일의 소유자 또는 root만 사용할 수 있으며, chown, chgrp는 root만이 사용할 수 있다.

      [root@bluestar /home]# ls -l crypt
      -rw------- 2 root admin 459 Apr 3 05:27 crypt
      이 화일은 소유자인 root만이 읽고 쓰기가 가능하며 다른 모든 사용자에 대해서는 어떤 권한도 없다..
      권한을 주려고 할때는 +를 없애려고 할때는 -를 사용하며 소유자에 대해서는 u를 소유자가 속한 그룹에 대해서는 g를, 그리고 다른 모든 사용자에 대해서는 o를 사용한다..

      먼저 소유자인 root에 대해서 실행권한을 주려면,
      [root@bluestar /home]# chmod u+x crypt
      [root@bluestar /home]# ls -l crypt
      -rwx------ 2 root admin 459 Apr 3 05:27 crypt

      이번에는 그룹과 다른 모든 사용자에 대해서 읽기와 쓰기 권한을 주어보자..
      [root@bluestar /home]# chmod go+rw crypt
      [root@bluestar /home]# ls -l crypt
      -rwxrw-rw- 2 root admin 459 Apr 3 05:27 crypt

      이제 다시 소유자와 그룹이 아닌 다른 모든 사용자에 대해 읽기 쓰기 권한을 제거해 보자.
      [root@bluestar /home]# chmod o-rw crypt
      [root@bluestar /home]# ls -l crypt
      -rwxrw---- 2 root admin 459 Apr 3 05:27 crypt

      이제 숫자(bit값)으로 권한을 바꾸는 법에 대해 살펴보자..
      [root@bluestar /home]# ls -l crypt
      -rwxr-x--- 2 root admin 459 Apr 3 05:27 crypt
      위에서 권한 부분을 bit 값으로 보면 아래와 같다.
      -rwxr-x---
      -421421421
      각각의 rwx비트가 켜져 있으면 각각의 bit 값인 421이 유효해지며 꺼져 있으면 0이다..
      그러므로 위의 -rwxr-x--- 부분을 보면 아래와 같다.
      -rwxr-x---
      -421401000

      이제 이 값을 세비트씩 더해서 8진수로 만들면 아래와 같다...
      -421/401/000
      -7/5/0 즉, 0750이 된다.
      그래서 이 화일의 권한을 숫자로 표시하면 0750이 되는 것이다..그러므로 이 숫자를 바꿈으로써 권한을 바꿀수 있게 된다..
      우선, 소유자와 그룹이 아닌 다른 모든 사용자에 대해 읽기 쓰기 권한을 주려면,
      -rwxr-xrw-이 되어야 하므로
      -0421401420가 된다 즉, 756이 된다. 그러므로 아래와 같이
      [root@bluestar /home]# chmod 0756 crypt
      [root@bluestar /home]# ls -l crypt
      -rwxr-xrw- 2 root root 459 Apr 3 05:27 crypt

      이 숫자값을 바꿈으로써 여러가지의 권한 설정이 가능해진다.

      chown- 루트만 사용가능
      사용법: chown 사용자 화일or디렉토리

      화일이나 디렉토리의 소유자를 바꾸어 준다.

      용례
      [root@bluestar /home]# ls -l crypt
      -rwxr-xrw- 2 root admin 459 Apr 3 05:27 crypt
      [root@bluestar /home]# chown bluesky crypt
      [root@bluestar /home]# ls -l crypt
      -rwxr-xrw- 2 bluesky admin 459 Apr 3 05:27 crypt
      [root@bluestar /home]#

      chgrp - 루트만 사용가능
      사용법: chgrp 그룹명 화일or디렉토리

      화일이나 디렉토리의 그룹을 바꾼다.

      용례
      [root@bluestar /home]# ls -l crypt
      -rwxr-xrw- 2 bluesky admin 459 Apr 3 05:27 crypt
      [root@bluestar /home]# chgrp root crypt
      [root@bluestar /home]# ls -l crypt
      -rwxr-xrw- 2 bluesky root 459 Apr 3 05:27 crypt
      [root@bluestar /home]#

      su - Substitute user id temporarily(super user가 아님.)
      사용법: su 유저명

      해당 유저명 또는 수퍼유저(root)으로 새로 로긴한다.
      유저명을 주지 않으면 수퍼유저로 로긴한다.

      용례
      [bluesky@bluestar bluesky]$ whoami
      bluesky
      [bluesky@bluestar bluesky]$ su
      Password: xxxxxxxx
      [root@bluestar bluesky]# whoami
      root
      [root@bluestar bluesky]# su jkpark
      [jkpark@bluestar bluesky]$ whoami
      jkpark
      [jkpark@bluestar bluesky]$

      find
      사용법: find [path...] [expression]   쉽게 얘기하면,
                  find [찾기 시작할 부모디렉토리] [각종 문법] 이다...

      찾기 시작할 부모 디렉토리 아래에서 [각종문법]에 해당하는 내용과 일치하는 화일을 찾아 보여준다.
      부모 디렉토리에서부터 시작해서 하위 디렉토리에 있는 모든 화일들에 대해서 검색하며, 시스템내의 모든화일들에 대해서.. 찾고자 할때는 [시작 디렉토리]를 '/(root)'로 해준다.

      [몇가지 문법]
      -name "문자열"
      ; 디렉토리를 검사할때 파일이름이 문자열에 속하는 것을 찾을때 사용합니다.

      "문자열" 안에는 다음과 같은 식으로 사용할 수 있어요.

          "*mp3"  : 마지막이 mp3로 끝나는 모든 문자열
          "mp3"    : mp3 로 된 문자열
          "mp3*"  : 첫글자가 mp3인 문자열
          "*mp3*"  : mp3 라는 문자가 어디든 상관없이 들어있는 문자열
          "?mp3"  : 첫글자 하나는 어떤문자라도 상관없고 뒤의 글자는 mp3인 문자열
                         ex) amp3 , 1mp3 , mmp3 , 6mp3 , 3mp3
         "??mp3"  : 앞에 두글자는 어떤문자라도 상관없고 뒤의 글자는 mp3인 문자열
                         ex) mmmp3 , 12mp3 , 34mp3 , kkmp3
         "m?3"   : 가운데 글자만 어떤문자라도 상관없고 나머지는 그대로인 문자열
                         ex) mp3 , mm3 , m33 , m13 , mr3 , mq3
         "mp3???" : 앞의 문자열은 mp3 이고 뒤의 세개의 문자열은 어떤문자라도 상관없는 문자열
                         ex) mp3123 , mp3aaa , mp3adf , mp3ert , mp3iao
      (참고로 ? 표시가 하나면 하나의 문자만 아무거나여도 상관없다는 것이며, ??? 이렇게 3개라면 3개의 문자열만 아무거나여도 상관없다는 것이다.)

      -user "유저이름"
      ; 특정 유저의 소유권인 파일을 찾을때 사용합니다.

      -perm "퍼미션"
      ; 명시된 퍼미션으로 된 파일을 찾습니다.

      -exec [사용할 명령]
      ; 해당 문법들로 검색된 파일을 입력값으로 해서 명령을 내린다.

             ex) -exec rm -rf {} \;
             ; 검색된 파일을 rm 명령에 -rf 옵션을 주어 입력값에 넣는다. 즉, rm -rf 검색된 파일

      용례
      /(root)아래에서 가운데 'linux'가 들어가는 모든 화일들을 찾아보자..
      [bluesky@bluestar bluesky]$ find / -name *linux*
      find: /home/bluesky/nsmail: Permission denied
      /home/linuxer
      find: /home/linuxer: Permission denied
      find: /home/test1: Permission denied
      /lib/ld-linux.so.2
      /lib/ld-linux.so.1
      /lib/ld-linux.so.1.9.5
      find: /root: Permission denied

      위에서 보면 permission의 문제로 접근할 수 없다는 에러 메시지가 보이는데..이러한 에러 메지지가 보이지 않게 하려면.. 표준에러(2) 출력을 리다이렉션(>)으로 /dev/null로 보내버리면 보이지 않게된다..아래를 보자..
      [bluesky@bluestar bluesky]$ find / -name *linux* 2>/dev/null
      /home/linuxer /lib/ld-linux.so.2
      /lib/ld-linux.so.1
      /lib/ld-linux.so.1.9.5


      이번에는 -user 옵션을 사용하여 소유자가 jkpark인 화일들을 모두 찾아보려면..
      [bluesky@bluestar bluesky]$ find / -user jkpark 2>/dev/null
      /home/jkpark/public_html/php3-doc/ref.zlib.html
      /home/jkpark/public_html/php3-doc/syntax-instrsep.html
      /home/jkpark/public_html/php3-doc/variable-arrays.html
      /home/jkpark/public_html/php3-doc/variable-external.html
      .....
      .....

      위에서 2>/dev/null은 꼭 해주지 않아도 된다..단지 불필요한 에러 메시지가 보이지 않게 하기 위해...

      이번에는 -perm 옵션으로 현재 디렉토리 아래에서 퍼미션이 755인 화일을 찾아보자
      [bluesky@bluestar bluesky]$ find . -perm 755
      .
      ./.kde
      ./.kde/share
      ./.kde/share/applnk
      ./.kde/share/apps
      ./.kde/share/apps/kdehelp
      ./.kde/share/apps/kdisknav
      ....
      ....


      이번에는 마지막으로 /home 디렉토리 아래에서 user가 bluesky이고 그룹이 root인 화일들을 찾아보기로 하자.
      [bluesky@bluestar bluesky]$ find /home -user bluesky -group root -print 2>/dev/null
      /home/crypt.c
      /home/crypt

      [확인]
      [bluesky@bluestar bluesky]$ ls -l /home/cry*
      -rwxr-xrw- 2 bluesky root 459 Apr 3 05:27 /home/crypt
      -rwxr-xrw- 2 bluesky root 459 Apr 3 05:27 /home/crypt.c

      clear
      사용법: clear

      터미널 디스플레이를 모두 지운다.

      용례
      [bluesky@bluestar bluesky]$ ls -l
      total 48
      drwxr-xr-x 5 bluesky bluesky 1024 Feb 16 23:48 Desktop
      drwxrwxr-x 3 bluesky bluesky 1024 Apr 2 13:59 hacking
      -rw-rw-r-- 1 bluesky bluesky 10089 Apr 3 07:57 han.gif
      -rw-rw-r-- 1 bluesky bluesky 9700 Apr 3 07:54 hanterm.gif
      -rw------- 1 bluesky bluesky 1074 Mar 2 02:04 mbox
      drwx------ 2 bluesky bluesky 1024 Mar 4 08:19 nsmail
      drwxr-xr-x 6 bluesky bluesky 1024 Feb 15 07:29 public_html
      -rwxrwxrwx 1 bluesky bluesky 21354 Apr 3 07:35 x.gif
      [bluesky@bluestar bluesky]$ clear
      [bluesky@bluestar bluesky]$

      ps - process status
      사용법: ps [옵션]

      현재 실행되고 있는 프로세스의 목록을 보여준다.

      옵션
      • -l : 자세한 형태의 정보를 출력한다.
      • -u: 각 프로세스의 사용자 이름과 시작 시간을 보여준다.
      • -j: 작업 중심 형태로 출력한다.
      • -s: 시그널 중심 형태로 출력한다.
      • -v: 가상 메모리 중심 형태로 출력한다.
      • -m: 메모리 정보를 출력한다.
      • -a: 다른 사용자들의 프로세스도 보여준다.
      • -x: 로그인 상태에 있는 동안 완료되지 않은 프로세스들을 보여준다. 유닉스 시스템은 사용자가 로그아웃하고 난 후에도 임의의 프로세스가 계속 동작하게 할 수 있다. 그러면 그 프로세스는 자신을 실행시킨 쉘이 없이도 계속 자신의 일을 수행한다. 이러한 프로세스는 일반적인 ps 명령으로 확인할 수 없다. 이때 -x 옵션을 사용하면 자신의 터미널이 없는 프로세스들을 확인할 수 있다.
      • -S: 챠일드(child) CPU 시간과 메모리 페이지 결함(fault) 정보를 추가한다.
      • -c: 커널 task_structure 로부터 명령 이름을 보여준다.
      • -e: 환경을 보여준다.
      • -w: 긴(wide) 형태로 출력한다. 한 행 안에 출력이 잘리지 않는다.
      • -h: 헤더를 출력하지 않는다.
      • -r: 현재 실행중인 프로세스를 보여준다.
      • -n: USER와 WCHAIN을 위해 수치 출력을 지원한다.

      명령 출력의 각 필드의 의미는 다음과 같다.
      • COMMAND: 명령어의 이름
      • PID: 프로세스 ID, 각 프로세스를 구분하기 위한 고유의 ID
      • RSS: 프로세스에 의해 사용되는 실제 메모리의 용량(K byte 단위)
      • USER: 프로세스를 실행시킨 소유자의 계정을 보여준다.
      • SZ: 프로세스의 자료와 스택크기(K byte 단위)
      • TIME: 현재까지 사용된 CPU의 시간(분,초)
      • TT: 프로세스의 제어 터미널(t3=/dev/tty3)
      • %CPU: 마지막 분 동안 프로세스가 사용한 CPU시간의 백분율
      • %MEM: 마지막 분 동안 프로세스가 사용한 메모리양의 백분율
      • START: 프로세스가 시작된 시간
      • STAT: 프로세스의 상태

      위에서 STAT는 몇가지 부호를 사용해서 프로세스의 상태를 표시하고 있는데 아래와 같은 의미이다..
      • P: 수행가능/수행중
      • T: 일시 정지
      • D: 디스크 입출력 대기 같은 인터럽트 할 수 없는 대기상태
      • S: 20초 미만의 짧게 잠듦(sleep)
      • I: 20초 이상의 길게 잠듦
      • Z: 좀비(zombi) 프로세스
      좀비(zombi) 상태라는 것은 프로세스가 사라질 때 시그널 처리의 문제로 완전히 소멸되지 못한 상태를 말한다. 보통은 실행이 끝나면 프로세스가 종료하는데, 이 zombi는 실행이 끝났음에도 불구하고 프로세스가 남아있는 상태이다.

      용례
      [bluesky@bluestar bluesky]$ ps -aux
      USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
      root 1 0.0 0.7 1144 480 ? S Apr05 0:04 init [5]
      root 2 0.0 0.0 0 0 ? SW Apr05 0:00 [kflushd]
      root 3 0.0 0.0 0 0 ? SW Apr05 0:00 [kpiod]
      root 4 0.0 0.0 0 0 ? SW Apr05 0:00 [kswapd]
      bin 252 0.0 0.4 1144 284 ? S Apr05 0:00 portmap
      root 266 0.0 0.9 1344 580 ? S Apr05 0:00 syslogd
      root 277 0.0 1.0 1440 692 ? S Apr05 0:00 klogd
      daemon 291 0.0 0.4 1168 308 ? S Apr05 0:00 /usr/sbin/atd
      .....
      .....

      [bluesky@bluestar bluesky]$ ps
      PID TTY TIME CMD
      1885 ttyp2 00:00:00 bash
      1989 ttyp2 00:00:00 ps

      kill
      사용법 : kill [옵션] 프로세서 ID (들)

      지정한 프로세서를 끝낸다. 시그널을 보내서 프로세스를 조절하는데, 해당 프로세스를 이 kill 명령어로 끝내려면 그 프로세서의 소유자이거나 혹은 슈퍼 유저이어야 한다. 보통은 쉘 자체적으로 정의된 kill을 쓰기 때문에 이 명령을 사용할 필요가 별로 없지만 한 프로세스를 비정상적으로 종료시켜야 할 필요가 있을때 사용한다.

      옵션
      -l : 사용 가능한 시그널을 모두 출력한다
      -시그널 : 시그널 번호나 혹은 시그널 이름을 지정하여 원하는 시그널을 보낼 수 있다

      용례
      [bluesky@bluestar bluesky]$ kill -l
      1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
      5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE
      9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
      13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
      18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
      22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
      26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
      30) SIGPWR

      [bluesky@bluestar bluesky]$ ps -aux | grep "xv"
      bluesky 600 0.0 2.9 3716 1856 ? S Apr05 0:00 xv
      bluesky 2009 0.0 0.6 1216 404 ttyp2 S 11:01 0:00 grep xv

      [bluesky@bluestar bluesky]$ kill 600
      [bluesky@bluestar bluesky]$ ps -aux | grep "xv"
      xv 프로세스가 없어졌다..
      bluesky 2011 0.0 0.6 1216 404 ttyp2 S 11:02 0:00 grep xv
      [bluesky@bluestar bluesky]$

      mount
      사용법: mount [-vwmta] 장치명 디렉토리

      다른 파티션의 디스크나 물리적으로 다른 기억 장치를 파일 시스템으로 연결한다.

      옵션
      • -v: 마운트 작업을 수행하면서 자세한 정보를 출력한다.
      • -w: 마운트되는 파일 시스템을 읽기와 쓰기가 가능하도록 한다.
      • -r: 마운트되는 파일 시스템이 읽기 동작만 가능하도록 한다.
      • -n: 마운트 정보가 기록되는 /etc/mtab 파일에 정보를 기록하지 않는다.
      • -a: /etc/fstab 파일에 있는 모든 파일 시스템을 마운트하도록 한다.
      • -t: 마운트되는 파일 시스템의 형태를 지정한다.

      용례
      플로피 마운트
      [bluesky@bluestar bluesky]$ mount -t msdos /dev/fd0 /mnt/floppy

      CD-ROM 마운트
      [bluesky@bluestar bluesky]$ mount -t iso9660 /dev/cdrom /mnt/cdrom

      두번째 하드(hdb)에 설치되어 있는 windows 시스템을 마운트
      [bluesky@bluestar bluesky]$ mount -t vfat /dev/hdb /mnt/win

      마운트된 시스템을 언마운트 하려고 할 때에는 umount를 사용한다.

      logout
      사용법: logout

      로그인한 시스템에서 로그아웃 한다.

      용례
      [bluesky@bluestar bluesky]$ logout
      로긴한 터미널(ex: 한텀)이 사라지면서 로그아웃된다.
      $exit 해도 된다.

      stty
      사용법: stty [키이름] [지정할키]

      명령어 수행도중 그만두거나 잠시 실행을 중단시키거나 잘못된 명령을 지우는 등의 터미널 사용에 대한 키들을 정의한다.
      $stty -a 라고 하면 현재 설정되어 있는 모든 키들을 보여준다.

      용례
      [bluesky@bluestar bluesky]$ stty -a
      speed 9600 baud; rows 39; columns 77; line = 0;
      intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
      eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
      lnext = ^V; flush = ^O; min = 1; time = 0;
      -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
      -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon
      -ixoff -iuclc -ixany -imaxbel
      opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
      isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
      [bluesky@bluestar bluesky]$ stty erase ^H
      [bluesky@bluestar bluesky]$stty rows 40

      path
      사용법: PATH=[추가할 패스]:[추가할 패스]...

      패스를 추가한다.

      용례
      [bluesky@bluestar bluesky]$ echo $PATH
      /usr/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/bluesky/bin:/bin:/sbin:/usr/bin:/usr/sbin:
      /usr/X11R6/bin:/usr/X11R6/sbin:/usr/hwpx/bin

      [bluesky@bluestar bluesky]$ PATH=.:/bin:/usr/bin
      [bluesky@bluestar bluesky]$ echo $PATH
      .:/bin:/usr/bin
      [bluesky@bluestar bluesky]$

      pushd/popd
      사용법: pushd/popd [이동할 디렉토리]

      특정 디렉토리를 이동할 때 완전한 패스를 주지 않고도 해당디렉토리를 어떤 영역에 저장한 다음.. 디렉토리를 쉽게 왔다갔다 할 때 사용한다.

      용례
      [bluesky@bluestar bluesky]$ pwd
      /home/bluesky
      [bluesky@bluestar bluesky]$ pushd /mnt/win98_c
      /mnt/win98_c ~
      [bluesky@bluestar win98_c]$ pwd
      /mnt/win98_c
      [bluesky@bluestar win98_c]$ popd
      ~
      [bluesky@bluestar bluesky]$ pwd
      /home/bluesky
      [bluesky@bluestar bluesky]$

      cat - catenate(사슬로 잇다)
      사용법: cat [file명]
                  cat > [file명]

      화일의 내용을 화면에 출력하는데 사용하기도 하며 파일을 다른 곳에 순차적인 스트림으로 보내기 위해서도 사용된다.

      용례
      mbox의 내용을 보려고 할때
      [bluesky@bluestar bluesky]$ cat mbox
      From MAILER-DAEMON Thu Mar 2 02:04:28 2000
      Date: Thu, 2 Mar 2000 02:04:28 +0900 (KST)
      From: Mail System Internal Data
      Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
      X-IMAP: 0951930192 0000000001
      Status: RO
      ....
      ....

      파일 작성시는
      [bluesky@bluestar bluesky]$ cat > file
      이것은 테스트 화일입니다..
      나중에 지우세요..
      ^D
      [bluesky@bluestar bluesky]$
      [bluesky@bluestar bluesky]$ ls
      Desktop hacking hanterm.gif nsmail x.gif
      file han.gif mbox public_html

      이제 위에서 작성한 file 이라는 파일의 내용을 함 보자..
      [bluesky@bluestar bluesky]$ cat file
      이것은 테스트 화일입니다..
      나중에 지우세요..
      [bluesky@bluestar bluesky]$

      more/less
      사용법: more [화일명]
                   less [화일명]

      한 화면이 넘어가는 화일의 내용을 한 화면씩 끊어서 볼때 사용한다..
      첫 화면에서 다음화면을 볼때는 [space bar] 또는 [f] 키를 이전화면을 볼때는 [b]키를 사용한다.
      그리고 more 실행하여 화일내용을 보는 도중에 subshell을 띄워서 특정명령을 수행할 수 있다.
      이때에는 ! [cmd를 사용한다.

      용례
      [bluesky@bluestar bluesky]$ more mbox
      From MAILER-DAEMON Thu Mar 2 02:04:28 2000
      Date: Thu, 2 Mar 2000 02:04:28 +0900 (KST)
      From: Mail System Internal Data
      Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
      X-IMAP: 0951930192 0000000001
      Status: RO>

      This text is part of the internal format of your mail folder, and is not
      --More--(30%)  이 상태에서 subshell을 띄워보자
      !sh
      bash$
      - subshell이 떴다..
      bash$ ls   <- 실행하고자 하는 명령실행..
      Desktop hacking hanterm.gif nsmail test1
      file han.gif mbox public_html x.gif
      bash$
      bash$exit  <- subshell 을 빠져나가서 원래의 more 상태로 간다.
      exit ------------------------
      --More--(30%)   <- 원래 more 상태로 돌아왔다.

      less 명령도 똑같이 사용할 수 있다.
      [bluesky@bluestar bluesky]$ less mbox
      Date: Thu, 2 Mar 2000 02:04:28 +0900 (KST)
      From: Mail System Internal Data
      Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
      X-IMAP: 0951930192 0000000001
      Status: RO

      This text is part of the internal format of your mail folder, and is not
      a real message. It is created automatically by the mail system software.
      mbox
      • -s: 시스템 이름을 알려준다.
      • -n: 시스템의 노드(node) 이름을 알려준다.
      • -r: 오퍼레이팅 시스템의 증명번호를 알려준다.
      • -v: 오퍼레이팅 시스템의 버전 번호를 보여준다.
      • -m: 하드웨어의 이름을 보여준다.
      • -a: 모든 정보를 보여준다. -snrvm과 같다.

      용례
      [bluesky@bluestar bluesky]$ uname
      Linux
      [bluesky@bluestar bluesky]$ uname -n
      bluestar.linuxnet.ac.kr
      [bluesky@bluestar bluesky]$ uname -r
      2.2.9-19mdk
      [bluesky@bluestar bluesky]$ uname -v
      #1 Wed May 19 19:53:00 GMT 1999
      [bluesky@bluestar bluesky]$ uname -m
      i686
      [bluesky@bluestar bluesky]$ uname -a
      Linux bluestar.linuxnet.ac.kr 2.2.9-19mdk #1 Wed May 19 19:53:00 GMT 1999 i686 unknown
      [bluesky@bluestar bluesky]$>

      umask
      사용법 umask [마스크]

      파일을 새로 생성할 때, 어떤 모드로 생성되는지를 알려주거나 새로 지정할 때 사용한다.

      용례
      [bluesky@bluestar bluesky]$ umask
      002

      위에서 나온 umask값은 실제 권한 값이 아닌 권한 값에 대한 mask값이다..
      777 - 002 = 755(111111111 - 000000010 = 111111101)이 실제 권한 값이다..

      위에서 umask값이 002이므로 새로 생성되는 화일의 권한은 755가 된다.
      (그러나, 실행화일이 아닌 경우는 실행권한 bit가 없어서 - 으로 표시되며 이 상태에서 실행권한만 주면.. 실제 권한인 755가 된다..,) 아래를 보라..

      [bluesky@bluestar bluesky]$ cat > test
      test file
      ^D
      [bluesky@bluestar bluesky]$ ls -l test
      -rw-rw-r-- 1 bluesky bluesky 10 Apr 7 12:41 test [bluesky@bluestar bluesky]$ chmod a+x test
      [bluesky@bluestar bluesky]$ ls -l test
      -rwxrwxr-x 1 bluesky bluesky 10 Apr 7 12:41 test
      [bluesky@bluestar bluesky]$

      grep
      사용법: grep [-vclhnief] 표현 파일명(들)

      파일내에서 특정패턴을 검색한다. grep은 Global Regular Express Printer의 머리글자이다.

      옵션
      • -v: 일치되는 내용이 없는 라인을 표시한다.
      • -c: 일치되는 내용이 있는 행의 개수를 센다.
      • -l: 일치되는 내용이 있는 파일의 이름만을 표시한다.
      • -h: 일치되는 내용을 찾은 파일의 이름을 표시하지 않는다.
      • -n: 일치 내용이 있는 행은 행번호와 함께 표시된다.
      • -i: 대소문자 구분을 하지 않는다.
      • -e 표현: 표현이 하이픈 문자로 시작될 때 사용한다.
      • -f 파일: 찾으려는 문장이나 표현이 있는 파일을 지시한다.

      용례
      mbox라는 화일내에서 'bluesky'라는 패턴을 찾아서 라인번호를 표시하면서 보여준다.
      [bluesky@bluestar bluesky]$ grep -n bluesky mbox
      13:From bluesky@darkstar.linuxnet.ac.kr Thu Mar 2 01:54:08 2000
      14:Return-Path:
      15:Received: from bluestar.linuxnet.ac.kr (IDENT:bluesky@darkstar.linuxnet.ac.kr [192.168.1.10])
      17: for bluesky@bluestar.linuxnet.ac.kr; Thu, 2 Mar 2000 01:48:22 +0900
      19:From: bluesky@darkstar.linuxnet.ac.kr
      26:Hi bluesky??

      alias
      사용법: alias 또는 alias 명령='바꿀이름'

      명령어 이름이 길거나 할때 별명을 만들어서 간단히 사용할 때 쓴다..

      용례
      현재 alias된 내용을 볼 때는 그냥 alias 만 한다..
      [bluesky@bluestar bluesky]$ alias
      alias c='clear'
      alias g='grep'
      alias gr='grep'
      alias less='less -rf'
      alias ls='ls --show-control-chars --color'
      alias m='more'

      grep 이라는 명령이 길다고 생각될 때 아래와 같이 간단히 'g'로 별명을 만들어 사용할 수 있다..
      [bluesky@bluestar bluesky]$ alias g='grep'

      이제 별명인 'g'를 사용해 보자. grep 을 사용했을때와 같은 결과이다..
      [bluesky@bluestar bluesky]$ g -n bluesky mbox
      13:From bluesky@darkstar.linuxnet.ac.kr Thu Mar 2 01:54:08 2000
      14:Return-Path:
      15:Received: from bluestar.linuxnet.ac.kr (IDENT:bluesky@darkstar.linuxnet.ac.kr [192.168.1.10])
      17: for bluesky@bluestar.linuxnet.ac.kr; Thu, 2 Mar 2000 01:48:22 +0900
      19:From: bluesky@darkstar.linuxnet.ac.kr
      26:Hi bluesky??
      [bluesky@bluestar bluesky]$



      1. vi(Visual Editor)는 유닉스상에서 가장 일반적으로 사용되는 문서 편집기이다. 유닉스의 문서편집기로는 vi외에 ed,ex등이 있으나 이것들은 줄단위 편집기라서 사용이 불편해 지금은 거의 사용되지 않는다. 이에 비해 vi는 화면단위 편집기(물론 요즘은 거의 대부분 화면단위 편집기이지만)이다. 화면상에 커서를 움직여 가며 원하는 곳에 문자를 입력하거나 삭제할 수 있다. 요즘에야 별 획기적인 얘기가 아니지만 줄단위 편집기를 사용하던 사람들에게는 획기적인 변화를 가져다 준 것이엇다.

        그럼에도 불구하고, vi를 처음 접하는 사람들의 공통된 의견은 사용하기 어렵다는 것이다. 편집기 명령이 몇개의 키 조합으로 이루어져 복잡하기도 하고 도움말이나 현재 상태에 대한 자세한 설명이 없어 막막한 느낌을 준다. 이는 리눅스를 처음 사용할 당시 프롬프트 앞에서 무엇을 해야 하나 망설이는 느낌과도 같다..그러나 vi를 사용하는 데는 몇가지 이유가 있다.
        첫째는 앞에서 말했듯이 vi는 리눅스/유닉스상의 표준 문서 편집기이기 때문이다. 유닉스/리눅스가 있는 곳에는 항상 vi가 있다.
        또 하나는 사용하면 할수록 편리하다는 것이다.(계속 사용하면서 익혀가다보면 100% 공감할 것이다..) 대부분의 명령이 자판의 한 부분에 몰려있어(예를 들면, 커서를 이동시키는 명령이 편집모드에서 h(좌), j(하), k(상), l(우)이기 때문에 화살표 키가 있는 곳까지 손을 이동시킬 필요가 없다) 문서 작성속도를 극대화 시킬 수 있다.

        vi의 자세한 사용법은 대부분의 유닉스/리눅스 책에서 많은 양의 지면을 할애해 설명하고 있으므로 여기서는 실전위주로 꼭 필요한 것들만을 설명하기로 한다.
        우선 새로운 파일 하나를 편집하기 위해 아래와 같이 입력해 보자.
        [bluesky@bluestar bluesky]$ vi test
        vi 초기화면

        위와 같은 초기화면이 나오는데..vi를 처음 실행하게 되면 명령모드로 들어가게 된다..이 명령모드에서 입력되는 모든키는 명령어로 동작하고 실제 화일에 입력되지는 않는다..이 명령모드에서 입력모드로 들어가기 위해서는 'i' 또는 'a' 를 입력하면 화면 하단에 INSERT가 표시되면서 입력모드로 들어간다. 이때부터 글자 입력이 가능해진다..
        아래에 'i'를 입력후 입력모드로 들어간 화면이다.
        vi의 입력모드

        아래에 명령모드로 돌아와서 ':wq!'로 저장하고 빠져나가는 화면이다.
        vi의 명령모드
        위와같이 ':wq!' 로 저장하고 빠져나오면 다시 shell 상태로 돌아오게 된다.

        지금까지 간략히 살펴보았듯이, vi는 아래와 같은 구조로 작업이 이루어진다.
        shell상에서 [vi 화일명]하면 vi의 명령모드로 처음 들어가게 되고,
        명령모드에서 [a A i I o O]등을 입력하면 실제 입력가능한 입력모드로 들어가게 되고
        입력모드에서 작업을 마쳤거나 또는 중간에 다른 명령을 하기 위해 명령모드로 오기 위해 [ESC]키를 누른다.
        이렇게 명령모드로 온다음 shell로 빠져나갈때는 [ZZ :q :wq :q!]등을 입력한다.

        위와 같은 vi의 작업과정을 그림으로 표시하면 아래와 같다.
        vi의 구조

        이제 다시 첨부터 하나 하나 살펴보기로하자..일단 다시 새로운 화일을 하나 작성하자 test1이란 이름으로
        [bluesky@bluestar bluesky]$ vi test1
        vi 초기화면
        그러면 다시 위와 같은 초기화면이 나온다..
        이 초기화면(명령모드)에서 'i' 또는 'a'를 입력해 입력모드로 들어가서 화일을 작성하자.
        화일을 작성하다가 내용을 지우려면 [ESC]키를 눌러 명령모드로 돌아간 다음 'x'키를 누르면 한 글자씩 지워진다.

        이렇게 명령모드에서 특정내용을 지우고 다시 입력모드로 가기위해서는 다시 'i' 또는 'a'를 입력하면 된다.
        이번에는 문서내에서 한 문자만 수정하고자 할때는 역시 [ESC]키로 명령모드로 돌아간다음 수정하고자 하는 문자위에 커서를 위치(커서이동은 h,j,k,l을 사용한다..)시킨후 's'키를 누른후 수정할 글자를 입력한다..
        마찬가지로 한 단어를 수정하고 할 때는 명령모드로 돌아간다음 수정하고자하는 단어의 맨앞에 커서를 위치시킨후에 'c'+'w'키(c와 w를 연속해서 누름)를 누른후 수정할 단어를 입력하면 된다..

        문서내에서 한줄을 지우기 위해서는 지우고자 하는 라인에 커서를 위치시킨후에 'dd'(d를 두번누름)키를 사용한다.
        여러줄을 지우고자 할때에는 지우고자하는 첫번째 줄에 커서를 위치시킨후에 'dd+n'(n은 지울 라인수)를 누르면 된다..즉, 커서가 있는 줄에서부터 아래로 9줄을 지우기 위해서는 'dd9'를 누르면 된다..(이 역시 명령모드에서..)

        이번에는 문서내에서 각 라인의 젤 앞에 라인번호를 붙여보자..라인번호를 붙이기 위해서는 명령모드에서 ':set nu'를 친다..
        행번호 붙이기
        아래와 같이 행번호가 붙게되고 이 행번호를 다시 없애기 위해서는 마찬가지로 명령모드에서 ':set nonu'를 입력한다.
        행번호 붙인 상태

        이번에는 문서의 정보를 한번보자. 문서의 총라인수와 현재 커서가 몇번째 라인에 있으며 전체문서의 몇%에 위치하는지 등의 정보를 보기위해서는 명령모드에서 'Ctrl'+'g'를 입력하면 된다..그러면 아래와 같이 문서의 젤 하단에 이런 정보가 나오게 된다.
        문서정보 보기

        이번에는 아래행의 내용을 윗행의 끝에 붙이기 위해서는 커서를 윗행에 위치시킨후(이 역시 명령모드에서) 'Shift'+'j' 를 입력하면 아래행의 내용이 윗행의 끝부분에 추가된다..

        이제 똑같은 내용을 입력하기 위한 수고를 덜기위해 문서내의 특정내용을 복사해서 붙이는 명령에 대해서 해보자..
        문서내에서 특정행을 복사하기위해서는 복사하고자 하는 행에 커서를 위치시킨후 'yy'(y를 두번 누름)를 누르면 복사가 된다.. 이렇게 복사된 내용을 붙이기 위해서는 붙이고자 하는 라인의 바로 위 라인에 커서를 위치시킨후 'p'를 누르면 커서아래행에 복사된 내용이 붙여진다..이런방식으로 여러행을 복사할때에는 복사하고자하는 부분의 첫행에 커서를 위치시킨후에 'nyy' (여기서 n은 복사할 라인수이다..즉, 커서위치에서부터 아래로 9라인을 복사하기 위해서는 '9yy' 를 누른다..)를 누르면 된다.

        휴우..지금까지 여러명령들을 배웠는데..그리 많은 내용은 아니다..vi 에디터를 사용하는데 있어 필수적인 것들이다..꼭 익혀두도록 하자..

        이번에는 문서내용이 많은 상황에서 특정라인으로 가고자 할때에는 ":행번호"를 명령모드에서 입력하면 된다..즉, 100번째 행으로 가기위해서는 ':100'하면 된다..
        그리고 특정행을 작업하면서 계속 참조해야 할 경우 일일이 커서를 이동해가면서 참조하려면 여간 힘든일이 아니다. 특히 여러번 계속해서 참조해야하는 경우에는 더욱더 그러한데..이럴경우 참조할 행을 미리 설정해둔다음 계속 그곳으로 가면 된다..
        이렇게 특정라인을 ':ka'로 설정한다음 문서작업중에 참조하기위해 그 특정라인으로 가기위해서는 ''a' ( ' 와 a를 연속적으로 누름)을 누름으로서 참조가 가능하다..
        행설정

        위 화면은 "한줄씩 .."행을 kk로 설정한 화면이다 이렇게 kk로 설정한후 계속 작업을 하다가 이부분을 참조하기 위해서는 " 'k " 을 입력하면 된다.('와 k를 연속해서 누름) - 그전에 참조하기 전행을 ':ka'등으로 설정해두어야 ''k'로 참조하고 다시 ''a'로 돌아가기가 쉬울것이다..

        이번에는 문서내의 특정부분을 임의의 화일로 저장하는 것에 대해 알아보자.. 예를 들어 위의 화면에서 젤 위에서 부터 세줄을 'tt'라는 화일로 저장하기 위해서는
        우선 저장하고자하는 첫줄인 "한줄씩 ..."행에 커서를 위치시킨후 ':kk'로 설정해두자..그리고 저장할 부분의 젤 마지막행인 "'x'키를 .." 행으로 커서를 가져온뒤 ':'k, w! tt'라고 입력하면 위의 세줄이 'tt'라는 화일에 저장이 된다..
        특정부분 화일에 저장

        아래에 저장이 되었다는 메시지가 하단에 나온다..
        저장된 화면

        명령모드에서 ':!ls' 해서 tt라는 화일이 있는지 확인해보면 다음과 같이 나온다..

        [No write since last change]
        Desktop han.gif mbox public_html tt
        hacking hanterm.gif nsmail test x.gif

        Press RETURN or enter command to continue

        여기서 [Enter]를 누르면 다시 편집기 화면으로 돌아간다.
        이제 외부화일을 문서상에 불러오는 것에 대해 알아보기로 하자..아까 저장한 tt라는 화일을 문서의 젤 아래에 추가해보자..
        문서에 다른 문서를 추가시키고자 할 경우는 추가시킬 라인에 커서를 위치시킨후(물론 이경우도 명령모드에서..)
        ':r tt'라고 입력하면 된다..그러면 젤 아래에 'tt' 화일의 내용이 추가될 것이다..아래 참조
        화일 불러오기

        아래에 추가된 내용이 보인다..
        추가된 내용

        이제 마지막으로 'dd' 명령으로 지우거나 ':r tt' 등으로 화일 읽거나 할때 잘못된 명령이어서 취소할려고 할때에는 해당명령 실행후 바로 'u'를 누르면 취소가 된다..즉, 'dd'하여 특정행을 삭제한후 이를 취소하려고 할때에는 바로 'u'를 누르면 된다..

        실제 vi의 사용법은 내용이 아주 많고 복잡한데..여기까지 주요한 내용이고 꼭 필요한 부분만을 살펴보았다.. 사실 지금까지의 내용만 제대로 익혀도 문서편집에는 그리 어려움이 없을것이다..더 자세한 내용은 각종 서적에서 vi 부분을 참조하기 바란다..



      2. 해당 명령을 클릭하시면 빨리 보실 수 있습니다..
        tar
        사용법: tar [-] c|r|t|u|x [bBefFhilmopvwX014578] [tarfile] [blocksize] [exclude-file] [-I include-file] filename1 filename2 ... -C directory filenameN ...
        이와같이 상당히 복잡한데 대부분은 잘 쓰이지 않고 보통은
        묶을때는 $tar -cvf filename1 filename2... [tarfile]을
        풀때는    $tar -xvf [tarfile] 의 두가지를 보통 잘 쓴다.

        tar는 여러개의 파일을 타르파일이라고하는 하나의 파일에 묶어주며 이들 가운데 특정 파일들을 끄집어 내거나 또는 tar 파일에 새로운 파일을 추가한다. tar가 수행할 작업은 첫번째 매개변수로 주어지는 선택사항(crtux 중 하나)에 의해 결정된다. 또다른 매개변수는 tar를 수행할 파일이나 디렉토리로써, 디렉토리가 주어지면 서브디렉토리 모두까지를 포함하게 된다.

        옵션
        • -c : 지정된 화일들에 대해 새로운 타르화일을 생성
        • -r : 지정된 파일들을 기존의 타르파일의 끝에 추가
        • -t : 타르파일이 저장하고 있는 파일의 리스트를 출력
        • -u : 지정된 파일들이 타르파일에 없거나 혹은 변경된 경우 타르파일에 추가 혹은 수정
        • -x : 지정된 파일들을 타르파일로부터 그집어냄
        • -b : 테이프를 이용할 때의 블럭크기를 지정
        • -B : 여러번 읽어들임. 파이프나 소켓을 이용할 경우 한번 읽어들일때 원하는 크기의 데이타 양을 읽기 위해 여러번 읽도록 해줌
        • -e : 예상치 않은 에러 발생시 정상종료 상태를 반환하며 종료
        • -f : 다음의 매개변수를 타르 파일 이름으로 지정. 생략시 환경변수 TAPE를 참조. 지정이 되지 않은 경우 /dev/rmt8을 기본적으로 이용. - 문자가 지정된 경우 표준 입출력을 이용
        • -F : 하나의 F 문자 지정시 SCCS 디렉토리를 모두 배제. 두개의 FF 문자 지정시 .o로 끝나는 파일, errs, core, a.out 파일들을 모두 배제
        • -h : 심볼릭 링크인 경우 실제의 화일 내용을 이용
        • -i : 디렉토리 checksum 에러를 무시
        • -m : 타르파일을 풀 때 각 파일의 수정 시간을 타르 파일을 푸는 현재 시간으로 설정.
        • -p : umask 값을 무시하고 원래의 파일 접근 권한을 이용한다. 수퍼 유저인 경우 setuid, sticky bit 값도 복구된다.
        • -v : tar의 작업진행 상황을 보여준다.
        • -w : tar 작업 수행시 각각의 작업을 수행할 지의 여부를 물어본다. y 이외의 문자를 입력하면 해당 파일에 대한 작업을 수행하지 않는다.
        • -X : 다음의 매개변수를 해당 작업을 수행하지 않을 파일 리스트를 가진 파일로 인식
        • -I : 다음의 매개변수를 해당 작업을 수행할 파일 리스트를 가진 파일로 인식
        • -C : c 혹은 r 선택사항에서, 타르파일 안에 묶기 전에 해당 디렉토리로 이동을 한다. 결과적으로 타르파일 안에 묶이는 파일들의 경로명이 단축된다.

        용례
        현재 디렉토리 아래의 hacking 디렉토리와 nsmail 디렉토리의 내용을 test.tar이라는 파일로 묶어보자
        [bluesky@bluestar bluesky]$ ls
        Desktop han.gif mbox public_html tt
        hacking hanterm.gif nsmail test x.gif

        [bluesky@bluestar bluesky]$ tar -cvf test.tar
        hacking/
        hacking/buffer_overflow/
        hacking/buffer_overflow/ex2.cc
        hacking/perm
        hacking/\244perm
        hacking/level13
        hacking/client.c
        hacking/level13.c
        hacking/listen.c
        hacking/server.c
        hacking/proto.h
        hacking/client
        hacking/listen
        hacking/server
        nsmail/
        [bluesky@bluestar bluesky]$

        [bluesky@bluestar bluesky]$ ls
        Desktop hanterm.gif public_html tt
        hacking mbox test x.gif
        han.gif nsmail test.tar
        [bluesky@bluestar bluesky]$

        이제 test.tar의 내용을 보면,
        [bluesky@bluestar bluesky]$ tar -tf test.tar
        hacking/
        hacking/buffer_overflow/
        hacking/buffer_overflow/ex2.cc
        hacking/perm
        hacking/\244perm
        hacking/level13
        hacking/client.c
        hacking/level13.c
        hacking/listen.c
        hacking/server.c
        hacking/proto.h
        hacking/client
        hacking/listen
        hacking/server
        nsmail/
        [bluesky@bluestar bluesky]$

        이제 이 test.tar을 풀어보자..
        [bluesky@bluestar test]$ ls
        test.tar
        [bluesky@bluestar test]$tar -xvf test.tar
        hacking/
        hacking/buffer_overflow/
        hacking/buffer_overflow/ex2.cc
        hacking/perm
        hacking/\244perm
        hacking/level13
        hacking/client.c
        hacking/level13.c
        hacking/listen.c
        hacking/server.c
        hacking/proto.h
        hacking/client
        hacking/listen
        hacking/server
        nsmail/

        [bluesky@bluestar test]$ ls
        hacking nsmail test.tar
        [bluesky@bluestar test]$

        gzip/gunzip/zcat
        사용법: gzip [-cdfhLrtvV19] [파일 ...]
                    gunzip [-cfhLrtvV] [파일 ...]
                    zcat [-hLV] [파일 ...]

        gzip은 파일을 압축하여(tar는 묶기만 할 뿐 압축하지는 않는다..) .z 확장자를 갖는 파일을 생성한다. 파일의 소유자, 접근권한, 수정시간 등은 그대로 보존한다. 지정된 파일이름이 없으면 표준 입력이 가정되며 그 결과는 표준 출력으로 생성된다. 파일 이름이 너무 긴 경우에는 압축 파일 이름을 짧게 만들고 원래의 파일 이름은 압축파일 내에 저장한다. 압축시 링크 파일은 무시한다. 압축된 파일은 'gzip -d' 또는 'gunzip', 'zcat' 등의 명령으로 푼다..

        gunzip은 .z 또는 .Z 확장자를 갖는 압축파일을 푸는데 사용하며 원래의 파일 이름도 풀어준다. gunzip은 compress나 pkzip을 이용하여 압축된 파일들도 풀 수 있다. zcat은 'gunzip -c'와 동일하게 동작하며 표준 출력을 복구시킨다. 압축된 파일은 .z 확장자를 갖지 않아도 된다. 압축률은 파일의 크기 그리고 공통 문자열의 분포에 따라 달라지며, 일반 텍스트 파일들은 대개 30 ~ 40% 정도로 압축된다..

        옵션
        • -c, --stdout : 표준 출력 이용
        • -d, --decompress : 복구/풀기
        • -f, --force : 링크화일도 압축
        • -h, --help : 도움말
        • -r, --recurse : 디렉토리 내의 화일들도 모두 처리
        • -t, --test : 압축파일의 완전성 검사
        • -v, --verbose : 파일 이름과 압축률 출력
        • -V, --version : 버젼과 편집 사항 출력
        • -#, --fast, --best : 압축 시간의 지정
                             -1, --fast는 가장빨리 압축하나 압축률은 떨어지고
                             -9, --best는 가장느리나 압축률은 가장 좋다.
                             지정하지 않으면 -5가 사용된다.

        • -c : 표준 출력을 이용
        • -f : 이미 압축되었어도 압축을 수행
        • -v : 압축률 출력
        • -b 비트수 : 공통 문자열 코드의 상한선 지정. 16이 기본이며, 9가 하한선임.
        • -a : 모든 파일 시스템에 대한 정보 출력
        • -i : 사용한 inode와 사용 가능한 inode를 출력
        • -t type : 유형이 type에 해당하는 파일 시스템에 대한 정보 출력(유형에는 nfs, 4.2등이 있다)

        용례
        [bluesky@bluestar bluesky]$ df
        Filesystem 1k-blocks Used Available Use% Mounted on
        /dev/hdb1 1486339 1106362 303169 78% /

        [bluesky@bluestar bluesky]$ df -i
        Filesystem Inodes IUsed IFree IUse% Mounted on
        /dev/hdb1 385024 93437 291587 24% /

        du
        사용법: du [-s] [-a] [filename ...]

        디렉토리일 경우 디렉토리 내의 모든 서브디렉토리까지 검사하며 재귀적으로 디스크 사용량을 보여준다.

        옵션
        • -s : 전체 사용량만 출력
        • -a : 디렉토리 내의 각 파일의 디스크 사용량도 출력

        용례
        [bluesky@bluestar bluesky]$ du
        8 ./.kde/share/applnk/레드헷 리눅스 프로그램
        11 ./.kde/share/applnk
        2 ./.kde/share/apps/kdehelp
        1 ./.kde/share/apps/kdisknav
        1 ./.kde/share/apps/kfm/bookmarks
        ...
        ...
        3 ./.netscape/xover-cache
        199 ./.netscape
        1 ./nsmail
        2 ./hacking/buffer_overflow
        45 ./hacking
        5208 .
        [bluesky@bluestar bluesky]$



      3. 해당명령을 클릭하시면 빨리 보실 수 있습니다..
        • archie.hana.nm.kr(하나망, 한국)
        • archie.sogang.ac.kr(서강대학교, 한국)
        • archie.ans.net(New York, USA)
        • archie.rutgers.edu(New Jersey, USA)
        • archie.sura.net(Maryland, USA)
        • archie.unl.edu(Nebraska, USA)
        • archie.mcgill.ca(the first Archie server, in Canada)
        • archie.funet.fi(Finland)
        • archie.cs.huji.ac.il(Israel)
        • archie.au(Australia)
        • archie.uqam.ca(Canada)
        • archie.doc.ic.ac.uk(Great Britain)
        • archie.wide.ad.jp(Japan)

        용례
        아래와 같이 그냥 archie하면 명령어 사용법이 나온다.
        [blue]/home1/ingots> archie
        Usage: archie [-acelorstvLV] [-m hits] [-N level] string
                  -a : list matches as Alex filenames
                  -c : case sensitive substring search
                  -e : exact string match (default)
                  -r : regular expression search
                  -s : case insensitive substring search
                  -l : list one match per line
                  -t : sort inverted by date
                  -m hits : specifies maximum number of hits to return (default 95)
                  -o filename : specifies file to store results in
                  -h host : specifies server host
                  -L : list known servers and current default
                  -N level : specifies query niceness level (0-35765)

        아래와 같이 -L 옵션으로 사용하면 현재 연결가능한 archie 서버 리스트가 나온다.
        [blue]/home1/ingots> archie -L
        Known archie servers:
                  archie.ans.net (USA [NY])
                  archie.rutgers.edu (USA [NJ])
                  archie.sura.net (USA [MD])
                  archie.unl.edu (USA [NE])
                  archie.mcgill.ca (Canada)
                  archie.funet.fi (Finland/Mainland Europe)
                  archie.au (Australia)
                  archie.doc.ic.ac.uk (Great Britain/Ireland)
                  archie.wide.ad.jp (Japan)
                  archie.ncu.edu.tw (Taiwan)
        * archie.kornet.nm.kr is the default Archie server.
        * For the most up-to-date list, write to an Archie server and give it the command `servers'.

        이제 archie.sogang.ac.kr에 접속해서 cops 이라는 화일을 찾아보자..
        [blue]/home1/ingots>archie -h archie.sogang.ac.kr cops
        Host cantine.wu-wien.ac.at

              Location: /pub/usr/edvz/gonter/.scratch/security
            DIRECTORY drwxr-xr-x 2048 Dec 3 1992 cops

        Host brolga.cc.uq.oz.au

              Location: /comp.sources.unix/volume21
            DIRECTORY drwxr-xr-x 512 Jun 9 1990 cops
        ...
        ...

        이렇게 파일을 찾으면 해당 FTP에 접속하여 파일을 가져오면 된다.
        [blue]/home1/ingots> ftp cantine.wu-wien.ac.at

        ftp
        위와 같이 archie로 파일을 찾거나 이미 화일이 있는 FTP 싸이트를 알고 있을 경우 이제 이를 자신의 컴으로 가져와야 하는데 이때 사용하는 명령이 ftp이다. anonymous(익명, 로긴 id가 없는 사용자도 접속가능) FTP에 로긴시는 사용자명으로 'anonymous' 또는 'ftp'를 비밀번호로 자신의 e-mail 주소를 입력하면 된다.

        용례
        ftp에서 파일 송수신을 위해 기본적으로 필요한 명령어는 다음과 같다.
        명령어 내용
        open 호스트 이름이나 IP 주소를 사용하여 접속한다.
        close 현재 접속중인 연결을 끊고 ftp 명령어 모드로 돌아간다.
        quit ftp 사용을 그만하고 셀 상태로 돌아간다.
        ascii ASCII 형태로 파일을 주고받는다
        binary Binary 형태로 파일을 주고받는다.
        ls ftp 싸이트의 디렉토리 파일 목록을 보여준다.
        pwd ftp 싸이트에서 현재 자신이 위치한 디렉토리의 경로를 나타내준다.
        cd ftp 싸이트의 디렉토리를 변경한다.
        lcd 로컬(자신이 ftp 명령어를 실행시킨 시스템) 디렉토리 위치를 변경한다.
        (m)get ftp 싸이트로부터 (복수개의) 파일을 전송받는다.
        ! 접속을 유지한 상태로 자신의 시스템의 셀 프롬프트로 빠져 나온다.
        (m)put 자신의 시스템에 있는 (복수개의) 파일을 ftp 싸이트로 전송한다.
        prompt 복수개의 파일 전송시 파일마다 사용자에게 전송여부에 대한 확인을 물어온다.
        hash 파일 전송 상태를 # 문자를 통해서 보여준다.
        ? 사용할 수 있는 명령어를 보여준다.
        help 도움말을 보여준다.

        이제 실제 접속해서 파일을 가져오는 과정을 보기로 하자..
        [blue]/home1/ingots> ftp ftp.dacom.co.kr
        Connected to ftp.bora.net.
        220 ftp.bora.net FTP Server ready.
        Name (ftp.dacom.co.kr:ingots): anonymous
        331 Anonymous login ok, send your complete e-mail address as password.
        Password:ingots@now....
        230-
                Welcome to BoraNet FTP archive in Korea ( FTP.BORA.NET )
                You are the user #992 of maximum #1000 on Wed Jan 26 03:11:31 2000

                한명이 동시에 2세션 이상을 접속하는 것을 제한합니다.
                Don't do ftp-ing more than 2 connections simultaneously.

                정기점검(PM): Every Tuesday 05:00 ~ 07:00 +0900 (KST)

                NEWS:
                1999/10/21. Linux Kernel added. (/pub/linux/kernel)
                1999/11/10. Insufficient FreeBSD Fixed. (/pub/FreeBSD)
                1999/12/02. Accel-Linux and Power-Linux added. (/pub/linux/...)
                1999/12/03. Visit TUCOWS.BORA.NET LINUXBERG.BORA.NET CPAN.BORA.NET
                1999/12/07. FTP.BORA.NET now supports max 1000 users.
                1999/12/07. Alzza-Linux 6.1 added. (/pub/linux/alzza/...)
                ....
        230 Anonymous access granted, restrictions apply.
        ftp>   <- ftp 프롬프트

        ftp> pwd
        257 "/" is current directory.

        ftp> ls
        200 PORT command successful.
        150 Opening ASCII mode data connection for file list.
        pub
        etc
        226 Transfer complete.
        10 bytes received in 0.046 seconds (0.21 Kbytes/s)

        ftp> cd pub
        250 CWD command successful.

        ftp> pwd
        257 "/pub" is current directory.

        ftp> cd security
        250 CWD command successful.

        ftp> pwd
        257 "/pub/security" is current directory.

        ftp> cd Scanner
        250 CWD command successful.

        ftp> ls -l
        200 PORT command successful.
        150 Opening ASCII mode data connection for file list.
        drwxr-xr-x 3 ftpadm ftp 4096 Aug 13 03:11 Cracker
        drwxr-xr-x 2 ftpadm ftp 4096 Aug 13 03:11 DoSTracker
        drwxr-xr-x 4 ftpadm ftp 4096 Aug 13 03:11 TCPSYN-attack
        drwxr-xr-x 2 ftpadm ftp 4096 Aug 13 03:11 Tripwire
        drwxr-xr-x 2 ftpadm ftp 4096 Aug 13 03:11 anticrack
        -rw-r--r-- 1 ftpadm ftp 289908 Mar 13 1992 cops_104.tar.gz
        -rw-r--r-- 1 ftpadm ftp 9737 Apr 5 1995 courtney-1.2.tar.Z
        -rw-r--r-- 1 ftpadm ftp 2623 Feb 6 1994 cpm.1.0.tar.gz
        -rw-r--r-- 1 ftpadm ftp 58881 Oct 24 1993 iss.shar
        drwxr-xr-x 2 ftpadm ftp 4096 Aug 13 03:11 l0pht
        drwxr-xr-x 2 ftpadm ftp 4096 Aug 13 03:11 nmap
        drwxr-xr-x 2 ftpadm ftp 4096 Aug 13 03:11 rscan
        drwxr-xr-x 2 ftpadm ftp 4096 Aug 13 03:11 satan
        226 Transfer complete.
        remote: -l
        862 bytes received in 0.43 seconds (1.96 Kbytes/s)

        ftp> bi
        200 Type set to I.

        ftp> hash
        Hash mark printing on (8192 bytes/hash mark).

        ftp> get cops_104.tar.gz
        200 PORT command successful.
        150 Opening BINARY mode data connection for cops_104.tar.gz (289908 bytes).
        ##################
        226 Transfer complete.
        local: cops_104.tar.gz remote: cops_104.tar.gz
        289908 bytes received in 13 seconds (21.48 Kbytes/s)
        ftp>

        telnet
        - telnet은 원격 machine에 접속할 수 있게 해주는 중요한 인터넷 프로토콜이다..telnet 은 기본적으로 컴퓨터 이름 (ara.kaist.ac.kr)이 아닌 IP 주소를 사용한다..그러므로 기본적으로는 $telnet IP address 형식으로 접속해야하나.. 해당 시스템에 hosts에 컴퓨터이름과 IP address쌍이 있는 경우 그냥 $telnet 컴퓨터이름 으로 접속해도 된다..
        telnet은 기본적으로 23번 포트를 사용한다..
        그래서 $telnet ara.kaist.ac.kr 이라고 하면 이는 $telnet ara.kaist.ac.kr 23 과 같다..
        만약 다른 포트로 접속하고자 한다면 $telnet ara.kaist.ac.kr 3000 과 같이 젤 뒤에 포트번호를 써주면 된다.

        rlogin
        - rlogin(remote login)은 telnet과 마찬가지로 원격 시스템에 로긴할 때 사용하는 명령어로 telnet과 사용법이 거의 동일하지만, 다른점은 rlogin의 경우, 자기가 해당 시스템에 id를 가지고 있고, 시스템에 로긴할 때마다 패스워드를 치기가 싫을 경우 자신의 홈 디렉토리 아래에 ~/.rhosts라는 파일에 자신의 계정 id와 로긴할 호스트이름을 넣어두면 로긴시에 패스워드를 넣지 않고도 $rlogin -l blueksy target_host 형식으로 로긴이 가능하다.
        만약 ~/.rhosts에 "+ +"의 내용이 들어있다면 누구라도 패스워드 없이 접속할 수가 있게되어 예전에 유행했던 해킹방법이 되기도 했으나 지금은 시스템들의 보안강화로 이게 통하는 시스템은 거의 없다..

        예를 들어 만약 자신의 시스템이 darkstar.linuxnet.ac.kr 이고, bluestar.linuxnet.ac.kr에 bluesky란 계정이 있다고 하면.. bluestar.linuxnet.ac.kr 시스템의 bluesky계정의 홈 디렉토리에 .rhosts 파일에 "bluesky darkstar.linuxnet.ac.kr"이라는 내용이 있다면 darkstar.linuxnet.ac.kr 시스템에서 $rlogin -l bluesky bluestar.linuxnet.ac.kr로 패스워드없이 접속이 가능하다.

        또한,
        자신이 계정을 가지고 있는 시스템에의 홈 디렉토리의 .rhosts에 아래와 같이 자신의 e-mail 주소가 들어있다면..

        %cat ~/.rhosts
        kjw@vivace.postech.ac.kr
        sakai@baram.kaist.ac.kr

        패스워드 없이 파일전송도 가능하다. 즉, 지금 자신이 adam이라는 기계를 쓰고 있고 여기의 파일을 baram의 sakai의 계정의 ~/mydir 밑으로 옮겨놓고 싶을 경우, rcp(remote copy) 명령을 쓰면 된다. 옮길 파일이 move_file 일경우,
        $rcp move_file sakai@baram.kaist.ac.kr:~/mydir
        위와 같이 하면 ftp의 귀찮은 작업을 하지 않고도 쉽게 파일을 옮길 수 있다.

        irc
        - IRC(Internet Relay Chatting)는 인터넷에 독특한 서비스인데, IRC라는 공간은 굉장히 많은 방으로 구성되어 있고, 사용자는 그 방에서 마음에 드는, 혹은 그렇지 않을 수도 있지만, 사람들과 영어로, 혹은 불어로, 혹은 이탤리어 대화하는 인터넷 채팅방이다.(windows용 irc 프로그램으로는 mirc가 있다..)

        아래에 그 사용법을 보자..
        [blue]/home1/ingots> irc
        --------------------------- 아래는 접속화면이다.. ---------------------------
        *** Connecting to port 6667 of server irc.kornet.nm.kr
        *** Welcome to the Hangul Internet Relay Network ingots (from kirc.net)
        *** If you have not already done so, please read the new user information with /HELP +NEWUSER
        *** Your host is kirc.net, running version u2.10.05.9.(chkconf1-2).hangul
        *** This server was created Sat Dec 25 1999 at 07: 46:29 KST
        *** umodes available dioswkg, channel modes available biklmnopstv
        *** There are 8 users and 1 invisible on 1 servers
        *** 4 channels have been formed
        *** This server has 9 clients and 0 servers connected
        *** Highest connection count: 28 (28 clients)
        *** - kirc.net Message of the Day -
        *** - 24/12/1999 7:50
        *** - * IRC 홈페이지 개설
        *** - 홈페이지가 구축되었읍니다. 주소는 HTTP://www.kirc.net입니다.
        *** -
        *** - * <접속포트>
        *** - - 서버가 업그래이드 되었습니다.
        *** - - 기존 Port: 6667에 6666,6668이 추가되었습니다.
        *** - - 더욱 빨라졌습니다.
        *** -
        *** - * 개설된 채널: "/list" 또는 "/list -wide -name"
        *** - 채널 참가: "/join #채널명"
        *** -
        *** - *** 40명 이상이 참가한 대화방에서만 대화방 Key값 설정이 용인됩니다.
        *** -
        *** - SOBACK 사용자들을 위한 IRC Help: "/help" - 도움말 목록 참조
        *** -
        *** - -----------------------------------------------------------
        *** -
        *** - <접속호스트>
        *** - Dacom : bora.dacom.co.kr (port: 6666, 6667, 6668)
        *** - KIDS BBS : kids.kornet.nm.kr (port: 6666, 6667, 6668)
        *** -
        *** - SYSOP: irc@kirc.net
        *** on 1 ca 1(2) ft 10(10) tr

        [1] 13:32 ingots * type /help for help
        --------------------------------------------------------------------------

        irc에서 사용가능한 명령어들은 아래와 같다.
        /server irc-2.mit.edu          서버를 바꾼다.
        /list                                    현재 가능한 방들의 리스트를 보여준다.
        *** #DrakRealm   9      Home of They Who Type With One Hand
        *** #siam           10      Jiab is cute ahaha
        *** #friendly       10     The friendliest place in cyberspace
        ...

        /nick vivaldi         IRC에서의 내별명은 vivaldi라고 한다.
        /who #korea       #korea라는 방에 누가 있는지를 보여준다.
        /whois vivaldi      vivaldi가 어떤 사람인지 알려준다.
        /join #espanol    espanol이라는 방에 join 한다.
        /msg joddie personal-says      joddie만 듣도록 귓속말을 하는 경우
        /sigoff 또는 /join 0     방에서 빠져나온다.
        /me action         대화자들에게 내가 무슨 행동을 한다는 식으로 나온다.
                                  예를 들어. /me kisses the baby 'Janes' 하면 내가 nick이 vivaldi라면,
                                  vivaldi kisses the baby 'Janes'라고 나오게 된다.
        /help join           join 명령에 대한 해설을 보여준다.
        /quit                   IRC를 끝낸다.

        finger
        - finger는 상대방이 시스템에 로긴했는지, 했으면 지금 있는지, 아니면 언제 썼었는지를 알려주는 서비스이다. 최근, 일부 기업들간에, 보안이 철저해짐에 따라, finger를 해도 finger가 막혀있는 경우가 상당히 많지만, 대부분의 학교에서는 finger 서비스가 자유롭게 이루어진다.

        용례
        [bluesky@bluestar bluesky]$finger jkpark@baram.kaist.ac.kr   <- jkpark가 뭐하는지 알고 싶을때..
        [bluesky@bluestar bluesky]$finger jkpark@baram   <- jkpark와 내가 kaist라는 같은 도메인에 있을때..
        [bluesky@bluestar bluesky]$finger jkpark  <- jkpark와 내가 같은 시스템을 쓰고 있을때..

        아래와 같은 결과를 볼 수 있다..
        [bluesky@bluestar bluesky]$ finger jkpark
        Login: jkpark Name: 박정근
        Directory: /home/jkpark Shell: /bin/bash
        Last login Mon Apr 3 06:49 (KST) on tty2
        No mail.
        No Plan.
        [bluesky@bluestar bluesky]$

        위에는 No Plan 이라고나오는데..이러한 finger 정보를 수정하고자 할때는 자신의 홈디렉토리 아래에 .project.plan 화일을 작성해주면 새로운 정보가 나타난다...

        또는 chfn 명령을 쓰면 finger 정보를 수정할 수 있다..
        [bluesky@bluestar bluesky]$ chfn
        Changing finger information for bluesky.
        Password: xxxxxxxx
        Warning: your password will expire in -38 days
        Name [박정근]:
        Office []:

        위에서 수정하고자하는 정보를 수정하면 된다..

        ping
        - ping 명령어는 어떤 다른 시스템이 현재 동작중인지 알 수 있다..telnet으로 접속하려는데 계속 접속이 안될경우 먼저 이 명령을 사용해 시스템이 동작중인지를 알아볼 수 있다.

        용례 아무런 옵션없이 사용하면 사용법에 대한 설명이 나온다..
        [bluesky@bluestar bluesky]$ ping
        usage: ping [-LRdfnqrv] [-c count] [-i wait] [-l preload]
                  [-p pattern] [-s packetsize] [-t ttl] [-I interface address] host

        [bluesky@bluestar bluesky]$ ping bluestar.linuxnet.ac.kr
        PING bluestar.linuxnet.ac.kr (192.168.1.11): 56 data bytes
        64 bytes from 192.168.1.11: icmp_seq=0 ttl=255 time=0.4 ms
        64 bytes from 192.168.1.11: icmp_seq=1 ttl=255 time=0.1 ms
        64 bytes from 192.168.1.11: icmp_seq=2 ttl=255 time=0.2 ms

        --- bluestar.linuxnet.ac.kr ping statistics ---
        3 packets transmitted, 3 packets received, 0% packet loss
        round-trip min/avg/max = 0.1/0.2/0.4 ms
        [bluesky@bluestar bluesky]$

        netstat/rup
        - netstat는 현재 네트웍의 상태를 알려주는 명령이고,
          그리고 rup는 시스템의 부하정도를 보여주는 명령이다..

        용례
        netstat는 -r 옵션을 이용하여 네트웍의 라우팅 테이블과 관련 정보를 보여준다.
        [bluesky@bluestar bluesky]$ netstat -r -n
        Kernel IP routing table
        Destination Gateway Genmask Flags MSS Window irtt Iface
        192.168.1.11 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
        192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
        127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
        [bluesky@bluestar bluesky]$

        [blue]/home1/ingots> netstat -r -n

        Routing Table:
        Destination Gateway Flags Ref Use Interface
        -------------------- -------------------- ----- ----- ------ ---------
        203.229.46.0 203.238.128.212 UG 0 7
        203.229.47.0 203.238.128.212 UG 0 4
        203.241.216.0 203.238.128.210 UG 0 10
        203.238.129.0 203.238.129.22 U 2 4 hme1
        203.238.128.0 203.238.128.22 U 3 4527 hme0
        203.238.149.0 203.238.128.212 UG 0 238
        ....
        ....

        [blue]/home1/ingots> rup
        neob7               up 11:43, load average: 0.14, 0.15, 0.18
        tiger3.nownu     up 11:43, load average: 0.02, 0.02, 0.02
        nms.nownuri.   up 10:12, load average: 2.60, 3.06, 3.26
        proxy5             up 14 days, 23:42, load average: 0.12, 0.18, 0.19
        172.25.2.14.     up 11:43, load average: 0.11, 0.11, 0.12
        .....
        .....

        [blue]/home1/ingots> rup lion8
        lion8 up 7 days, 10:23, load average: 2.40, 2.34, 2.23
        [blue]/home1/ingots>

        nslookup/dig
        - nslookup는 인터넷 주소를 IP address로 바꾸어 보여주는 명령이며 dig도 비슷한 역할을 하는 명령이다.

        용례
        [blue]/home1/ingots> nslookup drill.hackerslab.org
        Server: ns.nownuri.net
        Address: 203.238.128.24

        Non-authoritative answer:
        Name: drill.hackerslab.org
        Address: 203.239.110.20

        [blue]/home1/ingots> nslookup www.hackerslab.org
        Server: ns.nownuri.net
        Address: 203.238.128.24

        Non-authoritative answer:
        Name: www.hackerslab.org
        Address: 203.239.110.1

        [blue]/home1/ingots> nslookup
        Default Server: ns.nownuri.net
        Address: 203.238.128.24

        > www.hackerslab.org Server: ns.nownuri.net
        Address: 203.238.128.24

        Non-authoritative answer:
        Name: www.hackerslab.org
        Address: 203.239.110.1

        > www.waawaa.com
        Server: ns.nownuri.net
        Address: 203.238.128.24

        Non-authoritative answer:
        Name: waawebsrv.waawaa.com
        Address: 210.205.56.7
        Aliases: www.waawaa.com

        > exit
        [blue]/home1/ingots>

        traceroute
        - traceroute는 해당 시스템까지의 경로(path) 를 단계적으로 보여줌으로써 해당 시스템까지의 네트웍이 원활하게 동작되고 있는지를 체크하는 명령이다..
        아무런 옵션없이 사용하면 사용법을 보여주며, * 로 표시된 부분은 그 부분에서 네트웍이 끊어졌음을 알려준다..

        용례
        [blue]/home1/ingots> traceroute
        Usage: traceroute [-dnrv] [-w wait] [-m max_ttl] [-p port#] [-q nqueries] [-t tos] [-s src_addr] host [data size]

        [blue]/home1/ingots> traceroute www.hackerslab.org
        traceroute to www.hackerslab.org (203.239.110.1), 30 hops max, 40 byte packets
        1 203.238.128.203 (203.238.128.203) 2 ms 2 ms 1 ms
        2 203.238.141.2 (203.238.141.2) 17 ms 18 ms 19 ms
        3 192.145.251.32 (192.145.251.32) 19 ms 18 ms 20 ms
        4 210.122.160.177 (210.122.160.177) 213 ms 160 ms 210.122.160.173 (210.122.160.173) 153 ms
        5 c253.nuri.net (203.255.117.253) 133 ms 150 ms 165 ms
        6 210.103.229.38 (210.103.229.38) 224 ms 180 ms 222 ms
        7 203.239.110.1 (203.239.110.1) 239 ms 287 ms 264 ms
        [blue]/home1/ingots>

        위에서 보듯이 나의 시스템(blue.nownuri.net)에서 www.hackerslab.org까지의 네트웍 경로상에는 아무런 문제가 없으며 총 7개의 시스템을 거쳐 도달하게 됨을 알 수 있다.

        whois
        인터넷 상에서 사람이나 컴퓨터(IP/domain)을 찾아주는 서비스로, 메인 WHOIS 데이터베이스는 미국 NIC(Network Information Center)에서 운영되고 있는데, 'whois' 명려어를 이용하면 등록된 모든 domain(즉, mit.edu, kotel.co.kr..) 데이터베이스를 찾을 수 있다. 이것은 보통 시스템 포스트마스터나 리스트오너들이 어떤 site의 접촉 상대자를 찾을때나 문제점을 알려주고자 할 때, 또는 어떤 이유로 접촉하고자 할 때 사용된다..물론 주소를 알아내는 것도 가능하다.

        용례
        [blue]/home1/ingots> whois hackerslab.org

        Whois Server Version 1.1

        Domain names in the .com, .net, and .org domains can now be registered
        with many different competing registrars. Go to http://www.internic.net
        for detailed information.

             Domain Name: HACKERSLAB.ORG
             Registrar: NETWORK SOLUTIONS, INC.
             Whois Server: whois.networksolutions.com
             Referral URL: www.networksolutions.com
             Name Server: NS.NURI.NET
             Name Server: NS1.HACKERSLAB.COM
             Updated Date: 14-sep-1999


        >>> Last update of whois database: Wed, 26 Jan 00 01:45:34 EST <<<<

        The Registry database contains ONLY .COM, .NET, .ORG, .EDU domains and Registrars.

        [blue]/home1/ingots> whois 203.239.110.1

        Whois Server Version 1.1

        Domain names in the .com, .net, and .org domains can now be registered
        with many different competing registrars. Go to http://www.internic.net
        for detailed information.

             Server Name: NS1.HACKERSLAB.COM
             IP Address: 203.239.110.1
             Registrar: NETWORK SOLUTIONS, INC.
             Whois Server: whois.networksolutions.com
             Referral URL: www.networksolutions.com


        >>> Last update of whois database: Wed, 26 Jan 00 01:45:34 EST <<<

        The Registry database contains ONLY .COM, .NET, .ORG, .EDU domains and Registrars.



      4.  


      5.  


      6.  


    1. 쉘(shell)이란 우리가 예전에 알고 써왔던 Dos Shell과 같은 개념이다..즉, 명령어를 가져와서 해석하고 해석된 명령어를 실행하게끔 도와주는 명령처리기라고 할 수 있다. 즉 이들은 아래의 그림에서처럼 user와 kernel이 Communication을 할 수 있도록 해주는 역할을 한다. 유닉스/리눅스를 부팅을 하고 login을 하면 shell(shell prompt: $, #)이 뜨게 되고 사용자 명령이 내려기지까지 기다리게 된다.
      만약, shell이 없다면 사용자는 로긴을 할 수 없다. 그래서 root 소유자가 /etc/passwd에서 사용자의 사용 shell, 보통 Linux에서는 /bin/bash를 사용하는데 이 부분을 지우면 그 사용자는 로긴을 할 수 없게 된다.

      쉘(shell)의 개념

       


    2. 유닉스/리눅스에서는 일반적으로 Bourne Shell, C Shell을 지원한다. 가장 기본이 되는 것은 Bourne Shell로서 여기서 필요에 의해서 많은 변종 Shell들이 생겨났다.
      리눅스에서 제공하고 있는 Shell은 Unix에서 사용하고 있는 Bourne Shell을 본 딴 bash(Bourne Again Shell)과 C Shell을 본 딴 tcsh이 기본적으로 제공되고 있으며, 그밖에 많은 Shell들이 있지만 여기서는 bash와 tcsh에 대해서만 살펴보기로 하자.

      1. bash

        리눅스의 bash는 Unix의 Bourne Shell 문법을 모두 만족하며 그외에 더 나은 C Shell의 일부분도 포함을 하고 있는 보다 발전적인 Shell이라 할 수 있다. 그리고 bash는 기본적인 리눅스 쉘이며 root 쉘이기도 하다.
        root쉘이란 root 계정 사용자가 사용하는 shell을 의미하는데 리눅스를 부팅하고 login을 한 상태에서 ps 명령을 쳐보면 현재 사용하고 있는 쉘의 종류를 알 수 있다.
        아래를 보면, PID 6418번으로 root shell인 bash가 작동하고 있음을 볼 수 있다.

        [root@bluestar bluesky]# ps
        PID TTY TIME CMD
        6417 ttyp2 00:00:00 su
        6418 ttyp2 00:00:00 bash
        6421 ttyp2 00:00:00 ps
        [root@bluestar bluesky]#

      2. tcsh

        리눅스의 tcsh는 유닉스의 C Shell을 본 딴 것으로서 bash와 유사하다. 그러나 bash의 문법으로 짜여져 실행된 Shell 프로그램은 tcsh에서도 실행이 가능하지만, tcsh에서 짜여진 Shell 프로그램은 bash에서는 실행되지 않는다. 이러한 단점이 있는 반면 그만큼 막강한 기능들이 있으므로 응용할 수 있으면 상당히 편리하다. 보통 대부분의 리눅스나 유닉스는 Bourne 쉘과 C 쉘을 모두다 가지고 있으므로 걱정할 일은 아니다.

        현재 bash를 사용하고 있는데 tcsh로 바꾸고자 할 경우는 아래와 같이 하면 된다.

        [bluesky@bluestar bluesky]$ exec tcsh  <- 또는 그냥 tcsh만 해도 된다.
        [bluesky@bluestar ~]$ exec bash
        [bluesky@bluestar bluesky]$


    3. 간단히 말해서 키보드에서 들어오는 명령이 표준입력이라 하고 , 유저의 터미널, 콘솔로 보내지는 출력을 표준출력이라고 한다. 그 출력은 프린터, 파일로도 갈 수가 있는데 이에 대해서는 다음에 나오는 리다이렉션에서 알아보기로 할 것이다.
      여기서 사용자의 터미널이라는 것은 아래와 같이 tty tty1 tty2 ....라고 디스플레이 된 것을 의미한다.
      [bluesky@bluestar bluesky]$ ps
      PID TTY TIME CMD
      2863 ttyp2 00:00:00 bash
      6450 ttyp2 00:00:00 ps

      표준입력은 모든 명령을 받아들이는 입력의 가장 기본적인 스트림이다. 그러나 때에 따라서는 키보드가 아닌 다른 스트림을 통해서 표준입력으로 보낼수도 있다. 이 경우는 표준입력은 명령이 아닌 데이터스트림을 받아들이는 통로가 된다. 표준출력은 기본적으로 터미널로 가게되는 스트림이지만 가끔은 외부의 다른 네트워크를 통해서 다른 호스트의 표준입력으로도 전달할 경우도 있다.

      여기서 잠깐, 디바이스 장치에 대해 조금 알아보자. 리눅스/유닉스에서는 프린터, 디스크 드라이브, 터미널 같은 디바이스 장치를 하나의 파일로 간주하기 때문에 각각마다 고유의 파일이름을 가지고 있다. 리눅스 디렉토리내에 보면 /dev라는 디렉토리가 있는데 거기에 모든 디바이스 파일들이 들어있다.
      위에서 ps 명령에서 살펴보았듯이 유저 bluesky는 ttyp2라는 터미널(TTY)을 사용하고 있는데 이 역시 하나의 장치화일이며 이 역시 /dev에 있다. 아래를 보면 ttyp2라는 터미널 장치가 보일 것이다.
      [bluesky@bluestar bluesky]$ cd /dev
      [bluesky@bluestar /dev]$ ls -l ttyp*
      crw-rw-rw- 1 root root 3, 0 Apr 5 21:04 ttyp0
      crw------- 1 bluesky tty 3, 1 Apr 8 14:32 ttyp1
      crw------- 1 bluesky tty 3, 2 Apr 9 16:10 ttyp2
      crw-rw-rw- 1 root root 3, 3 Apr 9 12:09 ttyp3
      crw-rw-rw- 1 root root 3, 4 Mar 30 03:31 ttyp4
      crw-rw-rw- 1 root root 3, 5 Mar 30 04:01 ttyp5
      crw-rw-rw- 1 root root 3, 6 Feb 19 09:33 ttyp6
      crw-rw-rw- 1 root root 3, 7 Feb 19 09:34 ttyp7
      ...

      즉, bluesky는 /dev에 있는 여러 터미널 장치들중 하나인 ttyp2를 사용하고 있는 것이다.

      이제 표준입력/표준출력을 가장 잘 보여주는 예로 cat 명령을 살펴보기로 하자.
      cat는 다음에 아규먼트가 붙으면 그 파일의 내용을 화면에 보여주지만, 아무런 아규먼트를 붙이지 않고 cat를 실행하면 표준입력인 키보드로부터 입력받은 내용을 표준출력인 사용자 터미널에 보여준다.

      [bluesky@bluestar /dev]$ cat
      표준입력인 키보드에서 내용을 입력하면 표준출력인 터미널에 표시된다   <- 키보드에서 입력
      표준입력인 키보드에서 내용을 입력하면 표준출력인 터미널에 표시된다   <- 터미널에 표시
      ^D  <- EOT(End Of Text)로 cat에게 "이제 그만 하겠다"고 알려준다.
      [bluesky@bluestar /dev]$



    4. 이번에는 파이프와 리다이렉션에 대해 살펴보기로 하자.. 이것들은 앞에서 다룬 표준입력과 표준출력을 좀더 다양하게 다룰 수 있게 해준다. 다시말해, 표준입력으로 들어온 데이터를 가공할 수도 있고, (필터를 적용하여) 혹은 데이터를 다른곳으로 보낼수도 있고(파일로 저장하거나) 혹은 그냥 버리거나 표준에러와 같은 특수한 곳으로 보낼수도 있다. 이러한 것들을 잘 사용하면 작업을 훨씬 효율적으로 할 수 있으니 잘 익혀두기 바란다.

      1. 파이프(pipe)

        파이프는 "|" 문자를 말하는 것으로 한 프로세스의 표준 출력을 다른 프로세스의 표준입력으로 연결하는 방법을 말한다.
        사용은 아래와 같이 한다.

        command1 | command2 | command3

        위의 경우는 command1의 명령의 결과는 파이프를 통해서 command2에 전달되어 처리되고, 다시 command2에 전달되어 처리된 데이터가 command3의 입력으로 전달되어 최종적으로 표준출력으로 나가게 된다.

        가장 간단한 예를 들어보면 /dev 디렉토리에서 ls로 화일 목록을 보게되면 화일이 너무 많아 다 지나가 버리게 되는데..이때 파이프를 사용하여 이 ls의 결과를 more의 입력으로 하여 한줄씩 보려고 할 때 다음과 같이 ls | more라고하면 목록이 한 화면씩 보이게 된다.

        [bluesky@bluestar /dev]$ ls |more
        MAKEDEV
        MAKEDEV.ibcs
        MAKEFLOPPIES
        X0R
        arp
        atibm
        audio
        audio1
        aztcd
        bpcd
        capi20
        capi20.00
        capi20.01
        capi20.02
        capi20.03
        capi20.04
        capi20.05
        capi20.06
        capi20.07
        capi20.08
        capi20.09
        capi20.10
        --More--

        위에서 보았듯이 이 pipe 응용하면 다양한 작업을 쉽게 할 수 있을 것이다.

      2. 리다이렉션

        방향재지정(Redirection:리다이렉션)이란 표준입력이나 표준출력을 꼭 키보드나 터미널로 하는 것이 아니라 임의로 방향을 바꿔 키보드가 아닌 파일로부터 입력을 받거나, 터미널로 출력하는 것이 아니라 파일로 출력하는 것을 말한다.

        표준입력을 바꿀때는 < 또는 <<를 사용하고, 표준출력을 바꿀때는 > 또는 >>를 사용한다.
        임의의 파일을 작성할때 사용하는 "cat > test"라는 명령을 예로들어 알아보자
        원래 cat는 표준입력인 키보드로부터 입력받은 내용을 표준출력인 터미널로 보내는 명령인데 위의 경우는 표준출력을 터미널이 아닌 test라는 파일로 바꾼 경우이다(표준입력은 그대로 키보드이다).
        즉 키보드에서 입력한 내용이 터미널(화면)에는 다시 표시되지 않고 test 파일속에 들어가는 것이다. 아래를 보라..

        [bluesky@bluestar bluesky]$ cat > test
        이것은 테스트 파일이다.
        ^D
        [bluesky@bluestar bluesky]$ ls
        Desktop hacking han.gif hanterm.gif mbox nsmail public_html test x.gif
        [bluesky@bluestar bluesky]$ vi test
        이것은 테스트 파일이다.
        ~
        ~
        :q!
        [bluesky@bluestar bluesky]$

        이제 반대로 표준출력은 그대로 터미널로 하고 표준입력을 키보드가 아닌 파일로 하는 경우를 보자. 이는 보통 파일의 내용을 볼때 사용하는 "cat test"(test 파일의 내용을 보는 명령) 과 결과는 동일하다. 즉 "cat < test"는 표준 출력은 그대로 터미널이며 표준입력은 키보드가 아닌 test라는 파일이다. 그러므로 위와 같은 명령을 쓰면 test 파일의 내용이 터미널에 표시되는 것이다.

        [bluesky@bluestar bluesky]$ cat < test
        이것은 테스트 파일이다.
        [bluesky@bluestar bluesky]$

        여기서 한가지 주의할 것은 "cat > test" 명령에서 만약 test 라는 파일에 어떤 내용이 들어 있었다면 그 내용은 지워지고 새로운 내용이 들어가게 된다는 것이다. 이런 경우를 방지하려면 기존 내용은 그대로 두고 기존내용의 다음에 새롭게 추가되는 형식으로 명령을 주면되는데 이때에는 > 가 아닌 >>를 사용하면 된다.

        이번에는 표준에러에 대해 알아보자.
        [bluesky@bluestar bluesky]$ ttt
        bash: ttt: command not found
        [bluesky@bluestar bluesky]$
        위를 보면 ttt라는 명령을 내렸는데..그런 명령은 없다고 한다. 이와 같은 에러 메시지를 표준에러(Standard error)라고 한다.
        이런 에러 메시지를 화면상에는 보이지 않고 err라는 파일로 저장하려고 할 경우 아래와 같이 하면 된다.

        [bluesky@bluestar bluesky]$ ttt 2> err
        [bluesky@bluestar bluesky]$
        위와 같이 하면 앞에서처럼 에러메시지가 화면상에는 보이지 않고, err라는 파일의 내용을 보면 거기에 에러 메시지가 있게 된다.

        위에서 2가 표준에러를 의미하는 파일기술자(file descriptor)이다. '0'은 표준입력, '1'은 표준출력을 의미한다.

        지금까지의 내용을 종합해서 /(root)아래에서 중간에 'linux'라는 단어를 포함하는 모든 화일을 찾아서 find라는 파일에 저장하고 에러메시지는 err라는 파일에 저장하려고 할 경우에 아래와 같이 한다.
        [bluesky@bluestar bluesky]$ find / -name *linux* 1> find 2>err
        화면상에는 아무런 내용도 보이지 않는다.
        find의 내용을 보면 아래와 같이 결과가 보인다.
        [bluesky@bluestar bluesky]$ vi find
        /etc/rc.d/init.d/linuxconf
        /etc/rc.d/rc0.d/K00linuxconf
        /etc/rc.d/rc1.d/K00linuxconf
        /etc/rc.d/rc2.d/S99linuxconf
        /etc/rc.d/rc3.d/S99linuxconf
        ...

        그리고 err의 내용을 보면 아래와 같은 접근거부의 에러메시지가 보일것이다..
        [bluesky@bluestar bluesky]$ vi err
        find: /etc/uucp: Permission denied
        find: /tmp/kfm-cache-0: Permission denied
        find: /var/lib/pgsql/base: Permission denied
        find: /var/lib/nfs/sm: Permission denied
        find: /var/lib/nfs/sm.bak: Permission denied
        ...

        이제 마지막으로 표준에러 메시지를 파일이 아니고, 화면상에도 표시되지 않고 그냥 버려버리고 싶을 경우는 아래와 같이 한다.
        [bluesky@bluestar bluesky]$ find / -name *linux* 1> find 2>/dev/null
        위와 같이 하면 에러메시지는 /dev/null이라는 파일에 들어가는 것이 아니고 그냥 버려진다.

        bourne 쉘과 c쉘에서의 입력과 출력방향전환 방법은 약간 차이가 있는데 아래와 같다.
        기호 C shell Bourne shell
        > 표준출력을 새로운 파일로 표준출력을 파일로
        >!-d 표준출력을 기존의 파일로 사용하지 않음
        >> 표준출력을 기존의 파일에 덧붙임 표준출력을 기존의 파일에 덧붙이거나 새로운 파일로
        < 표준입력을 파일에서 표준입력을 파일에서
        >& 표준출력, 에러를 새로운 파일로 사용하지 않음
        >&! 표준출력, 에러를 기준의 파일로 사용하지 않음
        >>& 표준출력과 에러를 기존의 파일에 덧붙임 사용하지 않음
        1> 사용하지 않음 표준출력을 파일로
        2> 사용하지 않음 표준에러를 파일로
        >&2 사용하지 않음 표준출력,표준에러를 결합하고, 결과를 표준출력으로

       


    5. 명령을 내려서 프로세스를 생성시키는 방법에는 두가지가 있다. 하나는 포그라운드이고, 다른 하나는 백그라운드이다.
      쉘 프롬프트 상에서..그냥 명령을 입력하여 실행시키면 그 명령은 포그라운드(Foreground)로 프로세스를 실행하는 것이다.. 포그라운드로 명령을 내리면 쉘은 실행중인 프로세스가 종료가 되기까지 다른 명령을 실행할 수 없도록 쉘 프롬프트를 보여주지 않고 프로세스를 처리한다. 이렇게 포그라운드로 동작중인 프로세스를 강제로 종료시키려고 할 때는 'Ctrl+C' 키를 누르면 실행중인 프로세스가 종료된다. 그러나 어떤 작업을 하다보면 그 작업량이 처리시간이 길어서 오랜 시간 동안 기다려야 할 경우가 생기는데 이럴 경우 해당 작업이 끝날때까지 기다릴 필요없이 다른 작업을 할 수 있도록 해주는 것이 백그라운드인데 이렇게 프로세스를 백그라운드로 프로세스를 생성시키고자 할 경우에는 명령어 다음에 &(앰퍼센드)를 붙여주면 된다. 이렇게 되면 프로세스는 백그라운드로 동작을 하게되고 쉘 프롬프트가 다시 뜨게 되므로 사용자는 다른 작업을 할 수 있게 된다.

      이제 실제로 프로세스를 백그라운드로 생성해보자..
      [bluesky@bluestar bluesky]$ find / -name *linux* > find 2>/dev/null&
      [1] 1033

      위에서 [1]은 작업번호이고 "1033"은 PID(Process ID)이다.
      이렇게 백그라운드로 동작중인 프로세스를 중지시키는 명령이 kill이다. 중지시키는 방법에는 두가지가 있는데 하나는 작업번호로 중지시키는 것이고, 다른 하나는 PID로 중지시키는 것이다.

      그리고 백그라운드로 동작중인 프로세스가 잘 동작중인지 현재 어떤 작업들이 진행중인지를 보는 명령은 jobs이다.
      이제 이들 예를 보기로 하자
      [bluesky@bluestar bluesky]$ find / -name *linux* > find 2>/dev/null&
      [1] 1086
      [bluesky@bluestar bluesky]$ jobs
      [1]+ Running find / -name *linux* >find 2>/dev/null &

      [bluesky@bluestar bluesky]$ kill %1  <- job 번호로 kill 할 때는 kill %작업번호
      [1]+ Terminated 1 find / -name *linux* >find 2>/dev/null
      [bluesky@bluestar bluesky]$ jobs
      진행중인 작업이 없다...

      [bluesky@bluestar bluesky]$ find / -name *linux* > find 2>/dev/null&
      [1] 1108
      [bluesky@bluestar bluesky]$ ps
      PID TTY TIME CMD
      1014 ttyp1 00:00:00 bash
      1108 ttyp1 00:00:02 find
      1109 ttyp1 00:00:00 ps
      [bluesky@bluestar bluesky]$kill 1108  <- PID로 kill 할때는 kill PID
      [1]+ Terminated 1 find / -name *linux* >find 2>/dev/null

      [작업전환]
      1. 포그라운드로 현재 실행중인 프로세스를 백그라운드로 전환하려면 일단 'Ctrl+Z'키를 눌러 잠시 sleeping 상태로 만든 다음 'bg' 명령을 내리면 백그라운드로 동작하게 된다.
      2. 백그라운드로 실행중인 프로세스를 포그라운드로 전환하기 위해서는 'fg' 명령을 이용하는데 그냥 'fg' 명령을 내리면 가장 최근 작업이 포그라운드로 전환이 된다. 어떤 특정 작업을 포그라운드로 전환하고 싶으면 'fg %[작업번호]' 의 명령을 내리면 된다.(작업번호는 jobs로 알아본다.)



    6. 쉘은 자신이 해석할 수 있는 명령들로 이루어진 문서를 보고 그에 따라 작업을 수행할 수 있는 능력이 있다. 이러한 문서를 쉘 스크립트(script) 또는 쉘 프로그램이라고 하는데 DOS의 autoexec.bat와 비슷하지만 이와는 비교가 되지 않을 만큼 많은 일을 할수 있는것이 쉘 스크립트이다.

      쉘 스크립트에 대해 이야기하기 전에 먼저 리눅스 시스템에서 Power On에서부터 Prompt가 뜰때까지의 과정에 대해 먼저 살펴보자.

      • 1. 컴퓨터가 켜지면, POST 과정에 의해 시스템이 초기화된다.
        2. Boot record나 하드인 경우 MBR(Master boot record)를 읽어 들인다.
        3. LILO(Linux Loader)가 실행된다. 만일, 디폴트인 리눅스가 로딩되기 전에 Ctrl, Shift, Alt 중 하나를 누르고 있으면, LILO는 부팅할 운영체제를 물어 본다.
        4. Kernel이 메모리로 로딩되며, 만일 커널이 압축되었다면 압축을 해제한다.
        5. 커널은 하드, 플로피, 네트웍 어댑터 등을 검사하며, 디바이스 드라이버를 설정한다.
        6. 리눅스는 프로세서를 보호모드로 전환시킨다. 화면상의 변화는 나타나지 않는다.
        7. root 파일 시스템을 마운트시킨다. root 파일 시스템은 'rdev'나 LILO에 의해 설정되어 있으며, 파일 시스템의 형태는 자동적으로 검출된다.
        8. 커널은 /etc/init을 백그라운드로 실행한다. 'init'는 'inittab' 파일의 내용에 따라 실행된다.
        9. init는 /etc/rc를 실행한다.
        10. 'rc'는 /etc/rc.local이나 /etc/rc.[0-9]등을 실행시킨다.
        11. 'init' 프로그램은 가상 콘솔을 위해 /etc/gettytabs에 의해 설정된 직렬 라인으로 getty를 실행한다.
        12. ID와 패스워드를 입력한다.
        13. shell이 작동하고 bash shell이면 .bashrc를 , tcsh shell이면 .profile을 불러들인다.
        14. 프롬프트가 표시된다.


      위에서 8,9,10번에서 나온 /etc/inittab, /etc/rc, /etc/rc.local들이 모두 쉘 스크립트들인데, 여러가지 환경변수들을 설정하고 시스템 시작을 위한 여러가지 설정을 하는 스크립트들이다..

      [/etc/rc.d/rc]
      #!/bin/bash
      #
      # rc This file is responsible for starting/stopping
      # services when the runlevel changes. It is also
      # responsible for the very first setup of basic
      # things, such as setting the hostname.
      #
      # Original Author:
      # Miquel van Smoorenburg,
      #

      # Source function library.
      . /etc/rc.d/init.d/functions
      # Now find out what the current and what the previous runlevel are.
      argv1="$1"
      set `/sbin/runlevel`
      runlevel=$2
      previous=$1
      export runlevel previous

      # See if we want to be in user confirmation mode
      if [ "$previous" = "N" ]; then
      if grep -i confirm /proc/cmdline >/dev/null ; then
      CONFIRM=yes
      else
      CONFIRM=
      fi
      fi

      # Get first argument. Set new runlevel to this argument.
      [ "$1" != "" ] && runlevel="$argv1"
      ....
      ....

      위와 같은 시스템 부팅과 관계되는 쉘 스크립트들은 잘못 건드리면 부팅이 안되는 경우가 있으므로 어느정도 시스템에 대해 알기전까지는 섣불리 건드리지 않는 것이 좋다.

      이제 쉘스크립트에 대해 하나하나씩 알아보기로 하자.
      기본적으로 쉘 스크립트는 유닉스/리눅스 명령들의 나열이라고 생각할 수 있다.
      먼저 가장 기본적인 쉘스크립트인 "Hello!" 를 출력하는 스크립트를 test.sh란 파일명으로 하나 만들어 보자.

      [bluesky@bluestar bluesky]$ cat > test.sh  <- '.sh'은 꼭 써줄 필요는 없다.
      #!/bin/sh
      #
      # simple shell script.
      #
      echo Hello!
      [bluesky@bluestar bluesky]$ ls
      Acrobat30 acro30.tgz hacking mbox public_html x.gif
      Desktop bin hanterm.gif nsmail test.sh
      [bluesky@bluestar bluesky]$

      위와 같이 test.sh 라는 스크립트를 하나 작성하였는데,
      첫줄은 사용할 쉘을 지정하는 부분이다. "#!"표시가 파일의 첫행 첫칸에 나타나면 그뒤에 지정된 것은 이 스크립트를 실행할 쉘을 지정한 정보로 인식된다. 위와 같이 경로가 포함된 쉘을 지정해주면 된다.
      이러한 쉘 지정문구는 생략될수도 있으나 생략된다면 원하지 않는 쉘에 의해서 실행될수도 있으므로 지정해주는 것이 좋다.

      그 다음 # 문자는 주석문을 사용할때 쓰는것으로 # 문자가 나타나면 그행의 끝까지는 주석문으로 처리된다.

      그 다음은 실제 실행될 내용이다. (echo 명령으로 Hello!를 출력하라!)
      이러한 쉘스크립트를 실행하는 방법은,

      쉘에게 수행하도록 스크립트 파일명을 인수로 넘겨주는 방법과 스크립트 자체에 실행권한을 주어 스크립트 자체로 실행하는 두가지 방법이 있으며, 아래와 같이 결과는 동일하다.

      [bluesky@bluestar bluesky]$ sh test.sh  <- 쉘에게 인수로 넘겨주는 방법
      Hello!

      [bluesky@bluestar bluesky]$ test.sh
      bash: test.sh: command not found  <- 실행권한이 없으므로 자체로는 실행이 안됨.

      [bluesky@bluestar bluesky]$ ls -l test.sh
      -rw-rw-r-- 1 bluesky bluesky 49 Apr 20 09:41 test.sh
      [bluesky@bluestar bluesky]$ chmod a+x test.sh
      [bluesky@bluestar bluesky]$ ls -l test.sh
      -rwxrwxr-x 1 bluesky bluesky 49 Apr 20 09:41 test.sh
      [bluesky@bluestar bluesky]$ ./test.sh  <- 실행권한을 주어 자체로 실행
      Hello!
      [bluesky@bluestar bluesky]$

      이제 본격적으로 스크립트 작성시 자주 사용되는 변수 접근 방법과 셀 명령에 대해 알아보자.
      쉘스크립트내에서 아래와 같은 변수 접근 방식들이 어떻게 해석되는지를 보면,

      $name
      - name의 값으로 대치된다.

      ${name}
      - 역시 name의 값으로 대치된다. 변수이름과 다른 구문이 인접해 있어 서로 명확히 구분지어줄 때 사용..

      ${name-word}
      - name이 정의되어 있으면 그 값을, 그렇지 않으면 word에 명시된 값을 사용한다.

      아래의 차이를 보면 알 수 있다.
      [bluesky@bluestar bluesky]$ cat > test1
      #!/bin/sh
      name="hello everyone!"   <- 변수지정시 '=' 양쪽에 공란이 있어서는 안된다(C shell은 허용)
      echo ${name-hello!}
      ^D
      [bluesky@bluestar bluesky]$ chmod 755 test1
      [bluesky@bluestar bluesky]$ test1
      hello everyone!

      [bluesky@bluestar bluesky]$ cat > test1
      #!/bin/sh
      name1="hello everyone!"
      echo ${name-hello}
      ^D
      [bluesky@bluestar bluesky]$ chmod 755 test1
      [bluesky@bluestar bluesky]$ test1
      hello  <- name이라는 변수가 없으므로 hello를 출력한다.

      ${name+word}
      - name이 정의되어 있어야 word 값을 사용한다.

      ${name=word}
      - name이 정의되지 않았으면 word를 대입하고 그것을 사용한다.

      ${name?word}
      - name이 정의되어 있으면 그것을 사용하고, 그렇지 않다면 표준 에러 채널로 word를 출력한 후에 종료한다.
      이외에도 많으나 자세한 것을 여러 유닉스/리눅스 책을 보기 바란다.


      [인수받기와 read 명령]
      - 거의 모든 프로그램들은 실행시에 자신의 이름 뒤에 추가되는 인수들을 받는데, 쉘 스크립트도 인수를 받을 수 있다. 실행시 주어진 인수들을 쉘에 의해 $1부터 $2, $3... 등등 변수에 차례로 전달된다.
      아래에 그 예가 있다.

      [bluesky@bluestar bluesky]$ cat > argu
      #!/bin/sh
      echo 1st arg. : $1
      echo 2nd arg. : $2
      echo 3rd arg. : $3
      echo Everything : $* and total args : $#
      ^D

      [bluesky@bluestar bluesky]$ chmod 755 argu
      [bluesky@bluestar bluesky]$ argu Hello Every one
      1st arg. : Hello
      2nd arg. : Every
      3rd arg. : one
      Everything : Hello Every one and total args : 3
      [bluesky@bluestar bluesky]$

      위에서 '$*'와 '$#'는 실행결과를 보면 의미를 알 수 있을 것이다.
      그리고 위에서는 세개의 인수를 받도록 했는데 실행시 두개또는 네개의 인수를 주었을 경우는 에러는 발생하지 않고 주어진 변수만을 순서대로 처리한다(직접 확인해 보기 바란다).

      또한 쉘은 시스템 환경변수를 그대로 사용할 수 있는데 시스템 환경변수는 env 명령으로 볼 수 있다.

      [bluesky@bluestar bluesky]$ env | more
      USERNAME=root
      ENV=/home/bluesky/.bashrc
      QT_HANFONT=*-kodig-medium-r-normal--12-*-ksc5601*,*-kodig-medium-r-normal--14-*-
      ksc5601*,*-kodig-medium-r-normal--16-*-ksc5601*,*-kodig-medium-r-normal--20-*-ks
      c5601*,
      QT_KEYBOARD=2
      HISTSIZE=1000
      HOSTNAME=bluestar.linuxnet.ac.kr
      LOGNAME=bluesky
      HISTFILESIZE=1000
      MAIL=/var/spool/mail/bluesky
      TERMCAP=xterm|vs100|xterms|xterm terminal emulator (X Window System):Km=\E[M:ac=
      ++,,--..00``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:u6=\E[%i%d;%dR:u7
      =\E[6n:u8=\E[?1;2c:u9=\E[c:am:bs:km:mi:ms:xn:co#80:it#8:li#24:*6=\E[4~:@0=\E[1~:
      AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:
      F5=\E[28~:F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:LE=\E[%dD:RI=\E[%dC:
      UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:
      cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:eA=\E)0:ei=\E[4l:ho=\E[H:im=
      \E[4h:is=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EO
      S:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=\E[3~:kI=\E[2~:
      kN=\E[6~:kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EO
      A:le=^H:md=\E[1m:me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:r2=\E7\E[r\E[m\E[?7h\E[?
      --More--

      이런 환경변수들도 아래와 같이 사용될 수 있다.
      [bluesky@bluestar bluesky]$ cat > envargs
      #!/bin/sh
      echo USER = $USERNAME
      echo TERMINAL = $TERM
      echo SHELL = $SHELL
      echo HOSTNAME = $HOSTNAME
      echo DISPLAY = $DISPLAY
      [bluesky@bluestar bluesky]$ chmod 755 envargs
      [bluesky@bluestar bluesky]$ envargs
      USER = root
      TERMINAL = xterm-color
      SHELL = /bin/bash
      HOSTNAME = bluestar.linuxnet.ac.kr
      DISPLAY = 192.168.1.10:0.0
      [bluesky@bluestar bluesky]$

      이번에는 read 명령에 대해서 알아보기로 하자. 사용자는 쉘을 실행할 때 인수로서 데이타를 줄 수도 있지만, 실행 중에 나오는 입력 프롬프트에 값을 줄 수도 있다. 이것은 read 명령으로 구현하는데 형식은 아래와 같다.

      read 변수명(들)

      read 명령은 사용자가 공백 문자에 의해 구분되는 여러개의 값을 입력하면, read 구문에 명시된 변수들에 차례로 대입한다. 만일 변수의 갯수보다 많은 입력이 들어오면, 마지막 변수에 나머지 값을 모두 대입한다. 아래를 보자.

      [bluesky@bluestar bluesky]$ cat > readdata
      #!/bin/sh
      echo -e "Input two data : "
      read first second
      echo First : $first
      echo Second : $second
      ^D

      [bluesky@bluestar bluesky]$ chmod 755 readdata
      [bluesky@bluestar bluesky]$ readdata
      Input two data :
      blue dark  <- 사용자 입력 데이타
      First : blue
      Second : dark
      [bluesky@bluestar bluesky]$

      [산술연산]
      - 수치계산을 수행할 때는 expr를 사용하는데, 이것은 쉘이 내부적으로 가지고 있는 명령이 아니라 하나의 유틸리티로 존재하는 프로그램이다. expr는 연산식을 인수로 받고, 그 결과 값을 리턴 값으로 돌려준다.
      expr를 사용하기 위해 알아야 할 것은, 인수로 주어지는 연산식을 표현하는 방법이다. 많은 표현이 쉘이 사용하는 문자와 구분되기 위해서 백슬래쉬 문자(\)와 조합된다. 또한 모든 요소들은 공백 문자로 분리되어야 한다. 그렇지 않으면 모두 하나의 요소로 취급되기 때문에, 원하는 결과를 얻을 수 없다.

      expr가 사용하는 기본적인 표현 요소들은 아래와 같다.
      \* : 곱하기
      \/ : 나누기
      % : 나머지
      + : 더하기
      - : 빼기
      = \> \< \<= \>= != : 비교 연산자
      \& : and 연산자
      \| : or 연산자
      \( \): 괄호
      length 문자열 : 문자열의 길이를 반환한다.
      -> 이외에도 더 많이 있으나 여기까지만 알아두기로 하고 아래의 예를 보자..

      [bluesky@bluestar shell_scripts]$ cat > exprex
      #!/bin/sh
      var=`expr 5 \* 10`
      echo $var
      echo `expr length Programming!`
      ^D

      [bluesky@bluestar shell_scripts]$ chmod 755 exprex
      [bluesky@bluestar shell_scripts]$ exprex
      50
      12
      [bluesky@bluestar shell_scripts]$
      위에서 `는 back quotes(~아래이 키)이다.
      여기서 잠깐 single quotes, double quotes, backslash, back quotes들이 쉘 스크립트내에서 어떤식으로 사용되는지 잠깐 살펴보면,
      double quotes(" ") : 문자열을 표기, 변수에 사용하면 변수에 들어간 내용을 하나의 인자로 해석함.
      single quotes(' ') : 문자열을 표기, 변수에 사용하면 변수명 자체를 그냥 문자열로 표기
      back slash(/ ) : 문자의 특수한 기능을 제거한다. 따라서 일반문자로 인식시켜 준다.
      back quotes(` `) : 명령어로 인식, 묶여진 문자열은 명령어로 인식되고, 변수에는 명령어의 결과값이 들어간다.

      [test 명령]
      - 참과 거짓에 따른 논리식의 값에 근거하여, 분기되는 동작은 매우 중요하다. 그러한 판단에 의해 분기하기 위해서는, 먼저 비교 판단 작업이 있어야 하는데 test는 이러한 판단 작업에 사용되는 명령이다. 또한, test 대신 대괄호 [ ]를 사용할 수도 있는데 그 효과는 같다.

      test 표현식 or [ 표현식 ]

      대괄호를 사용할 때 각 괄호 문자는 반드시 공백으로 다른 문자와 구분되어져야 한다. 이러한 표현 방법은 쉘이 그것을 직접 해석하기 때문이다.
      기본적으로 사용되는 표현들은 아래와 같고, 공백문자는 생략되어서는 안된다.
      형식 의미
      문자열 = 문자열 두 문자열이 같으면 참
      문자열 != 문자열 두 문자열이 같지 않으면 참
      문자열 문자열이 널(null)이 아니면 참
      -l 문자열 문자열의 길이를 계산
      정수1 -eq 정수2 정수1이 정수2와 같으면 참
      정수1 -ne 정수2 정수1이 정수2와 같지 않으면 참
      정수1 -gt 정수2 정수1이 정수2 보다 크면 참
      정수1 -ge 정수2 정수1이 정수2 보다 크거나 같으면 참
      정수1 -lt 정수2 정수1이 정수2 보다 작으면 참
      정수1 -le 정수2 정수1이 정수2 보다 작거나 같으면 참
      !표현식 표현식이 참이면 거짓, 거짓이면 참
      표현식 -a 표현식 양쪽 표현식이 모두 참일 때만 참(and)
      표현식 -o 표현식 양쪽 표현식 중 하나 이상만 참이면 참(or)
      \( 표현식 \) 표현식에 괄호를 사용

      또한 파일의 형태를 검사하는 표현식도 있는데 이는 다음과 같다.
      형식 의미
      -b 파일명 파일이 블록 접근 형태의 파일이면 참
      -c 파일명 파일이 문자 접근 형태의 파일이면 참
      -d 파일명 파일이 디렉토리 형태의 파일이면 참
      -f 파일명 파일이 일반 형태의 파일이면 참
      -g 파일명 파일이 set-group-id 파일로 존재하면 참
      -h 파일명 파일이 심볼릭 링크 형태의 파일이면 참
      -n 문자열 문자열이 하나 이상의 길이를 가진다면 참
      -p 파일명 파일이 파이프로 존재하면 참
      -r 파일명 파일이 읽을 수 있는 권한을 가지면 참
      -s 파일명 파일이 하나 이상의 문자를 가지면 참
      -t 파일기술자 파일 기술자(description)가 터미널과 연관되어 있으면 참
      -u 파일명 파일이 set-user-id 파일로 존재하면 참
      -w 파일명 파일이 수정될 수 있는 권한을 가지면 참
      -x 파일명 파일이 실행할 수 있는 권한을 가지면 참
      -z 파일명 파일이 문자를 가지지 않으면 참

      이와 같은 표현식들은 보통 제어구조와 같이 사용되는데 이제 제어구조에 대해 알아보자.

      [if...then]
      if 표현식
      then
          명령들
      elif 표현식
      then
          명령들
      else
          명령들
      fi

      [bluesky@bluestar shell_scripts]$ cat > ifelse
      #!/bin/sh
      echo -e "Input number :" ; read num   <- 한라인에 둘이상의 명령시는 ;으로 구분
      if [ $num -eq 15 ]
      then
           echo Same!!
      elif [ $num -gt 15 ]
      then
           echo Big!!
      else
           echo Small!!
      fi   <- fi는 반드시 개행후 사용해야 쉘이 인식한다.
      ^D

      [bluesky@bluestar shell_scripts]$ chmod 755 ifelse
      [bluesky@bluestar shell_scripts]$ ifelse
      Input number :
      30
      Big!!
      [bluesky@bluestar shell_scripts]$

      [case 분기문]
      case 구문 in
        패턴) 명령들 ;;
        패턴) 명령들 ;;
      ...
      esac

      아래의 예를 보면 쉽게 이해가 갈것이다. 사용자의 입력에 따라 다른 내용의 문자열 출력한다.
      [bluesky@bluestar shell_scripts]$ cat > case
      #!/bin/sh
      echo "**** my profile ****"
      echo "**** Mr. Park ****"
      echo 1\) Birth Day.
      echo 2\) Address.
      echo 3\) Work.
      echo Q\) Quit \(Don\'t you have interest in me?\)
         read select

      case $select in
         1) echo "1969.09.18 (10.01 of the lunar)"
           echo "Remember-!";;  <- 각 case의 마지막은 double 셈콜론
         2) echo "shihung-si Kyounggi-do";;
         3) echo "I\'m computer programmer...";;
      Q|q) echo "See you again!";;   <- Q or q이면
         *) echo "Select error...";;   <- 그외인 경우
      esac
      ^D

      [bluesky@bluestar shell_scripts]$ chmod 755 case
      [bluesky@bluestar shell_scripts]$ ./case
      **** my profile ****
      **** Mr. Park ****
      1) Birth Day.
      2) Address.
      3) Work.
      Q) Quit (Don't you have interest in me?)
      1
      1969.09.18 (10.01 of the lunar)
      Remember-!

      [bluesky@bluestar shell_scripts]$ ./case
      **** my profile ****
      **** Mr. Park ****
      1) Birth Day.
      2) Address.
      3) Work.
      Q) Quit (Don't you have interest in me?)
      3
      I\'m computer programmer...

      [bluesky@bluestar shell_scripts]$ ./case
      **** my profile ****
      **** Mr. Park ****
      1) Birth Day.
      2) Address.
      3) Work.
      Q) Quit (Don't you have interest in me?)
      5
      Select error...
      [bluesky@bluestar shell_scripts]$

      case문의 분기조건은 변수만 사용되는 것은 아니다. 필요에 따라서는 다른 프로세스의 리턴값이 그래도 사용될 수도 있다.

      case `find -name data.txt` in
        0) echo find it!!;;
        *) echo can\'t find...;;
      esac

      위의 예는 find의 수행결과가 case의 분기조건으로 사용되고 있는데, 프로세스들은 성공하면 0을 리턴한다.

      [for/while 루프문]
      for 변수명 [ in 대입값들 ]
      do
        실행구문
      done

      for문에서 주의할 것은 보통의 고급 언어에서 사용하듯이 변수의 수치 값을 증감하면서 반복되는 것이 아니라는 것이다.
      반복되는 부분은 do와 done 문의 사이에 위치한 명령들이다. for 문은 그곳을 지정된 변수의 값을 바꾸면서 반복한다. 변수의 이름은 for문 뒤에 지정되며, 순서대로 대입되는 값들은 in 지시문 다음에 나열된다. 역시 아래의 예를 보자.

      [bluesky@bluestar shell_scripts]$ cat > forex
      #!/bin/sh
      for friend in Victor Sisap Qwfwq "Every girl"
      do
        echo $friend is my friend.
      done
      ^D

      [bluesky@bluestar shell_scripts]$ chmod 755 forex
      [bluesky@bluestar shell_scripts]$ forex
      Victor is my friend.
      Sisap is my friend.
      Qwfwq is my friend.
      Every girl is my friend.
      [bluesky@bluestar shell_scripts]$
      (in 다음의 대입값들은 스크립트내에서 주지 않고 인수로 주어 실행할 수도 있다.)

      [while 루프문]
      while 조건
      do
        실행구문
      done

      조건이 만족하면 do와 done 사이에 있는 구문들을 한번 실행하고 다시 처음의 조건문으로 돌아온다. 계속 그런 동작을 반복하다가 조건이 만족하지 못하면 루프를 벗어난다.

      [bluesky@bluestar shell_scripts]$ cat > whileex
      #!/bin/sh
      echo "**** my profile ****"
      echo "**** Mr. Park ****"
      echo 1\) Birth Day.
      echo 2\) Address.
      echo 3\) Work.
      echo Q\) Quit \(Don\'t you have interest in me?\)
         select=0

      while [ \( $select != Q \) -a \( $select != q \) ]
      do
         read select

         case $select in
           1) echo "1969.09.18 (10.01 of the lunar)"
              echo "Remember-!";;
           2) echo "shihung-si Kyounggi-do";;
           3) echo "I\'m computer programmer...";;
       Q|q) echo "See you again!";;
           *) echo "Select error...";;
        esac
      done
      ^D

      [bluesky@bluestar shell_scripts]$ chmod 755 whileex
      [bluesky@bluestar shell_scripts]$ whileex
      **** my profile ****
      **** Mr. Park ****
      1) Birth Day.
      2) Address.
      3) Work.
      Q) Quit (Don't you have interest in me?)
      1
      1969.09.18 (10.01 of the lunar)
      Remember-!
      2
      shihung-si Kyounggi-do
      q
      See you again!
      [bluesky@bluestar shell_scripts]$

      [쉘 함수]
      쉘 스크립트를 배우면서 추가적으로 한가지 더 알아볼 것은 쉘 함수이다. 사용자는 자신이 작성한 스크립트 루틴을 C 함수와 유사한 문법으로 묶어놓고 호출할 수 있다. 쉘 함수는 다음과 같은 형식을 갖는다.

      이름 ()
      {
        명령들
      }

      먼저 아래와 같이 입력해보자.
      $today ( )

      엔터키를 누르면, 무슨일이 일어났는가??? 어떤 수행결과가 나타나는 것이 아니라, 쉘의 보조 프롬프트(일반적으로 > 문자)가 나타난다. 쉘은 추가적인 입력을 기다리는 것이다. 임의의 이름으로 함수를 지정했지만 아직 함수의 내용은 지정해 주지 않았기 때문에 함수의 내용을 완성하기 위해 추가적인 입력을 기다리는 것이다.
      완전한 함수의 형태를 만들기 위해 > 프롬프트에서 아래와 같이 입력해보자.
      (달력과 시간을 보여주는 함수로 구성한다.)

      > {
      > cal
      > date
      }
      [bluesky@bluestar shell_scripts]$

      위와 같이 중괄호를 닫아서 함수를 완성하면 쉘은 곧장 보조 프롬프트를 종료하고 다시 명령을 기다리는 본래의 프롬프트로 돌아간다. 그렇다면 지금까지 무슨 일이 일어났는가???
      이렇게 되면 쉘은 today 함수의 내용을 기억하고 있는 상태이다. 사용자는 이제 언제든지 원할때 today 함수를 호출할 수 있는 것이다. 이것은 마치 쉘 스크립트가 쉘의 메모리 영역으로 들어간 것과 같다. 이제 직접 이 함수를 호출해 보자.

      [bluesky@bluestar shell_scripts]$ today
      February 2000
      Su Mo Tu We Th Fr Sa
                                    1
      2    3    4    5   6   7   8
      9  10   11  12  13  14  15
      16 17  18  19  20  21  22
      23 24  25  26  27  28  29
      30
      Thu Apr 20 20:30:42 KST 2000
      [bluesky@bluestar shell_scripts]$

      위의 함수는 아래와 같이 한줄로 구성할 수도 있다.
      [bluesky@bluestar shell_scripts]$ today () { cal; date }

      이렇게 정의된 쉘 함수는 함수를 해제하기 전까지 언제나 호출 가능한데 함수를 해제하고자 할 경우에는 unset 명령을 사용한다. 이렇게 unset으로 해제한 이후에는 해제된 함수는 더이상 사용할 수 없게 된다.

      [bluesky@bluestar shell_scripts]$ unset today
      [bluesky@bluestar shell_scripts]$ today
      bash: today: command not found


      지금까지 쉘 프로그래밍을 위한 기초적인 것들을 알아보았는데, 이를 바탕으로 자신만의 스크립트들을 작성해 보기바란다. (게임, 초기화 스크립트, 기타 유틸 스크립트 등등..)
      쉘 스크립트가 가장 중요하게 사용되는 경우는 바로 초기화 스크립트를 만드는 경우인데, 각 사용자마다 자신의 쉘이 처음 실행될 때 사용되는 쉘 스크립트를 만들 수 있으며 쉘의 종류마다 그 이름이 다르다.
      bash 쉘은 .bash_profile 이라는 스크립트 파일을 사용하는데, 처음 로그인하여 쉘이 시작될 때 사용자의 home 디렉토리에서 그러한 파일이 있는지를 살펴보고, 있다면 파일의 내용을 읽어서 그에 따라 명령들을 수행한다.
      자신의 home 아래의 .bash_profile 파일을 한번분석해보고 자신만의, 자신의 환경에 맞게 고쳐보기 바란다.--;


  5. 초기의 컴퓨팅 환경(이후 70년대까지..)은 사용자들이 모든 명령을 일일이 직접 입력해주어야 하는 CUI(Command line User Interface) 였다. 이런한 CUI 환경은 지금 생각하면 너무나도 불편했음에도 불구하고 오랜동안 버텨오다 80년대로 접어들면서 사람들의 미적 감각이 증가하면서 부터 GUI(Graphic User Interface) 환경이 요구됨에 OS/2나 Windows와 같은 OS들이 나오게 되었다.
    유닉스 계열도 예외는 아니었다. 이러한 요구에 따라 MIT에서 개발된 X window 시스템은 유닉스의 표준 GUI 환경으로서 많은 응용 프로그램을 지원하며, 완벽한 멀티태스킹을 지원하는 유닉스를 기반으로 만들어졌기 때문에 여러개의 윈도우를 열어 다중 작업을 할 수 있으며, 네트웍을 통해 다른 시스템의 X window 어플리케이션도 실행시킬수 있다. 또한 다른 GUI 환경의 OS가 요구하는 턱없이 높은 시스템 사용을 필요로 하지 않는다.
    (92년 리눅스를 처음 접했을 때 386DX에 4M RAM 비디오 메모리 1M 의 시스템에서도 X 윈도우에서 멀티태스킹이 가능했던 것으로 기억된다. - 당시 windows3.1에서는 생각지도 못한...- 속도가 조금 느리긴 했지만 나름대로 신기했음..)



    1. X window는 1984년 MIT(Massachusetts Institute of Technology)에서 DEC(Digital Equipment Corporation)의 지원을 받아 Athena 프로젝트에서 그래픽 사용자 인터페이스에 대한 필요성을 느끼면서 설계되었는데, 스탠포드 대학에서 V라는 OS에서 사용하기 위해 개발된 W라는 윈도우 시스템으로부터 그 기초를 가져왔다. 그래서 W의 다음 알파벳인 X를 사용하여 X Window라고 이름이 붙여졌다는 이야기도 있고, X window가 주로 UNIX에서 사용되는 것이기 때문에 UNIX의 끝 문자인 X를 가져온 것이라는 얘기도 있다.

      어쨌든 X window의 초기 버젼은 주로 MIT와 DEC에서 사용되었지만 1986년 X10R4(X window System Version 10 Release 4)가 일반에 공개되면서 그 기능을 인정받아 본격적으로 사용자 층을 넓혀가면서 UNIX 시스템에서의 표준 GUI 환경으로 자리잡게 되었다. 그후 1987년 MIT에서 X11이 발표되고 꾸준한 성능개선으로 X11R4, X11R5, X11R6(X11 Release 6, X11.6) 버젼까지 발표되었으며, 현재 다양한 기종에서 다양한 X window가 사용되고 있다.

      리눅스에서는 David Wexelblat를 중심으로한 프로그래머들이 이 X11을 기반으로 사용하여 인텔의 x86계열 프로세서에서 동작할 수 있도록 포팅한 XFree86을 사용하고 있다. XFree86은 리눅스만을 위해서 만들어진 것이 아니라 리눅스를 포함한 System V/386이나 386BSD와 같이 인텔의 x86 계열 프로세서에 사용되는 유닉스에서 X window를 사용할 수 있도록 하기 위한 목적으로 만들어진 것이다.



    2.  
      1. 뛰어난 이식성
        X는 유닉스를 운영하는 PC를 비롯하여, 거의 모든 웍스테이션에 이식되어 있으며, Mac이나 Amiga에서도 가능하며 Cray 같은 수퍼 컴퓨터에서도 구동이 되는 뛰어난 이식성을 가지고 있다.

      2. 클라이언트-서버 구조

        클라이언트는 이런 것이고 서버는 이런 것이다라고 한마디로 말하기는 어렵지만 일반적으로 네트웍을 통해서 어떤 자원을 제공해주는 시스템을 서버(Server)라 하고, 그 자원을 제공받아 활용하는 시스템을 클라이언트(Client)라 한다.
        그런데 X window에서는 이 클라이언트-서버에 대한 개념이 좀 다르다. 앞의 클라이언트-서버 개념을 X window에 적용시키면 X window 서버역할을 하는 시슨템이 어딘가에 있어서 사용자가 네트워크를 통하여 그 서버의 X window를 사용하는 형태가 되어야겠지만 그것과는 조금 다른 개념이다.

        사용자가 네트웍에 연결되어 있는 시스템이든 그렇지 않든 자신의 시스템에 X window를 설치했다면 이미 X 서버와 X 클라이언트가 모두 설치되어 있는 상태다. 또한 어떤 X window 프로그램을 사용하고 있다면 X 서버를 통해 X 클라이언트와 통신을 하고 있는 중인 것이다.
        즉, X 클라이언트란 바로 사용자가 어떤 작업을 하기위해 실행시킨 X window 프로그램을 말하여, X 서버란 사용자가 그러한 클라이언트 프로그램을 사용하기 위해서 필요한 키보드를 통한 입력이나 클릭 및 윈도우의 사이즈 조정, 위치변경 등 사용자로부터 주어지는 일련의 입력정보를 받아서 해당 X 클라이언트에게 전달해 주는 역할을 한다.
        이러한 클라이언트-서버 구조로 인해 위의 그림과 같이 A의 컴퓨터에서 B의 X 서버에게 X 클라이언트 실행을 요청하여 자신의 디스플레이 장치 또는 서버의 디스플레이 장치에 실행결과를 보여주게 할수도 있다.

        아래는 A(192.168.1.10)에서 B(192.168.1.11)의 X 서버에 XV라는 X용 프로그램의 실행을 요청하여 A의 디스플레이 장치에 그 결과를 보여주고 있는 화면이다.

        이제 XV를 A가 아닌 서버가 있는 B의 디스플레이 장치에서 실행하고 싶다면 A의 터미널 상에서 다음과 같은 명령을 주면 된다.

        $export DISPLAY=192.168.1.11:0.0

        이렇게 하고 나면 A의 터미널에서 xv를 실행하면 실행된 화면은 아래와 같이 A가 아닌 B의 디스플레이 장치에 표시가 된다. (실제 B에 표시된 화면은 생략한다.)


      3. 장치 독립성
        X 시스템은 하드웨어의 제어에 필요한 것들을 모두 처리해주는 X 서버가 있기 때문에 X 클라이언트가 어떤 종류의 키보드나 마우스, 시스템에서도 실행이 될 수 있는 뛰어난 '장치 독립성'을 지닐수 있게 된다. 이것은 네트웍을 통해서 다른 시스템의 X 클라이언트를 하드웨어 사양이 틀린 자신의 시스템에서 실행시키고자 할 때 그 진가를 발휘하게 된다. 즉, 한 화면에서 자신의 컴퓨터에서 실행중인 X 클라이언트와 다른 시스템메서 실행시킨 X 클라이언트를 동시에 볼 수 있는 것이다.

        예를 들어서 x term을 이용해서 다른 시스템에 있는 X eyes를 실행시켰다고 하자. 그러면 분명 다른 사양의 하드웨어에 설치되어 있는 X 클라이언트 중 하나인데도 불구하고, 자신의 시스템에서도 마우스의 움직임을 따라서 아무 이상 없이 잘 굴러다니는 눈동자를 볼 수 있을 것이다.
        아래는 A(192.168.1.10)의 터미널 상에서 B(192.168.1.11)의 X 클라이언트인 X eyes를 실행시킨 화면이다. 역시나 눈동자가 잘도 굴러다니네..(참고로 xeyes는 마우스의 움직임에 따라 눈동자가 따라 움직이는 X 클라이언트임.)
        참고화면

      4. 투명한 네트워크
        앞의 장치 독립성에서도 보았듯이 한 화면에 다른 시스템에서 실행시킨 X 클라이언트와 자신의 시스템에서 실행중인 X 클라이언트를 동시에 볼 수 있는데, 이처럼 다른 시스템에서 동작하고 있는 프로그램을 자신의 시스템을 통해서 볼 수 있고, 마찬가지로 자신의 시스템에서 동작하고 있는 프로그램의 출력을 다른 시스템으로 보낼 수도 있는데, 이러한 것을 네트워크가 투명하다(transparent network)고 한다. 네트워크 투명성은 특히 분산처리 환경에서 중요하게 부각되는 부분인데, 전체 네트워크의 투명성이 잘 보장되면 사용자들은 연결된 모든 컴퓨터들을 마치 하나의 컴퓨터처럼 사용할 수 있게 되는 것이다.

      5. 정해져 있지 않은 윈도우 자원
        OS/2나 Windows 95/98과 같은 GUI 환경의 OS는 각각 정해진 형태의 타이틀 바(title bar 혹은 caption bar), 메뉴, 스크롤바(scroll bar) 등과 같은 인터페이스를 가지고 있다. 그러나 X window는 이러한 인터페이스의 형태를 정의하고 있지 않기 때문에 다양한 형태의 인터페이스를 가질 수 있다.

        그래서 다양한 윈도우 매니저(예를 들면, mwm, twm, fvwm, olvm, window maker, KDE, GNOME, AfterStep 등등..)를 사용해 윈도우 매니저를 바꾸어 주면 전혀 다른 인터페이스로 모습이 바뀌는 X window의 모습을 볼 수 있다. 단순히 색이 바뀌는 정도가 아니라 윈도우 틀(frame)과 캡션 바(caption bar) 등의 모습을 완전히 바꿀수 있다. 이것은 X window의 구조가 완벽하게 객체 지향(object-oriented) 구조를 가지고 있기 때문에 가능한 것이다.

       


    3. X 윈도우의 설정은 요즘은 거의 대부분의 배포본에서 설치시에 X 윈도우 설치과정도 함께 포함되어 있으며 그래픽카드도 대부분 자동으로 검색해주므로 크게 어려운 부분이 없다. 그저 모니터만 선택해주고 모드만 선택해주면 된다.
      (예전에 X를 띄울려고 며칠을 고생했던걸 생각하면 --; 지금은 대부분 까먹었지만..)

      X 윈도우의 설정파일은 /usr/X11R6/lib/X11/XF86Config이다. X 윈도우 설정 유틸리티들인 xf86config나 XF86Setup, Xconfigurator등은 모두 이 파일을 생성/수정하는 유틸리티들이므로 이 파일의 내용에 대해 완벽하게 이해하고 있다면 그냥 텍스트상에서 세세하게 이 파일을 수정할 수도 있을 것이나 그리 쉬운것은 아니다.

      xf86config는 모든 설정과정이 텍스트로 진행이 되며,
      Xconfigurator는 콘솔에서 실행되는 X 설정용 프로그램이다. 리눅스 설치과정중 X 설치부분이 이 프로그램에 의해 실행되는 부분이다. 설정이 편한 반면 기능이 별로 많지 않다.
      XF86Setup은 XFree86 팀에서 X 서버를 내놓으면서 같이 내놓은 것으로서 자세한 설정이 가능하지만 그만큼 복잡하다. 그러므로 초보자들이 하기엔 좀 무리가 있다. XF86Setup은 보통의 경우 리눅스 설치시에 설치가 되지 않으므로 따로 설치를 해주어야 한다. 또한 XF86Setup은 XFree86-VGA16 패키지를 사용하므로 같이 설치해주어야 한다. 설치한 뒤에 콘솔에서 실행시켜주면 바로 VGA16 모드로 X 윈도우가 뜨면서 설정을 시작한다.

      그러므로 X 설정에 대해서 어느정도 자신있으며 자세한 설정을 하고자 한다면 XF86Setup을 사용하고 그렇지 않은 경우는 Xconfigurator나 xf86config를 사용하도록 한다.
      xf86config 설정은
      xf86config 설정 - 김정원님 홈페이지 링크를 보시고,
      Xconfigurator 설정은
      이곳을 보기 바란다.



    4. X 윈도우의 특징에서도 보았듯이 X 윈도우는 OS/2나 Windows 95/98과 같은 OS와 달리 타이틀 바, caption bar, 스크롤 바 등과 같은 윈도우 자원을 특정하게 정해져 있지 않기 때문에 어떤 윈도우 매니저를 사용하는냐에 따라 X의 모습은 상당히 달라진다.

      여기서는 리눅스에서 대표적으로 사용되는 X 윈도우 매니저에 대해서 알아보기로 한다.

      1. KDE

        KDE(K Desktop Environment)는 노르웨이의 Troll Tech가 개발한 GUI 툴킷 라이브러리 'Qt'를 베이스로 한 자유 통합 데스크탑 환경이다. 개발은 전세계에서 모은 소프트웨어 엔지니어팀(KDE Team)에 의해 인터넷을 통해 행하여 지고 있고, MacOS나 Windows 95/98과 같이 누구든지 간단하게 사용할 수 있는 데스크탑을 유닉스계 OS에 제공하는 것을 목적으로 하고있다.(좀더 자세한 얘기는 다음 기회에 시간을 내서..)
        www.kde.org <- KDE 프로젝트 웹싸이트
        아래는 KDE 환경의 스크린 샷이다.


      2. GNOME

        GNOME(GNU Network Object Management Environment)는 툴킷에 GTK+를 사용한 종합 데스크탑 환경중의 하나로서, 멕시코의 유저그룹 활동의 일환이었던 GNOME 프로젝트에 의해 1997년 10월 경에 시작되었으며 얼마전에 GNOME1.0이 발표되었다.
        www.gnome.org<- GNOME 프로젝트 웹싸이트
        GNOME 환경의 스크린 샷

        GNOME 프로젝트가 탄생한 시점에 이미 KDE는 데스크탑 환경으롯의 지위를 획득하고 있었고, 신뢰성도 높아져 갔다. 그런데 KDE는 토대가 되는 툴킷에 Qt를 사용하고 있었고, 배포조건에 여러제약이 있었다.
        [Qt의 라이센스 내용중의 일부..]
        • Qt로 쓴 어플리케이션은 GNU 라이센스로 배포해야 한다. 사내 등의 제한된 장소라도, 업무에 사용되는 경우에는 Troll Tech의 허가를 구해야 한다.
        • Qt에 기능을 추가하거나 개조하는 패치를 배포해서는 안된다. 또, 소스코드를 개조한 바이너리도 배포해서는 안된다.

        이러한 라이센스상의 문제로 여러가지 제약이 있었고 논란이 있어서 이들 문제를 해소해야 한다는 취지로 Miguel de Icaza는 완전히 GPL에 따른 새로운 데스크탑 시스템을 만들것을 선언하고, GNOME 프로젝트가 발족되었다.

        이런 영향을 받아서인지 최근 Troll Tech는 새로운 라이센스 'QPL'을 발표하고 그것에 근거하여 Qt-2.0을 발매할 예정에 있음을 분명히 했다. QPL에서 배포되는 소스코드가 프리인 점은 GNU 회장인 Richard Stallman도 인정을 했으며, 이러한 Qt에 관한 라이센스 문제도 해소될 것이 확실해 보인다.
        KDE와 GNOME은 둘다 자체에 포함된 많은 유용한 유틸리티들을 가지고 있다.

      3. Window maker

        www.windowmaker.org<- 윈도우 메이커 공식 웹싸이트
        윈도우 메이커 스크린 샷

      4. 그외..

        그외에 KDE나 GNOME가 나오기 전에 인기가 있었던 fvwm, mwm, twm 등이 있다.



     
  6. 리눅스에서 네트웍 설정은 설치시에 네트웍 설정부분이 있으며, 그곳에서 설정하지 않았다면 나중에 netconf 유틸리티로 설정이 가능하다. 기본적으로 리눅스 시스템을 혼자서 사용하는 모뎀 사용자의 경우 네트웍 설정이 따로 필요하지 않지만 두세대의 컴퓨터로 LAN 환경을 구축하려고 할 경우나 이미 네트웍에 물린 컴퓨터에 리눅스를 설치하려고 할 경우에는 네트웍 설정이 필요하다.
    이미 네트웍에 물려있을 경우 시스템 관리자에게 자신의 IP와 domain 명, 게이트웨이, 네임서버(Nameserver)를 문의해서 설치시 네트웍 설정부분에 적어주면 된다. 그렇지 않고 외부 네트웍과는 연결되지 않지만 자체적으로 LAN 환경을 구축하고자 할 경우는 192.168.xxx.xxx의 IP를 사용하여(꼭 이걸로 해야하는 것은 아니지만 보통 외부네트웍과 연결되지 않은 자체 LAN 환경에서 사용하는 IP이다.) , domain 명을 정하여 적절히 사용하면 된다.

    1. 네트웍(TCP/IP)의 기초('Craig Hunt'의 "TCP/IP 네트웍관리"의 내용을 바탕으로)

      TCP/IP는 크게 전송제어 프로토콜(Transmission Control Protocol)과 인터넷 프로토콜(Internet Protocol)을 포함하여 다양한 프로토콜들이 합쳐져 만들어진 프로토콜 모음이란 의미에서 TCP/IP 프로토콜보다는 TCP/IP Protocol Suit 또는 TCP/IP Protocol Set이라는 용어가 더 정확한 의미를 가지는 프로토콜의 모음이다.

      TCP/IP에 대한 것은 너무 광범위하고 복잡한 것이어서 여기서는 중요한 부분만 간략하게 살펴보자.. 먼저, 프로토콜이라는 것은 '통신규약'이라고 할수 있으며, 통신을 하기위해 필요한 여러가지 요소들을 체계적으로 확립해 놓은 것이라 할 수 있다. 보통 파일 송수신에 사용되는 zmodem, kermit, xmodem등도 모두 프로토콜들이다.
      프로토콜이 위의 파일 송수신 프로토콜과 같이 하나의 프로그램 정도로만 인식되는 경우도 있지만, 네트워킹에 사용되는 프로토콜이란 데이터 송수신에 사용되는 다양한 기능들에 따라 몇 단계의 계층(Layer)으로 세분화 되어있다. 예를 들면, 데이터를 전송하는 프로토콜, 에러를 체크하는 프로토콜, 이런식으로 나뉘어져 있는 것이며, 이러한 계증의 프로토콜들이 모여서 인터넷에서의 네트워킹에 사용되는 TCP/IP와 같은 하나의 프로토콜을 형성하는 것이다.

      이러한 통신 프로토콜에 대한 개념적인 형태를 제시한 것으로 OSI(Open System Interconnection) 7 Layer가 있는데 (OSI 7 Layer는 TCP/IP 프로토콜이 만들어지고, 이미 널리 사용되고 있는 중에 제시된 것이기 때문에 TCP/IP 프로토콜의 형태가 OSI 7 Layer에서 제시하고 있는 프로토콜의 형태와 정확히 일치하지는 않는다.), 데이터 통신이 이루어지는 과정을 가장 잘 보여주는 모델이라 할 수 있다.

      아래에 OSI 7 Layer (OSI 참조 모델)을 보여준다.
      OSI 참조 모델
      위와 같은 모델에서 예를 들어 사용자가 telnet이나 ftp(이러한 응용프로그램들은 최상위인 Application 계층에 속한다.) 등을 통해 데이터를 전송하면 가장 상위 계층에서 데이터를 아래로 전달하고, 그 데이터는 각 계층을 지날 때마다 특정 정보가 담긴 헤더가 첨가되면서 가장 하위 계층까지 통과한다. 헤더에는 에러체크 정보 등 각 계층마다의 역할에 따른 정보가 담겨있다.
      이렇게 만들어진 데이터 조각은 전송 채널을 통해 원하는 목적지에 도달하고, 목적지에서는 이와 반대로 각 계층마다 데이터 조각의 헤더를 벗기면서 확인작업을 하고, 자신의 역할 안에서 일이 끝나면 상위 계층으로 데이터를 전달한다. 각 계층에서 이러한 각자의 작업을 모두 마치면 최상위 계층에서는 모든 헤더가 제거된 순수한 데이터만을 전송받게 되는 것이다.

      TCP/IP의 관점에서본 OSI 참조모델의 기능을 보면 아래와 같다.

      • Application 계층
        Application 계층은 사용자가 접근하는 네트워크 프로세스가 존재하는 프로토콜 체계의 레벨이다. TCP/IP 어플리케이션은 Transport 계층의 위에서 일어나는 모든 프로세스를 가리킨다. 이는 사용자가 반드시 알 필요가 없는 이 레벨의 다른 프로세스 뿐만 아니라, 사용자가 직접적으로 상호작용하는 모든 프로세스를 포함한다.

      • Presentation 계층
        협력하는 어플리케이션이 데이터를 교환하기 위해서는 데이터가 표현되는 방식에 대해서 합의해야만 한다. OSI에서, 이 계층은 표준 데이터 표현 루틴들을 제공한다. 점점 XDR과 MIME같은 TCP/IP 프로토콜이 이 기능을 수행하기는 하지만, 이 기능은 TCP/IP의 어플리케이션에서 주로 처리된다.

      • Session 계층
        Presentation 계층과 마찬가지로, Session 계층은 TCP/IP 프로토콜 체계에서 분리된 계층으로 규정할 수 없다. OSI의 Session 계층은 협력 어플리케이션 사이의 접속(session)을 관리한다. TCP/IP에서, 이 기능은 Transport 계층에서 많이 담당하고, "session"이란 용어도 사용되지 않는다. TCP/IP에서는 협력 어플리케이션이 통신하는 경로를 표현하기 위해 소켓(socket)과 포트(port)란 용어들이 사용된다.

      • Transport 계층
        TCP/IP에 대한 내용의 많은 부분은 Transport 계층에 있는 프로토콜로 직결된다. OSI 참조모델의 Transport 계층은 수신자가 전송된 것과 똑같이 데이터를 받도록 보장한다. TCP/IP에서 이 기능은 TCP에 의해 수행된다. 그러나 TCP/IP는 상호 신뢰도 검사를 하지 않는 UDP이라는 두번째 Transport 계층서비스를 제공한다.

      • Network 계층
        네트워크 계층은 네트워크를 통한 접속을 관리하고, 네트워크의 자세한 내용을 상위 계층의 프로토콜로부터 분리시켜 준다. IP(Internet Protocol)를 보통 TCP/IP의 Network 계층이라고 하는데, 이 IP는 네트워크를 상위 계층으로부터 분리시켜주고, 주소 지정과 데이터의 전달을 처리한다.

      • Data Link 계층
        물리적 네트워크를 통한 안전한 데이터의 전달은 Data Link 계층에서 처리된다. TCP/IP의 Data Link 계층에 프로토콜을 만드는 일은 드물다. Data Link 계층과 관련된 대부분의 RFC는 IP가 어떻게 기존의 data link 프로토콜을 이용할 수 있는지에 대해서 다루고 있다.

      • Physical 계층
        Physical 계층은 데이터 전송 신호를 전하기 위해 필요한 하드웨어의 특성을 정의한다. 전압레벨이나, 인터페이스 핀의 갯수와 위치 같은 특성을 이 계층에서 정의한다. RS232C와 V.35와 같은 인터페이스 컨넥터와 IEEE 802.3과 같은 LAN 표준을 Physical 계층 표준의 예로 들 수 있다.



      네트워크로 데이터가 보내질 때는 데이터가 계층에서 아래로 전해지고, 네트워크에서 받을때는 계층의 위로 전해진다. 각 계층은 데이터가 제대로 전달되었는지 확인하기 위해, 제어정보를 추가하는데, 이 제어정보는 아래에서와 같이 전송되는 데이터의 앞에 위치하기 때문에 헤더(header)라고 부른다. 각 계층은 상위의 계층으로부터 받은 정보를 데이터로 보고 자신의 헤더를 그 정보의 앞에 계속 추가한다. 이와 같은 모든 계층에서의 배달정보 추가를 캡슐화(encapsulation)라고 한다.
      데이터의 캡슐화(encapsulation)
      [ 데이터의 캡슐화(encapsulation) ]


      이와 같은 전송 데이터들은 TCP/IP의 각 계층들에서 서로 다르게 불리워진다. TCP를 사용하는 어플리케이션은 데이터를 스트림(stream)이라 표현하고, 반면에 UDP를 사용하는 어플리케이션은 데이터를 메시지(message)라고 부른다.
      TCP는 데이터를 세그먼트(segment)라고 부르고, UDP는 자신의 데이터 구조를 패킷(packet)이라고 부른다. 이와 같은 각 계층에서의 데이터 구조의 이름은 아래와 같다.
      각 계층에서의 데이터 구조
      [ 데이터 구조 ]


      IP는 비접속(connectionless) 프로토콜이다. 이는 IP가 데이터를 전송하기 전에 통신 당사자들 사이(ent-to-end)의 접속을 구성하기 위해 handshake라고 불리는 제어정보를 교환하지 않는다는 것을 의미한다. 반면에 connection-oriented 프로트콜은 데이터를 보내기 전에 원격 시스템이 데이터를 받을 준비가 되어 있는지를 확인하기 위해 원격 시스템과 제어 정보를 교환한다. 핸드쉐이킹(handshaking)이 성공하면, 시스템은 접속을 이루었다고 얘기한다. 인터넷 프로토콜은 접속기반(connection-oriented) 서비스가 필요하면 접속을 이루기 위해 다른 계층의 프로토콜에 의존한다.

      IP는 또한 에러 탐지와 에러복구를 제공하기 위해 다른 계층의 프로토콜에 의존하기도 한다. 인터넷 프로토콜은 에러탐지와 복구코드를 포함하고 있지 않기 때문에 때때로 불안정한 프로토콜(unreliable protocol)이라고 불리기도 한다. 일종의 모순이라고 할 수 있겠지만 이것이 프로토콜이 안정화될 수 없음을 나타내는 것은 아니다. 반면, IP는 접속된 네트워크로 데이터를 정확하게 전달함으로서 안정성을 가질 수 있지만. 데이터가 제대로 수신되었는지를 검사하지는 않는다. 이 검사가 필요할 때는 TCP/IP 구조의 다른 계층 프로토콜들이 이를 지원한다.
      IP 데이터그램의 처음 다섯개 혹은 여섯개의 32비트 워드는 '헤더'라 불리는 제어정보이다. 디폴트로, 헤더는 다섯워드 길이다. 여섯워드는 선택사항이다. 헤더의 길이가 변할 수 있기 때문에, 헤더의 길이를 워드 단위로 나타내는 IHL(Internet Header Length) 이란 필드를 가지고 있다.
      IP 데이터그램 포맷
      [ IP 데이터그램 포맷 ]



      [Transport 계층]
      Internet 계층의 바로 위에 있는 프로토콜 계층이 Host-to-Host Transport 계층이다. 보통 줄여서 Transport 계층으로 사용된다. Transport 계층의 가장 중요한 두 프로토콜은 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)이다. TCP는 end-to-end 에러탐지와 수정기능을 가진 안정성 있는 데이터 전달서비스를 제공한다. UDP는 부하가 걸리지 않으며, connectionless 데이터그램 전달 서비스를 제공한다. 이들 두 프로토콜 모두 Application 계층과 Internet 계층 사이에서 데이터를 전달 한다. 어플리케이션 프로그래머들은 특정 어플리케이션에 더 적당한 프로토콜들을 선택할 수 있다.

      UDP
      UDP(User Datagram Protocol)는 IP가 제공하는 전달 서비스와 마찬가지로 응용 프로그램이 직접 데이터그램 전달에 관여할 수 있도록 해준다. 이는 어플리케이션이 프로토콜 오버헤드를 최소화하면서 네트워크를 통해 메시지를 교환할 수 있도록 해준다.
      UDP는 불안정한 비접속 데이터그램 프로토콜이다. 불안정하다는 말은 단지 데이터가 네트워크의 반대쪽 끝으로 제대로 전달되었는지를 확인할 어떤 기술도 프로토콜 내부에 가지고 있지 않다는 것을 의미한다. UDP는 데이터를 올바른 어플리케이션 프로세스로 전달하기 위해 메시지 헤더의 워드 1에 있는 16비트의 Source Port와 Destination Port를 사용한다.
      UDP 메시지 포맷
      [ UDP 메시지 포맷 ]

      왜 어플리케이션 프로그래머들이 데이터 전송 서비스로 UDP를 선택하는 것일까??
      여기에는 분명히 많은 이유들이 있다. 만약 전송되는 데이터의 양이 적다면 접속을 생성하고 전달의 안정성을 보장하는 오버헤드가 전체 데이터를 다시 전송하는 작업보다 더 클지도 모른다. 이 경우에, UDP는 Transport 계층 프로토콜을 위한 가장 효율적인 선택이다. Query-response 모델에 맞는 어플리케이션도 역시 UDP를 사용하는 훌륭한 예이다. response는 query에 대한 긍정적인 응답으로 사용될 수 있다. 만약 특정 시간동안 response가 돌아오지 않는다면, 어플리케이션은 단지 다른 query를 보낸다. 많은 어플리케이션들이 안전한 데이터 전달을 위해 자기만의 기술을 사용하고, Transport 계층 프로토콜로부터 그 서비스들을 요구하지는 않는다. 이런 종류의 어플리케이션에서의 확인 작업을 다른 계층에 요구하는것은 비효율적이다.

      TCP
      TCP(Transmission Control Protocol)는 데이터가 네트워크를 통해 정확하고 올바른 순서로 전달되었는지를 확인해주기 때문에 안정적인 데이터 전송을 제공하기 위해 transport 프로토콜을 필요로 하는 어플리케이션은 TCP를 사용한다.
      TCP는 신뢰할 수 있는, 접속기반(connection-oriented), 바이트 스트림( byte-stream) 프로토콜이다.
      신뢰도, 접속기반, 바이트 스크림이란 용어들에 대해서 알아보자.

      TCP는 PAR(Positive Acknowledge with Re-transmission, 인증을 통한 재전송)이란 불리는 메커니즘으로 신뢰도를 제공한다. 간단히 말해, PAR 을 사용하는 시스템은 원격시스템으로부터 데이터가 잘 도착했다는 것을 듣지 못하면 데이터를 다시 보낸다. 통신하는 TCP 모듈 사이에 교환되는 데이터의 단위는 세그먼트(segment)라고 불린다.
      각 세그먼트는 받은 쪽에서 데이터가 손상되지는 않았는지를 확인하기 위해 사용하는 체크섬(checksum)을 가지고 있다.
      데이터 세그먼트가 손상되지 않고 받아지면, 수신자는 인증값(positive acknowledgment)을 송신자에게 보낸다. 만약 데이터 세그먼트가 손상되었으면, 수신자는 그것을 버린다. 적당한 시간이 지난후에, 송신하는 TCP 모듈은 인증값(positive acknowledgment)이 도착하지 않은 세그먼트들을 재전송한다.

      TCP 세그먼트 포맷

      TCP는 접속기반(connection-oriented) 프로토콜이다. TCP는 두 개의 통신하는 호스트 사이에 논리적인 종단간의(end-to-end) 접속을 이룬다. 양쪽에서 통신이 이루어지기전에 handshake라 불리는 제어정보가 전송된다. TCP는 세그먼트 헤더(segment header) 워드 4의 Flag 필드에 적당한 비트를 설정함으로서 세그먼트의 제어기능을 나타낸다.

      TCP가 사용하는 handshake의 종류는 세 개의 세그먼트가 교환되기 때문에 3단계 handshake(three-way handshake)라 불린다. 아래는 3단계 handshake의 가장 간단한 형태를 보여주는데, 호스트 A는 호스트 B로 "Synchronize sequence numbers(SYN)" 비트를 설정한 세그먼트를 보내면서 접속을 시작한다. 이 세그먼트는 호스트 B에게 A가 접속을 시작하기를 바라고 있음을 알려주고, 호스트 A가 그 세그먼트의 시작번호로 어떤 일련번호(sequence number) 값을 사용할 지를 알려준다. (일련번호는 데이터의 순서를 잘 유지하기 위해 사용된다). 호스트 B는 A에 "Acknowledgment(ACK)" 와 SYN 비트가 설정된 세그먼트를 보내는 것으로 응답한다. B의 세그먼트는 A의 세그먼트를 받았음을 알리고, 호스트 B가 사용할 시작 일련번호를 A에 알려준다. 마지막으로, 호스트 A는 B의 세그먼트를 받았음을 알리는 세그먼트를 보내고, 첫번째 실제 데이터를 전송한다.

      3 단계 handshaking
      이런 교환 절차 후, 호스트 A의 TCP는 원격 TCP가 살아있고, 데이터를 받을 준비가 되어 있다는 증거를 가지게 된다. 접속이 이루어지자마자, 데이터는 전송될 수 있다. 협력하는 모듈들이 데이터 전송을 끝내려고 할 때는, 접속을 끊기 위해 "No more data from sender" 비트(FIN 비트라고 불린다)를 담고 있는 세그먼트를 가지고 3단계 인증을 한다.
      두 시스템 간에 논리적 접속을 제공하는 데이터의 end-to-end 교환이다.

      TCP는 전송하는 데이터를 독립적인 패킷들로 보는 것이 아니라, 연속되는 바이트(byte)들의 흐름으로 본다. 그래서, TCP는 전송되고 수신되는 바이트들의 순서를 관리한다. TCP 세그먼트 헤더의 일련 번호(Sequence number)와 확인번호(Acknowledgment Number) 필드는 바이트들을 계속 추적한다.

      각 시스템이 어떤 숫자로 그 번호를 시작하는지에 대해서는 TCP 표준에 정해져 있지 않다. 각 시스템은 시작점으로 사용할 숫자를 선택하게 된다. 데이터 흐름을 정확하게 따라가기 위해서, 접속한 시스템들은 상대 시스템의 초기 일련번호를 알아야만 한다. 접속하는 두 시스템은 인증과정에서 SYN 세그먼트를 교환함으로써 바이트 번호지정 시스템(byte numbering system)을 동기화한다. SYN 세그먼트의 일련번호 필드는 번호지정 시스템의 시작점이 되는 ISN(Initial Sequence Number, 초기 일련번호)을 담고 있다. 보안상의 이유로 ISN은 임의의 숫자가 되어야만 한다. 그래도 0이 자주 사용되곤 한다.

      데이터의 각 바이트들은 ISN에서부터 순서대로 번호가 매겨진다. 그래서 전송되는 첫번째 실제 바이트는 ISN+1이라는 일련번호를 가진다. 데이터 세그먼트의 헤더에 있는 일련번호는 세그먼트의 첫 데이터 바이트가 데이터 흐름 속에서 어디에 위치하는가를 나타낸다. 예를 들어, 만약 데이터의 흐름의 첫번째 바이트가 1이라는 일련번호(ISN=0)를 가지고, 4000개의 데이터 바이트들이 이미 전송되었다면, 현재 세그먼트에서 데이터의 첫번째 바이트는 4001번 바이트이고, 일련번호는 4001이 될 것이다.

      확인 세그먼트(ACK)는 두가지 기능을 수행한다. 긍정적인 확인 작업과 흐름 제어(flow control)이다. 확인 세그먼트는 데이터를 얼마나 받았고, 수신자가 얼마나 더 받을 수 있는가를 송신자에게 알려 준다. 확인 번호는 수신자가 기다리고 있는, 다음 바이트의 일련 번호이다. 모든 패킷의 개별적인 확인을 표준에서 요구하지는 않는다. 확인번호는 그 번호까지의 모든 바이트들에 대한 긍정적인 확인이다. 예를 들어 송신된 첫번째 바이트를 1번이라고 하고, 2000개의 바이트가 성공적으로 수신되면, 확인번호는 2001이 된다.

      윈도우(window) 필드는 윈도우를 담고 있거나 원격 시스템이 수신할 수 있는 바이트의 양을 가지고 있다. 만약 수신자가 6000 바이트를 더 받을 수 있다면, 윈도우는 6000이 될 것이다 .윈도우는 송신자가 보낸는 바이트의 수가 수신자가 받을 수 있는 바이트 윈도우보다 작은 동안에는 계속해서 세그먼트들을 전송할 수 있다고 송신자에게 알려준다. 수신자는 윈도우의 크기를 변화시키면서 송신자로부터 오는 조각들의 흐름을 제어한다. 0의 값을 가진 윈도우는 영이 아닌 윈도우 값을 받을 때까지 송신자가 전송을 중지하도록 한다.

      IP Address<
      인터넷에서 서로 통신하기 위해서는 IP를 따라야 한다. 실제적으로 네트웍에서 각각의 컴퓨터는 IP 주소라는 것을 부여받는데 이 IP 주소는 32 비트의 숫자로서 8비트씩 4자리로 끊어져 있다.

      IP Address 형태와 규칙
      [ IP Address의 형태와 규칙 ]

      203.238.128.97이라는 IP 주소가 있을 때 A class는 203이고, B class는 238이 된다. IP 주소는 각각 8bit 이므로 8비트이면 2^8(=256) 즉, 256가지(0~255) 그러니깐 이론상으론 000.000.000.000 ~ 255.255.255.255 까지의 IP 주소가 가능하나 이중 몇몇은 실제 사용이 안되거나 특별한 용도로 사용이 된다. 그 중 하나가 127.0.0.1 인데, 이는 자기자신을 나타내는 IP 주소이다. 따라서 어떤 호스트이던지 127.0.0.1을 호출($telnet 127.0.0.1)하면 자신이 불러지게 된다. 두번째로 인터넷에 연결되지 않은 사설 네트웍을 구출할 때는 192.168.x.x의 주소를 사용한다. 이외에도 몇가지가 더 있으나 생략하기로 한다.
      (우리가 현재 사용하는 IP 주소는 IPv4 시스템이다. 앞으로 보안 및 용량을 고려한 IPv6가 사용될 것으로 보인다.)
      에고...여기까지만..

    2. 콘솔모드에서의 네트웍 설정

      이제 본격적으로 리눅스에서 네트웍 설정에 대해 알아보자. 최근에 나오는 배포판의 경우 설치과정중에 네트웍 설정부분이 있으므로 IP와 호스트명, 도메인, 네임서버들을 설치시에 적어주면 된다.

      설치중에 네트웍 설정을 하지 않더라도 설치를 끝낸후 로긴하여 콘솔모드나 X-window 환경에서 네트웍 설정 툴들을 사용하여 설정을 할 수가 있다.

      ifconfig - NIC에 IP 주소 할당하기
      interface란 NIC(Network Interface Card)를 세팅한다고 생각하면 된다. ifconfig를 사용하여 IP address, netmask, gateway등을 세팅해보자.

      [ 사용법 ]
      ifconfig [interface]
      ifconfig interface [atype] options | address ...

      [ options ]
      up : interface를 활성화 시킨다.
      down : interface를 비활성화 시킨다.
      address : [aaa.bbb.ccc.ddd] 형태를 가진다.

      interface란 NIC에 부여된 별칭을 의미한다. 리눅스에서는 차례대로 eth0, eth1, 으로 이름을 매기게 된다. 보통의 경우 NIC를 하나 가지고 있으므로 대부분은 eth0가 될 것이다.
      up/dowm 옵션을 주면 시스템 재부팅없이 곧바로 NIC를 활성/비활성 시킬 수가 있다. (시스템 점검시나, IP 주소를 바꿀경우)

      일단 현재 첫번째 NIC인 eth0에 설정된 interface의 내용을 보려면 아래와 같이 ifconfig -a 명령을 사용한다.

      [bluesky@bluestar bluesky]# ifconfig -a
      eth0    Link encap:Ethernet HWaddr 00:C0:26:DD:9E:B5
                inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
                RX packets:1220 errors:0 dropped:0 overruns:0 frame:0
                TX packets:1259 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:100
                Interrupt:12 Base address:0x9200

      lo       Link encap:Local Loopback
                inet addr:127.0.0.1 Mask:255.0.0.0
                UP LOOPBACK RUNNING MTU:3924 Metric:1
                RX packets:50 errors:0 dropped:0 overruns:0 frame:0
                TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:0

      [bluesky@bluestar bluesky]#

      위를 보면 lo(local loopback 장치), eth0의 두개의 interface가 있는 것을 볼 수 있는데,
      일단, eth0 부분을 보면 eth0라는 이더넷 장치명이 나오고
      Link encap: 이라는 부분에 Ethernet이라고 표시되어 있는데 이것은 장치에 사용중인 프로토콜이 Ethernet임을 알려주는 것이다.
      바로 다음에 HWaddr이라는 것은 이더넷 하드웨어에 기입되어 있는 고유 하드웨어 주소(MAC address라고도 부르는데 48bit이다.)인데 실제 네트웍상에서는 IP address가 아닌 이 MAC 주소로 네트웍상의 호스트들을 구분한다.(IP address를 이 MAC address로 변환하는 프로토콜이 ARP-Address Resolution Protocol 프로토콜이다)
      그 다음에 inet addr: 항목은 인터페이스에 부여한 IP 주소를 말한다. 현재 192.168.1.11(외부 네트웍에 연결이 안된 자체 LAN 구성시 사용하는 192.168.x.x 를 사용하고 있다.)이 부여된 상황이다.
      그 다음 Bcast: 란 브로트캐스트(Broadcast) 주소를 말하며 일반적으로 맨 마지막이 .255로 끝난다.
      그 다음 Mask: 는 넷마스크(Netmask)를 말하며 일반적으로 255.255.255.0의 값을 갖는다.
      그 다음 UP BROADCAST RUNNING MULTICAST는 각각 인터페이스가 활성화되어 있는 상태(UP)이며 브로드캐스트를 사용하고 지금 현재 작동중이며 멀티캐스트도 사용한다는 것을 보여주고 있다.
      그 다음 MTU란 Maximum Transmission Unit 즉 최대 전송 패킷의 크기를 말하며 이더넷의 기본값은 1500이다.
      그 다음 Metric은 라우팅에서 참조되는 값이다.
      RXTX는 각각 패킷을 받은것에 대한 통계와 보낸것에 대한 통계이다.
      packets는 받거나 보낸 패킷의 총수를, errors는 그중 오류가 발생한 패킷의 갯수를, dropped는 어떤 이유로든 그냥 버린 패킷의 갯수를, 그리고 overruns는 이더넷이 처리할 수 없을 정도로 빠르게 자료가 오고 감으로써 손실된 패킷의 갯수를 나타낸다.
      만일 errors, overruns, dropped가 0(zero)가 아니라면 네트웍 상태가 불안정하다고 봐야 한다.
      마지막으로 Interrupt는 이더넷 카드가 사용하는 IRQ를, Based address는 사용하는 I/O 주소를 말한다.

      이제 실제로 interface에 IP address를 새로 할당을 해보자 일단 이더넷을 다운시키고 새로운 IP를 할당한다.
      [bluesky@bluestar bluesky]# ifconfig eth0 down   <- eth0 다운시킴
      [bluesky@bluestar bluesky]# ifconfig eth0 192.168.2.100  <- eth0에 새로운 IP 192.168.2.100을 할당

      이번에는 위의 두번째 명령을 아래와 같이 자세하게 풀어서 명령을 줄수도 있는데 아래를 보자.
      [bluesky@bluestar bluesky]# ifconfig eth0 192.168.2.100 netmask 255.255.255.0 broadcast 192.168.2.255 up
      이 명령은 위의 #ifconfig eth0 192.168.2.100과 같은 명령이나 자세하게 풀어서 쓴것이다.
      이렇게 설정후 다시 ifconfig -a 명령으로 보면 새로 설정된 내용들이 나올것이다.

      route - IP routing table을 보거나 설정
      이제 라우팅 테이블을 작성한다. ifconfig로 자신의 주소를 설정했지만 주소만 가지고는 아무것도 할 수가 없다. 주소를 가지고 밖으로 나가서 자신이 누구인지 알려야 하고, 그래야만 그 주소로 통해서 다른 컴퓨터가 들어올 수 있다. (아래의 설정은 인터넷과 같은 외부네트웍에 연결된 경우가 아니고 자체 LAN에서 설정하는 경우를 보여준다.)

      [ 사용법 ]
      route [-v] [-net|-host] Target [netmask Nm] [gw Gw] [[dev] If]

      [ 옵션 ]
      -v : 자세한 설명을 보여준다.
      -net : 라우팅 테이블의 목표가 네트웍 영역
      -host : 호스트의 주소를 설정할 때 사용
      add : 라우팅 테이블에 추가
      del : 라우팅 테이블에서 삭제
      Target : 설정될 IP 주소
      netmask Nm : 특정 넷마스크를 설정할 때 사용
      gw Gw : 네트웍/호스트가 사용하게될 게이트웨이
      dev If : 디바이스 이름 If를 정한다.

      아무런 옵션없이 route명령을 주면 현재 설정된 라우팅 데이블 정보를 보여준다.(route -n 명령과 같다)
      이제 -net과 -host 옵션으로 라우팅 테이블을 작성한다. -net 옵션은 IP가 가지는 목적이 네트웍을 의미할 때 사용한다. 이들은 특정 계층의 영역을 나타낼 때 사용한다.

      [bluesky@bluestar bluesky]# route add -net 192.168.1.0 eth0
      위의 명령은 네트웍 주소, 즉 192.168.1로 시작하는 모든 네트웍에 대해서 라우팅 테이블을 작성하게 된다. 192.168.1.0의 네트웍주소, 즉 192.168.1로 시작하는 모든 패킷은 eth0를 통해서 나가게 된다.
      보통 -host로 호스트의 주소를 설정하는 것은 일반적으로 안하는 경우도 있지만 해줘야 하는 경우에는 꼭 해줘야 한다.

      [bluesky@bluestar bluesky]# route add -host 192.168.1.11 eth0
      위의 명령은 호스트 주소로 라우팅 데이블을 만드는 것인데, 이것은 자신을 인식할 때 사용한다. 일반적으로 -net이나 -host를 생략하면 -host라고 간주하게 된다.

      이제 게이트웨이를 추가해보자.
      [bluesky@bluestar bluesky]# route add default gw 192.168.1.254 eth0
      위의 명령으로 게이트워이를 추가하는데, 디폴트 게이트웨이 즉, 기본적으로 eth0 디바이스가 사용할 게이트웨이로서 192.168.1.254를 지정하겠다는 뜻이다. 외부네트웍과 연결하는 주소로 사용함을 의미한다. 게이트웨이는 처음 네트웍 장비들이 세팅될 때 정하므로 게이트웨이 주소를 모른다면 네트웍관리자에게 문의해서 알아봐야 한다. 하지만 보통 일반적인 게이트웨이 주소는 맨끝이 .254로 끝난다.
      위의 명령은 #route add 0.0.0.0 gw 192.168.1.254 eth0와 같다.

      [IP에 따른 네트웍 주소]
      IP 주소에는 네트웍 인테페이스에 할당되어 특정주소를 가리키는 주소와 한 묶음의 네트웍 인터페이스들을 통칭하는 주소가 있는데, 192.168.1.10과 같은 것은 하나의 네트웍 인터페이스를 가리키지만 192.168.1.0 처럼 마지막이 0으로 끝나는 것은 192.168.1로 시작하는 모든 네트웍 인테페이스를 가리킨다. 그래서 192.168.1.0과 같이 0으로 끝나는 주소는 어떤 네트웍 인터페이스에 붙일 수 있는 주소가 아니란 뜻이다.

      또한 192.168.1.255와 같이 255로 끝나는 주소는 어떤 하나의 네트웍 인터페이스가 아닌 모든 192.168.1 네트웍의 인터페이스가 똑같은 자료를 동시에 받기 원할 때 사용하는 Broadcast 주소를 가리킨다.

      그리고 대부분의 경우 맨끝이 1로 끝나는 곳에 네임서버(Name Server)를 두는 경우가 많으며, 게이트웨이는 거의 맨끝이 .254로 끝나는 것을 사용한다.


      이제 지금까지 설정한 내용들을 보면 아래와 같다.
      [bluesky@bluestar bluesky]# route -n
      Kernel IP routing table
      Destination    Gateway      Genmask          Flags  Metric  Ref   Use  Iface
      192.168.1.11    0.0.0.0        255.255.255.255    UH       0        0      0     eth0
      192.168.1.0     0.0.0.0        255.255.255.0       U         0        0      0     eth0
      127.0.0.0        0.0.0.0        255.0.0.0             U         0        0      0      lo
      0.0.0.0      192.168.1.254    0.0.0.0                UG       0        0      0     eth0
      [bluesky@bluestar bluesky]#


      라우팅 테이블의 네트워크 찾기
      위에서 라우팅 테이블을 작성하는 방법에 대해서 알아보았는데, 이제 라우팅 테이블이 어떻게 작동하는지 작동원리를 한번 알아보자. 만일 192.168.1.154 라는 주소를 찾아가려는 경우 커널을 기본적으로 네트웍 인터페이스인 eth0를 찾고 그 다음에 패킷을 여기를 통해 보내기 위해서 라우팅 테이블을 읽는다.

      일단 라우팅 테이블을 보면,
      [bluesky@bluestar bluesky]# route -n
      Kernel IP routing table
      Destination    Gateway      Genmask          Flags  Metric  Ref   Use  Iface
      192.168.1.0     0.0.0.0        255.255.255.0       U         0        0      0     eth0
      0.0.0.0      192.168.1.254    0.0.0.0                UG       0        0      0     eth0
      127.0.0.0        0.0.0.0        255.0.0.0             U         0        0      0      lo
      192.168.1.11    0.0.0.0        255.255.255.255    UH       0        0      0     eth0
      [bluesky@bluestar bluesky]#

      192.168.1.154를 찾아가기 위해 커널은 이제 라우팅 테이블의 첫번째 줄을 읽어 들인다. Genmask 부분이 보이는데, 이 부분이 넷마스크(net-mask)이다. 이 부분을 가지고 매스킹을 하게 된다.
      매스킹을 할때는 AND 연산을 하게되는데..
      위의 목적지 주소 192.168.1.154와 첫번째 줄의 Genmask 255.255.255.0와 AND 연산을 하면

      목적지 주소
      [binary]
      192
      [11000000]
      168
      [10101000]
      1
      [00000001]
      154
      [10011010]
      넷매스크
      [binary]
      255
      [11111111]
      255
      [11111111]
      255
      [11111111]
      0
      [00000000]
      연산결과
      [binary]
      192
      [11000000]
      168
      [10101000]
      1
      [00000001]
      0
      [00000000]


      연산 결과가 192.168.1.0으로 위의 라우팅 테이블의 첫번째 Destination 값과 일치한다. 그러면 이제 목적지 주소(192.168.1.154)가 여기에 포함된다는 것을 알게되고 전송하게 된다.

      이제 203.238.128.51로 보낸다고 할 경우, 위와 같이 라우팅 테이블어 첫번째 라인의 Genmask와 비트매스킹을 한 결과를 보면 203.238.128.0이 나오므로 이는 첫번째 라인의 Destination과 서로 다르다
      그러면 이제 두번째 줄을 읽어들인다. 두번째 줄은 게이트웨이로서 0.0.0.0의 Genmask 값을 가지는데 이와 매스킹을 해보면 0.0.0.0의 결과가 나오는데 이는 두번째 줄의 Destination의 값과 일치하므로 이제 eth0를 통해서 밖으로 나가게 된다.

      이 밖의 다양한 네트웍관련 명령어는
      이곳을 보기 바란다.

    3. 리눅스에서의 PPP 설정

      리눅스에서 PPP를 설정하는 방법은 보통 아래의 두가지가 있다.
      kppp를 이용한 방법은 KDE 데스크탑 환경에서 제공하는 ppp 설정툴이며, netconf는 레드헷 리눅스에서 기본적으로 제공되는 네트웍 설정툴로서 이 툴내에 PPP/SLIP 설정을 이용하여 설정하는 방법이다.

      리눅스에서의 com port(com1, com2, com3, ...)는 디바이스 디렉토리인 /dev에 ttyS#(#은 0, 1, 2, ...)또는 cua#로 존재한다. 예를 들어 ttyS0이 com1이며 ttyS1이 com2이다(cua0가 com1, cua1가 com2, ...).
      이러한 디바이스를 그대로 사용해도 되지만 보통의 경우 자신이 사용하는 포트를 modem 이란 파일로 링크한 후에 이 modem 파일을 디바이스로 사용하기도 한다.

      예를 들어, com3를 사용하는 경우 /dev/cua2를 modem이란 파일로 링크를 시킨후에 이 modem을 사용하는 것이다.

      [bluesky@bluestar bluesky]# cd /dev
      [bluesky@bluestar /dev]# ln -s cua2 modem
      [bluesky@bluestar /dev]# ls -l mo*
      lrwxrwxrwx 1 root bluesky 4 May 7 19:52 modem -> cua2


      또한 /etc/ppp/options 파일의 내용을 보면 "lock" 부분이 있는데 이를 "#"으로 막고,
      아래 라인을 추가한다.

      /dev/modem
      57600
      crtscts
      defaultroute


      이제 네임서버를 추가하기 위해 /etc/resolv.conf파일에 자신이 사용하는 ISP(Internet Service Provider)의 네임서버를 추가해 주어야 한다. kppp를 사용할 경우 따로 추가하지 않아도 툴 설정시에 네임서버 부분에 적어두면 자신이 PPP 서비스를 시작할 때 /etc/resolv.conf 파일에 네임서버를 추가하므로 따로 추가해줄 필요가 없다.
      나우 PPP를 사용하는 경우 아래 라인을 추가하며, 자신이 사용하는 ISP의 네임서버를 추가하면 된다.

      nameserver 203.238.128.24



       
    4. 네트웍(TCP/IP) 문제점 진단과 해결 - "TCP/IP 네트웍관리" by Craig Hunt

      앞 부분에서 TCP/IP와 네트웍 설정에 대해서 알아 보았는데 이런 설정작업은 크게 어려운 부분은 아니며, 일단 시스템이 적절히 설정된 뒤에는 바꿀 일이 거의 없다. 그러나 네트워크 문제점을 해결하는 것은 특정분야의 세세한 지식보다는 포괄적이고 개념적인 지식이 필요해 쉬운일이 아니다. 네트워크 문제점이란 것들이 대부분 뚜렷한 현상을 보이지만, 해결하기 굉장히 어려울 때가 종종 있기 때문이다.

      TCP/IP 관련 모든 문제점들이 모두 똑같을 수는 없다. 그리고, 모든 문제점들이 똑같은 방법으로 접근할 수 있는 것도 아니다. 하지만, 이런 문제점들을 해결하는데 가장 중요한 것은 그 문제점이 과연 무엇인지 정확하게 이해하는 것이다. 겉으로 보이는 현상들이 종종 본질을 흐릴 수 있으며, 실제 문제점은 여러 소프트웨어에 덮여 드러나지 않는 것이 보통이어서, 일단 문제점의 본질을 파악한다면 이에 대한 해법은 한결 명확해진다.

      먼저 정확히 어떤 현상이 일어나는지에 관한 자세한 정보들을 모아야 한다. 어떤 응용프로그램이 문제를 일으키는지, 원격 호스트의 이름과 IP 주소가 어떻게 되는지, 사용자의 호스트 이름과 IP 주소는 어떻게 되는지, 어떤 에러 메시지가 나타나는지 등에 대한 정보를 모아야 할 것이다.

      [문제점 해결 힌트]

      • 문제점에 조직적으로 접근한다. 각 테스트별 정보들을 차근차근 이용해 다음 테스트로 넘어가야 한다.
      • 문제점들을 조심스럽게 다루며, 관리 가능한 조각들로 나누어 처리하도록 한다. 각 조각들을 끝낸 후 다음 단계로 넘어 가야 한다. 예를 들어, 네트워크 연결 상태를 테스트할 때 문제점을 찾을 때까지 각 네트워크 파트들을 테스트하도록 한다.
      • 성공적으로 해결한 작업내역과 결과는똑같은 문제점의 재발 상황에 대비하여 기록으로 남겨둔다.
      • 문제점에 관한 이유를 너무 추측해서는 안된다. 가능한 모든 것들을 테스트해 보고, 이들 테스트 결과에 의거해서 해결하도록 해야 한다.
      • 보안을 위한 장애물들의 존재를 인지하고 있어야 한다. 보안 방화벽은 때때로 ping, traceroute 및 ICMP 에러 메시지를 걸러버리기도 한다. 만약, 원격 싸이트에 대한 문제점이 발생한 경우라면 해당 네트워크에 방화벽이 설치되어 있는지 확을을 해보아야 한다.
      • 에러 메시지를 주의깊게 살펴보아야 한다. 에러 메시지가 함축된 의미를 띄고 있긴 하지만, 문제점 해결에 대한 중요한 단서를 제공해 주기 때문이다.
      • 원격 시스템 관리자와 협조하여 테스트하기에 앞서 먼저 스스로의 네트워크를 전체적으로 테스트해 볼 필요가 있다. 네트워크 문제점 해결의 가장 큰 어려움은 바로 대부분의 네트워크 쌍방 모두를 한 사람이 관리하지 않는다는 것이다. 대부분의 경우, 원격 시스템 관리자가 누구인지조차 모를 때가 많다. 자기 네트워크에 대한 정보를 많이 알면 알수록 원격 관리자와 협조할 때 일이 간단해진다.


      [진단 도구]
      여기서는 하드웨어적인 진단도구(네트워크의 물리적인 문제점 진단을 위한)가 아닌 소프트웨어적인 진단 도구들에 대해 알아 보기로 하자.

      ifconfig
      - 인터페이스의 기본 설정에 관한 정보를 제공한다. 잘못된 IP 주소나, 서브넷 마스크 및 브로드캐스트 주소를 확인하는데 사용한다.

      arp
      - 이더넷/IP 주소의 변환(IP주소->이더넷주소, 이더넷주소->IP 주소)에 관한 정보를 제공한다. 로컬 네트워크 내에 IP 주소가 잘못 지정되었는지를 확인하는데 필요하다.

      netstat
      - 굉장히 많은 정보를 제공하는 툴인데 네트워크 인터페이스, 네트워크 소켓, 네트워크 라우팅 테이블에 관련된 자세한 정보를 확인할 수 있다.

      ping
      - 원격 호스트가 도달가능한지를 판단해 준다. 또한 패킷 유실율과 전송 시간을 알 수 있다.

      nslookup
      - DNS 네임 서비스 관련 정보들을 확인해 볼 수 있다.

      dig
      - 역시 네임 서비스 관련 정보를 확인해 볼 수 있으며, nslookup과 유사하다.

      ripquery
      - 해당 시스템으로 오가는 RIP(Routing Information Protocol; 라우팅 정보 프로토콜) 업데이트 내용을 확인해 볼 수 있다. gated 소프트웨어 패키지의 구성요소이지만, 이를 위해 gated를 실행할 필요는 없다. RIP가 동작하는 대부분의 시스템에서 작동한다.

      traceroute
      - 원격 시스템까지 패킷이 진해되는 동안의 라우팅 홉(hop) 정보를 확인해 볼 수 있다.

      snoop
      - 네트워크를 통해 전달되는 각각의 패킷들을 분석할 수 있다. snoop은 각 패킷의 내용과 헤더 등을 분석하는 TCP/IP 프로트콜 분석 소프트웨어이다. 프로토콜 문제점을 분석하는 데 가장 유용하며, snoop와 유사한 것으로 인터넷 상에서 anonymous FTP 등으로 구할 수 있는 tcpdump(리눅스 알짜 6.0 기본 설치됨)가 있다.

      위의 진단도구들의 기본적인 사용법은
      이곳을 보기 바란다.


      [기본 연결 상태 점검하기]
      ping 명령은 각 컴퓨터로부터 원격 호스트가 접근 가능한지 그 여부를 테스트한다. ping 결과에 따라 네트워크 연결(하위계층)이나 응용 프로그램(상위계층) 중 무엇을 점검해 보아야 할 지를 결정할 수 있다.
      만약 ping을 이용해 패킷이 원격 시스템까지 전달되었다면 상위계층에 문제가 있다고 보아야 하며, 만약 패킷이 제대로 전달되지 않는다면 하위 프로토콜 계층에 문제가 있다고 보아야 한다.

      아마 anonymous ftp 서비스만 제공하는 호스트에 telnet을 시도하였을 수도 있고, 응용 프로그램을 실행시키는 순간에 해당 호스트가 다운되었을 수도 있다. 계속해서 접속이 안된다면 snoop(or tcpdump)를 이용해 용용 프로그램을 분석하고, 필요하다면 원격 시스템 관리자와 협력해야 한다.

      ping이 실패할 경우 에러 메시지를 통해서 무엇을 점검해 보아야 할 지를 결정할 수 있는데, 일반적인 에러 메시지들은 다음과 같다.

      Unknown host
      [bluesky@bluestar bluesky]# ping mir.dimanch.net
      ping: unknown host mir.dimanch.net
      - 원격 호스트 이름을 네임 서비스를 통해 적절한 IP 주소로 번역할 수 없는 경우이다. 로컬 네임 서버나 원격 네임 서버가 제대로 동작하지 않거나, 이름을 잘못 입력했거나, 원격 네트워크와의 통신에 문제가 발생한 경우이다.
      만약 원격 호스트의 IP 주소를 알고 있다면, IP 주소로 ping을 해보아야 한다. IP 주소로 해당 호스트에 접근할 수 있다면 네임 서비스에 문제가 있다는 뜻이다. nslookupdig를 이용해 로컬 네임 서버와 원격 네임 서버를 점검해 보아야 한다.

      Network unreachable
      [bluesky@bluestar bluesky]# ping nownuri.net
      PING nownuri.net (203.238.128.51): 56 data bytes
      ping: sendto: Network is unreachable
      ping: wrote nownuri.net 64 chars, ret=-1
      ...
      - 로컬 시스템이 원격 시스템으로 라우팅할 수 없음을 뜻한다. IP 주소로 ping을 이용해 보고, 호스트 이름으로도 ping을 해보아야 한다. 이는 IP 주소를 잘못 입력했을 가능성을 줄여주며, 잘못된 IP 주소를 알고 있을 가능성을 줄여준다. 만약 라우팅 프로토콜을 운영 중이라면 제대로 실행되고 있는지를 살펴보고, netstat를 이용해 라우팅 테이블을 점검해 보아야 한다.
      RIP(Routing Information Protocol)을 이용하고 있다면, ripquery를 이용해 RIP 업데이트 내용을 확인해 보아야 하며, 기본 라우터를 사용중이라면 이를 다시 설치해 보기 바란다. 호스트에 별 문제가 없어 보인다면 라우팅 문제에 관한 기본 게이트웨이를 점검해 보아야 한다.

      No answer
      - 원격 호스트가 응답하지 않는 경우이다. 대부분의 네트워크 유틸리티들은 이와 동일한 현상을 다른 메시지로 표현하기도 한다.
      ping의 다른 버젼은 "100% packet loss"를 나타내며, telnet은 "Connection timed out" 메시지를 나타내며, sendmail은 "cannot connect" 에러 메시지를 보여준다. 이들 모두 동일한 현상을 가리키며, 로컬 시스템이 원격 호스트로 라우팅은 할 수 있지만, 해당 원격 시스템으로부터 응답을 못받는 경우를 가리킨다.
      이 문제점에 대한 몇가지 원인들은 아래와 같은 경우들이다.
      • 원격 호스트가 다운된 경우,
      • 로컬 또는 원격 호스트가 잘못 설정된 경우,
      • 로컬 호스트와 원격 호스트 사이의 게이트웨이나 네트워크가 다운된 경우,
      • 원격 호스트의 라우팅에 대한 문제

      이런 경우 netstat와 ifconfig를 이용해 로컬 설정을 자세히 살펴보고, traceroute를 이용해 원격 시스템으로의 라우팅을 점검해 보고 원격 시스템 관리자와 협의하여 문제를 해결해야 한다.


      [네트워크 접근 상태 해결하기]
      "no answer" 과 "cannot connect" 등의 에러 메시지는 네트워크 프로토콜의 하위 계층에 문제가 있음을 뜻한다. 여러 점검 방법을 통해 이런 형태의 문제라고 판단될 경우, 라우팅이나 네트워크 인터페이스에 관한 점검을 해봐야 한다.
      네트워크 접근 계층을 점검하기 위해서는 ifconfig, netstatarp 명령들을 이용해야 한다.

      ifconfig
      ifconfig는 네트워크 인터페이스 설정 상황을 점검한다.
      시스템의 설정이 최근에 변경되었다면 이 명령을 이용해 바뀐 설정을 확인할 수 있으며, 동일 서브넷 내의 다른 시스템들은 원격 호스트에 접근할 수 있으나, 특정 시스템에서는 원격 호스트에 접속할 수 없다면 이 명령을 이용해 점검해 볼 필요가 있다.

      ifconfig에 다른 인자없이 인터페이스 이름(eth0, eth1, ...)만 줄 경우 현재 인터페이스에 설정된 정보가 나타난다.

      [bluesky@bluestar bluesky]# ifconfig eth0
      eth0    Link encap:Ethernet HWaddr 00:C0:26:DD:9E:B5
                inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
                RX packets:1220 errors:0 dropped:0 overruns:0 frame:0
                TX packets:1259 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:100
                Interrupt:12 Base address:0x9200
      (각 항목에 대한 자세한 설명은 "콘솔모드에서의 네트웍 설정" 에 나와 있다.)

      • UP
        - 인터페이스가 사용가능하도록 설정되어 있음을 뜻한다. 만약 인터페이스가 "down"으로 되어 있다면 관리자가 ifconfig 명령을 이용하여 "up" 상태로 변경시킬 수 있다(#ifconfig eth0 up). 만약, 이렇게 해도 인터페이스가 제대로 동작하지 않는다면 인터페이스 케이블을 바꿔 본 다음 다시 해보고, 여전히 문제가 생긴다면 인터페이스 하드웨어를 점검해 보아야 한다.

      • RUNNING
        - 인터페이스가 제대로 동작함을 뜻한다. 만약 인터페이스가 "running"으로 나오지 않는다면, 해당 인터페이스 드라이버가 제대로 설치되지 않았음을 뜻한다. 이때 시스템 관리자는 제대로 인터페이스를 등록하는 과정을 거쳐야 하며, 빠뜨린 부분이 있는지 살펴 보아야 한다.
        inet addr/Bcast/Mask 등도 자세하게 살펴보아야 한다.

      arp
      arp 명령은 IP 주소와 이더넷 주소의 변환을 분석하는데 사용된다.
      자세한 사용법은 "arp --help"하면 나오며, 주로 사용되는 옵션은 아래와 같다.

      -a
      - 테이블 내의 모든 ARP 항목을 보여준다.

      -d hostname
      - ARP 테이블에서 해당 항목을 제거한다.

      -s hostname ether-address
      - 테이블에 새로운 항목을 추가한다.

      만약 부적절한 주소 변환 내용이 테이블에 추가되고 있다고 의심될 때면 arp 명령을 이용하자. ARP 테이블과 관련된 가장 확실한 증거는 바로 ftp나 telnet 명령에 엉뚱한 호스트가 응답하는 경우이다. 간헐적으로 특정 호스트의 통신에 문제가 생기는 것도 ARP 테이블에 문제가 있음을 뜻한다. ARP 테이블 관련 문제들은 서로 다른 두 시스템이 동일한 IP 주소를 이용할 때 보통 발생한다. 이런 문제는 최종 ARP 요청에 대해 가장 먼저 응답한 호스트 정보만 테이블에 등록되기 때문에 간헐적으로 발생한다. 때로는 제대로된 호스트가 응답하기도 하지만, 때로는 잘못된 호스트가 응답하기도 하기 때문이다.

      netstat
      앞의 여러 테스트 방법으로 점검한 결과 로컬 네트워크로의 접근이 불안하다고 판단될 경우, netstat -i 명령을 이용하여 유용한 정보를 얻을 수 있다.
      RX-ERR/TX-ERR 항목이 0이 아닌경우에는 네트웍 상태를 점검해 보아야 한다.

      [bluesky@bluestar bluesky]# netstat -i
      Kernel Interface table
      Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
      eth0 1500    0    1811       0           0           0         1533       0           0           0       BRU
      lo     3924   0     68         0           0           0          68         0           0           0       LRU
      [bluesky@bluestar bluesky]#


      [라우팅 점검하기]
      "network unreachable(네트워크 접근 불가능)"이란 에러 메시지는 라우팅에 문제가 있음을 가리킨다. 로컬 호스트의 라우팅 테이블에 문제가 있는 경우라면 이를 진단하고 해결하기 쉽다. 먼저 netstat -nrgrep 명령을 이용해 라우팅 테이블에 적절한 라우팅 경로가 설치되어 있는지를 확인해 보아야 한다.

      만약 어떤 호스트로의 ping 결과가 "network unreachable" 이라고 나왔다면 해당 호스트로의 라우팅 경로가 있는지 없는지를 알기위해 라우팅 테이블을 점검해 보아야 한다.
      만약 접근 불가능인 호스트가 aaa.bbb.ccc.dd이고 B 클래스 주소인 경우 다음과 같은 명령으로 라우팅 테이블을 점검해 볼 수 있다.
      #netstat -nr | grep "aaa.bbb.0.0"

      만약 위의 네트워크에 대한 라우팅 정보가 있으면 출력될 것이고 없다면 해당 네트워크로의 라우팅 정보가 없다는 뜻이다. 목적지로의 지정 라우팅이 없는 경우라면 아래와 같이 기본 라우팅 정보를 찾아 보아야 한다.
      #netstat -nr | grep default

      netstat 결과 지정 라우팅 정보나 기본 라우팅 정보가 나타난다면 라우팅 테이블에 문제가 있는 것은 아니란 얘기다. 이런 경우에는 traceroute 명령을 이용해 목적지까지의 라우팅 경로를 추적해 보아야 한다.
      netstat 결과 해당 라우팅 내용이 나타나지 않는다면 로컬 라우팅에 문제가 있음을 뜻하며, 이런 로컬 라우팅 문제를 해결하는 데는 두가지 방법이 존재하며 이는 정적 라우팅을 이용하느냐 동적 라우팅을 이용하느냐에 달려 있다. 정적 라우팅을 이용하는 경우라면 빠뜨린 라우팅 정보를 'route add' 명령을 이용해 추가하면 된다. 대부분의 정적 라우팅을 이용하는 시스템들은 기본 라우팅에 의존하기 때문에, 기본 라우팅 정보를 빠뜨렸을 가능성이 크다.
      만약, 동적 라우팅을 이용하는 경우라면 라우팅 프로그램(예: gated - gate daemon)이 동작되는지 살펴보아야 한다.

      이외에 더 자세한 내용은 Craig Hunt의 "TCP/IP 네트웍 관리"를 참고하기 바란다.

     
    1. DHCP(Dynamic Host Configuration Protocol) 서버

      DHCP는 호스트의 네트워크 설정, 즉 IP 주소, 게이트웨이, DNS 등을 자동으로 설정해주는 서비스이다.
      노트북 사용자가 네트워크 설정을 하거나 수십대의 컴퓨터의 네트웍 설정을 일일이 수동으로 한다면 여간 귀찮은 작업이 아니다. 이런경우 네트웍 설정을 자동으로 해주는 서버(DHCP 서버)가 있으면 특정 컴퓨터가 부팅하면서 자동으로 네크워크를 통해서 DHCP 서버에게 이런 자료의 요청을 하게 되면 서버는 IP 주소외에 기타 설정에 관련된 정보를 클라이언트에게 주어 자동으로 인식하도록 하는 유용한 서비스이다. (이와 비슷한 것으로 BOOTP 가 있으며 몇몇 고속 인터넷 서비스에서 이러한 BOOTP나 DHCP를 사용한다.)

      DHCP의 설정은 서버 설정과 클라이언트 설정 두가지를 해야 한다.
      우선 서버 설정시 주의할 점은 서버를 설치할 시스템의 인터페이스에 MULTICAST 옵션이 켜져 있는지를 반드시 체크해야 한다. 이는 네트워크를 broadcast 할때 매우 중요한 것으로 이 옵션이 켜져 있어야 DHCP를 사용할 클라이언트가 이 서버를 찾아낼 수 있다.
      레드헷 리눅스에서 기본적으로 제공되는 커널에는 MULTICAST가 설정되어 있으므로 따로 건드릴 것은 없으나, 커널을 새로 컴파일 했을 경우는 ifconfig 명령으로 한번 살펴 보아야 한다.

      [bluesky@bluestar bluesky]# ifconfig eth0
      eth0    Link encap:Ethernet HWaddr 00:C0:26:DD:9E:B5
                inet addr:192.168.1.11 Bcast:192.168.1.255 Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
                RX packets:1220 errors:0 dropped:0 overruns:0 frame:0
                TX packets:1259 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:100
                Interrupt:12 Base address:0x9200

      [DHCP 서버 설정]


         

      1. DHCP 서버 설정 파일: /etc/dhcpd.conf
        DHCP 서버의 설정파일은 /etc/dhcpd.conf 이다. 이 파일은 기본적으로 패키지에 포함되는 파일이 아니어서(샘플파일이 있는것도 아님..) 사용자가 수동으로 작성해야 한다. vi 등의 에디터를 사용하여 작성하면 된다.

        일단 아래의 견본 파일을 보면서 하나씩 알아보자. 아래의 경우는 외부 네트웍과 연결이 안된 로컬 네트웍(LAN)이다.
        192.168.1.11 ~ 20까지의 IP 어드레스를 요청시 할당하며(DHCP 서버는 192.168.1.10에 설치), domain-name과 domain-name-servers 및 routers 부분은 자신의 환경에 맞게 적절하게 고쳐야 한다.

        [bluesky@bluestar bluesky]# cat > /etc/dhcpd.conf
        default-lease-time 86400;
        max-lease-time 259200;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.254;
        option domain-name-servers 192.168.1.10;
        option domain-name "linuxnet.ac.kr";

        subnet 192.168.1.0 netmask 255.255.255.0{
        range 192.168.1.11 192.168.1.20;
        }
        [bluesky@bluestar bluesky]#


        default-lease-time은 기본적으로 DHCP 클라이언트에게 IP 주소를 할당할 초단위의 시간이다. 이 시간은 클라이언트가 특별히 IP 주소 할당 받을 때 시간을 정하지 않을 경우 적용되는 시간이다.(86400초=1일)
        max-lease-time은 클라이언트가 IP를 요청할 때 정할 수 있는 최대허용시간이다. 이 시간보다 더 많은 시간을 달라고 요청할 수는 없으며 3일(259200초)이다.

        그 다음에 option이라고 나오는 행들은 모두 클라이언트가 IP를 요청하면서 받게될 네트워크 관련 설정 데이터들이다.
        subnet-mask는 서브넷 마스크로 255.255.255.0은 C 클래스까지 같은 주소에 서브넷 매스킹을 하여 로컬 네트워크 주소를 알아내는데 사용한다.
        broadcast-address는 사용할 브로드캐스트 주소이다.
        routers는 사용할 게이트웨이이다.
        domain-name-servers는 사용할 네임서버를 말하며, 3개까지 적을 수 있는데 하나만 사용한 경우이다.
        domain-name은 사용할 지역 도메인을 말한다.

        이제 실제로 각 호스트들에게 할당할 주소들을 지정하는 부분이다.
        subnet으로 처음을 시작하며 여기에는 네트워크 주소(B 클래스 네트워크인 경우 aaa.bbb.0.0, C 클래스인 경우 aaa.bbb.ccc.0)를 적어준다. (맨 마지막이 0으로 끝나면 특정 호스트 주소가 아닌 해당 클래스 범위에 해당하는 모든 주소를 의미함)
        그리고 다음에
        netmask는 서브네트워크 주소와 매스킹하여 같은 주소인지 알아내기위한 주소이며, 당연히 255.255.255.0이 되어야 할 것이다.(192.168.1.0의 네트워크가 C 클래스이기 때문에..)
        만일 192.168.1.속한 특정호스트가 DHCP를 요구하게 되면 브로드캐스트를 통해 DHCP 서버를 찾을 것이고 여기서 255.255.255.0과 매스킹을 해보면 위의 서브네트워크 주소인 192.168.1.0에 속하는 것을 찾을 수 있을 것이다.
        range는 실제 지정할 주소의 범위을 정해주는 것으로 위의 경우는 192.168.1.11에서 192.168.1.20까지의 주소를 DHCP 서버가 제공한다는 뜻이다.

      2. DHCP로 특정 호스트에 고정 IP 주소 할당하기
        DHCP 클라이언트가 서버에게 IP를 요청하게 되면 서버는 지정된 범위내에 있는 IP 주소중에서 아직 할당되지 않은 하나의 주소를 배정해 주게 되는데, 네트워크 상의 특정 호스트의 경우 가변이 아닌 고정 IP 주소를 가져야 하는 호스트가 있을 수 있다.
        예를 들면, DNS에 등록된 IP 주소라서 각종 인터넷 서비스에서 고정 IP 주소가 필요한 경우나, 보안을 IP를 통해서 거는 경우 등등의 경우를 생각해서 DHCP 서버는 특정 호스트에는 특정한 고정 IP 주소를 배정할 수가 있다.

        고정 IP를 할당하고자 할 때는 MAC 주소가 사용되는데 이 MAC 주소는 arp 명령으로 알아낼 수 있다.
        만약 MAC 주소가 00:C0:26:DD:9E:B5인 호스트에 192.168.1.100의 고정 IP 주소를 할당하고자 할 경우는 (MAC 주소는 아래와 같이 해당 호스트에서 arp 명령으로 알아볼 수 있다) 다음과 같은 라인을 /etc/dhcpd.conf에 추가하면 된다. 이렇게 하면 MAC 주소가 00:C0:26:DD:9E:B5인 NIC를 가진 호스트가 IP를 요청하게 되면 항상 192.168.1.100의 주소를 할당하게 된다.
        [bluesky@bluestar bluesky]# arp -a
        bluestar.linuxnet.ac.kr (192.168.1.11) at 00:C0:26:DD:9E:B5 [ether] on eth0

        추가할 라인은
        host bluestar{
        hardware ethernet 00:C0:26:DD:9E:B5;
        fixed-address 192.168.1.100;
        option host-name "bluestar";
        }
        이다.

        host 다음에는 사용할 이름을 써준다. 그리고,
        hardware ethernet는 MAC 주소이며,
        fixed-address는 사용할 고정 IP 주소이다.
        마직막으로 option 행은 꼭 필요한 것은 아니지만 호스트 이름을 bluestar로 하겠다는 뜻이다.

      3. DHCP 서버 IP 주소 임대 기록파일 만들기
        DHCP 서버가 클라이언트에게 IP 주소를 임대하면 어떤 호스트에 어떤 IP 주소를 할당했는지에 대한 내용을 /etc/dhcpd.leases 파일에 작성을 하게 되는데 이 파일은 touch 명령으로 생성을 한다 (이 파일을 생성해야 dhcpd 명령으로 서버를 작동시 에러없이 정상 작동이 된다).

        [bluesky@bluestar bluesky]# touch /etc/dhcpd.leases
        [bluesky@bluestar bluesky]#

      4. DHCP 서버 작동시키기
        DHCP 서버를 설치하면 /etc/rc.d/init.d/dhcpd라는 실행 스크립트가 생성된다. 여기에 start 인수를 주어 실행시키면 서버가 작동을 하게 된다.(알짜 6.0에서는 start 인수없이 그냥 실행하면 된다)

        [bluesky@bluestar bluesky]# dhcpd (or /etc/rc.d/init.d/dhcpd)
        Internet Software Consortium DHCPD $Name: V2-BETA-1-PATCHLEVEL-6 $
        Copyright 1995, 1996, 1997, 1998 The Internet Software Consortium.
        All rights reserved.
        Listening on Socket/eth0/192.168.1.0
        Sending on Socket/eth0/192.168.1.0
        [bluesky@bluestar bluesky]#

        /etc/dhcpd.conf 파일이 제대로 작성이 되었고 임대파일(/etc/dhcpd.leases)도 제대로 작성이 되었다면 위와 같이 정상적으로 서버가 작동할 것이도 그렇지 않다면 에러가 발생하며 어디를 잘못 작성하였는지에 대한 내용이 나올 것이다.

      5. 부팅시 DHCP 서버 작동시키기
        매번 부팅시마다 위의 명령을 실행하는것은 매우 번거로운 일이어서 부팅시마다 자동실행이 되도록 하기 위해서는 아래와 같이 런 레벨을 편집해 주어야 한다.

        [bluesky@bluestar bluesky]# cd /etc/rc.d/rc3.d
        [bluesky@bluestar rc3.d]# ln -s ../init.d/dhcpd S65dhcpd
        [bluesky@bluestar rc3.d]# cd ../rc0.d
        [bluesky@bluestar rc0.d]# ln -s ../init.d/dhcpd K35dhcpd
        [bluesky@bluestar rc0.d]# cd ../rc6.d
        [bluesky@bluestar rc6.d]# ln -s ../init.d/dhcpd K35dhcpd

        런레벨 3(멀티유저,네트웍 대응레벨<- 일반적인 부팅레벨)에 dhcpd를 start(S)하고 런레벨 0(시스템 홀트/시스템 종료레벨)과 6(재부팅 레벨)에 dhcpd를 kill(K)시킨다는 의미이다.

        위의 작업은 X윈도우 상에서 런레벨 매니저를 실행하면 좀더 간단히 작업할 수가 있는데..이 작업은 KDE 환경을 사용하는 경우라면 /usr/bin/ksysv를 실행하면 된다.

        [bluesky@bluestar bin]# ksysv
        실행화면

        위의 런레벨 편집기에서 왼쪽의 "Available Services"에서 dhcpd를 선택해서 마우스 오른쪽 버튼을 눌러 카피를 선택한후 런레벨 3의 Start 부분과 런레벨 0과 6의 Stop 부분에 '붙여넣기'를 하면 된다. 붙여넣기를 할 때는 각각의 서비스의 순서를 생각하여 적절하게 하여야 한다.
        런레벨 편집은 시스템 부팅과 재부팅에 직접적인 영향을 미치므로 잘못 설정시 부팅이 안될 경우도 있으므로 주의해야 한다.


      [DHCP 클라이언트 설정]

      서버 설정이 끝났으면 서버로부터 네트웍 정보를 수신할 클라이언트 설정을 해야 한다.

      1. 리눅스

        리눅스에서의 DHCP 클라이언트 설정을 netconf 툴을 사용한다.
        아래와 같이 터미널 상에서 netconf를 실행하면 초기화면이 뜬다.
        [bluesky@bluestar bluesky]# netconf


        위에서 [Basic host information] 항목을 클릭하면 아래와 같은 설정창이 뜬다.
        "Host name" 란에 FQDN(Fully Qualified Domain Name; 호스트명+도메인네임)을 적어준다.



        호스트명을 적어준 후 옆의 [Adaptor 1] 항목을 선택하면 아래와 같은 창이 뜬다.


        위에서 맨먼저 "Enabled"를 체크해주고 "Config mode"에는 dhcp를 선택해 준다.
        그리고 "Primary name + domain"에는 위에서 적어준 FQDN을 적어주고,
        "Aliases(opt)"에는 호스트명만 적어준다.
        그리고 "Net device"에는 NIC번호(보통 네트웍카드 하나만을 사용하므로 eth0이다.)를 적어주고,
        "Kernel module"에는 NIC의 하드웨어 구동모듈(옆에 화살표를 클릭하면 목록이 나옴)을 적어준다.

        이렇게 설정이 끝난후 "Accept"를 선택해서 빠져나가면 이제 DHCP 서버로부터 IP 주소를 바로 받아오게 된다. 재부팅은 필요없으며, 확인을 해보기위해서 ifconfig를 실행해 eth0 항목이 생성되었는지, 그리고 IP 주소및 기타 항목을 살펴보면 된다.

       
    2. FTP(File Transfer Protocol) 서버

      리눅스에서 보통 사용되는 ftp 서버는 wu-ftp와 proftp를 많이 사용한다. wu-ftp는 리눅스 설치시 기본적으로 설치가 된다. (설치시 선택을 했을 경우)
      FTP server는 주로
      inetd super server라는 서버에 의해서 동작되는 경우가 많은데, 이것은 FTP 데몬이 항상 상주하고 있으면 시스템의 자원을 낭비하기 때문이다.

      [wu-ftp 설정 : ftp 서버]

      우선 wu-ftp가 설치되었는지를 확인을 해보기 위해서 "rpm -qa | grep ftp" 명령을 쳐보자.
      그러면 아래와 같은 목록들이 나올 것이다. 여기서 wu-ftpd가 있는지 확인하면 되며, anonftp라는 것도 설치되어 있는지 확인해보아야 한다 (anonftp가 설치되어 있어야 공개(anonymous) FTP를 제공할 수 있다).
      (아래는 Linux Mandrake 6.0의 경우이다.)

      [root@bluestar bluesky]# rpm -qa | grep ftp
      anonftp-2.8-2mdk
      ftp-0.10-3mdk
      gftp-1.13-4
      ncftp-3.0beta18-4mdk
      tftp-0.10-4mdk
      wu-ftpd-2.5.0-1mdk
      [root@bluestar bluesky]#

      wu-ftp의 경우 2.1 대 버전 및 2.4 대 버전에서 보안상의 문제가 있는것으로 알려져 있다. 공격 대상이 되는 버전은 wu-ftpd-2.4.2b18-1과 wu-ftpd-2.4.2b18-2인 것으로 알려져 있다. 아래의 주소에 가면 wu-ftpd overflow 관련 내용이 있으니 참고해 보기 바란다.

      http://www.netspace.org/cgi-bin/wa?A1=ind9903d&L=bugtraq


      wu-ftp는 /etc/ftpaccess, /etc/ftphosts, /etc/ftpusers의 모두 3개의 설정파일이 있다. 이중 ftpaccess는 ftp 전반에 걸쳐서 접속과 관련된 설정들이 들어있고, ftphosts에는 특정 호스트의 접근제어에 사용되며, ftpusers는 ftp를 사용금지시킬 유저를 설정하게 된다.

      1. /etc/ftpaccess 설정(1)

        /etc/ftpaccess 파일에서는 주로 ftp의 접근시간과 디렉토리 권한설정, 유저에 따른 권한, 메시지설정들을 한다.
        일단 /etc/ftpaccess 파일을 보면 아래와 같다.
        /etc/ftpaccess

        1. class

          먼저 class란 사용자 계층, 혹은 그룹을 말한다. 사용자들의 그룹을 만들 수 있으며, 여기서 정한 그룹별로 제약을 가할 때 사용한다(여기서 그룹을 정해주고 아래에서 여러 제약을 가할때 이 그룹명을 사용하면 된다).
          사용법
          class < class_name> < typelist> < addrglob> [< addrglob> ...]

          class_name은 클래스로 정의할 이름이다.
          typelist는 사용자 유형으로, anonymous, guest, real의 3가지가 있다. anonymous는 anonymous 계정을 가지고 접속하는 유저로서 공개용 ftp이다. guest는 손님 사용자로 특정 ID를 가지고 접근하게 되며, real은 실제 사용자 계정을 가진 유저를 말한다. 콤마로 분리하여 여러개를 적을 수 있다.
          addrglob는 접속하는 위치의 주소로서 와일드카드를 사용할 수 있으며, 역시 콤마로 분리하여 여러 주소를 적을 수 있다.

          사용예
          192.168.1.*의 주소를 가지는 곳에서 접속하는 실제 계정 사용자를 localuser라고 등록하고자 할 경우 아래와 같이 하면 된다.
          class localuser real 192.168.1.*

        2. loginfails

          loginfails는 예제 파일에 설명이 되어 있듯이 최대 접속실패 허용수이다. 여기 적힌수 만큼 접속실패하면 접속이 끊어지게 된다.

        3. banner

          banner는 FTP 접속(로그인)전에 보여주는 메지지를 지정하는 것이다.
          사용법은 아래와 같이

          banner < banner_path>

          이다.
          위의 예제의 경우는 /(root) 아래의 .banner를 사용하는 경우로써 아래에 그 내용을 보여주고 있다.

          [root@bluestar /root]# cd /
          [root@bluestar /]# cat < .banner

              *****************************
              * BLUESTAR FTP SERVER !!! *
              *****************************

          [root@bluestar /]#

        4. email, message

          email은 이상이 있거나 할 때 메일을 보낼 주소이다. 보통 서버 관리자의 email 주소를 적어준다.
          message는 FTP에 접속하거나 어떤 디렉토리로 들어갈 때 보여줄 메시지를 설정하게 된다. 주로 접속시의 환영인사나 FTP 디렉토리 구조나 새로 갱신된 정보들을 알려주기 위해 사용된다. br>
          사용법
          message < path> {< when> {< class>

          path는 보여줄 메시지가 있는 위치이며,
          whenlogin, cwd=< dir>의 두가지로 login은 접속시 보여줄 메시지, cwd=< dir>은 dir의 디렉토리에 들어갈 때 보여줄 메시지를 지정하게 된다. 만일 cwd=*이면 모든 디렉토리로 해석된다. 그리고 class는 위에서 말한 클래스로써, 적용되는 클래스만 이 메시지를 볼 수 있다는 뜻이다.

          내장변수
          메시지에서 특별하게 사용할 수 있는 몇개의 내장변수가 있는데 메시지 파일에 좀더 많은 정보를 넣을 수 있도록 하는 것으로서, 메시지 파일 안에서 특수한 의미로서 대치되는 변수들이며 아래와 같은 것들이 있다.
          변수 의미
          %T 현재 시간을 의미한다. 예를 들어 1999년 5월 1일(토요일) 오후 5시 30분이라면 Sat May 1 17:30:00 1999라고 표시된다.
          %F 현재 디렉토리가 속해있는 파티션의 free space를 KB로 보여준다.
          %C 현재 작업 디렉토리를 보여준다.
          %E ftpaccess에서 정의한 관리자의 e-mail 주소
          %L 서버의 hostname
          %R 원격 hostname
          %U login할 때 사용한 username
          %u RFC931 인증을 통해 결정된 username
          %M 해당 class의 최대 접속 허용수
          %N 해당 class의 현재 접속수

          위의 예제 파일의 경우 login시에 /welcome.msg라는 파일의 내용을 보여주며,
          모든 디렉토리 이동시에 해당 디렉토리내의 .message라는 파일의 내용을 보여준다고 설정하고 있다.

          /welcome.msg의 내용은 아래와 같이 작성되어 있다.
          로긴 환영 메시지

          위의 내용들이 실제 접속시 어떻게 보여지는지는 아래를 보면 알 수 있다.
          FTP 로그인

        5. limit

          limit는 사용자 클래스와 날짜, 시간을 가지고 사용할 수 있는 인원수를 제한할 수 있는 기능이다.
          사용법
          limit < class> < n> < times> < message_files>

          class는 앞에서 설정했던 클래스명이다.
          n은 최대 접속 허용인원.
          times는 시간설정으로, 요일은 [Sn, Mo, Tu, We, Th, Fr, Sa]으로 표기하고 월요일부터 금요일까지는 Wk로 표시한다. 여러 요일은 빈칸 없이 콤마로 구분하며, 시간은 HHMM의 형식으로 적어주며 24시간 표기법을 사용한다.

          위의 예제 파일(limit all 10 Any /home/ftp/userover.msg)에서는 모든 클래스에 대해서 10명을 초과시 /home/ftp/userover.msg 파일을 보여주도록 설정하고 있다.

          /home/ftp/userover.msg 파일의 내용은 아래와 같다.
          [root@bluestar /]# cat < /home/ftp/userover.msg
          #######################################################
               최대허용 접속자수를 초과하였습니다....
               잠시후 다시 접속해 주세요...
          #######################################################
          [root@bluestar /]#

        6. shutdown

          shutdown 다음에 특정파일명이 있으면 ftp 서버는 셧다운 시키면 이 파일을 생성하게 된다. 이 파일이 생성된 이후에는 접속을 할 수 없게 된다. 그러나 현재 접속되어 있는 사용자는 영향을 받지 않는다.
          파일명은 대부분 기본설정인 /etc/shutmsg를 사용하며, ftp를 셧다운 시키는 명령은 ftpshut이다.
          "ftpshut now" 명령을 주면 /etc/shutmsg 파일이 생성되며 ftp 서버는 셧다운되며, 이후의 접속은 안된다.

          [root@bluestar /root]# ftpshut now
          [root@bluestar /root]# ls -l /etc/shutmsg
          -rw-r--r-- 1 root root 49 May 9 03:39 /etc/shutmsg
          [root@bluestar /root]# ftp bluestar
          Connected to bluestar.linuxnet.ac.kr.
          500 bluestar.linuxnet.ac.kr FTP server shut down -- please try again later.
          ftp> quit
          [root@bluestar /root]#

      2. /etc/ftpaccess 설정(2)

        지금까지 /etc/ftpaccess 파일의 전반부를 살펴보았고 이제 나머지 부분을 보기로 하자.
        /etc/ftpaccess 파일의 나머지 부분은 아래와 같은 내용들이다.
        deny 203.253.16.* /home/ftp/deny.msg

        passwd-check rfc822 enforce

        upload /home/ftp /incoming yes ftp daemon 0666 dirs

        virtual ienet.soongsil.com root /home/ftp_ienet
        virtual ienet.soongsil.com banner /home/ftp_ienet/banner.msg

         
        1. deny - 거부 호스트 주소

          특정 IP 주소에서 접근하는 것을 막을 때 사용한다.
          사용법
          deny < IP 주소> < 보여줄 메시지 파일>

          만일 203.253.16.*에서 접근하는 모든 호스트를 거부하며, 이 주소에서 접근해 오는 경우 /home/ftp/deny.msg 파일의 내용을 보여주려고 할 경우 아래와 같이 써주면 된다.

          deny 203.253.16.* /home/ftp/deny.msg

        2. passwd-check

          passwd-check는 공개용 ftp의 패스워드 부분을 검사할 때 얼마나 엄격하게 검사할지를 체크하는 부분으로, 여기서 어떻게 써주는가에 따라서 체크하지 않을 수도 있고, 아니면 엄격한 email 주소를 검사할 수도 있다.

          사용법
          passwd-check < non|trivial|rfc822> (< enforce|warn>)

          < none|trivial|rfc822> : none은 아무것도 체크하지 않고, trivial은 @ 문자가 있는지만 체크하며, rfc822은 RFC822에 명시된 규칙에 의거 강력하게 체크하겠다는 뜻이다.
          < enforce|warn> : enforce는 위의 체크 규칙 위배시 접속을 금지하고, warn은 위배해도 접속은 허용하고 경고만 하게 된다.

          예를들어,
          passwd-check rfc822 enforce
          라고 설정시 anonymous 로 들어오는 사용자가 패스워드 입력시에 guest@guest등으로 제대로된 e-mail 형식을 입력하지 않았을 경우 접속은 금지된다.

        3. upload

          upload는 공개용 ftp 에서 쓰기가능한 디렉토리를 만들 때 사용된다.
          사용법
          upload < root-dir> < dirglob> < yes|no> < owner> < group> < mode> ["dirs"|"nodirs"]

          root-dir은 ftp의 root 디렉토리이다. anonymous로 접속하면 /로 나타나는 곳이다.
          dirglob는 upload를 허용할 디렉토리명으로 ftp의 root 디렉토리를 기준으로 만든다.
          yes|no는 업로드 허용여부이다.
          owner는 기록이 되는 파일에 세팅될 owner UID, 업로드 디렉토리 소유자와 동일해야 한다.
          group은 기록이 되는 파일에 세팅될 owner GID, 역시 업로드 디렉토리의 그룹과 동일해야 한다.
          mode는 기록되는 파일의 권한모드이다.
          dirs|nodirs은 하위 디렉토리를 만드는것을 허용할 것인지 여부이다.

          예를 들어,
          /home/ftp/incoming 이라는 곳을 업로드용으로 사용하며, 업로드를 허용하며, 사용되는 UID는 ftp, GID는 daemon, 그리고 생성되는 파일의 모드는 0666(-rw-rw-rw-)이며, 하위디렉토리를 생성할 수 있도록 설정하고자 할 경우 아래와 같이 써준다.

          upload /home/ftp /incoming yes ftp daemon 0666 dirs

          이렇게 설정했으면 실제로 /home/ftp/incoming 디렉토리를 만들어주어야 하며, 권한도 적절히 설정해 주어야 한다.

          [root@bluestar /root]# mkdir /home/ftp/incoming
          [root@bluestar /root]# chown ftp:daemon /home/ftp/incoming
          [root@bluestar /root]# chmod 755 /home/ftp/incoming

        4. virtual

          virtual은 가상 ftp 호스팅을 하기위한 가상 ftp 설정을 하는 부분이다.
          이 기능을 이용하면 한 대의 서버에서 여러 대의 ftp 서버를 만든 것과 같은 효과를 만들 수 있게 된다.

          사용법
          virtual < address> < root|banner|logfile>

          address는 가상 ftp가 사용할 address이다.
          root|banner|logfile은 root를 선택한 후 path 를 적어주면 주어진 경로이하가 가상 ftp의 root 디렉토리가 된다. banner는 배너 메시지, logfile은 로그를 적을 파일이다.

          아래와 같이 하면 ftp.linux.net의 주소로 접근하면 /home/linux_ftp가 새로운 virtual ftp의 root 디렉토리가 되며, 접속시 보여주는 배너 메시지는 /home/linux_ftp/banner.msg가 된다.

          virtual ftp.linux.net root /home/linux_ftp
          virtual ftp.linux.net banner /home/linux_ftp/banner.msg
          (ftp.linux.net을 192.168.1.20을 가리키도록 /etc/hosts에서 지정해주면 된다.)

          그러나 여기서 virtual에서 호스트만 적어준다고 서버가 해당 호스트의 주소를 받아오지는 않는다.
          IP 주소를 실제로 서버가 가로채 오기 위해서는 아래와 같이 새로운 인터페이스를 만들어주어야 한다. 또한 라우팅 테이블에 해당 가상 서버의 주소를 등록해 주어야 한다.

          [root@bluestar /root]# ifconfig eth0:0 192.168.1.20 netmask 255.255.255.0
          [root@bluestar /root]# route add -host 192.168.1.20 dev eth0:0

      3. /etc/ftpusers - ftp 사용거부자 명단

        /etc/ftpusers 파일에 적힌 유저는 ftp 서비스를 사용할 수 없다. 너무나 강력한 권한을 가지거나, 특정 목적을 위해 만들어진 유저이기 때문에 보안상의 이유로 이들을 통해 파일의 유출을 막아야 하기 때문이다.

        일반적으로 막아두는 유저는 아래와 같으며 추가적으로 막을 사용자에 대해서는 아래에 추가하면 된다.

        [root@bluestar /root]# cat < /etc/ftpusers
        root
        bin
        boot
        daemon
        adm
        lp
        sync
        shutdown
        halt
        digital
        field
        gateway
        guest
        nobody
        operator
        ris
        sccs
        sys
        uucp[root@bluestar /root]#

      4. /etc/ftphosts - ftp 사용거부 호스트

        /etc/ftphosts에는 접근을 허용하거나 막을 호스트명을 지정해 준다.
        사용법

      [proftpd 설정]
      - 다음에 올리겠습니다..

    3. HTTP(Hyper Text Transfer Protocol) 서버

    4. INET 수퍼 서버

      유닉스/리눅스 시스템에서는 수많은 네트워크 서비스를 위한 데몬이 실행되고 있는 경우가 많은데, 이 모든 데몬들이 서비스 요청을 기다리며 자원을 가지고 있다면 시스템 자원의 엄청난 낭비가 초래된다. 그래서 inetd라는 수퍼서버를 하나 띄워두고 요청이 있을 때만 알맞는 서버데몬을 실행시켜주는 서비스가 있는데 이를 INET 수퍼서버라고 한다.
      이 INET 수퍼서버를 이용하면 INET 자체에서 사용되는 보안을 높여줄 수 있으므로 아주 간편하면서 유용한 서비스이다.

      • [INET 수퍼서버의 설정: /etc/inetd.conf]

        INET 수퍼서버는 /etc/inetd.conf라는 설정파일을 사용하는데 일단 파일의 내용을 보면 아래와 같다.

        #
        # inetd.conf     This file describes the services that will be available
        #                    through the INETD TCP/IP super server. To re-configure
        #                    the running INETD process, edit this file, then send the
        #                    INETD process a SIGHUP signal.
        #
        # Version:      @(#)/etc/inetd.conf      3.10      05/27/93
        #
        # Authors:      Original taken from BSD UNIX 4.3/TAHOE.
        #                   Fred N. van Kempen,
        #
        # Modified for Debian Linux by Ian A. Murdock
        #
        # Modified for RHS Linux by Marc Ewing
        #
        # < service_name> < sock_type> < proto> < flags> < user> < server_path> < args>
        #
        # Echo, discard, daytime, and chargen are used primarily for testing.
        #
        # To re-read this file after changes, just do a 'killall -HUP inetd'
        #
        #echo         stream     tcp    nowait    root     internal
        #echo        dgram     udp     wait     root     internal
        #discard     stream     tcp     nowait     root     internal
        #discard     dgram     udp     wait     root     internal
        #daytime     stream     tcp     nowait     root     internal
        #daytime     dgram     udp     wait     root     internal
        #chargen     stream     tcp     nowait     root     internal
        #chargen     dgram     udp     wait     root     internal
        #time        stream     tcp     nowait     root     internal
        #time        dgram     udp     wait     root     internal
        #
        # These are standard services.
        #
        ftp        stream     tcp     nowait     root     /usr/sbin/tcpd     in.ftpd -l -a
        telnet     stream     tcp     nowait     root     /usr/sbin/tcpd     in.telnetd
        #
        ....
        ....

        위의 파일을 보면 < service_name> < sock_type> ... 부분이 있는데 이 /etc/inetd.conf 파일이 이런 요소들로 구성되어 진다는 것을 보여주고 있다.
        < service_name>은 유닉스/리눅스에서 각 포트별로 제공되고 있는 서비스명을 말하며 /etc/services를 보면 자세하게 나온다. /etc/services의 내용을 보면 아래와 같다.

        # /etc/services:
        # $Id: services,v 1.4 1997/05/20 19:41:21 tobias Exp $
        #
        # Network services, Internet style
        #
        # Note that it is presently the policy of IANA to assign a single well-known
        # port number for both TCP and UDP; hence, most entries here have two entries
        # even if the protocol doesn't support UDP operations.
        # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
        # are included, only the more common ones.

        tcpmux        1/tcp      # TCP port service multiplexer
        echo           7/tcp
        echo           7/udp
        discard       9/tcp      sink null
        discard       9/udp      sink null
        systat         11/tcp      users
        daytime       13/tcp
        daytime       13/udp
        netstat        15/tcp
        qotd            17/tcp      quote
        msp            18/tcp      # message send protocol
        msp            18/udp      # message send protocol
        chargen      19/tcp      ttytst source
        chargen      19/udp      ttytst source
        ftp-data       20/tcp
        ftp              21/tcp
        fsp             21/udp      fspd
        ssh            22/tcp      # SSH Remote Login Protocol
        ssh           22/udp      # SSH Remote Login Protocol
        telnet         23/tcp

        ....
        ....

        이 /etc/services 파일의 형식은 아래와 같이 3개의 필드와 4개의 데이터를 가지고 구성이 된다.

        < service_name> < port/protocol> < aliases ...>

        각 필드는 TAB 문자로 구분이 되며,
        < service_name>은 말그대로 서비스 요청 이름이다. 이 이름이 /etc/inetd.conf에서의 서비스 이름과 같은 내용을 가진다.
        port는 사용할 포트번호이다. 가장 중요한 100 이하의 포트는 중요한 서비스를 제공하고 있다.
        protocol은 사용할 프로트콜을 적어주는 부분으로, 일반적으로 tcp, udp의 두개의 프로토콜을 사용한다.
        이 프로토콜에 대한 것은
        /etc/protocols에 정의되어 있다.
        그리고 aliases는 사용할 별칭이다.


        이제 본론으로 돌아와서 /etc/inetd.conf 파일을 보면 아래와 같은 형식으로 구성이 된다.

        < service_name> < sock_type> < proto> < flags> < user> < server_path> < args>

        < service_name>은 위에서 설명이 되었고,
        < sock_type>은 소켓의 형태를 지정하는 것으로, 소켓은 어떤 형태의 패킷을 사용하는가에 따라 설정되는데 stream, dgram, raw, rdm, seqpacket 중에 하나를 사용한다.
        < proto>는 위의 /etc/services 파일에서 살펴보았던 protocol이다.
        < flags>는 데이터그램 소켓에 관련된 옵션으로 wait/nowait의 두개의 값중 하나를 사용한다.
        < user>는 해당 서버를 가동시킬 유저명이다. 대부분의 중요한 서비스는 root 유저로 가동되지만 가끔은 nobody 유저로 가동되는 서비스도 있다.
        < server_path>< args>는 실제로 가동되는 서버의 경로와 서버에 전달할 인자를 써준다. 대부분 < args> 인자는 서버가 특정 옵션을 필요로 할 때 써 준다. 예를 들어, ftp 서비스의 경우 "/usr/sbin/tcpd in.ftpd -l -a" 라고 되어 있는데, 이것은 tcpd라는 tcp wrapper를 사용하기 때문이며, 실제로 가동되는 ftp 서버는 in.ftpd이다. 만일 wu-ftp가 아닌 proftpd를 사용하는 경우는 이부분이 그냥 "/usr/sbin/tcpd in.ftpd"로 써주면 된다.

        이런 형식으로 inetd.conf 파일을 작성해 주면 되며, 이 파일에서 해당 서버 부분을 "#"으로 주석처리하느냐, 아니면 풀어주느냐에 따라 외부에 대한 서비스 제공여부를 결정할 수 있다. 즉, 외부에 ftp 서비스를 제공하고 싶지 않은 경우는 이 파일에서 ftp 부분의 맨 앞에 "#"으로 주석처리 한후 inetd를 재실행 하면 외부에서 ftp 접속시 아래와 같이 에러 메시지를 표시하면서 서비스는 제공되지 않게 된다.

        < ftp 부분을 "#"으로 주석처리후 >
        [root@bluestar bluesky]# ps -aux|grep inetd   <- 실행중인 inetd 서버를 찾아서..
        root      377      0.0      0.8      1308      524      ?         S      May07     0:00     inetd
        root      1609    0.0      0.7      1220      448     ttyp2      S      21:14      0:00      grep inetd
        [root@bluestar bluesky]# kill 377  <- PID(Process ID)로 kill시킴
        [root@bluestar bluesky]# !ps
        ps -aux|grep inetd
        root      1611      0.0      0.6      1216      412      ttyp2      S      21:14      0:00     grep inetd
        [root@bluestar bluesky]# inetd  <- 새로운 설정파일(ftp 서비스 주석처리)을 적용
        [root@bluestar bluesky]# !ps
        ps -aux|grep inetd
        root      1613      2.0      0.9      1312      584      ?      S      21:14      0:00      inetd
        root      1615      0.0      0.6      1216      412     ttyp2   S      21:14      0:00     grep inetd
        [root@bluestar bluesky]# ftp bluestar.linuxnet.ac.kr
        ftp: connect: Connection refused
        ftp> quit
        [root@bluestar bluesky]#

         
      • tcp wrapper를 이용한 제어

        위에서 inetd.conf 파일을 보면 대부분의 서버가 /usr/sbin/tcpd라는 부분이 다 있는 것을 볼 수 있는데, 이것은 tcpd 라는 프로그램이 다음에 나오는 서버를 로딩시키는 것으로 이것을 tcp wrapper라고 부른다. 이것은 서버의 보안을 높이기 위해 사용되고 있다.
        리눅스 시스템에서 /etc/hosts.allow, /etc/hosts.deny라는 파일이 있는데, 이 파일을 사용하여 각 서비스에 대한 외부에서의 접근을 제어할 수 있다.
        inetd 수퍼 서버를 통해 실행함으로서 갖는 장점중에 하나로서 tcpd를 통해서 서비스 제어를 할 수 있다는 것이다. 물론 독립형으로 실행되는 경우가 많은 아파치와 같은 웹서버는 그 자체가 접근에 관련된 서비스를 제어할 수 있는 메커니즘을 가지고 있기도 하지만, tcp wrapper를 사용함으로써 /etc/hosts.allow에는 서비스를 가능하게 할 클라이언트들을 기록하고, /etc/hosts.deny에는 서비스를 거부할 클라이언트를 적어줌으로써 외부에 대한 서비스 제공여부를 정하여 서버의 보안을 높일 수 있게 된다.

        이 /etc/hosts.allow, /etc/hosts.deny 파일의 작성방법은 아래와 같다.

        < daemon_list> : < client_list> [ : shell_command ]

        < daemon_list>에는 inetd.conf 파일에서 써주었던 실제 < server_path>를 써준다.
        예를 들어 ftp 서비스의 경우 in.ftpd이고 telnet의 경우는 in.telnetd이다.
        < client_list>는 당연히 접속을 요청하는 클라이언트의 주소나 도메인을 써준다.
        그리고 마지막 shell_command는 위의 < daemon_list>에 해당하는 서비스로 < client_list>에 해당하는 클라이언트가 서비스 요청시 실행할 쉘 명령어를 써 준다.

        일단 hosts.allow와 hosts.deny의 파일 내용을 보기로 하자.

        #
        # hosts.deny      This file describes the names of the hosts which are
        #                      *not* allowed to use the local INET services, as decided
        #                      by the '/usr/sbin/tcpd' server.
        #
        # The portmap line is redundant, but it is left to remind you that
        # the new secure portmap uses hosts.deny and hosts.allow. In particular
        # you should know that NFS uses portmap!
        in.ftpd : 203.253.16., 192.245., .co.kr
        in.telnetd : .co.kr, ac.kr

        위의 hosts.deny의 내용을 보면 일단 ftp 서비스에 대해서 "203.253.16."과 "192.154."로 시작하는 IP 주소에 대해서 모두 접근을 거부하며, ".co.kr"의 도메인 주소를 가지는 클라이언트의 ftp 서비스 요청도 거부하겠다는 뜻이다.
        그리고 telnet 서비스에 대해서는 ".co.kr"과 ".ac.kr"의 도메인 주소를 가지는 클라이언트에 대해서 서비스 요청을 거부하겠다는 뜻이다.

        이번에는 다르게 작성된 hosts.deny 파일의 내용을 한번 보기로 하자.
        #
        # hosts.deny      This file describes the names of the hosts which are
        #                      *not* allowed to use the local INET services, as decided
        #                      by the '/usr/sbin/tcpd' server.
        #
        # The portmap line is redundant, but it is left to remind you that
        # the new secure portmap uses hosts.deny and hosts.allow. In particular
        # you should know that NFS uses portmap!
        ALL : 203.253., 192.245.
        ALL EXCEPT in.ftpd : .co.kr, .net

        이 경우는 "203.253."과 "192.245."으로 시작하는 IP 주소에 대해서는 모든 서비스 요청에 대해서 거부를 하겠다는 뜻이며, 아래줄의 경우는 ".co.kr"과 ".net"의 도메인을 갖는 클라이언트에 대해서는 ftp를 제외한 모든 서비스 요청을 거부(즉, ftp 서비스만 제공) 하겠다는 뜻이 된다.

        이번에는 마지막을 조금 색다르게 설정된 hosts.deny 파일을 보기로 하자.
        (서비스 요청이 들어올 경우 따로 실행할 쉘 명령어를 설정해 준 경우이다.)
        #
        # hosts.deny      This file describes the names of the hosts which are
        #                      *not* allowed to use the local INET services, as decided
        #                      by the '/usr/sbin/tcpd' server.
        #
        # The portmap line is redundant, but it is left to remind you that
        # the new secure portmap uses hosts.deny and hosts.allow. In particular
        # you should know that NFS uses portmap!
        in.ftpd : ALL : (/usr/bin/finger -l @%h | /bin/mail -s %d-%h root) &

        위의 경우는 ftp 서비스는 모든 클라이언트에 대해서 제한하겠으며, 서비스 요청이 들어올 경우 서비스를 거부하고 /usr/bin/finger 프로그램을 실행시키겠다는 뜻이다. %h는 클라이언트의 호스트이름이나 주소로 대치되는 변수이다.
        그리고 나서 파이프로 연결되어지고 /bin/mail을 가동시키고 -s 옵션으로 제목을 적어서 root 유저에게 메일을 보낸다.
        %d 변수는 데몬프로세스 이름을 기록하고 %h는 클라이언트의 호스트이름이나 주소로 대치되는 변수이다.

    5. NFS(Network File System) 서버

      NFS(Network File System)은 UNIX중의 Solaris로 유명한 Sun Mycrosystems가 제안한 서비스로, 네트워크상에서 서로 다른 호스트끼리 특정 디렉토리를 서로 공유하자는 개념에서 출발하였다.
      마치 네트워크상의 다른 호스트의 하드디스크를 마치 네트워크선이라는 케이블을 통해서 약간 멀리 떨어져 있는 하드 디스크인 것처럼 사용하는 것이 주목적이었으나 현재는 유닉스/리눅스에서 매우 많이 사용되는 서비스 중의 하나가 되었다.
      윈도우즈에서 Netbeui를 이용한 smb 프로토콜을 이용하여 파일을 공유(네트웍 드라이브)하는 것처럼 유닉스/리눅스에서도 네트웍 드라이브처럼 다른 호스트의 하드디스크를 사용할 수 있는 것이다.

      그러나 NFS 서비스는 보안에 관해서는 그다지 완벽하다고 볼 수 없는 서비스이어서 안전하게 사용하기 위해서는 현재 서브넷에 신뢰성이 떨어지는 유저가 있는지를 살펴보아야 한다. 만일 자신의 패킷이 가로채어 지고 있다면 해당 서비스를 중단하고 해당 위치에서 접근을 막거나 다른 보안책을 강구해야 할 것이다.

      1. NFS 서버측 설정

        NFS 설정은 서버측 설정과 클라이언트측 설정으로 나뉘는데, 우선 서버측 설정은 netconf를 사용한다.

        일단 서비스를 할 디렉토리를 정해야 하는데, root 디렉토리(/)는 보안상 공유시키지 않는 것이 좋다. 또한 여러가지 중요한 설정파일이 있는 /etc 디렉토리도 서비스하지 않는것이 좋다. 주로 사용자들의 홈 디렉토리가 있는 /home과 /var, /usr 등의 디렉토리를 서비스하게 되는데 필요에 따라서 다른 디렉토리들도 적절하게 서비스 해줄 수도 있다.

        일단 netconf를 실행해 보자.

        [bluesky@bluestar bluesky]# netconf
        netconf의 메인화면

        netconf를 실행하면 위와 같은 메인화면이 나오는데 [Server tasks]를 선택하면 아래와 같은 서버설정 창이 뜬다.
        Server tasks

        위에서 [Exported file systems(NFS)]를 선택하면 아래와 같은 메인 설정화면이 나온다.
        NFS 서버측 설정 화면

        위를 보면 현재 3개의 디렉토리가 서비스되고 있는데(/home/ftp, /home/httpd, /home/samba라는 3개의 디렉토리를 darkstar.linuxnet.ac.kr이란 호스트에게 제공하고 있다).. 처음에는 아무것도 없을 것이다. 새로운 디렉토리를 추가하려면 아래의 [Add]를 선택하면 아래와 같은 설정창이 뜬다.
        NFS 서버 Add 창

        우선 "Path to export"는 다른 호스트에 제공할 디렉토리 경로를 적어준다.
        "Comment (opt)"는 디렉토리에 대한 설명이며, 안적어주어도 상관없다.
        "Client name(s)"는 접근을 허락할 NFS 클라이언트의 주소나 FQDN(호스트명+도메인명)을 적어준다.

        그 다음에 몇가지의 설정이 나오는데,
        "May write"는 서비스 제공하는 디렉토리에 대한 쓰기를 허락하는 것이고, 보안이 신경이 쓰이는 서버에서는 "May write" 및 "Root privileges"는 켜주지 않는 것이 좋다.
        "Root privileges"는 root 유저의 권한을 설정해주는 것이고,
        "translate symbolic links"는 심볼릭 링크를 쫓아갈 것인지를 설정해 주는 것이다.
        마지막으로, "Request access from secure port"는 secure port를 통해서 접근을 하도록 하겠다는 것으로 보안을 위해서 이 옵션은 항상 켜진다.

        아래에 "Client name(s)"가 여러개 있는데 이는 하나 이상의 여러 호스트에게 서비스를 제공할 경우 해당 호스트들을 여기에 계속적으로 써주면 된다.

        이렇게 설정이 끝나면 [Accept]를 선택한후 연속적으로 [Quit]를 누르면 젤 마지막에 아래와 같은 활성화 여부를 묻는 창이 뜨는데, 여기서 "Activate the changes"를 선택하면 지금까지 설정한 내용이 적용이 된다.


        지금까지의 설정은 /etc/exports라는 파일에 기록이 된다.
        참고로 이 파일의 내용을 보면 아래와 같다.

        [bluesky@bluestar bluesky]# cat < /etc/exports
        /home/ftp darkstar.linuxnet.ac.kr(rw,no_root_squash) # Bluestar's FTP directory
        /home/httpd darkstar.linuxnet.ac.kr(rw,no_root_squash) # Bluestar's HTTP directory
        /home/samba darkstar.linuxnet.ac.kr(rw,no_root_squash) # Bluestar's Samba directory
        [bluesky@bluestar bluesky]#

      2. NFS 클라이언트측 설정

        NFS의 클라이언트측 설정은 fsconf 툴을 사용하는데, 서비스를 제공받을 호스트상에서 fsconf를 실행하면 아래와 같은 창이 뜨는데, 여기서 [Access nfs volume]를 선택한다.


        위에서 [Access nfs volume]를 선택하면 아래와 같은 창이 뜨는데, 처음이므로 아무 내용도 없을 것이다.


        위에서 [Add]를 선택하면 아래와 같이 새로운 설정을 추가할 창이 뜬다.


        먼저, Server는 NFS 서버측 호스트명을 적어준다(bluestar.linuxnet.ac.kr).
        Volume은 서비스될 공유 디렉토리명이다(/home/ftp).
        Mount point는 클라이언트측에서 마운트할 디렉토리를 적어준다(예:/home/bluestar/ftp).

        지금까지의 내용을 정리하면 bluestar.linuxnet.ac.kr이란 NFS 서버에서 제공하는 /home/ftp란 디렉토리를 darkstar.linuxnet.ac.kr이란 클라이언트에서 /home/bluestar/ftp란 디렉토리에 마운트를 하게 된다.

        위에서 Base에 대한 설정을 하였고 이제 [Option]을 선택하면, 아래와 같은 옵션 설정창이 뜬다.


        먼저, "Read only"는 읽기 전용으로 마운트 하겠다는 뜻이다.(기본적으로는 Read/Write이다. 물론 서버측에서 "May write"를 켜두지 않으면 쓰기가 안되지만..)
        "User mountable"은 유저가 마운트할 수 있도록 권한을 주는 것인데 보안상 좋지 않다.
        "Not mount at boot time"은 부팅시 마운트 하지 않겠다는 뜻이며, 부팅시에 자동으로 마운트를 하려면 이 옵션을 선택해 준다.
        "No program allowed to execute"는 NFS로 마운트된 곳에서 프로그램을 실행시키지 못한다는 뜻이다. 만일 보안상 특별히 가할 필요가 있다면 이 옵션을 선택하도록 한다.

        이외의 옵션및 다른 메뉴들을 그다지 중요하지 않으므로 여기서는 생략한다.
        이제 모든 설정을 끝내고 [Accept]를 선택하면 아래와 같이 설정된 내용이 적용된 창이 보이게 된다.


        이제 모든 설정이 끝났는데, 이렇게 설정된 내용은 /etc/fatab 파일에 기록이 된다.

        아래는 darkstar란 호스트에서 bluestar란 NFS 서버에서 제공하는 /home/ftp란 디렉토리를 /mnt/bluestar/home/ftp란 디렉토리에 마운트하여 사용하고 있는 화면이다.
        참고화면

    6. Proxy 서버

    7. Samba 서버

    8. Mail 서버

    1. 데몬(daemon)이란 시스템에 관련된 작업을 하는 후위 프로세스(background process)를 말한다. 대부분의 데몬들은 시스템이 부팅되면서 시작되는데, telnetd daemon, ftpd daemon, httpd daemon, inetd daemon, squid daemon, sendmail daemon, bind nameserver daemon, routed daemon, smb daemon 등의 네트웍 데몬과 프린트를 제어하는 lpd daemon, 데이터베이스인 postgresql daemon, crond daemon, atd daemon 등이 있다.

      대부분의 데몬은 시스템에 관련된 작업을 하게 되는데, 서비스 요청이 없을 때는 후위 프로세스로서 유휴(idle) 상태에 들어가 있게 되어 시스템의 CPU를 차지하지 않지만 메모리와 기타 자원을 상당수 차지하게 된다. 그러므로 많은 데몬을 띄울려면 그 만큼 시스템에 자원을 많이 가지고 있어야 한다.

      데몬(=데몬 프로세스:daemon process)이란 도스에서의 램상주와도 비교되지만, 차이가 있다면 램상주 프로그램은 메모리의 일부분에서 잠자고(sleep) 있다가 어떤 사건(단축키를 통한 호출 등)이 일어났을 때만 깨어나서 자기 역할을 수행하는 것이지만, 데몬의 경우 메모리에서 백그라운드 상태로 계속 실행되고 있다는 것이다.
      ps -axj 명령으로 봤을 때 tty 필드에서 tty가 설정되어 있지 않는 것들이 데몬들이며 이름이 모두 d로 끝난다.


    2. System V 계열의 유닉스는 런레벨이라는 것을 가지고 있는데, 런레벨에서 해당하는 레벨 번호를 호출하기만 하면 시스템은 곧바로 미리 정해진 필요한 서비스를 띄워줌으로서 간편하게 시스템 초기화를 이룰 수 있게 된다.
      /etc/rc.d 디렉토리가 바로 런레벨과 관련이 있는 디렉토리인데 내용을 보면 아래와 같다.



      기본적으로 8개의 디렉토리와 3개의 실행파일이 있는데,
      이중에서 rc#.d(#는 0-6중의 하나)의 7개의 디렉토리가 있는데 이 디렉토리들이 각각 런레벨을 나타낸다. 각각의 런레벨은 각각 의미가 있는데 아래와 같은 의미를 가진다.

      런레벨 의 미
      0 halt, 시스템 종료 레벨
      1 single user mode, 네트웍을 지원하지 않는 싱글유저 시스템 레벨
      2 multi-user without NFS, 3번과 같지만 네트워킹을 지원하지 않음
      3 full multi-user mode, 일반적인 부팅레벨(full network)
      4 unused, 사용자 정의 레벨
      5 X11, X윈도우로 시작을 의미하는 레벨(xdm이 사용됨)-> X로 바로 부팅
      6 reboot, 재부팅을 의미하는 레벨


      일반적으로 부팅할 경우 런레벨 3으로 부팅을 하게 되는데, 런레벨 3을 의미하는 rc3.d의 내용을 보면 아래와 같다.

      [root@bluestar rc3.d]# ls -lF
      ....
      ls -lF 실행화면

      ....

      위의 파일들을 보면 뭔가 규칙이 있는것 같은데, 모든 파일들은 심볼릭 링크로 되어 있으며 규칙은 앞에 영문자 한글자, 그리고 2자리 숫자, 그 다음에 데몬 서비스 이름의 형식으로 되어 있다.
      맨 앞의 영문 한 글자는 보통 "K", "S" 중의 한 글자가 되는데 K(Kill)로 시작하면 해당 서비스를 죽이는 역할을 하고, S(Start)는 해당 서비스를 시작하게 하는 역할을 하게 된다. 그래서 rc0.d(종료레벨)의 파일들은 모두 K로 시작하게 된다.
      그 다음의 두자리 숫자는 스크립트의 번호인데, 이 번호가 낮을수록 먼저 시작하게 된다. 스크립트 파일 생성시 이 스크립트 번호는 되도록 서로 겹치지 않게 하는 것이 좋다(번호가 같을 경우 어떤 서비스가 먼저 시작될지 모르기 때문에..).

      이와 같은 규칙에 따라 어떤 런레벨에 어떤 서비스를 추가하려고 할 때는 링크를 직접 생성해주거나, ksysv라는 런레벨 편집기를 사용하면 된다.

      1. 리눅스의 부팅과정

        [Power on ~> Prompt]
        1. 컴퓨터가 켜지면, POST 과정에 의해 시스템이 초기화된다.
        2. Boot record나 하드인 경우 MBR(Master boot record)를 읽어 들인다.
        3. LILO(Linux Loader)가 실행된다. 만일, 디폴트인 리눅스가 로딩되기 전에 Ctrl, Shift, Alt 중 하나를 누르고 있으면, LILO는 부팅할 운영체제를 물어 본다.
        4. Kernel이 메모리로 로딩되며, 만일 커널이 압축되었다면 압축을 해제한다.
        5. 커널은 하드, 플로피, 네트웍 어댑터 등을 검사하며, 디바이스 드라이버를 설정한다.
        6. 리눅스는 프로세서를 보호모드로 전환시킨다. 화면상의 변화는 나타나지 않는다.
        7. root 파일 시스템을 마운트시킨다. root 파일 시스템은 'rdev'나 LILO에 의해 설정되어 있으며, 파일 시스템의 형태는 자동적으로 검출된다.
        8. 커널은 /etc/init을 백그라운드로 실행한다. 'init'는 'inittab' 파일의 내용에 따라 실행된다.
        9. init는 /etc/rc를 실행한다.
        10. 'rc'는 /etc/rc.local이나 /etc/rc.[0-9]등을 실행시킨다.
        11. 'init' 프로그램은 가상 콘솔을 위해 /etc/gettytabs에 의해 설정된 직렬 라인으로 getty를 실행한다.
        12. ID와 패스워드를 입력한다.
        13. shell이 작동하고 bash shell이면 .bashrc를 , tcsh shell이면 .profile을 불러들인다.
        14. 프롬프트가 표시된다.


        위의 부팅과정의 8번에서 있는 것처럼 리눅스는 처음 부팅을 하면서 init라는 프로세스가 /etc/inittab이라는 파일을 불러들이게 되는데, 이 파일에는 부팅시 불러올 런레벨을 결정하는 부분이 있는데, 이 파일의 내용은 아래와 같다.

        [root@bluestar rc3.d]# vi /etc/inittab
        #
        # inittab     This file describes how the INIT process should set up
        #              the system in a certain run-level.
        #
        # Author:   Miquel van Smoorenburg,
        #              Modified for RHS Linux by Marc Ewing and Donnie Barnes
        #

        # Default runlevel. The runlevels used by RHS are:
        # 0 - halt (Do NOT set initdefault to this)
        # 1 - Single user mode
        # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
        # 3 - Full multiuser mode
        # 4 - unused
        # 5 - X11
        # 6 - reboot (Do NOT set initdefault to this)
        #
        #여기까지는 화일설명 및 런레벨 설명에 관한 주석문..

        id:5:initdefault:
        #이 부분이 부팅시의 런레벨을 결정해주는 부분인데 5이므로 부팅시 X윈도우로 시작하겠다는 의미이다.

        # System initialization.
        si::sysinit:/etc/rc.d/rc.sysinit

        l0:0:wait:/etc/rc.d/rc 0
        l1:1:wait:/etc/rc.d/rc 1
        l2:2:wait:/etc/rc.d/rc 2
        l3:3:wait:/etc/rc.d/rc 3
        l4:4:wait:/etc/rc.d/rc 4
        l5:5:wait:/etc/rc.d/rc 5
        l6:6:wait:/etc/rc.d/rc 6

        # Things to run in every runlevel.
        ## Linux Mandrake:
        # Obsolete with 2.2.9 kernel.
        #
        #ud::once:/sbin/update

        # Trap CTRL-ALT-DELETE(Ctrl-Alt_Del을 눌렀을 때 실행되는 명령:shutdown 명령으로 재부팅함.)
        ca::ctrlaltdel:/sbin/shutdown -t3 -r now

        # When our UPS tells us power has failed, assume we have a few minutes
        # of power left. Schedule a shutdown for 2 minutes from now.
        # This does, of course, assume you have powerd installed and your
        # UPS connected and working correctly.
        pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

        # If power was restored before the shutdown kicked in, cancel it.
        pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

        # Run gettys in standard runlevels
        1:2345:respawn:/sbin/mingetty tty1
        2:2345:respawn:/sbin/mingetty tty2
        3:2345:respawn:/sbin/mingetty tty3
        4:2345:respawn:/sbin/mingetty tty4
        5:2345:respawn:/sbin/mingetty tty5
        6:2345:respawn:/sbin/mingetty tty6

        # Run xdm in runlevel 5
        # xdm is now a separate service
        x:5:respawn:/etc/X11/prefdm -nodaemon


        주석정도의 내용만 알고 있으면 되며, 이와 같이 특정 런레벨로 실행이 된후에 다른 런레벨로 바꾸고 싶은경우(이런경우는 잘 없겠지만..) telinit 명령을 사용한다.
        예를 들어 런레벨 5로 부팅된 상태에서 런레벨 3으로 바꾸고자 한다면
        [root@bluestar rc.d]# telinit 3
        그러면 X 윈도우가 사라지면서 콘솔환경의 로긴화면이 다시 뜨게 된다.

        그냥 telinit 만 쓰면 아래와 같이 사용법이 나온다.
        [root@bluestar rc.d]# telinit
        Usage: telinit 0123456SsQqAaBbCcUu

      2. Run level에 새로운 서비스를 추가하기

        특정 런레벨에 새로운 서비스를 추가하는 방법에는 수동적으로 링크를 만들어 주는 방법런레벨 에디터를 사용하는 방법이 있다.

        우선 에디터에는 콘솔화면용 런레벨 에디터와 X용 런레벨 에디터가 있는데,
        콘솔용은 ntsysv이며, 실행하면 아래와 같은 창이 뜬다.
        [root@bluestar rc.d]# ntsysv
        ntsysv 실행화면

        여기서 추가하고 싶은 데몬은 별표(*)로 체크해주고, 선택된 데몬을 제거하고자 한다면 별표를 제거해주면 된다.

        X용 런레벨 에디터는 KDE 환경의 ksysv와 레드헷 리눅스의 기본 런레벨 에디터인 tksysv가 있다(거의 비슷하지만 차이점이 있다면 ksysv가 좀더 사용하기 쉬우며, tksysv에서는 0,1,6의 런레벨의 경우 시스템에 결정하므로 수정할 수 있는 창에는 나타나지 않는다).

        tksysv는 자세한 설정방법은 생략하고(실제 설정은 그리 어렵지 않다..화면에서 보면 왼쪽의 리스트(Available)에서 추가할 서비스를 선택한후 Add 버튼을 누르면 자세한 설정창이 뜨는식인데 적절히 선택해 주면 된다.) 실행화면만 아래에 보인다.



        ksysv는 KDE 데스크탑 환경에서 제공하는 런레벨 에디터로서, 최근 배포판의 경우 대부분 KDE를 제공하고 있기 때문에 사용하는데 문제는 없을 것이다.
        [ksysv 실행화면]

        위의 실행화면에서 일단 서비스를 추가하는 경우는 화면 왼쪽의 "Available Services"에서 추가하려는 서비스(데몬)를 선택한후 마우스 오른쪽 버튼을 누르면 선택가능 메뉴가 나오는데 거기서 "복사(C)"를 선택한 후 추가하려는 런레벨로 가서 추가하려는 부분에서 마우스 오른쪽 버튼을 클릭한후 "붙여넣기(P)"를 선택하면 된다.
        예를 들어 런레벨 5의 syslog(30번) 데몬 다음에 amd 데몬을 추가하려는 경우, "Available Services"에서 amd를 선택한 후 마우스 오른쪽 버튼을 클릭하여 "복사(C)"를 선택한 다음, 런레벨 5로가서 30번 syslog 데몬을 선택한 후 마우스 오른쪽 버튼을 클릭하여 "붙여넣기(P)"를 선택하면 syslog 아래에 amd 데몬이 추가될 것이다. 데몬 번호는 시스템이 결정해 준다.

        그리고 해당 런레벨에서 특정 데몬(서비스)을 제거하려는 경우 해당 런레벨의 해당 데몬을 선택한 후 마우스 오른쪽 버튼을 클릭한 후 "잘라내기(U)"를 선택하면 된다.


        지금까지는 에디터를 이용하는 방법을 알아 보았는데, 만약 이러한 에디터를 사용할 수 없는 환경이라면 수동으로 링크파일을 만들어서 편집하는 수 밖에 없다.
        예를 들어 런레벨 5에 데몬번호 86번으로 gated를 추가하는 경우 아래와 같이 하면 된다.

        [root@bluestar /root]# cd /etc/rc.d/rc5.d   <- 편집하려는 해당 런레벨(5)로 이동
        [root@bluestar rc5.d]# ln -s ../init.d/gated S86gated  <- /etc/init.d는 데몬들이 있는 디렉토리이다.

        제대로 생성되었는지 확인해보면 된다.
        [root@bluestar rc5.d]# ls -l S*
        lrwxrwxrwx    1   root    root      17 Feb 15 04:25 S10network -> ../init.d/network
        lrwxrwxrwx    1   root    root      17 Feb 15 04:25 S11portmap -> ../init.d/portmap
        lrwxrwxrwx    1   root    root      16 Feb 15 04:25 S30syslog -> ../init.d/syslog
        lrwxrwxrwx    1   root    root      20 Mar 4 09:28 S35atd -> /etc/rc.d/init.d/atd
        lrwxrwxrwx    1   root    root      15 Feb 15 04:25 S40crond -> ../init.d/crond
        lrwxrwxrwx    1   root    root      14 Feb 15 04:25 S50inet -> ../init.d/inet
        lrwxrwxrwx    1   root    root      13 Feb 15 04:25 S60nfs -> ../init.d/nfs
        lrwxrwxrwx    1   root    root      16 Feb 15 04:25 S72autofs -> ../init.d/autofs
        lrwxrwxrwx    1   root    root      18 Feb 15 04:25 S80sendmail -> ../init.d/sendmal
        lrwxrwxrwx    1   root    root      13 Feb 15 04:25 S85gpm -> ../init.d/gpm
        lrwxrwxrwx    1   root    root      15 Feb 15 04:25 S85httpd -> ../init.d/httpd
        lrwxrwxrwx    1   root    root      15 Feb 15 04:25 S85sound -> ../init.d/sound
        lrwxrwxrwx    1   root    root      15 May 14 01:18 S86gated -> ../init.d/gated
        lrwxrwxrwx    1   root    root      13 Feb 15 03:40 S90xfs -> ../init.d/xfs
        lrwxrwxrwx    1   root    root      13 Feb 15 04:25 S91smb -> ../init.d/smb
        lrwxrwxrwx    1   root    root      19 Feb 15 04:25 S99linuxconf -> ../init.d/linuxconf
        lrwxrwxrwx    1   root    root      11 Feb 15 03:37 S99local -> ../rc.local

       
      1. /proc 디렉토리

        유닉스/리눅스 시스템에는 /proc 이라는 특별한 디렉토리가 있는데, 이 디렉토리는 일반적으로 가상적으로 생기는 파티션이 마운트되는 곳으로 mount 명령으로 현재 마운트된 디렉토리들을 보면 /proc 라는 부분이 있을 것이다.

        [root@bluestar /proc]# mount
        /dev/hdb1 on / type ext2 (rw)
        none on /proc type proc (rw)
        none on /dev/pts type devpts (rw,mode=0622)
        automount(pid459) on /misc type autofs (rw,fd=5,pgrp=459,minproto=2,maxproto=3)
        [root@bluestar /proc]#

        이 /proc 디렉토리는 실시간 시스템 정보를 가지고 있는 디렉토리들이다. 따라서 많은 프로그램들이나 시스템에 관련된 작업들이 이 디렉토리를 참고해서 일어나게 된다. 이 디렉토리의 내용을 보면 아래와 같다.



        위의 파일들 중 몇개에 대한 설명은 아래와 같다.
        cpuinfo cpu에 대한 자세한 정보를 기록
        interrupts 시스템의 IRQ(interrupt)에 대한 정보를 기록
        ioports 입출력 포트들에 대한 정보를 기록해서 가지고 있다.
        meminfo memory(RAM, Swap)에 대한 정보를 기록해서 가지고 있다.
        pci PCI 포트에 대한 정보를 가지고 있다. 각각의 PCI 포트에 PCI 카드가 있다면 해당 정보가 기록된다.
        [/proc 디렉토리의 파일들]

        디렉토리 파일 설명
        scsi/ scsi SCSI를 사용하는 경우의 정보가 여기에 기록된다.
        net/ arp arp table의 내용을 담고 있다.
        sockstat 현재 소켓의 상황을 보여준다.
        dev 네트웍 장치를 보여준다. 보내고 받은 패킷수나 에러, 콜리즌(충돌)의 수를 보여준다.
        [하위 디렉토리에 있는 파일들]

        그리고 위의 파일 내용에서 숫자들로 이루어진 디렉토리들이 있는데 이 디렉토리들은 해당 숫자번호의 PID(Process ID)로 실행되고 있는 데몬(서비스)에 대한 정보들을 가지고 있는 디렉토리들이다.
        예를 들어 inetd 데몬에 대한 정보를 보려면,


        위와 같이 ps 명령으로 보면 PID가 6404번으로 inetd 데몬이 실행되고 있음을 알 수 있다. 이 inetd 데몬에 대한 정보를 보려면 /proc 디렉토리 아래의 /6404 디렉토리로 가면 된다.


        아래와 같이 cmdline의 내용을 보면 command line이 inetd이라는 것과 status를 보면 현재 데몬 상태를 볼 수 있다.
        [root@bluestar 6404]# cat < cmdline
        inetd

        [root@bluestar 6404]#
        [root@bluestar 6404]# cat < status
        Name: inetd
        State: S (sleeping)
        Pid: 6404
        PPid: 1
        Uid: 0 0 0 0
        Gid: 0 0 0 0
        Groups: 0
        VmSize: 1312 kB
        VmLck: 0 kB
        VmRSS: 584 kB
        VmData: 40 kB
        VmStk: 12 kB
        VmExe: 16 kB
        VmLib: 1196 kB
        SigPnd: 0000000000000000
        SigBlk: 0000000000000000
        SigIgn: 0000000000001000
        SigCgt: 0000000000016003
        CapInh: 00000000fffffeff
        CapPrm: 00000000fffffeff
        CapEff: 00000000fffffeff
        [root@bluestar 6404]#

      2. 프로세스, 서비스 관리

        보통 사용되지 않는 서비스나 많이 사용되지 않는 경우에는 대부분 stop 시켜두는 것이 좋은데, 일반적으로 자신에게 필요없는 프로세스는 살려둘 필요가 없다. 또한 nice 값을 조정하여 실행시 프로세스의 우선순위를 변화시킬수도 있다. 이렇게 시스템 상황에 따라 적절히 서비스들을 관리하려면 현재 자신의 시스템의 여러가지 상황을 알아야 하는데, 이런 경우 프로세스 및 실시간 시스템 상황을 보는 명령이 top 이라는 명령이다.

        사용법
        top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

        옵션
        -d delay : delay의 시간이 경과하면 현재 스크린을 갱신한다.
        -q : 이 옵션을 사용하면 스크린을 계속 갱신한다.
        -c : command list 전체를 보여준다. 즉 옵션을 사용한 것까지 모두 보여준다.
        -i : idle 상태와 zombie 프로세스는 무시한다.
        이외의 옵션에 대해서는 man 파일을 참고하기 바란다.

        사용예
        [root@bluestar /root]# top
        top 실행화면

        위의 화면을 보면 우선 첫줄은 2:59am up 6days, 10:36는 현재시간 오전 2:59이고 시스템을 부팅한지 6일 10시간 36분이 지났다는 뜻이다. 그 다음 4 users는 4 유저가 현재 접속해 있다는 뜻이다. 그리고 load average는 평균부하이다.

        두번째 줄의 61 processes: 56 sleeping, 3 running, 1 zombie, 1 stopped는 현재 총 61개의 프로세스가 있고, 그 중 56개가 sleeping 상태이고, 3개가 동작중이며, 1개가 zombie 상태이고, 1개가 중단되었다는 뜻이다.

        그리고 세번째 줄의 CPU states: 36.4% user, 63.5% system, 0.0% nice, 0.0%idle는 유저모드에서의 CPU 시간이 36.4%이고, 시스템 모드(프로세스를 위해서 커널이 사용한 CPU의 시간 퍼센트)에서의 CPU 시간이 63.5%이고, 0.0%nice는 nice로 nice value를 음수로 주어 우선순위를 높이는 경우에 해당하는 모드의 경우이다. 그리고 0.0%idle은 CPU의 0.0%가 놀고 있다는(현재 CPU가 모두 사용중) 뜻이다.

        그 다음 두줄은 각각 RAM과 Swap 메모리의 상태를 보여주고 있는 것이다.

        그 다음 각 항목을 나타내는 라인이 표시되고 있는데,


        기본적으로 총 13개의 필드로 구성되어 있는데, 아래에 각 항목들에 대한 설명이 있으며 이 항목들은 다음에 얘기할 명령어로 보고싶은 항목만 정렬해서 바꿀 수도 있다.
        항목 설명
        PID 해당 프로세스의 Process ID이다.
        PPID 해당 프로세스의 부모 Process ID이다.
        UID 해당 프로세스의 소유자 UID이다.
        USER 해당 프로세스의 소유자명이다.
        PRI PRIority, 해당 프로세스의 우선순위이다.
        NI NIce, 해당 프로세스의 nice값을 보여준다.
        nice값은 (-20~19)의 값을 가지는 음수쪽으로 갈수록 높은 순위를 매겨지게 되며, 0이 기본값이다.
        SIZE 해당 프로세스의 (code+data)의 용량을 KB로 나타낸 크기이다.
        TSIZE 해당 프로세스의 (code)의 용량을 KB로 나타낸다.
        DSIZE 해당 프로세스의 (code+stack)의 용량을 KB로 나타낸다.
        SWAP 해당 프로세스가 스왑한 메모리양을 KB로 나타낸다.
        RSS 해당 작업에 소요된 실제 메모리양을 KB로 나타낸다.
        SHARE 해당 작업이 사용하는 공유메모리(shared memory)의 양을 KB로 나타낸다.
        STAT 영문자 한글자로 대치되는 프로세스의 상태.
        S는 sleeping, D는 uninterruptible sleeping, R은 running, Z는 zombie, T는 stop되거나 trace되는 경, <는 nice값이 음수가 될 경우이고 N은 nice값이 양수일 경우에 나타난다.
        LIB 라이브러리 페이지의 크기를 보여준다. (ELF 형태의 프로세스는 해당되지 않는다.)
        %CPU CPU 시간 사용 퍼센트이다.
        %MEM 메모리 사용 퍼센트이다.
        TIME 해당 프로세스가 시작되어 사용한 총 CPU 시간을 나타낸다.
        COMMAND 해당 프로세스를 실행한 명려어 라인을 보여준다.
        [top 에서 사용되는 필드들의 의미]

        이 top 명령에서 나오는 출력내용들은 실시간으로 계속 바뀌고 있는 내용들을 갱신해서 보여주는데, 이 명령 실행중에 키보드에서 명령을 입력받을 수 있다. 그 명령들은 아래와 같다.
        space : 현재 화면을 갱신한다.
        ^L : 현재 스크린을 완전히 지우고 다시 그린다.
        h, ? : 도움말을 출력한다.
        k : 프로세스에게 kill 명령을 내린다. 이 키를 누르면 죽일 PID를 물어본다.
        i : zombie, stop 프로세스를 출력을 on/off 한다.
        n or # : 출력할 프로세스의 개수를 정한다.
        q : top을 종료한다.
        r : re-nice를 사용해서 nice값을 변경한다.
        s : 스크린을 갱신할 delay 시간을 변경한다.
        f, F : 보여줄 항목을 추가하거나 제거한다.
        o, O : 보여줄 항목의 순서를 바꾼다.
        l : 처음 설명한 첫줄인 uptime과 load average 항목을 on/off 한다.
        m : memory에 관련된 항목을 on/off 한다.
        t : 프로세스와 CPU state 항목을 on/off 한다.
        c : 앞에 실행옵션중의 command line, name 관련인 -c 항목을 on/off 한다.
        M : 위의 항목중 RSS의 순으로 정렬한다.
        P : CPU 사용량인 %CPU 항목 순으로 정렬한다. 기본값이다.
        T : TIME 항목 순으로 정렬한다.
        W : 현재 바꾼 설정을 저장한다. 저장파일은 ~/.toprc이다.

        top의 X용 명령어로는 KDE 환경의 ktop과 GNOME 환경의 gtop이 있다.
        [root@bluestar bin]# ktop
        ktop 실행화면

        [root@bluestar bin]# gtop
        gtop 실행화면

    3. at 데몬은 어떤 명령을 연속적으로 내려야 하는데 지금은 바쁜 경우라든지 외부에서 텔넷으로 접근해서 작업을 해야 하는데 해당 작업을 계속 하도록 하고 싶은 경우에 사용하는 작업 스케쥴 예약 데몬이며, 이 데몬은 일반적으로 root 유저만 사용이 가능하다.

      1. at 데몬의 사용법

        at 데몬(atd)을 사용하기 위해서는 at, atq, atrm, batch 명령에 대해서 알아야 한다.

        1. at, atq, atrm

          이 명령어는 실제적으로 atd 데몬에 명령어를 내리는 명령어로 명령해에는 언제 실행할 것인지 그리고 무슨 옵션으로 실행할 것인지에 대한 옵션이 있고, 명령어를 엔터를 쳐서 입력하면 커서가 한 줄 밑으로 내려가게 되는데 여기서 실행할 명령을 순서대로 하나씩 쳐서 입력한 뒤에 다 끝나면 [Ctrl]+[D] 를 눌러서 나가면 된다.

          사용법
          Usage: at [-V] [-q x] [-f file] [-m] time
                     atq [-V] [-q x] [-v]
                     atrm [-V] [-q x] job ...
                     batch [-V] [-f file] [-m]

          옵션
          -V : 버전을 보여준다.
          -q queue : 실행할 대기큐를 정할 수 있다. 사용할 수 있는 문자는 a-z, A-Z 까지이며, a가 기본 큐이다. 특별히 b는 batch 명령에서 사용하는 큐이며 그 외에는 높은 글자를 사용할 수록 nice값을 높여서 실행하게 된다. atq로 큐를 확인할 수 있다.
          -f file : 표준 입력이 아닌, 뒤에 써주는 파일에서 명령어를 읽어들인다.
          -m : 실행한 결과를 메일로 통보해준다.
          -l : atq를 실행하는 alias이다.
          -d : atrm 을 실행하는 alias이다.
          -v : 끝난 작업이지만 아직 큐에서 삭제되지 않은 작업을 적어준다.
          -c : 작업 리스트를 명령행을 포함하여 표준 출력으로 보여준다.
          TIME : 실행할 시간을 기록한다. 기본적으로 "hh:mm YYYY-MM-DD"로 적는다. hh:mm은 시간으로 24시간제를 기본으로 한다.

          사용예
          실제 명령은 아래와 같이 "at + 실행할 시간"으로 명령을 내리면 at>라는 프롬프트가 뜨는데 여기서 부터 실제 내릴 명령을 계속적으로 써주면 된다.

          [root@bluestar bin]# at 12:00 2000-03-02
          at> find / -name *linux* -print
          at> tee ~/linux.txt
          at> < EOT>   <- [EOT]는 실제는 [Ctrl]+[D]이다.
          warning: commands will be executed using /bin/sh
          job 1 at 2000-03-02 12:00
          [root@bluestar bin]#

          위에서 "at 12:00 2000-03-02"는 2000년 3월 2일에 아래에 타이핑한 명령어를 실행하라는 뜻이며, 그 다음에 내린 명령들은 가운데 'linux'라는 패턴이 들어가는 파일을 찾아서 그 결과를 ~/linux.txt 라는 파일에 저장하라는 뜻이다.
          마지막으로 [Ctrl]+[D]를 눌러서 끝내게 되는데, 시스템은 커맨드를 언제 입력했는지를 보여주며 job 1에 할당되었다고 보여주고 있다.

          이번에는 다른 예를 보기로 하자.

          [root@bluestar bin]# at now + 2 hours
          at> find / -name *.html -print
          at> tee ~/html.txt
          at> mount -t vfat /dev/hda1 /mnt/win98_c
          at> cp ~/html.txt /mnt/win98_c/
          at> < EOT>
          warning: commands will be executed using /bin/sh
          job 2 at 2000-03-02 13:34
          [root@bluestar bin]#

          위는 지금부터 2시간 후에 아래 명령들을 실행하라는 뜻이다. hours 대신에 minutes, days, week 등이 쓰일 수 있으며, 그냥 "at now" 라고 쓰면 모든 명령을 입력한 후 [Ctrl]+[D]를 입력하는 즉시 실행한다.

          이러한 atd 데몬은 쉘스크립트내에서 아주 유용하게 사용되어 질 수 있는데, 만약 어떤 쉘스크립트의 마지막 부분에 "at -m -f $0 now + 3 days"라고 써주게 되면 해당 쉘스크립트를 매번 3일마다 실행하게 되며, 그 결과를 메일로도 알려주게 된다.


          이제 이렇게 예약된 작업내용(큐:queue)을 보려면 at 명령에 -l 옵션을 주거나 atq 명령을 써면 된다.

          [root@bluestar bin]# at -l
          1 2000-03-02 12:00 a
          2 2000-03-02 13:34 a

          [root@bluestar bin]# atq
          1 2000-03-02 12:00 a
          2 2000-03-02 13:34 a

          큐에 있는 작업을 지우려면 atrm 명령을 사용한다.

          [root@bluestar bin]# atrm 2
          [root@bluestar bin]# atq
          1 2000-03-02 12:00 a  <- 2번 작업이 지워졌다.
          [root@bluestar bin]#

        2. batch

          batch 명령은 at와 사용법이 같다.

          [root@bluestar bin]# batch
          at> find / -name *.html -print
          at> tee ~/html.txt
          at> mount -t vfat /dev/hda1 /mnt/win98_c
          at> cp ~/html.txt /mnt/win98_c/
          at>
          warning: commands will be executed using /bin/sh
          job 3 at 2000-03-02 11:56
          [root@bluestar bin]#

      2. at 사용유저 제한

        이러한 atd 데몬을 아무 유저나 마음데로 쓰게 된다면 시스템에 많은 부하가 걸릴 수가 있으므로 사용유저를 제한할 필요가 있는데 이 때 사용되는 파일이 /etc/at.allow/etc/at.deny 파일이다.
        보통 둘중에 하나의 파일만 사용하며, /etc/at.allow 파일을 먼저 읽게 된다. /etc/at.allow 파일에 특정 유저명을 적어넣으면 그 유저들을 제외한 나머지 유저는 at를 사용할 수 없으며, /etc/at.deny는 반대이다.

        [root@bluestar /root]# cat < /etc/at.allow
        bluesky
        jkpark
        [root@bluestar /root]#

    4. crond 데몬은 일정시간 주기로 반복하는 작업을 할 수 있는 데몬이다.

      1. cron 데몬의 사용 : crontab

        cron 데몬의 가동은 /etc/rc.d/init.d/crond에 있다. 보통 시스템의 어떤 런레벨이든지 cron 데몬은 부팅시 시작하도록 되어 있는데, 굳이 cron 데몬을 죽이거나 다시 시작하기 위해서는 위의 /etc/rc.d/init.d/crond 실행 스크립트를 실행하면 된다. cron 데몬에 작업을 설정하기 위해서는 cron table을 설정하는 crontab라는 실행파일을 사용한다.

        사용법
        usage:    crontab [-u user] file
                      crontab [-u user] { -e | -l | -r }
                                 (default operation is replace, per 1003.2)
                     -e         (edit user's crontab)
                     -l          (list user's crontab)
                     -r          (delete user's crontab)

        옵션
        -u 사용자 : 특정 사용자의 crontab 파일을 다루도록 지정한다. 이 명령은 root 유저인 경우만 사용하능하며, 일반적으로는 자신의 cron 스케쥴링에 걸려있는 작업만 보거나 설정을 할 수 있다.
        -l : crontab에 등록되어 있는 스케쥴을 확인한다.
        -r : 사용자의 crontab 파일을 지운다.
        -e : 에디터를 사용하여 crontab 파일을 수정한다.(새로운 스케쥴을 등록한다.)
        file : cron table 내용을 기록한 파일에서 읽어와서 설정한다.

        사용예
        우선 cron table을 편집하기 위해서는 crontab -e 명령을 사용한다.
        "crontab -e"를 실행하면 cron table을 편집할 수 있도록 vi 에디터가 실행이 되는데 실행하고자 하는 내용을 입력하고 빠져 나오면 되는데 입력 형식은 아래와 같다.

        01 4 * * * /etc/rc.d/init.d/network stop
        15 4 * * * ~/scripts/my_script.sh
        00 5 * * * /etc/rc.d/init.d/network start


        위의 내용이 cron table에 입력된 내용인데 이러한 입력형식은 아래와 같다.

        M H D m d cmd-line
        필드명 범위 설명
        M 0-59,* 분을 의미하며, *는 모든 범위를 말한다.
        H 0-23,* 시를 의미한다.
        D 1-31,* 날짜를 의미한다.
        m 1-12,* 달을 의미한다.
        d 0-7,* 요일을 의미하며, 0과 7은 일요일(Sun)을 의미한다.
        cmd-line 실행할 명령을 그냥 써준다.

        결국 위의 입력내용중 첫번째 입력인 "01 4 * * * /etc/rc.d/init.d/network stop"은 매일 4시 01분에 뒤의 "/etc/rc.d/init.d/network stop" 명령을 실행하게 되며, 다른 입력내용들도 동일하게 해석된다. 각자의 사용자가 등록한 cron table은 /var/spool/cron 디렉토리에 저장된다.


        입력 내용의 다른 예를 보면,

        30 13 * * 1-5 mail -s "It's 2pm" root% Dear root%% Are you sleeping??

        같은 경우는 월요일부터 금요일까지 오후 1시 30분에 해당 mail 명령을 실행하게 된다.
        위에서 % 문자는 개행문자 역할을 하며(풀어쓰면 아래와 같은 명령이 된다), 한줄이 넘어가는 명령을 쓰기 위해서는 백슬래쉬(\)를 써주고 다시 개행해서 쓰면 된다.

        $ mail -s "It's 2pm" root
        Dear root

        Are you sleeping?
        [EOT]
        Cc:
        $


        이제 이렇게 작성된 cron table을 보거나 삭제하고자 할 경우에는 -l 옵션(table을 볼 때)과 -r 옵션(table 삭제할 때)을 사용한다.

        [root@bluestar cron]# crontab -l
        # DO NOT EDIT THIS FILE - edit the master and reinstall.
        # (/tmp/crontab.9706 installed on Thu Mar 2 13:26:59 2000)
        # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
        30 13 * * 1-5 mail -s "It's 2pm" root% Dear root%% Are you sleeping??

        [root@bluestar cron]# crontab -r
        [root@bluestar cron]# crontab -l
        no crontab for root
        [root@bluestar cron]#

      2. /etc/crontab

        cron table을 작성하는 crontab 실행파일은 /usr/bin/crontab에 위치하고 있다. 그런데 /etc 디렉토리에도 crontab 파일이 있는데 이는 crontab 설정파일이다. 그 내용은 아래와 같다.

        [root@bluestar /root]# cat < /etc/crontab
        SHELL=/bin/bash
        PATH=/sbin:/bin:/usr/sbin:/usr/bin
        MAILTO=root
        HOME=/

        # run-parts
        01 * * * * root run-parts /etc/cron.hourly
        02 4 * * * root run-parts /etc/cron.daily
        22 4 * * 0 root run-parts /etc/cron.weekly
        42 4 1 * * root run-parts /etc/cron.monthly
        [root@bluestar /root]#

        SHELL은 실행명령을 실행할 쉘의 종류를 적어준다.
        PATH는 실행파일을 검색할 PATH이다.
        MAILTO는 실행결과를 보고하는데 사용할 email 주소를 적어준다.

        그리고 실행파일이 들어가야할 부분에 "root run-parts /etc/cron.xxxxxxx"라고 되어 있다.
        root는 뒤의 "run-parts ..."라고 나오는 명령행을 실행할 유저명을 적어준다. 위의 내용들은 각각 처음부터 만들어져 있는 스크립트로서 run-parts라는 스크립트를 이용해서 해당 디렉토리내에 있는 모든 실행파일을 실행하도록 되어있다. 그래서 만일 어떤 명령이 매시마다, 혹은 매일, 매주, 매달마다 실행되어야 하는 명령이라면 해당 디렉토리(/etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly, /etc/cron.weekly)에 실행파일(혹은 스크립트)을 넣어주거나 링크파일을 넣어두면 된다.

        참고로 /usr/bin/run-parts 스크립트의 내용은 아래와 같다.
        [bluesky@bluestar bluesky]# cat < /usr/bin/run-parts
        #!/bin/bash
        # run-parts - concept taken from Debian
        # keep going when something fails
        set +e

        if [ $# -lt 1 ]; then
                     echo "Usage: run-parts < dir>"
                     exit 1
        fi

        if [ ! -d $1 ]; then
                     echo "Not a directory: $1"
                     exit 1
        fi

        for i in $1/* ; do
                     [ -d $i ] && continue
                     if [ -x $i ]; then
                             $i
                     fi
        done

        exit 0
        [bluesky@bluestar bluesky]#
        첫번째 if문은 run-parts 명령을 인수가 없이 그냥 run-parts만 실행하면 명령어 뒤에 디렉토리를 명시하라는 사용법 메시지를 보여준다는 내용..
        두번째 if문은 run-parts의 첫번째 인수가 디렉토리가 아니면 "Not a directory : 입력한 인수"를 출력하고 빠져나감.
        세번째줄 for 문은 인수로 받은 디렉토리내의 파일들($1/*)을 하나씩 대입해서 실행파일이면([ -x $i ]) 실행한다는 내용이다.

      3. cron 데몬의 사용유저 제한

        cron 데몬도 at 데몬과 마찬가지로 유저에 따라 사용을 제한할 수가 있는데 역시 /etc/cron.allow/etc/cron.deny 파일을 사용하며, 사용법은 at.allow/at.deny와 동일하다.

  7. 시스템 보안                                                        KLDP 링크 -> Security HOWTO - 장범수/박민석/유성태
                                                                               KLDP 링크 -> Shadow Password HOWTO - 조용일

    1. Shadow password system은 현재 거의 모든 UNIX/Linux에서 기본으로 장착하고 있는 패스워드 시스템이다. 레드헷 리눅스에서는 기본으로 패키지는 제공하지만 처음부터 사용되지는 않으므로 명령으로 가능하게 만들어 주어야 한다. 만일 레드헷 6를 사용하는 경우라면 설치할 때 쉐도우 패스워드와 MD5(해커스랩 링크) 모듈을 사용할 것인지에 대해서 물어보게 되는데 이 때 선택하면 된다.

      쉐도우 패스워드는 기존의 login password를 보완한 것으로, 기존의 시스템에서는 /etc/passwd라는 모든 사용자의 패스워드가 들어있는 파일이 모든 유저에게 읽기 가능하다는 단점이 있었다.

      [bluesky@bluestar bluesky]# ls -l /etc/passwd
      -rw-r--r-- 1 root root 930 Mar 4 02:40 /etc/passwd

      물론 패스워드가 암호화되어 있긴 하지만 이 파일이 외부에 노출될 경우 패스워드 크랙툴(CrackJack/Ntucrack/John the ripper 등등)을 사용하면 쉽게 루트의 패스워드까지 크랙할 수 있기 때문에 문제가 되었다.

      이러한 단점을 보완하기 위해서 암호화된 패스워드를 저장하는 shadow라는 파일을 만들고 여기에 따로 사용자들의 패스워드를 저장하게 하고, 이 shadow 파일은 일반 사용자들은 읽지 못하며, root로 읽을 수 있게 한 것이다.
      기존의 /etc/passwd파일에서 패스워드가 들어갈 자리는 'x'로 대치되므로 이 /etc/passwd 파일이 외부에 노출되더라도 문제가 없게 되는 것이다.

      만일 패스워드 시스템을 쉐도우 패스워드 시스템으로 바꾸시려는 경우 pwconv 명령을 사용한다. 쉐도우 패스워드 시스템을 사용하지 않는 경우는 /etc/shadow 파일은 존재하지 않게 되며, /etc/passwd 파일에 사용자들의 암호화된 패스워드가 패스워드 필드에 존재하게 된다.

      [bluesky@bluestar bluesky]# ls -l /etc/shadow
      ls: /etc/shadow: No such file or directory
      [bluesky@bluestar bluesky]# ls -l /etc/passwd
      -rw-r--r-- 1 root root 1036 Mar 5 02:36 /etc/passwd
      [bluesky@bluestar bluesky]# cat < /etc/passwd

      root:$1$UTGjDy$ccol4tVwSzVdeTGWHg.9l/:0:0:root:/root:/bin/bash
      bin:*:1:1:bin:/bin:
      daemon:*:2:2:daemon:/sbin:
      adm:*:3:4:adm:/var/adm:
      ....
      ....
      bluesky:$1$MnPxS9$7ES4F1K/bNH0WZCC2vKUi0:501:501:박정근:/home/bluesky:/bin/bash
      linuxer:!!:503:503::/home/linuxer:/bin/bash

      [bluesky@bluestar bluesky]#

      이제 쉐도우 패스워드 시스템으로 바꾸려면,
      [bluesky@bluestar bluesky]# pwconv

      이렇게 바꾸고 나면 아래와 같이 /etc/shadow 파일이 생기게 됩니다..기존의 /etc/passwd 파일의 패스워드 필드는 'x'로 대치되고 암호화된 패스워드는 /etc/shadow 파일에 있게 됩니다.
      [bluesky@bluestar bluesky]# ls -l /etc/shadow
      -r-------- 1 root root 781 Mar 5 02:42 /etc/shadow
      [bluesky@bluestar bluesky]# ls -l /etc/passwd
      -rw-r--r-- 1 root root 930 Mar 5 02:42 /etc/passwd
      [bluesky@bluestar bluesky]#

      [bluesky@bluestar bluesky]# cat < /etc/passwd

      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:
      daemon:x:2:2:daemon:/sbin:
      adm:x:3:4:adm:/var/adm:
      ....
      ....
      bluesky:x:501:501:박정근:/home/bluesky:/bin/bash
      linuxer:x:503:503::/home/linuxer:/bin/bash


      [bluesky@bluestar bluesky]# cat < /etc/shadow

      root:$1$UJGjDy$ccol4tVwSzVdeTGWHg.9l/:11020:0:99999:7:::
      bin:*:11020:0:99999:7:::
      daemon:*:11020:0:99999:7:::
      adm:*:11020:0:99999:7:::
      ....
      ....
      bluesky:$1$MnPxS9$7ES4F1K/bNH0WZCC2vKUi0:11020:0:99999:7:::
      linuxer:!!:11020:0:99999:7:::

      [bluesky@bluestar bluesky]#

      다시 쉐도우 패스워드 시스템이 아닌 예전의 login 패스워드 시스템으로 돌아갈려면 pwunconv 명령을 사용하면 된다.

      [bluesky@bluestar bluesky]# pwunconv
      [bluesky@bluestar bluesky]# ls -l /etc/shadow
      ls: /etc/shadow: No such file or directory
      [bluesky@bluestar bluesky]# ls -l /etc/passwd
      -rw-r--r-- 1 root root 1036 Mar 5 04:38 /etc/passwd

    2. - PAM(Pluggable Authentication Modules) - 장착식 인증 모듈
      레드헷 리눅스에는 PAM(Pluggable Authentication Modules)이라는 패키지로 장착이 가능한 인증 모듈이 있다. 이 인증 모듈은 새로운 인증 기법이나 추가 기법을 사용하기 위해서 바이너리 파일을 다시 컴파일할 필요가 없이 설치만으로 간편하게 업그레이드가 가능하고 쉽게 바꿀 수 있다.

      PAM은 캡슐화를 지원하여 인증법, 제한사항, 지역 인증법에 캡슐화를 사용할 수 있다. 이 캡슐화는 리눅스에서 좀 더 높은 보안과 관리를 위해서는 꼭 알아두어야 한다.
      자세한 내용은 PAM 웹싸이트
      http://www.kernel.org/pub/linux/libs/pam/index.html을 보기 바란다.


      PAM으로는 아래와 같은 작업을 하게 된다.

      1. 패스워드에 비(非) DES 암호화 방법을 쓴다. (패스워드를 부르트 포스공격을 써서 풀어내는 것이 어렵게 된다.) 부르트 포스 공격(brute force attack)이란 crack이나 John the ripper 같은 크랙툴을 사용하여 가능성이 높은 패스워드를 무작위로 집어넣어서 알아내는 방법이다.
      2. 사용자들이 쓸 수 있는 (프로세스 수, 메모리의 양 등의) 자원을 제한하는 방법을 써서 서비스 거부식 공격(DoS : Denial of Service)을 막을 수 있다.
      3. 패스워드를 쉐도우로 감추는 것을 쉽게 할 수 있도록 한다.
      4. 특정한 사용자가 특정한 시간에 특정한 장소에서만 로그인할 수 있도록 제한 조정하는 것이 가능하다.


      시스템을 설치하고 조정하기 시작한 지 몇 시간 안으로, 공격 시도 시점에서 막을 수 있다. 예를 들면, .rhosts 파일을 시스템 전체용으로 사용자 홈 디렉토리에서 사용하는 것을 막기 위해서 다음을 /etc/pam.d/login에 PAM을 사용해서 넣을 수 있다.

      #
      # Disable rsh/rlogin/rexec for users
      #
      login auth required pam_rhosts_auth.so no_rhosts

       
    3. 리눅스/유닉스 시스템에서는 기본적으로 모든 행동에는 자취가 남게 된다. 이 자취는 모든 것이 기록이 되어 로그파일로 남는것을 의미하는데, 로그파일이란 시스템의 작동중에 시스템을 감시하기 위해서 기록해 두는 파일들이다.
      따라서 어떤 사용자가 어떤 행동을 취했는지 어디서 누가 시스템에 접근했는지, 누가 무슨 파일을 전송해 가져 갔는지를 알 수 있게 된다. 따라서 로그파일을 분석해보면 보안에 상당한 도움이 된다.

      [로그파일 디렉토리 - /var/log]
      리눅스에서 대부분의 로그파일은 /var/log에 저장된다. 가끔 소스파일이나 어떤 시스템에서는 /var/adm 디렉토리를 사용하는 경우도 있지만 대부분의 리눅스 시스템에서는 /var/adm 디렉토리는 사용되지 않는다.
      예전에는 /var/adm 디렉토리를 대부분 사용했으나 최근에는 /var/log에는 로그파일을, /var/run에는 프로그램 실행기록 및 잠금파일들을 담고 있다.


      1. 로그파일의 위치, 이름

        레드헷 리눅스 시스템에서는 기본적으로 모든 시스템 관련된 기본 로그파일이 저장되는 곳이 /var/log로 되어 있다. 웹서버나 기타 다른 서버들은 다른 곳에 로그파일이 위치할 수도 있다. 기본적으로 레드헷 패키지에서 설치되는 웹서버의 로그파일은 /var/log/httpd 디렉토리에 기록이 남게 되어 있다.

        [/var/log, /var/log/httpd]



        /var/log에는 많은 로그파일들이 존재하는데, 이 중에는 부팅메시지 관련 로그파일인 dmesg가 존재한다.

        /var/log/dmesg
        이 로그파일은 부팅 메시지로 부팅시에 어떤 형태의 하드웨어를 가지고 있고 어떻게 인식되었는지를 알 수 있는 로그파일이다. 일단 내용을 보면 아래와 같으며, 내용은 사용자에 따라 다르게 나올 것이다.

        [bluesky@bluestar log]# cat < dmesg
        Linux version 2.2.9-19mdk (root@data.mandrakesoft.com) (gcc version pgcc-2.91.66 19990314 (egcs-1.1.2 release)) #1 Wed May 19 19:53:00 GMT 1999
        Detected 149692968 Hz processor.
        Console: colour VGA+ 80x25
        Calibrating delay loop... 149.09 BogoMIPS
        Memory: 63236k/65536k available (956k kernel code, 408k reserved, 888k data, 48k init)
        VFS: Diskquotas version dquot_6.4.0 initialized
        CPU: Intel Pentium Pro stepping 02
        Checking 386/387 coupling... OK, FPU using exception 16 error reporting.
        Checking 'hlt' instruction... OK.
        POSIX conformance testing by UNIFIX
        mtrr: v1.34 (19990310) Richard Gooch (rgooch@atnf.csiro.au)
        PCI: PCI BIOS revision 2.10 entry at 0xfb2b0
        PCI: Using configuration type 1
        PCI: Probing PCI hardware
        PCI: 00:00 [8086/1237]: Passive release enable (00)
        Linux NET4.0 for Linux 2.2
        Based upon Swansea University Computer Society NET3.039
        NET4: Unix domain sockets 1.0 for Linux NET4.0.
        NET4: Linux TCP/IP 1.0 for NET4.0
        IP Protocols: ICMP, UDP, TCP, IGMP
        Initializing RT netlink socket
        Starting kswapd v 1.5
        Detected PS/2 Mouse Port.
        Serial driver version 4.27 with MANY_PORTS MULTIPORT SHARE_IRQ enabled
        ttyS00 at 0x03f8 (irq = 4) is a 16550A
        ttyS01 at 0x02f8 (irq = 3) is a 16550A
        pty: 256 Unix98 ptys configured
        apm: BIOS version 1.2 Flags 0x07 (Driver version 1.9)
        Real Time Clock Driver v1.09
        PCSP 1.3 measurement: maximal samplerate 85227 Hz, 18356 Hz used
        RAM disk driver initialized: 16 RAM disks of 4096K size
        Uniform Multi-Platform E-IDE driver Revision: 6.19
        PIIX3: IDE controller on PCI bus 00 dev 39
        PIIX3: not 100% native mode: will probe irqs later
        ide0: BM-DMA at 0xf000-0xf007, BIOS settings: hda:pio, hdb:pio
        ide1: BM-DMA at 0xf008-0xf00f, BIOS settings: hdc:pio, hdd:pio
        hda: SAMSUNG WU32165A (2.1GB), ATA DISK drive
        hdb: SAMSUNG WN321620A (2.16 GB), ATA DISK drive
        hdc: GCD-R580B, ATAPI CDROM drive
        ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
        ide1 at 0x170-0x177,0x376 on irq 15
        hda: SAMSUNG WU32165A (2.1GB), 2060MB w/109kB Cache, CHS=523/128/63
        hdb: SAMSUNG WN321620A (2.16 GB), 2060MB w/109kB Cache, CHS=523/128/63
        hdc: ATAPI 8X CD-ROM drive, 256kB Cache
        Uniform CDROM driver Revision: 2.55
        Floppy drive(s): fd0 is 1.44M
        FDC 0 is a post-1991 82077
        md driver 0.36.6 MAX_MD_DEV=4, MAX_REAL=8
        scsi : 0 hosts.
        scsi : detected total.
        Partition check:
        hda: hda1
        hdb: hdb1 hdb2 hdb3 < hdb5 >
        VFS: Mounted root (ext2 filesystem) readonly.
        Freeing unused kernel memory: 48k freed
        Adding Swap: 68540k swap-space (priority -1)
        [bluesky@bluestar log]#

      2. 접속기록

        1. lastlog

          lastlog는 가장 최근 텔넷을 이용해 접속한 흔적을 기록하고 있는 파일이며, lastlog 명령시 나오는 정보에 대한 내용을 담고 있다.

          [bluesky@bluestar log]# ls -l lastlog*
          -rw-r--r-- 1 root root 146584 Mar 5 01:35 lastlog
          -rw-r--r-- 1 root root 147168 Apr 30 2000 lastlog.1
          [bluesky@bluestar log]# lastlog
          Username      Port         From                  Latest
          root               :0                                    Sun May 14 00:24:46 2000
          bin                                                       **Never logged in**
          daemon                                                **Never logged in**
          adm                                                     **Never logged in**
          ....
          ....
          bluesky          ttyp2      192.168.1.10:0.0     Sun Mar 5 01:35:07 2000
          [bluesky@bluestar log]#

        2. secure

          /etc/log/secure는 모든 접속과 관련하여 언제 어디서 어떤 서비스를 사용했는지를 기록하고 있는 파일이다. secure 파일의 일부를 보면 아래와 같다.

          [bluesky@bluestar log]# cat < secure
          Mar 2 23:54:42 bluestar in.telnetd[9796]: connect from 192.168.1.10
          Mar 2 23:56:30 bluestar in.ftpd[9820]: connect from 192.168.1.10
          Mar 3 18:37:54 bluestar ipop3d[9881]: connect from 192.168.1.10
          ....
          ....
          [bluesky@bluestar log]#

          위의 로그에서 첫번째 필드(Mar 2 23:54:42)는 해당 서비스가 호출된 시간이다. 3월 2일 23시 54분 42초.. 두번째는 서버이름이며, 세번째(in.telnetd[9796])는 해당 서비스를 하는 데몬이며 []안의 숫자는 해당 데몬의 PID이다.
          그리고 마지막은 해당 서비스를 호출한 외부 호스트 주소이다.
          그러므로 첫번째 라인은 "3월 2일 23시 54분 42초에 192.168.1.10에서 telnet으로 접속하였으며, 서비스를 제공하기 위해 9796의 PID로 in.telnetd 데몬이 실행되었다"는 뜻이다.

      3. system log, logrotate


        위에서 /etc/log 디렉토리내의 각종 시스템관련 로그파일을 보았는데 이러한 로그파일들은 기존의 파일에 계속적으로 덧붙여져 생성된다. 따라서 가만히 놔두면 파일의 용량은 계속적으로 증가를 하게 된다.
        이렇게 로그파일이 계속 커지는 것을 방지하기 위해서 로그파일을 조각조각 나누게 되는데 각각의 로그파일 뒤의 숫자들이 이렇게 나뉘어 졌음을 의미한다. 이렇게 로그파일들을 조작조각 나누는 기능을 하는 것이 logrotate라는 유틸리티이다.

        1. logrotate 패키지

          logrotate는 로그파일을 알맞게 짤라서..새로 작성하도록 하는 유틸리티로 레드헷 리눅스에서는 기본 설치되며, 레드헷 리눅스 시스템에서는 일주일마다 한번씩 로그파일을 rotate 시켜준다. 이는 logrotate의 설정파일인 /etc/logrotate.conf를 변경함으로써 바꿀수 있다.
          사실 이 설정파일은 logrotate라는 실행파일이 읽어들이게 되는데, 이 logrotate
          cron 데몬에 의해 하루에 한번씩 실행된다.
          아래 /etc/logrotate.conf의 예제를 보이면서 하나씩 알아보자.

          [bluesky@bluestar /etc]# cat < logrotate.conf
          # see "man logrotate" for details
          # rotate log files weekly
          # 아래에 특별히 명시하지 않은 로그파일에 대해서 일주일(weekly)마다 rotate한다.
          weekly

          # keep 4 weeks worth of backlogs
          # 최대 4번까지 rotate를 허용한다. (logfile, logfile.1 ~ logfile.4까지의 로그파일이 생성된다.
          rotate 4
          # send errors to root
          # 에러가 생기면 root 사용자로 메일을 보낸다.
          errors root

          # create new (empty) log files after rotating old ones
          # rotate한 후에 비어있는 로그파일을 생성.
          create

          # uncomment this if you want your log files compressed
          # 로그파일을 압축한다. 용량문제가 크게 되지 않는다면 압축하지 않는것이 좋다.
          #compress

          # RPM packages drop log rotation information into this directory
          # /etc/logrotate.d 디렉토리 안에 있는 설정파일들을 포함시킨다.
          # 대부분 RPM 패키지로 설치되는 데몬들은 이렇게 이 디렉토리에 로그파일을 rotate 시킬 수 있도록 설정파일이 설치된다.
          include /etc/logrotate.d

          # no packages own lastlog or wtmp -- we'll rotate them here
          # 아래있는 로그파일(wtmp, lastlog)은 어떤 패키지에 의해서도 설정되지 않기 때문에 아래에서 따로 설정해 준다.
          # 다른 로그파일들은 /etc/logrotate.d내의 파일들에서 모두 설정하고 있다.

          # 한달마다 rotate하며 최대 1회까지만 rotate한다.
          /var/log/wtmp {
              monthly
              rotate 1
          }

          # 한달마다 rotate하며 최대 3회까지 rotate한다.
          /var/log/lastlog {
              monthly
              rotate 3
          }

          # system-specific logs may be configured here
          ----------------------------- 끝 --------------------


          위에서 /etc/logrotate.d 디렉토리 안의 설정파일들을 포함시킨다(include /etc/logrotate.d)는 내용이 있는데../etc/logrotate.d에는 RPM 패키지로 설치된 각종 데몬들의 logrotate 관련 설정파일들이 들어 있다.
          이 디렉토리의 내용은 다음과 같다.



          위를 보면 RPM으로 설치된 각종 데몬들의 logrotate관련 설정들이 있는데, 해당 파일 내용을 보면 logrotate에 관련된 설정내용들이 있다.
          먼저 syslog의 내용을 보면(messages, secure, maillog, spooler의 네개의 로그파일에 대한 설정을 담고 있다),

          [bluesky@bluestar logrotate.d]# cat < syslog
          /var/log/messages {
               postrotate   <- rotate가 끝난후에 아래의 명령(/usr/bin/killall -HUP syslogd)을 실행한다.
                   /usr/bin/killall -HUP syslogd
               endscript   <- 그냥 스크립트의 마지막을 알려주는 역할만 한다.
          }

          /var/log/secure {
               postrotate
                   /usr/bin/killall -HUP syslogd
               endscript
          }

          /var/log/maillog {
               postrotate
                   /usr/bin/killall -HUP syslogd
               endscript
          }

          /var/log/spooler {
               postrotate
                   /usr/bin/killall -HUP syslogd
               endscript
          }


          이번에는 웹서버인 Apache에 대한 logrotate 관련 설정파일인 apache의 내용을 보면,

          [bluesky@bluestar logrotate.d]# cat < apache
          /var/log/httpd/access_log {
               rotate 4
               mail www@linuxer.net   <- rotate의 한계가 넘어갈 경우, 즉 5번째 rotate가 일어나면 기존의 4번째는 지워지는데 이 파일을 여기서 정한 이메일 주소로 보내주게 된다.
               errors www@linuxer.net
               size=100k   <- 로그파일 크기가 100KB가 넘어가면 rotate한다.
               postrotate
                   /usr/bin/killall -HUP httpd
               endscript
          }

          /var/log/httpd/error_log {
               mail www@linuxer.net
               errors www@linuxer.net
               size=100k
               postrotate
                   /usr/bin/killall -HUP httpd
               endscript
          }


          그 외의 다른 파일들을 열어보면 다양한 설정내용들을 볼 수 있는데, 설정옵션들을 정리해보면 아래와 같다.

          daily 매일 rotate한다.
          weekly 매주 rotate한다.
          monthly 매달 rotate한다.
          size < SIZE> < SIZE>에 해당하는 용량이 넘으면 rotate한다. 사용가능 유니트로는 k,M 이 있다. 예를 들어, 'size 100k'는 100KB를, "size 2M"는 2MB를 의미한다.
          [rotate 조건에 관련된 옵션]

           
          mail < email 주소> "rotate < number>" 옵션을 사용하여 정한 횟수를 넘어갈 경우 rotate되어 삭제될 로그파일을 뒤의 메일주소로 보내준다.
          errors < email 주소> rotate 중에 에러가 발생하면 뒤의 메일주소로 메일을 보낸다.
          [메일을 통한 보고관련 옵션]

           
          rotate < number> rotate를 허용할 횟수를 의미한다. "rotate 4"는 rotate 조건에 맞는 경우 최대 4번 rotate한다는 뜻이다.
          include < file> < file>에서 설정을 포함시킨다. 디렉토리를 지정하면 해당 디렉토리안에 있는 파일 전체를 설정파일에 포함시킨다.
          create [mode owner grp] rotate한 후에 비어있는 로그파일을 생성한다. 만일 mode, owner, grp들을 설정해주면 해당 모드와 파일 소유자, 그룹을 설정하여 생성하게 된다. 웹서버등에서 종종 사용됨.
          nocreate 위의 create 옵션의 효력을 상실하게 한다.
          olddir < directory> rotate한 옛날 로그파일들을 < directory>로 옮겨준다.
          noolddir olddir 옵션의 효력을 상실하게 함.
          compress 로그파일들을 압축한다.
          nocompress 로그파일들을 압축하지 않는다.
          prerotate < 명령어 ..> endscript rotate를 하기전에 < 명령어 ..>부분을 실행한다.
          postrotate < 명령어 ..> endscript rotate를 하고난 후에 < 명령어 ..> 부분을 실행한다.
          [rotate 관련 옵션]

          logrotate는 기본적으로 하루에 한번씩 cron 데몬에 의해서 실행된다. 하지만 하루가 지나기 전에 로그파일이 10MB에 거의 다다르는 경우에는 이 시간을 줄여줄 수가 있다. 처음 레드헷을 설치하면 logrotate는 /etc/cron.daily에 있게 되는데, 이 파일을 다른 곳에 옮겨놓던지 혹을 이 파일을 crontab에 다시 걸어서 몇시간 단위로 또 실행하도록 하는것도 괜찮다. 아니면 /etc/cron.hourly 디렉토리에 넣어두면 한시간 단위로 계속 실행되게 된다.

        2. /var/log/cron

          이 파일은 앞에서 배운
          cron 스케쥴링 데몬의 로그 파일이다.
          이 파일에는 cron 데몬이 실행했던 작업을 모두 기록해 두고 있다.

        3. /var/log/maillog

          sendmail이 설치되어 작동한다면 레드헷 리눅스는 /var/log/maillog라는 로그파일을 만들게 된다. 여기에는 sendmail이 메일관련 작업을 한 기록과 메일전송관련 패키지인 imap의 작동기록도 여기에 남게 된다. 일단 로그의 내용을 보면 아래와 같은 것들이 있다.

          [bluesky@bluestar log]# cat < maillog
          May 14 04:25:09 bluestar sendmail[7233]: EAA07233: from=root, size=966, class=0, pri=30966, nrcpts=1, msgid=<200005131922.EAA07233@bluestar.linuxnet.ac.kr>, relay=root@localhost
          May 14 04:25:09 bluestar sendmail[7233]: EAA07233: to=root, ctladdr=root (0/0), delay=00:02:22, xdelay=00:00:00, mailer=local, stat=Sent
          Mar 2 12:00:00 bluestar sendmail[9620]: MAA09620: from=root, size=112, class=0, pri=30112, nrcpts=1, msgid=<200003020300.MAA09620@bluestar.linuxnet.ac.kr>, relay=root@localhost
          Mar 2 12:00:01 bluestar sendmail[9625]: MAA09620: to=bluesky, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=local, stat=Sent
          Mar 2 13:21:00 bluestar sendmail[9694]: NAA09694: to=root, delay=00:00:00, xdelay=00:00:00, mailer=local, stat=Sent
          Mar 3 18:37:48 bluestar sendmail[9879]: NOQUEUE: Null connection from darkstar.linuxnet.ac.kr [192.168.1.10]
          Mar 3 18:37:54 bluestar ipop3d[9881]: port 110 service init from 192.168.1.10
          Mar 3 18:37:54 bluestar ipop3d[9881]: No such file or directory while reading line user=??? host=UNKNOWN
          [bluesky@bluestar log]#

           
        4. /var/log/messages

          이 파일은 여러모로 유용한 파일이다. 시스템에서 나오는 모든 메시지는 이 파일에 기록되어진다. 따라서 이 파일에는 접속에서부터 커널 메시지, 인증관련, 파일시스템 관련한 메시지등 별로 관련이 없는 모든 메시지가 기록되므로 정규식을 이용해서 적절한 메시지를 검색하거나 찾아볼 수 있다.

          [bluesky@bluestar log]# cat < messages | more
          Mar 5 01:35:34 bluestar PAM_pwdb[10025]: (su) session opened for user root by bluesky(uid=0)
          Mar 5 01:35:41 bluestar PAM_pwdb[10025]: (su) session closed for user root
          ....
          ....
          Mar 5 12:40:29 bluestar ftpd[10143]: ANONYMOUS FTP LOGIN FROM root @ bluestar.linuxnet.ac.kr [192.168.1.11], ingots@nownuri.net
          Mar 5 12:40:31 bluestar ftpd[10143]: FTP session closed
          ....
          ....
          Mar 7 05:08:32 bluestar in.rexecd[10270]: connect from darkstar.linuxnet.ac.kr
          Mar 7 05:08:32 bluestar in.rexecd[10270]: login from darkstar.linuxnet.ac.kr as bluesky
          Mar 7 05:08:44 bluestar in.rexecd[10285]: connect from darkstar.linuxnet.ac.kr
          Mar 7 05:08:44 bluestar in.rexecd[10285]: login from darkstar.linuxnet.ac.kr as bluesky
          Mar 7 05:08:54 bluestar in.rexecd[10293]: connect from darkstar.linuxnet.ac.kr
          Mar 7 05:08:54 bluestar in.rexecd[10293]: login from darkstar.linuxnet.ac.kr as bluesky
          ....
          ....
          위를 보면,
          3월 5일 bluesky란 유저가 su 명령을 사용하여 root 유저가 되었으며 잠시후 su session을 종료,
          그 당에 ingots@nownuri.net이란 이메일 주소를 가진 유저가 anonymous FTP에 접속하였으며,
          darkstar 호스트에서 rexecd를 이용하여 bluesky란 유저가 로그인 하였음
          을 보여주고 있다.


        5. /var/log/netconf

          linuxconf의 모듈중의 하나인 netconf를 사용하는 경우에 작업내용이 이 파일에 기록이 된다. 따라서 netconf를 이용해서 설정을 바꾼 경우에는 어떻게 설정이 바뀌었는지, 혹은 어떤 설정이 어느 파일에 기록되었는지 이 파일에 모두 나타나게 된다.


          - netconf를 이용한 시간이 일단 기록되고, 그 다음에 여러가지 변경을 한 후에, 런레벨 5의 network 부분의 실행스크립트를 재시작 하였다는 기록이다.

        6. /var/log/xferlog

          이 파일은 FTP 접속관련 로그기록을 담고 있는 파일이다. 외부에서 파일을 다운로드하거나 혹은 업로드 한 경우, 누가 어떤 파일을 올리고 받아갔는지에 대한 자세한 내역을 알 수 있는 파일이다.

          [bluesky@bluestar log]# cat < xferlog
          Thu Mar 2 23:56:53 2000 1 darkstar.linuxnet.ac.kr 146584 /home/bluesky/lastlog b _ o r bluesky ftp 0 * c
          Tue May 9 04:27:01 2000 1 bluestar.linuxnet.ac.kr 23855 /home/ftp/incoming/mbox1 b _ i a [none_given] ftp 1 root c
          Sat Apr 29 20:54:07 2000 3 darkstar.linuxnet.ac.kr 6018 /home/bluesky/xlock-exploit b _ i r bluesky ftp 0 * c
          ...
          ...

          위의 /var/log/xferlog 파일에서 각 라인의 필드구성은 아래와 같다.
          current tr-time rhost size name tr-type sp-flag direction access-mode username service auth-method auth-uid

          current current-time, 현재시간을 의미한다.
          tr-time transfer-time, 전송하는데 소요된 시간을 초로 기록함.
          rhost remote-host, 접속한 원격호스트
          size filesize, 전송된 파일의 크기
          name filename, 전송된 파일의 이름
          tr-type transfer-type, "a"는 아스키모드 "b"는 바이너리모드를 나타낸다.
          sp-flag special-action-flag, "C"는 compress된 파일, "U"는 uncompress된 파일, "T"는 tar 파일, "_"는 아무 동작이 없음.
          direction "o"는 밖으로 나가는 파일, "i"는 안으로 들어온 파일
          access-mode "a"는 anonymous, "g"는 guest, "r"은 실제 서버에 있는 유저가 접근한 것.
          username 사용한 유저명
          service 사용한 서비스명으로, 대부분 ftp를 사용하게 된다.
          auth-method "0"은 인증을 사용안한 것이고, "1"은 RFC931 인증을 하였다는 것을 보여준다.
          auth-uid 위의 auth-method에 의해서 되돌려받은 User ID(유저명)
          [xferlog의 각 필드의 의미]

          이제 위의 각 필드의 의미들을 보면 위의 xferlog 파일의 내용을 분석할 수 있을 것이다.
          첫째줄만 보면,
          "Thu Mar 2 23:56:53 2000"이 current로서 2000년 3월 2일 목요일 23시 56분 53초를 가리킴.
          "1"은 tr-time으로 전송소요시간이 1초임.
          "darkstar.linuxnet.ac.kr"이 rhost로서 접속한 원격호스트를 가리킴.
          "146584"는 파일 size이다.
          "/home/bluesky/lastlog"는 파일이름이다.
          "b"는 tr-type으로 바이너리(binary)를 가리킴.
          "_"는 sp-flag로 아무 동작도 하지 않음.
          "o"는 direction 으로 밖으로 나감을 가리킴.
          "r"은 access-mode로써 실제 서버에 있는 유저가 접근했음을 가리킨다.
          "bluesky"는 username으로 사용한 유저명을 가리킴.
          "ftp"는 서비스명이다.
          "0"은 auth-method로 인증을 안했음을 가리킴.
          "*"는 인증한 유저명이 시스템에서 가능하지 않음을 가리킨다.

      4. syslog 데몬 이용하기

        위에서 많은 시스템 로그파일들이 있음을 보았는데, 설정파일에 따라서 이러한 로그파일들을 작성하도록 해주는 데몬이 syslog 데몬이다.

        syslog데몬의 설정파일은 /etc/syslog.conf이다. syslog 데몬이 메시지를 어떻게 처리할 것인지를 이 설정파일에서 설정해 준다. 즉, 이 설정파일에서 설정해준 내용대로 해당 메시지를 처리하여 로그파일로 저장하게 된다.
        /etc/syslog.conf 파일의 내용을 보면 아래와 같다.

        [bluesky@bluestar /etc]# cat < syslog.conf
        # Log all kernel messages to the console.
        # Logging much else clutters up the screen.
        # crit 이상레벨의 커널관련 에러를 콘솔 디바이스로 보냅니다.
        kern.crit      /dev/console

        # Log anything (except mail) of level info or higher.
        # Don't log private authentication messages!
        # 메일관련과 개인 인증관련을 제외한 info 레벨 이상의 경우 기록
        *.info;mail.none;authpriv.none      /var/log/messages

        # The authpriv file has restricted access.
        # 제한적인 접속에 대해서 모두 기록한다. 이는 모든 인증이 필요한 경우이다.
        authpriv.*      /var/log/secure

        # Log all the mail messages in one place.
        # 메일관련 모든 메시지를 기록함.
        mail.*      /var/log/maillog

        # Everybody gets emergency messages, plus log them on another
        # machine.
        # emergency 메시지에 대해서 모든 사용자에게 알려준다.
        *.emerg *

        # Save mail and news errors of level err and higher in a
        # special file.
        # uucp와 news의 경우 crit 레벨 이상의 에러를 기록한다.
        uucp,news.crit /var/log/spooler


        syslog.conf 파일의 형식
        facility.level action

        facility는 메시지를 보내는 프로그램의 유형으로, 다음과 같은 몇가지 종류가 있다. 예를 들면, sendmail은 mail 유형에 속하며 여러개의 facility를 열거하기 위해서는 콤마(,)를 사용한다.

        facility 메시지를 발생시키는 프로그램 유형
        cron cron, at과 같은 프로그램이 발생한 메시지
        auth login과 같이 인증프로그램 유형이 발생한 메시지
        authprive 개인인증을 요하는 프로그램 유형이 발생한 메시지(대부분의 보안이 필요한 접속관련임.)
        daemon telnetd, ftpd 등과 같이 데몬이 발생한 메시지
        kern 커널이 발생한 메시지
        lpr 프린터 유형의 프로그램이 발생한 메시지
        mail 메일 시스템이 발생한 메시지
        mark syslogd에 의해 만들어지는 날짜유형
        news 유즈넷 뉴스 프로그램 유형이 발생한 메시지
        syslog syslog 프로그램 유형이 발생한 메시지
        user 사용자 프로세스
        uucp UUCP 시스템이 발생한 메시지
        local0-local7 여분으로 남겨둔 유형
        [프로그램 유형에 따른 메시지 발생 유형]

        level은 위험의 정도를 가리키며, 설정된 위험의 정도보다 높아야 메시지를 내보낸다. 레벨의 유형은 아래와 같다. 위에 있는 순으로 아래로 오름차순으로 정리되어 있다. 즉, debug는 가장 기본적인 레벨로서 제일 자세하게 메시지를 출력하고, emerg는 가장 높은 레벨로서 시스템에 아주 치명적인 레벨로서 웬만하면 발생되지 않는 경우이다.

        level 레벨의 의미
        debug 프로그램을 디버깅할 때 발생하는 메시지
        info 통계, 기본정보 메시지
        notice 특별한 주의를 기하나 에러는 아닌 메시지
        warning 주의를 요하는 경고 메시지
        err 에러가 발생하는 경우의 메시지
        crit 크게 급하지는 않지만 시스템에 문제가 생기는 단계의 메시지
        alert 즉각적인 조정을 해주어야 하는 상황
        emerg 모든 사용자들에게 전달되어야 할 위험한 상황
        [레벨의 의미]

        위에서 해당 레벨을 넘어가야 메시지를 내보낸다고 했는데, 즉, err로 레벨을 맞추어 놓은 경우는 err, crit, alert, emerg에 해당하는 레벨이 발생하면 메시지를 내보낸다는 말이다. 그러나 해당 레벨을 정할 때 해당레벨만 맞추게 될 때는 "="를 레벨 앞에 같이 사용하게 된다. 따라서 "facility.=crit"라고 하면 해당 facility에 대해서 crit 레벨만 기록되고, 이 이상인 alert, emerg는 기록되지 않게 된다.
        또한 부정의 의미로서 "!"(bang 혹은 exclamation mark라고 부름.)를 사용할 수 있다. 이는 해당 레벨을 포함한 상위레벨은 제외한 나머지가 된다. 예를 들어 "facility.!notice"라고 하면 notice 레벨과 그 상위레벨을 제외한 나머지이므로, debug, info만 해당된다.

        그리고 레벨중에는 별로 쓰이지는 않지만 "none"이라는 것이 있는데 이것은 메시지를 보내지 말라는 뜻이다.
        지금까지 facility와 level에 대해서 알아보았는데, 이 둘은 하나로 결합되는 것인데, 세미콜론(;)으로 구분하여 여러개를 사용할 수도 있다.

        facility1.level1;facility2.level2;...


        마지막 필드인 action은 메시지를 어디에 보낼 것인가에 대해서 행해지는 목적지나 행위를 가리키게 된다. 따라서 로그파일이 될 수도 있고, 파이프나 터미널/콘솔, 특정 유저에게 보내어지게 할 수도 있다.

        action 의 미
        file file에 내용을 추가
        @host host에 지정된 호스트로 메시지를 보냄
        user 지정된 사용자의 스크린으로 메시지를 보냄
        * 현재 로긴되어 있는 모든 사용자의 스크린으로 메시지를 보냄
        [사용가능한 action]


        이제 지금까지의 내용을 가지고 몇가지의 예제를 보기로 하자.

        예제 1
        *.=crit;kern.none      /var/log/critical

        - facility 부분에 *가 있으므로 모든 facility에대해서, "=crit"이므로 crit 레벨에 해당하는 에러가 발생한 경우만 기록..
        그 다음 세미콜론(;)으로 복수조건을 쓰겠다는 뜻이구..다음의 "kern.none"은 커널관련 메시지는 제외시키겠다는 뜻이다. 그리고 이 메시지들은 "/var/log/critical"에 저장된다.

        예제 2
        kern.*    /var/log/kernel
        kern.crit    @darkstar
        kern.crit    /dev/console
        kern.info;kern.!err    /var/log/kernel-info

        - 첫째줄은 모든 커널 메시지를 "/var/log/kernel"에 저장한다.
        두번째줄은 crit 레벨 이상의 경우 darkstar라는 호스트에 보고하고,
        세번째줄은 "/dev/console" 즉 화면에도 메시지를 보내게 된다.
        네번째 줄은 복수조건으로 일단 info 레벨 이상을 기록하며, 두번째 조건이 "!err"이니깐 err 이상의 레벨은 기록하지 않게 된다. 따라서 위의 경우는 info 이상레벨과 err 레벨을 제외한 그 이하레벨까지를 의미한다. 즉, info, notice, warning 레벨을 /var/log/kernel-info 파일에 기록하게 된다.

        예제 3
        *.alert     root, master

        - 모든 alert 이상 레벨의 에러는 root와 master라는 유저가 로그인해 있다면 콘솔화면에 해당 메시지를 뿌려준다.

       
      1. SetUID, SetGID, Sticky bit

        유닉스/리눅스 시스템에서의 파일모드는 아래와 같이 세자리 숫자로 되어 있다. 즉, 755(-rwxr-xr-x), 644(-rw-r--r--)와 같은 조합을 이루고 있다.



        그런데 여기에 한자리의 숫자가 맨앞에 하나더 있다. 즉, 755의 경우 0755가 되는 것이다. 맨 앞의 숫자는 다음과 같은 의미를 가진다(0은 아무런 설정도 되어있지 않음을 의미).

        이름 비트 설명
        SetUID 4 이 부분이 설정되면 실행시 그 파일의 소유자 권한으로 실행된다. 따라서 누가 그 파일을 실행하게 되면 실행시 실제로 그 파일의 소유권을 가진 유저가 실행하는 것과 같은 의미를 가지게 된다. 설정되면 권한에서 소유자의 실행(x)부분이 "s", "S"로 나타나게 된다.
        SetGID 2 이 부분이 설정되면 실행시 그 파일의 소유그룹의 권한으로 실행된다. 위와 같은 의미이고, 설정되면 권한에서 소유그룹의 실행(x)부분이 "s", "S"로 나타난다.
        Sticky bit 1 이 부분은 해당 파일의 소유자에게만 쓰기 권한을 제공한다. 이 부분이 설정되면 해당파일, 디렉토리는 public에게 쓰기가 되어있다고 하더라도 해당파일의 소유자가 아니면 쓰기에 관련된 작업을 할 수 없다. 설정되면 public의 실행(x)부분이 "t", "T"로 나타난다. 유닉스/리눅스의 /tmp 디렉토리가 sticky bit로 설정되어 있다.
        [SetUID, SetGID, sticky bit의 의미]


        SUID, SGID, Sticky bit의 설정과 제거는 아래와 같이 chmod 명령으로 한다.

        SUID
        • chmod u+s filename : filename 파일의 user에게(u) SUID 비트를(s) 부여한다.
          or,
        • chmod 4*** filename : SUID 비트는 8진수로 4의 값을 갖는다. *** 자리에는 755 등과 같은 기존의 8진수 모드 값이 오게 된다.
        • [ex]
          위에서 xl이라는 스크립트에 SUID를 설정할 경우,
          [bluesky@bluestar bluesky]# ls -l xl
          -rwxr-xr-x 1 root root 2886 Apr 29 2000 xl
          [bluesky@bluestar bluesky]# chmod u+s xl
          [bluesky@bluestar bluesky]# ls -l
          -rwsr-xr-x 1 root root 2886 Apr 29 2000 xl

          이렇게 suid 비트가 설정이 되면 다른 유저가 xl이라는 스크립트를 실행할 때 루트의 권한을 가질수 있게 된다.

        SGID
        • chmod g+s filename : filename 파일의 group에게(g) SGID 비트를(s)를 부여한다.
          or,
        • chmod 2*** filename : SGID 비트는 8진수로 2의 값을 가진다. 마찬가지로, *** 자리에는 755와 같은 기존 8진수 모드의 값이 온다.
        • [ex]
          위에서 xlock-exploit라는 스크립트에 SGID를 설정할 경우,
          [bluesky@bluestar bluesky]# ls -l xlock-exploit
          -rwxr-xr-x 1 root root 6018 Apr 29 2000 xlock-exploit
          [bluesky@bluestar bluesky]# chmod g+s xlock-exploit
          [bluesky@bluestar bluesky]# ls -l xlock-exploit
          -rwxr-sr-x 1 root root 6018 Apr 29 2000 xlock-exploit
        Sticky bit
        • chmod o+t filename : filename 파일 또는 디렉토리에 Sticky bit를 부여한다.
        • chmod 1*** filename : Sticky bit의 8진수 값은 1이다.
        • [ex]
          예를 들어, 위에서 shell_scripts라는 디렉토리에 sticky bit를 설정하려고 할 경우,
          [bluesky@bluestar bluesky]# ls -l shell_scripts
          drwxrwxr-x 2 bluesky bluesky 1024 Apr 20 2000 shell_scripts
          [bluesky@bluestar bluesky]# chmod o+t shell_scripts
          [bluesky@bluestar bluesky]# ls -l shell_scripts
          drwxrwxr-t 2 bluesky bluesky 1024 Apr 20 2000 shell_scripts

        각각의 설정을 제거하려고 할 경우는 + 대신에 -를 사용한다.
        그리고 위에서 SUID, SGID, Sticky bit 설정시 실행(x)부분에 "s", "S" 또는 "t", "T"로 나타난다고 했는데, 소문자의 경우는 이미 기존의 파일에 실행권한이 부여되어 있는경우에 SUID,SGID,Sticky bit를 설정시에 나타나게 되고, 대문자(S, T)의 경우는 기존의 파일에 실행권한이 없는 상태에서 SUID, SGID, Sticky bit를 설정할 경우에 나타나게 된다. 즉, 대문자인 경우는 기존 파일의 권한에서 실행권한이 없는 상태에서 설정했기 때문에 SUID,SGID 등을 설정해도 실행은 되지 않는다. 즉, 대문자로 나타나는 경우는 동작되지 않음을 의미한다
        .

        예를 들어 아래와 같이 실행권한이 없는 suid란 파일에 SUID 비트를 설정해보면,
        [bluesky@bluestar bluesky]# ls -l suid
        -rw-rw-rw- 1 bluesky bluesky 2290 May 6 2000 suid   <- 실행권한 없음
        [bluesky@bluestar bluesky]# chmod u+s suid
        [bluesky@bluestar bluesky]# ls -l suid
        -rwSrw-rw- 1 bluesky bluesky 2290 May 6 2000 suid  <- 대문자 S
        [bluesky@bluestar bluesky]# ./suid
        bash: ./suid: Permission denied


        지금까지는 전반적인 내용과 설정법에 대해 알아보았는데, 그렇다면 실제로 유닉스 시스템에서 어떻게 사용되고 있는지 알아보자.

        유닉스/리눅스 시스템에서 사용자가 자신의 패스워드를 바꾸려고 할 때 passwd(/usr/bin/passwd)란 명령을 사용한다. 이 명령을 사용하여 사용자는 /etc/passwd란 파일을 수정하여 자신의 패스워드를 변경하게 된다.
        그런데 /etc/passwd란 파일의 접근권한을 보면,
        [bluesky@bluestar bluesky]# ls -l /etc/passwd
        -rw-r--r-- 1 root root 930 Mar 5 04:38 /etc/passwd

        즉, root 유저만 이 파일을 수정할 수가 있다..그런데 어떻게 일반 사용자가 이 파일을 수정하여 자신의 패스워드를 변경할 수가 있는가??

        그 비밀은 passwd(/usr/bin/passwd)란 파일의 접근권한(즉, SUID)에 있다. 이 파일의 접근권한을 보면,
        [bluesky@bluestar bluesky]# ls -l /usr/bin/passwd
        -r-sr-xr-x 1 root bin 58306 Apr 13 1999 /usr/bin/passwd

        위와 같이 /usr/bin/passwd란 파일은 root 유저에게 SUID 비트가 설정되어 있다. 그러므로 일반 사용자들도 이 파일을 실행하고 있는 동안에는 root의 권한을 잠시 빌려쓸 수 있게 되고 그리하여 root 만 변경할 수 있는 파일인 /etc/passwd 파일도 수정하여 자신의 패스워드를 변경할 수가 있는 것이다.


        이번에는 Sticky bit의 사용에 대해 알아보자.
        유닉스/리눅스 시스템에서 /tmp 디렉토리의 권한을 보면,
        [bluesky@bluestar bluesky]# ls -l /tmp
        drwxrwxrwt 15 root root 1024 Mar 8 23:27 tmp

        위를 보면 /tmp 디렉토리의 권한이 1777(rwxrwxrwt)로 설정되어 있다. 이 디렉토리가 sticky bit가 설정이 되어 있는데, 일반적으로 /tmp 디렉토리는 많은 유저들이 임시적으로 파일을 생성하거나 복사하여 작업하는 디렉토리이다.
        그런데 만약 A라는 유저가 파일을 /tmp 에 만들었는데 B라는 유저가 이 파일을 보고 지워버린다면 어떻게 되겠는가?? 바로 이런 불상사를 막기 위해서 /tmp 디렉토리에 sticky bit가 설정되어 있는데 이렇게 sticky bit가 설정되어 있으면 해당 디렉토리내에서 다른 유저들이 만들어 놓은 파일들을 보거나 실행은 가능하지만 지우거나 변경을 할 경우에는 반드시 그 파일의 소유자의 권한이 있어야만 한다. 즉, 해당 파일의 소유자만이 그 파일을 변경하거나 지울 수가 있는 것이다.


        이러한 suid는 위와 같이 매우 유용하게 사용될 수 있는 반면 보안상으로 매우 취약한 약점을 가지고 있다. 여기서 suid가 왜 문제가 되는지 간단한 예를 하나 들어보자.
        예를 들어 시스템 관리자가 관리자용으로 따로 만든 계정이 아닌 그냥 root로 작업을 하고 있다가 잠시 자리를 비웠다고 가정해 보자. 이때, 이 시스템에 hacker란 계정을 가진 사람이 들어와서 아래와 같이 했다면 큰일이다.
        [root@bluestar /root]# cp /bin/sh /home/hacker
        [root@bluestar /root]# chmod 4775 /home/hacker/sh
        [root@bluestar /root]# ls -l /home/hacker/sh
        -rwsrwxr-x 1 root root 373304 Mar 23 04:05 /home/hacker/sh

        위와 같이 해두면 hacker란 사용자는 다음에 자신의 계정으로 로긴한 후 이 훔친 shell(일종의 백도어이다.)을 이용하여 언제라도 root가 될 수 있으니 얼마나 위험한 일인가...다음은 그 과정을 보여준다.
        [hacker@bluestar hacker]$ <-- hacker가 자신의 계정으로 로긴..
        [hacker@bluestar hacker]$ whoami
        hacker
        [hacker@bluestar hacker]$ ls -l
        -rwsr-xr-x 1 root root 373304 Mar 23 04:05 sh
        [hacker@bluestar hacker]$ ./sh  <-- root의 권한으로 shell을 실행시킴(root shell 획득...)
        [hacker@bluestar hacker]#whoami(프롬프트가 $->#으로 바뀐것을 주목..)
        root
        이후의 일은 끔찍함 그자체.... ^_^

        그러므로 시스템 관리자는 화면 잠금없이 자리를 비우는 일이 없도록 해야하며, 수시로 아래명령으로 불필요하게 suid/sgid 설정 이 되어있는 화일이 없는지 확인해야 한다. (보안툴을 이용해서 점검이 가능..)
        [root@bluestar /root]# find / -perm -4000 -o -perm -2000 -print



        위에서 SUID,SGID에 대해서 알아보았는데, 만약 중요한 실행파일들이 사용자들에게 root의 소유이면서 suid가 설정되어 있다면 그 실행파일로 인해서 대부분의 침입자들은 root 유저의 권한을 얻거나 시스템을 파괴하려들 것이다. 따라서 불필요한 SUID는 제거해야 한다. 시스템에 있는 모든 SUID/SGID를 찾아내어 그러한 설정 비트들이 왜 붙어 있는지를 따져보고 불필요한 suid, sgid라면 제거를 해야하고, 만약 전에 없던 suid 비트가 어떤 실행파일에 설정되어 있다면 침입의 여부를 꼼꼼히 살펴보아야 할 것이다.

        suid/sgid가 설정된 파일을 찾을 때는 아래와 같은 명령을 사용한다.

        [bluesky@bluestar bluesky]# find / -type f \( -perm -04000 -o -perm -02000 \)
        or,
        [bluesky@bluestar bluesky]# find / -perm -4000 -o -perm -2000 -print 2>/dev/null

        이렇게 해서 나온 결과들을 보고 해당 실행파일에 불필요하게 suid/sgid가 설정이 되어 있다면 바로 제거해야 한다. suid와 sgid는 잠재적인 보안 위험 요소이며 철저하게 감시되어야 한다.

        만약 크래커가 여러분의 시스템에 사용권을 얻게되고, 특히 시스템 파일이나 월드 라이터블(World-writable) 파일들을 변경할 수 있게되면 심각한 보안 개구멍이 존재하게 된다.(월드 라이터블이란 public 부분이 쓰기 가능한 경우이다. 즉, "--------w-"의 권한 비트를 말한다) 또한 월드-라이터블 디렉토리도 위험하다. 그래서 이러한 파일 및 디렉토리들도 찾아보고 왜 "쓰기가능"으로 설정되어 있는지 따져보아야 하며 불필요한 경우에는 "쓰기가능"을 제거해 주어야 한다.
        정상적인 운영에 있어서 /dev의 일부와 심볼릭 링크를 포함한 여러 파일들이 라이터블로 되어 있을 수 있다.

        이러한 World-writable 파일들을 찾는 명령은 아래와 같다.
        [bluesky@bluestar bluesky]# find / -perm -2 -print

        또한 무소속의 파일들 또한 침입자가 시스템에 들어왔다는 징후일 수 있으므로 주인이 없거나 그룹에 소속되어 있지 않는 파일들이 없는지 아래의 명령으로 찾아보아야 한다.
        [bluesky@bluestar bluesky]# find / -nouser -o -nogroup -print

        마지막으로 리모트 호스트(.rhosts) 파일들 또한 반드시 살펴보아야 한다. 시스템내의 /home 디렉토리 내의 임의의 사용자의 디렉토리내에 이러한 파일이 있다는 것은 시스템에 암호없이 들어올 수 있는 특정 호스트가 존재한다는 것이기 때문에 매우 위험하다.
        이러한 .rhosts 파일들을 찾기위해서는 다음과 같이 한다.
        [bluesky@bluestar bluesky]# find /home -name .rhosts -print
        /home/bluesky/.rhosts
        [bluesky@bluestar bluesky]# rm /home/bluesky/.rhosts
        rm: remove `/home/bluesky/.rhosts'? y

      2. 파일속성 설정

        예를 들어, 어떤 파일이 있는데 이 파일은 쓰기가 가능한데 오로지 추가하는 모드로만 열 수 있도록 하고 싶은경우가 있다면 기존의 파일 권한 모드로는 어떻게 할 방법이 없다. 이럴 때 사용하는 것이 파일속성 설정이며 이는 chattr 명령을 사용한다.

        사용법
        chattr [-RV] [-+=AacdisSu] [-v version] files...

        옵션
        -R(Recursive) : 디렉토리와 그 이하 모든 내용의 속성을 회귀적으로 변경한다.
        -V(Verbose) : 변화된 속성에 대하여 자세히 출력해 준다.
        -v version_number : 파일에 "version_number"에 해당하는 버전을 설정한다.

        심볼릭 모드의 형식은 +-=[Sacdisu] 으로 사용가능하다.
        여기서 "+" 연산자는 주어진 속성을 현재 파일의 속성에 추가하며, "-" 연산자는 속성을 제거한다. "=" 연산자는 파일이 갖는 속성을 오로지 주어진 속성만 갖도록 설정하게 된다.
        "Sacdisu" 문자들은 각각 다음과 같은 속성을 지닌다.

        S syncronization, 동시적 갱신으로 파일을 열게 한다.
        a append, 추가만 지원한다.
        c compress, 압축상태로 저장한다.
        d dump, 덤프를 하지 않는다.
        i imutable, 면역상태를 만든다.
        s safe, 안전한 쓰기를 제공한다.
        u undelete, 지울 수 없게 한다.
        [리눅스 파일시스템의 추가 속성]

        "S"는 파일을 동기화 시켜준다. 따라서 여러곳에서 파일을 사용하는 경우에도 해당 파일은 시간의 순서대로 동기화되어 진다. 이것은 sync 마운트 옵션을 사용하는 경우와 같다.
        "a"는 해당 파일을 추가하는 모드로만 열 수 있다. 따라서 이 속성이 지정되면 지우거나 변경은 되지 않는다.
        "c"는 디스크상에서 압축해서 저장하는 속성이다.
        "d"는 dump 명령 수행시 백업되지 않게하는 속성이다.
        "i"는 완전히 불변하는 파일을 만든다. 이 파일은 어떠한 경우에도 지울 수도, 이름을 변경할 수도, 심지어 링크도 만들 수 없게 된다. 수퍼유저가 이 속성을 변경하기 전에는 어떤 상태도 만들 수 없게 된다.
        "s"는 안전하게 지우는 것으로 일단 지울 때는 모든 블록을 0으로 초기화 시킨뒤에 스기를 시작한다.
        "u"는 undelete로, 지운뒤에 사용자가 다시 복구하는 기능이지만 아직 구현되지 않고 있다.


        이제 몇가지를 확인해 보면,
        아래와 같은 내용을 담고 있는 attr 이라는 파일이 있다고 할 때, 이 파일에 append 속성을 추가해보기로 하자.

        [bluesky@bluestar bluesky]# ls -lF attr
        -rw-r--r-- 1 bluesky bluesky 46 Mar 9 11:15 attr
        [bluesky@bluestar bluesky]# cat < attr
        S: syncronization...
        a: append...
        c: compress

        이제 이 파일에 append 속성을 추가하면,
        [bluesky@bluestar bluesky]# chattr -V +a attr
        chattr 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09
        Flags of attr set as -----a--

        이렇게 append 속성을 추가하면 이제부터 이 파일은 "추가모드로만 변경이 되며 지우거나 할 수가 없게 된다".
        [bluesky@bluestar bluesky]# cat > attr
        bash: attr: Operation not permitted  <- 수정이 안된다고 함.
        [bluesky@bluestar bluesky]# cat >> attr   <- 추가모드(>>)로 작성
        d: dump...   <- 이 라인을 추가한다.

        [bluesky@bluestar bluesky]# cat < attr
        S: syncronization...
        a: append...
        c: compress
        d: dump...  <- 추가된 라인


        이번에는 imutable 속성을 추가해보자.
        [bluesky@bluestar bluesky]# chattr -V +i attr
        chattr 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09
        Flags of attr set as ----ia--

        [bluesky@bluestar bluesky]# rm attr
        rm: remove `attr'? y
        rm: cannot unlink `attr': Operation not permitted  <- 지울 수가 없다고 한다.




     
  8. 리눅스 한글문서 프로젝트(KLDP)의 커널 컴파일 관련 링크



    ! have a good day !

'컴퓨터 > Linux(Unix)' 카테고리의 다른 글

sudo에 대해  (0) 2008.02.12

Posted by ㉡ㅐ꼬
,