Unix Linux Hacker (박 준석)

“PC 하드웨어의 발전은 워크스테이션급 컴퓨터와의 구분을 어색하게 만들어 버렸으며, 그 운영체제인 유닉스는 더이상 워크스테이션의 전유물이 아니다.”

유닉스는 가장 훌륭한 운영체제이다. PC에서 동작하는 주요 OS로는 DOS, MS-WINDOWS, OS/2 등을 들 수 있다. DOS의 시대는 이미 지났으며(MS-DOS 6.x 버젼이 DOS의 마지막 버젼), MS-Windows나 NT는 수많은 소프트웨어군들을 가지고 있고, OS/2는 화려한 개체 지향 인터페이스와 DOS나 MS-Windows와의 특유의 호환성을 지원하고 있다. 유닉스는 이러한 운영체제들의 모범이 되어온 강력한 멀티태스킹과 멀티유저기능을 보유하고 있으며, GUI 환경으로는 X-Windows를 제공한다. 특히, 리눅스는 유닉스의 공개 버젼으로써 486 PC를 유닉스가 탑재된 워크스테이션급의 성능과 맞먹는 기능을 제공하는 훌륭한 유닉스 시스템이다.

근래들어, 많은 소프트웨어들이 사용자 인터페이스에 역점을 두어 개발되고 있다. 일반적으로 유닉스는 사용자 인터페이스가 좋지 않다고 알려져 있으며, 따라서 배우기 어렵다고 한다. 이것에 대한 필자의 생각은 이렇다. 아무리 쉽게 설계된 운영체제나 응용프로그램들도 그 기능을 충분히 활용하려면 적지 않은 시간과 노력이 들기 마련이다. DOS의 허약한 체력을 뒷바침해주는 것은 비정상적인 트릭과 하드웨어를 직접 제어하여 그 체력의 한계를 뛰어 넘는 훌륭한 응용프로그램들이다. 실제로 스스로 부팅하여 동작하는 프로그램도 있었다. 결국, 사용자의 입장에서는 운영체제와 응용프로그램과의 어떠한 통일성이나 일관성을 찾아 보기 어려우며, 서로 다른 유틸리티나 응용 프로그램을 각각 열심히 배워야 한다. 각각의 응용프로그램들이 고유의 인터페이스를 가지고 있는 것은 수많은 프로그램을 이용해야하는 사용자에게는 결코 사용하기 편한 인터페이스는 아닐 것이다. 훌륭한 사용자 인터페이스는 깔끔한 화면이나 쉽게 실행시킬 수 있는 구조를 가지고 있는 것보다는 사용자가 원하는 최종 결과를 쉽게 얻을 수 있어야 한다.

응용프로그램들이 방대해지고 있다. 이제는 응용프로그램 하나가 10MB 이상되는 것을 쉽게 찾아 볼 수 있다. 통합적인 기능을 제공하기 위해서 수많은 루틴과 폰트들이 첨가되고, 사용자 인터페이스를 위해서 적지 않은 코드들이 사용된다. 아무리 수많은 기능을 제공하는 응용프로그램이라 할지라도 모든 작업을 할 수 없는 것이 컴퓨터상의 작업이다. 따라서, 당연히 여러가지의 응용프로그램을 사용하며, 그러인해 똑같은 루틴과 폰트 등이 여러개 존재하게 된다. 이것은 프로그래머나 사용자에게 낭비가 아닐 수 없다. 유닉스는 라이브러리를 서로 공유하며, X상의 폰트들을 함께 사용한다. 적은 용량이 아닌 유닉스는 실제로 최적화된 시스템인 것이다.

OS/2나 NT는 모두 훌륭한 운영체제들이다. 하지만, 실제로 이들 운영체제를 사용하기 위해서는 최소한 각각 8MB와 12MB의 RAM용량을 가지고 있어야 하며, 이들 전용의 응용프로그램도 많지 않다. 대부분 DOS와의 호환성으로 그 응용프로그램들을 실행할 수 있으나, 큰 패키지같은 경우는 운영체제에 다소 무리가 따르며, 실행이 불가능한 것도 있다.

필자가 언급하고 싶은 것은 지금의 하드웨어 시스템으로는 리눅스가 가장 적합한 운영체제라는 것이다. 운영체제 자체로서는 상업용 유닉스의 기능을 가지고 있고, 사용자에게는 완전 공개됨으로서 마음대로 사용할 수 있는 권한을 주며, 프로그래머나 학생들은 수많은 소스파일을 얻음으로해서 보다 훌륭한 소프트웨어를 만들 수 있게 해주기 때문이다.

리눅스는 전세계의 해커들에 의해 만들어진 80386 이상의 PC에서 운영할 수 있는 공개 유닉스이며, FSF(Free Software Foundation)에서 GNU(Gnu's Not Unix) Project의 일환으로 계획 개발된 것이다. FSF는 “소프트웨어는 소스를 포함하여 공개적으로 배포되어야 소프트웨어 자체를 비롯하여 사용자나 개발자에게 진정한 발전이 이루어진다”라는 주의를 펼치고자 설립된 비영리 재단이며, GNU는 그것을 실천으로 옮기고자하는 프로젝트이다.

해커의 시대가 하드웨어에서 소프트웨어로 변화되었다. 이 시대 마지막 해커라고 불리우는 Richard Stallman이 설립한 FSF는 진정한 해커주의를 실현하고 있는 재단이다. 해커라는 말이 사회적으로 나쁜 용어로 쓰이고 있는게 현실이지만, 이들은 반드시 범죄자와는 구분되어야 한다. 해커주의는 근본적으로 정보는 모든이에게 공유되어야 한다는 것이 주된 바탕이다. 따라서, 프로텍트를 걸거나 소프트웨어를 판매하는 행위로 정보의 흐름을 막는 것을 거부한다. 소프트웨어에 관한 지적 소유권이나 특허권에 위배된다고 볼 수 있으나, 이들 법률적 장치는 궁극적으로 소프트웨어를 발전시키는 것이 목적이지 쇠퇴시키는 것이 아니다. Richard Stallman이 생각해 낸 것은 상업용이 되어버린 수많은 프로그램을 지적 소유권 침해없이 공개용 프로그램으로 만드는 것이었다. 이것이 바로, 법에 위배되지 않으면서 소프트웨어를 마음대로 사용할 수 있게 하는 GNU 프로그램들이다. 결론적으로, 리눅스라는 훌륭한 공개 유닉스와 수많은 GNU 프로그램들이 개발되었다.

현실적으로, 절대적인 기술 우위로 미국 주도인 소프트웨어 산업을 우리나라같은 후발주자들이 따라잡기 위한 방법중의 하나가 GNU라고 생각한다. `한글화'라는 울타리에 언제까지나 안주 할 수는 없으며, 유니코드(UNICODE)는 그 울타리마저 허물어 버릴 것이다. 소수의 개발자팀에 의해 힘들게 쫓기 보다는 다수의 사용자와 개발자들 모두 서로 나누고 발전시키는 것이 유니코드를 역이용할 수 있는 방법이 될 것이다.

운영체제의 과목이 없는 컴퓨터 관련 학과는 없을 것이다. 관련 학과 학생들에게 정말로 추천하고 싶은 것이 리눅스이며, 실제로 많은 것을 배울 수 있다고 생각한다. 그리고, 리눅스를 개개인 보다는 학과 주도로 한 과목으로 설정하는 것이 어떤가 하는 생각도 가져본다. 더이상 단속에 긴장해야하는 배움의 전당이 있어서는 안될 것이다.

이 책은 GNU 선언문을 시작으로 리눅스에 대해 설명한다. 또한, 유닉스 입문서로서의 내용을 담고 있으며, 기존의 DOS나 MS-Windows에서의 일상적인 여러 작업들을 포기하는 것이 아닌, 그것을 리눅스상에서 구현해보는 방법을 소개한다.

						박 준석

Overview

0장에서는 FSF를 설립한 Richard Stallman의 GNU선언문을 싣는다. GNU의 기본적인 개념과 필요성들을 알 수 있을 것이다.

1장에서는 리눅스 배포본 중 가장 많이 배포되는 SLS 배포본과 Slackware 배포본을 사용하여 설치하는 방법과 이 배포본 디스크에 포함된 내용을 설명한다.

2장은 리눅스(유닉스)를 사용하는 기본적인 명령어 요약및 개념들을 설명한다.

3장에서는 시스템을 관리하는 방법과 관련 명령어를 설명한다. 2장과 3장은 GDP(Gnu Document Project)에 의해 공개된 Matt Welsh의 "Linux Installation and Getting Startded"을 참조하였다.

4장은 X Window의 설치와 사용법을 설명하며, DOS 시스템을 액세스하는 Mtools와 리눅스 상에서 DOS를 에뮬레이션 해주는 DOSEMU 등을 설명한다.

5장은 리눅스 상에서 한글을 사용할 수 있는 프로그램들을 설명한다. 한글을 사용하는 기본적인 기반인 한텀, 에디터인 helvis, 보다 강력한 에디터인 Mule(Emacs), 문서 형식기인 LaTeX, 통신 프로그램인 Seyon등을 설명한다.

부록에서는 몇가지 트릭과 문제 해결 방법, 시스템 관리에 필요한 명렬어들과 FTP 사용법, Networking, FAQ(Frequently Answer and Question) 등을 설명한다.

차 례

0. GNU 선언문

1. 리눅스의 기능과 설치 방법 1.1 리눅스란? 1.2 SLS와 Slackware 배포본의 디스크 내용 1.3 설치 요약 1.4 하드 디스크로 부터의 설치

2. Linux Tutorial 2.1 기본 명령어 요약 2.2 파일 시스템의 탐험 2.3 Shell의 형태 2.4 파이프의 사용 2.5 파일 사용허가 2.6 Job 제어 2.7 환경 기호화

3. 시스템 관리 3.1 ROOT 3.2 시스템 부팅 3.3 셧 다운 3.4 사용자 관리 3.5 압축파일 3.6 플로피의 사용과 백업만들기 3.7 새로운 소프트웨어 설치 3.8 파일시스템 관리 3.9 기타 작업 3.10 시스템 복구 3.11 초기화 파일들 3.12 /etc, /usr/etc 디렉토리 내의 파일 설명

4. Advanced Features 4.1 The X Window System 설치와 사용 4.2 DOS 파일 액세스 Mtools 4.3 DOSEMU 4.4 파일 변환 프로그램 4.5 사운드

5. 한글 사용과 관련된 주요 응용 프로그램 5.1 한텀 5.2 helvis 5.3 Mule/Emacs 5.4 한글 LaTeX 5.5 Seyon

Appendix A Tips, Tricks, and Common Problems B. FTP Tuterial and Site List C. Networking D. Linux FAQ

1.리눅스의 기능과 설치방법

1.1 리눅스란? 1.2 SLS와 Slackware 배포본의 디스크 내용 1.3 설치 요약 1.4 하드 디스크로 부터의 설치

리눅스란 무엇이며, 어떤 소프트웨어들이 포함되어 있는지 살펴보며, 그 배포본으로 설치하는 방법을 알아보자. 1.1 리눅스란?

리눅스란 인텔 80386 이상을 사용하는 PC에서 운영되는 유닉스 운영체제의 공개 버전이다. 기본적인 환경은 POSIX 사양및 SYSV, BSD와 같으나 독자적인 소스로 개발되었다. 커널은 Linus B. Torvalds에 의해 제작되었으며, 기타 유틸리티와 응용 프로그램들은 인터넷을 통한 많은 해커들로 부터 제작되었다.

아래와 같은 기능상의 특징을 가지고 있다.

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

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

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

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

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

* 윈도우 악셀리이터및 Super VGA 지원 ET4000, CIRRUS, Paradise, Trident, S3, ATI 등 대부분의 VGA가 지원되며, HGC, CGA, EGA등도 물론 지원된다.

* 기타 하드웨어 Sound Blaster, ProAudio Spectrum 16, Gravis, Ultrasound 등 대부분의 음악카드와 WD 80x3, ne1000, ne2000, 3com503, 3com509 등의 네트웍카드가 지원된다.

이 밖에, 수치 연산 프로세서 에뮬레이션, SCSI 및 VESA, PCI 버스 지원, 도스 에뮬레이션, 다중 부트 기능 등을 지원한다.

리눅스 시스템과 더불어 관련문서들도 공개 배포된다. LDP(Linux Document Project)에 의해 작성되고 있는 것으로서 완전한 Guide Book의 형식을 가지고 있다. 아래와 같은 네가지의 종류가 있다.

Installation and Getting Started The Kernel Hacker's Guide Network Administration Guide Linux System Administrator's Guide

또한, 이 이외에 유용한 여러가지 HOWTO 문서들이 있다.

Installation HOWTO Electronic Mail HOWTO Linux INFO-SHEET UUCP HOWTO Linux META-FAQ SCSI HOWTO NET-2 HOWTO Printing HOWTO Ethernet HOWTO Hardware Compatibility HOWTO News HOWTO XFree86 HOWTO Distribution HOWTO Sound HOWTO

실제적 이런 문서들은 인터넷을 경유하지 않으면 직접적으로 얻을 수 없으나, 인터넷을 액세스할 수 있는 분들의 수고로 하이텔을 비롯한 여러 BBS에 구할 수 있을 것이다.

리눅스는 다양한 방법으로 배포된다. 커널(운영체제의 핵심부분)을 포함한 각각의 소프트웨어들을 개별적으로 구하여(통신상으로) 설치할 수도 있고, 앞으로 설명할 여러 가지 소프트웨어를 종합하여 배포본(디스크)을 만들어 배포되는 것이 있다. 현재 Slackware 배포본이 주로 보급되고 있다. 또한, 국내에서 리눅스를 배포하시는 여러분들께서 나름대로의 시스템으로 구성하여 배포하는 것도 있다. 이런 배포본들은 대부분 한글이 지원되는 여러 가지 프로그램들을 포함하고 있으며, 주로 최신 버전 소프트웨어들을 사용하고 있다. 따라서, 설치하는 방법도 약간씩 다를 수 있다.

1.2 SLS 와 Slacksware 배포본의 디스크 내용

1. SLS 배포본

o a1-a4: 기본 시스템, 리눅스 커널, 라이브러리, 기본 실행파일 설치와

	셋업을 위한 도구 

o b1-b7: 추가적인 기본 시스템, Manual pages, Emacs, 등등

o c1-c3: gcc, p2c, f2c 등의 컴파일러

o x1-x10: X 윈도우 시스템과 관련 소프트웨어

o t1-t3: TEX, 문서 형식화 시스템

o s1: 패키지의 소스코드

o d1-d2: 문서파일

패키지 디스크 대략적인 하드 용량 — Tiny a 15 megabytes Base a, b, c 45 megabytes Main a, b, c, x 70 megabytes Full a, b, c, x, d, s, t 90 megabytes

2. Slackware 배포본 1.2.0

o bootdisk 1.44MB와 1.2MB Boot/install 디스크로 1.44M용과 1.2M용이 있다. 리눅스를 설치하기 위해서 적어도 하나의 boot/install 디스크가 필요하다.

o a1 - a3 기본 시스템. elvis, comm 과 Linux 1.0 커널. 새로운 파일 시스템인 FSSTND

o ap1 - ap4 manual pages, groff, ftape, ispell (GNU and international versions), term, joe, jove, ghostscript, sc, bc, quota patch 등 다양한 응용 프로그램을 포함한다.

o d1 - d6 프로그램 개발 디스크. GCC/G++/Objective C 2.5.8, make (GNU 와 BSD), byacc, GNU bison, flex, 4.5.24 C library, gdb, Linux 1.0의 커널 소스, SVGAlib, ncurses, clisp, f2c, p2c, m4, perl, rcs.

o e1 - e5 GNU Emacs 19.22.

o u1 - u2 UMSDOS 파일 시스템

o f1 FAQ 모음과 여러 문서파일

o i1 - i3 GNU 소프트웨어의 info 파일들.

o n1 - n3 네트워크 디스크. TCP/IP, UUCP, mailx, dip, deliver, elm, pine, smail, cnews, nn, tin, trn.

o oop1 개체 지향 프로그래밍. GNU Smalltalk 1.1.1 과 Smalltalk Interface to X. (STIX)

o tcl1 - tcl2 Tcl, Tk, TclX, blt, itcl.

o y1 게임. BSD 게임 모음, 터미날용 테트리스

o x1 - x8 XFree86 2.1 기본 시스템. libXpm, fvwm 1.21c, xlock

o xap1 - xap2 X 응용 프로그램. X11 ghostscript, libgr13, seyon, workman, xfilemanager, xv 3.00, GNU chess, xboard, xfm 1.2, ghostview, xgrapsc, 및 여러 가지 X 게임.

o xd1 - xd2 X11 프로그램 개발용. X11 libraries, server linkkit, PEX, X11 programming man page

o xv1 - xv2 Xview 3.2 release 5. XView 라이브러리, Open Look virtual 및 non-virtual window managers.

o iv1 - iv4 Interviews libraries, include files, 그리고 doc 와 idraw 프로그램.

o oi1 - oi3 ParcPlace's Object Builder 2.0 및 Object Interface Library 4.0.

o t1 - t5 TeX. LaTeX

1.3 설치 요약

SLS나 Slackware 배포본 모두 아래의 과정을 따르며, 부트 디스크가 대부분 따라 올 것이다. 설명은 인터넷이나 기타 다른 통신망으로 부터 리눅스를 얻었을 경우 필요한 부트 디스크를 만드는 과정이므로, 부트 디스크가 있는 경우는 필요 없는 과정이다.

1. 부트 디스크 생성

o SLS 배포본 도스용 프로그램인 rawrite 이용한다.

C:\> rawrite ← 입력

Enter source file name: a1.5 ← 입력, 3.5inch용 일 경우는 a1.3이다.

Enter destionation drive: A: ← 입력

Please insert a formatted diskette into drive a: and press -Enter-:

끝나면, A: 드라이브의 디스켓은 도스에서 인식하지 못하게 되 며, 리눅스 부팅 디스켓이 된다.

o Slackware 배포본

위와 같으며, source file name 은 uniboot이다.

2. 리눅스 부트 디스크로의 부팅 만들어진 부트디스켓으로 부팅하면, root로 login할 수 있다. 초기 패스워드는 없다.

3. fdisk를 사용한 하드디스크 재파티션

fdisk [ -l ] [ -v ] [ -s partition ] [ device ]

-l 파티션 테이블의 목록을 출력한다. -v fdisk 버젼을 출력한다. -s partition DOS 파티션이 아니라면 해당 파티션의 크기를 출력한다. device <device> 에는 몇번째 하드디스크를 파티션할 것인 알려주어야 한다. 아래는 리눅스에서 각각의 디바이스들에 대한 이름이다.

Device Name — — First floppy (A:) /dev/fd0 Second floppy (B:) /dev/fd1 First hard drive (entire drive) /dev/hda First hard drive, primary partition 1 /dev/hda1 First hard drive, primary partition 2 /dev/hda2 First hard drive, primary partition 3 /dev/hda3 First hard drive, primary partition 4 /dev/hda4 First hard drive, logical partition 1 /dev/hda5 First hard drive, logical partition 2 /dev/hda6 . . Second hard drive (entire drive) /dev/hdb Second hard drive, primary partition 1 /dev/hdb1 . . First SCSI hard drive (entire drive) /dev/sda First SCSI hard drive, primary partition 1 /dev/sda1 . . . Second SCSI hard drive (entire drive) /dev/sdb Second SCSI hard drive, primary partition 1 /dev/sdb1 (and so on…)

여기서는 하드 파티션을 설정하는 것이므로 해당하는 목록중 아래의 것을 입력한다.

첫번째 설치된 하드 드라이브이면, fdisk /dev/hda

두번째 설치된 하드 드라이브는, fdisk /dev/hdb

SCSI인터페이스의 첫번째 하드 드라이브이면, fdisk /dev/sda

SCSI인터페이스의 첫번째 하드 드라이브이면, fdisk /dev/sdb

fdisk 가 실행되면, `m' 명령어로 도움말을 볼 수 있다. 출력은 아래와 같다.

Command action a toggle a bootable flag d delete a partition l list known partition types m print this menu n add a new partition p print the partition table q quit without saving changes t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)

그럼, 파티션을 설정하는 순서대로 위의 명령을 설명한다.

`p' 파티션 정보를 출력한다. 아래의 내용은 이미 파티션이 설정된 한 예이다.

Disk /dev/hdb: 16 heads, 63 sectors, 665 cylinders Units = cylinders of 1008 * 512 bytes

Device Boot Begin Start End Blocks Id System /dev/hdb1 2 2 665 334656 5 Extended /dev/hdb5 * 2 2 630 316984+ 83 Linux native /dev/hdb6 631 631 665 17608+ 82 Linux swap

`n' 새로운 파티션을 생성한다. 아래의 내용이 출력된다.

l logical (5 or over) p primary partition(1-4)

리눅스는 logical이나 primary 파티션 모두 설치할 수 있다. 원하는 형태를 입력한후, 시작 실린터(또는 섹터)와 마지막 실린더의 값을 입력하면 된다.

`a' 파티션의 부팅 여부를 전환한다. 예제 중 `Boot' 란에 `*'가 표시된다.

`d' 파티션을 제거한다. 현재 생성되어 있는 파티션의 번호가 출력되며, 원하는 번호를 입력하여 파티션을 제거할 수 있다.

`l' 파티션의 형태를 출력한다.

일반적으로 사용되는 것은 아래와 같다.

6 DOS 16-bit >=32M 82 Linux swap 83 Linux native

`t' 파티션 시스템 형태(ID) 를 변경한다.

`v' 파티션 테이블을 검사한다. 파티션 생성에 에러가 있으면 그 메세지를 출력해준다.

`u' 실린더와 섹터의 단위를 서로 변환한다.

`m' 도움말을 출력한다.

`q' 설정한 파티션을 저장하지 않고 종료한다.

`w' 작성한 파티션 테이블의 정보를 저장하고 종료한다.

`x' 기타 다른 명령어 메뉴를 호출한다.(전문가만 사용)

파티션을 설정하였으면,`shutdown -r now'를 입력하여 다시 부팅 시킨다.

4. 파일시스템 생성 리눅스가 설치될 파티션을 만들었으면, 해당하는 파티션에 파일 시스템을 만들어야 한다. 다음 5번의 과정이 배포본에 따라 파일시스템을 자동으로 생성해주는 경우도 있으나 여기서는 손수 입력하여 파일 시스템을 만들어 보기로 한다.

만들어야할 파일 시스템은 root 파일시스템과 swap 영역이며, 문법은 아래와 같다.

mke2fs /dev/<partition> <number of blocks> mkswap /dev/<partition> <number of blocks> swapon /dev/<partition>

위의 명령어 문법을 기초로 만들어 보자. 예를 들어, /dev/hdb5 가 리눅스가 설치될 리눅스 파티션으로 크기가 153184 블럭(153MB)이고, /dev/hdb6가 스웹파티션이며, 크기가 15592 블럭이라면 아래와 같이 입력한다. 이것은 도스에서 포맷하는 것과 같다.

mke2fs -c /dev/hdb5 153184 mkswap -c /dev/hdb6 15592 swapon /dev/hdb6

5. doinstall(SLS), setup(Slackware)을 이용하여 필요한 소프트웨어 설치 할 수 있다.

doinstall <device> or setup

명령이 실행되면, 설치될 패키지를 선택할 수 있다. "Prompt for each package?" 메시지는 다른 패키지로 설치가 계속될 때, 확인을 받을 것인가를 선택한다.

1.4 하드 디스크로 부터 설치

플로피 디스크로 설치하는 대신에, 배포본의 모든 파일을 하드의 다른 파티션에 (MS-DOS 파티션 같은) 복사하여, 그곳으로 부터 설치할 수 있다. 먼저, 플로피 설치를 위한 a1 디스크를 만드는 것이 필요하다. 둘째, 다른 모든 파일들을 파티션의 한 디렉토리안에 넣고, 각각의 디스크의 디렉토리를 만든다. 예를 들면, C: 드라이브에 있는 MS-DOS파티션으로부터 설치하려 계획하였다면, 디렉토리이름은, C:\install\a2, C:\install\a3가 될 것이다. 설치될 각각의 서브 디렉토리는 디스켓과 일치하는 파일들을 포함하고 있어야 한다.

설치를 확실히 하기 위에서 파티션의 첫번째 디렉토리에 있어야 한다. 달리 말하면, C:\SLS\install로 하는 것 보다는, C:\install로 하는 것이 보다 명확할 것이다.

다른 설치 단계들(파티션이나 파일시스템을 만드는 것 등)은 일반적인 것과 같다. 명령어 doinstall을 사용하면, 하드 드라이브로부터 설치될 메뉴 옵션을 택하면 된다. 파티션의 이름(/dev/hda2)나 파티션의 형태(msdos)같은 것을 답해야 할 것이다.

2.Linux Tutorial

2.1 기본 명령어 요약 2.2 파일 시스템의 구조 2.3 Shell의 형태 2.4 파이프의 사용 2.5 파일 사용 허가 2.6 Job 제어 2.7 환경 기호화

이 장에서는 유닉스의 기본적인 사용법에 관한 내용을 다룬다. DOS의 디렉토리 구조나 간단한 명령어들과 비교하면 쉽게 이해할 수 있으며, 유닉스의 성격 및 기능을 알 수 있을 것이다.

2.1 기본 명령어의 요약

DOS와 유닉스의 환경 차이에 의해 같은 기능의 명령이라 할지라도 다르게 작동한다. 여기서는 이러한 환경의 차이로 인해 접할 수 있는 문제를 막기위해 몇가지 차이점을 설명한다. 이것은 또한, 제한적인 DOS와는 다른 유연한 유닉스의 기능이다.

1. 파일명의 길이 차이 DOS는 파일명 8자와 확장자 3자의 크기로 사용할 수 있는 문자 갯수가 정해져 있지만, 유닉스는 보통 최대 255자의 파일 이름을 가질 수 있으며, 파일명과 확장자를 따로 구분하지 않는다. 예를 들면, 아래의 파일명을 사용할 수 있다.

		linux-1.1.0.tar.gz
		This.is.my.first.program
		

2. 와일드카드 유닉스 하에서는 복수 개의 “*”가 사용될 수 있다. 아래와 같은 파일들이 있다면,

		linux-1.1.0.tar.gz
		linux-1.1.0.copyright
		linux-0.99pl15.tar.Z

위의 파일들 중, 중간에 “tar”를 포함하는 파일들만을 선택하고자 한다면, “*tar*”와 같이 할 수 있다. 이것은 긴 파일명을 선택할 때 매우 유용하다.

3. PATH DOS 상에서 명령어를 입력하면, 현재 디렉토리에서 해당 파일을 찾은 후에 path로 설정된 디렉토리를 조사하지만, 유닉스 하에서는 path로 지정되어 있지 않으면, 명령어만을 입력하여 실행 할 수 없고, 경로까지 포함하여 입력해야 한다.

4. 내부 명령 DOS 하에서는 md, rd, cd, type, copy 등의 명령어가 내부 명령이라 하여 바로 실행 가능하지만, 유닉스 하에서는 대부분의 명령들은 따로 파일로 존재한다.

5. 파일 사용 허가(Permission) 리눅스 초보자들이 가장 쉽게 접하는 문제가 이것이다. 시스템을 혼자만 사용하고 있더라도 실제로 root ID를 사용하지 않고, 별도로 사용자를 생성하여 사용하는 것이 시스템을 보다 안전하게 하는 것이다. 따라서, root 이외의 사용자는 시스템의 모든 파일들을 액세스할 수 없다. 새로운 소프트웨어를 설치한 후, 반드시 파일 사용 허가도 적당하게 변경시키는 것이 필요하다.

명령어 요약 기존 DOS 사용자를 명령어 요약을 싣는다. 유닉스의 기본적인 명령어는 DOS와 상당히 유사하기 때문에 대부분의 명령어는 쉽게 이해할 수 있을 것이다. 또한, 약자로 이루어진 것들이 많고, 선택 옵션이 많아 다소 복잡하게 느껴질 수 있으나, 하나의 옵션이라도 더 아는 것은 사용을 보다 편리하게 해줄 것이다. 또한, 여기에서 사용되는 유닉스 용어들은 뒤에 자세히 설명된다.

cd

기 능 작업 디렉토리를 변경한다. 문 법 cd <directory> <Directory>는 바꾸려고 하는 디렉토리이다. 디렉토리를 따로 입력하지 않으면, login한 디렉토리($HOME 또는 ‘~’로 표시됨)로 이동한다. "."은 현재 디렉토리이며, ".."은 상위 디렉토리이다.

사용예 cd ../foo 현재 디렉토리를 상위 디렉토리에 있는 ‘foo’라는 디렉토리로 바꾼다.

ls [abcdefgiklmnpqrstuxABCFGLNQRSUX178]

기 능 DOS의 'dir'과 유사한 명령으로 파일명, 디렉토리명 등을 출력시키며 옵션에 따라 다양한 정보와 함께 출력된다.

문 법 ls <file1> <file2> …<fileN> <file1>부터 <fileN>까지의 파일명이나 디렉토리명을 출력시킨다.

옵 션 -a 디렉토리 내의 모든 파일 출력한다. -i 파일의 inode와 함께 출력한다. -l 파일 허용 여부, 소유자, 그룹, 크기, 날짜 등을 출력한다. -m 파일을 쉼표로 구분하여 가로로 출력한다. -r 정렬 옵션이 선택되었을 때, 그 역순으로 출력한다. -s KB 단위의 파일 크기를 출력한다. -t 최근에 생성된 파일순으로 출력한다. -x 파일 순서를 세로로 출력한다. -F 파일의 형태와 함께 출력한다. 출력되는 파일의 형태는 ‘*’, ‘@’, ‘|’, ‘=’ 등이며, 이것은 각각 실행 파일, 심볼릭 링크, FIFO 소켓을 나타낸다. -R 서브 디렉토리의 내용을 포함하여 출력한다. -S 파일 크기가 큰 순서로 출력한다. -U 정렬하여 출력한다. -1 라인당 한 파일씩 출력한다. –help 도움말을 출력한다. –version ‘ls’의 파일 버전과 함께 출력한다.

사용예 ls -lF /home/jspark /home/jspark 디렉토리 내용을 파일 허용 여부, 소유자, 그룹등의 정보와 파일의 형태를 포함하여 출력시킨다. 이 명령은 DOS에서의 ‘dir’ 명령에 의한 출력과 유사하다.

cp [abdfilprsuvxPRSV]

기 능 파일(들)을 다른 파일 이름으로 복사하거나 다른 디렉토리로 복사한다.

문 법 cp <file1> <file2> …<fileN> <destination> <file1>부터 <fileN>까지를 <destination>으로 복사한다. <destination>은 파일이나 디렉토리이다.

옵 션 -a -dpR의 조합과 같다. -b 덮어쓰거나 지울 때 백업 파일을 만든다. -d 심볼릭 링크 파일 그대로 복사한다.

(디폴트는 연결된 원래 파일을 복사함).

-f 같은 파일명을 갖는 파일이 있을 경우, 지운 후 복사한다. -i 같은 파일명을 갖는 파일이 있을 경우, 사용자 확인후 복사한다. -l 하드 링크를 만든다. -p 원시 파일의 소유자, 그룹, 허용 여부, 시간 등을 그대로 복사한다. -r 서브 디렉토리를 포함한 모든 파일 복사한다. -s 심볼릭 링크를 만든다. -u 복사할 파일이 구 버전일 경우만 복사한다. -v 복사하기 전에 각각의 파일명을 출력한다. -x 파일 시스템이 같을 경우만 복사한다. -P 원시 파일이 존재하는 디렉토리까지 포함하여 복사한다. -R 디렉토리를 포함하여 복사한다. -S 환경 변수 SIMPLE_BACKUP_SUFFIX에 의해 지정된 백업 꼬리말로 백업 파일 생성한다.

사용예 cp ../foo myfile ../foo 파일을 파일이나 디렉토리가 될 수 있는 myfile로 카피한다.

mv [bfiuv]

기 능 파일(들)을 다른 파일이나 디렉토리로 이동시킨다. 이 명령은 복사와 같으나 원본이 지워진다. 따라서 파일의 이름을 바꿀때도 사용될 수 있다.

문 법 mv <file1> <file2> …<fileN> <destination> <file1>부터 <fileN>까지의 파일들을 이동시키며 <destination>은 그 목표 파일이나 디렉토리이다.

옵 션 -b 지워지기 전에 백업본을 만든다. -f 옮겨질 디렉토리에 존재하는 파일이 있으면 덮어쓴다. -i 옮겨질 디렉토리에 존재하는 파일이 있으면 확인한다. -u 옮겨질 디렉토리에 구 버전의 파일이 있을 경우만 옮긴다. -v 옮기기 전에 파일명을 출력한다.

사용예 mv ../foo bar ../foo 파일을 파일이나 디렉토리인 bar로 이동시킨다.

rm [dfirvR]

기 능 파일들을 지우는 명령이다. 주의할 것은 유닉스 하에서 파일들이 지워지면, 복구가 불가능하다.

문 법 rm <file1> <file2> …<fileN> <file1>부터 <fineN>까지의 파일들을 지운다.

옵 션 -d ‘unlink' 디렉토리를 지운다.

수퍼 유저만 가능하며, 사용 후 fsck가 필요하다.

-f 존재하지 않은 파일일 경우에도 에러 메시지 출력을 하지 않는다. -i 지우기 전에 확인한다. -r 서브 디렉토리를 포함하여 지운다. -v 지워지는 파일명을 출력한다. -R -r과 같다.

사용예 rm -i /home/jspark/joe /home/jspark/frog /jspark/larry의 joe와 frog를 지운다.

mkdir

기 능 새로운 디렉토리를 만든다.

문 법 mkdir <dir1> <dir2> …<dirN> <dir1>부터 <dirN>까지의 디렉토리를 생성한다.

옵 션 -p 지정된 모든 서브 디렉토리까지 함께 생성한다. -m mode mode에 해당하는 사용 허가로 디렉토리를 생성한다.

사용예 mkdir /home/jspark/temp /home/jspark 아래의 temp 디렉토리를 생성한다.

rmdir [p]

기 능 비어 있는 디렉토리를 지운다. rmdir을 사용할 때는 현재 디렉토리가 지워질 디렉토리 안에 포함되어 있으면 안된다.

문 법 rmdir <dir1> <dir2> …<dirN> <dir1>부터 <dirN>까지의 디렉토리를 지운다.

옵 션 -p 지우고자 하는 디렉토리의 상위 디렉토리까지 포함하여 지운다.

사용예 rmdir /home/jspark/temp /home/jspark/temp가 비여 있으면, 지운다.

man [adfhkt]

기 능 주어진 명령이나 자원들의 매뉴얼을 출력한다.

문 법 man <command> <command>의 명령이나 자원의 도움말을 보여 준다.

옵 션 -a 발견되는 모든 manual page를 출력 -d 디버깅 정보 출력 -f whatis와 같음 -h 도움말 출력 -k apropos와 같음 -t groff(troff)를 사용하여 프린트를 위한 형식으로 출력

사용예 man ls ls 명령어의 도움말을 보여 준다.

more

기 능 주어진 파일의 내용을 한 화면씩 출력시킨다.

문 법 more <file1> <file2> … <fileN> <file1>부터 <fileN>까지의 파일을 출력시킨다.

유닉스상의 more는 DOS와는 달리 실행중에 몇가지 명령어가 제공되어 그 명령어를 이용하므로써 파일의 내용을 편리하게 볼 수 있다. 명령어는 아래와 같다.

h 도움말 SPACE, z 다음 페이지 RETURN 1 라인 스크롤 d, ^D 반 페이지 스크롤 q, Q 종료 f 다음 페이지 b, ^B 이전 페이지 /pattern 검색 = 현재 라인 출력 !<command> :!<command> <command> 명령어 실행

:f 현재 파일명과 라인 출력

사용예 more temp/readme temp/readme 파일을 페이지 단위로 출력시킨다.

cat

기 능 파일의 모든 내용을 한번에 출력시킨다.

문 법 cat <file1> <file2> …<fileN> <file1>부터 <fileN>의 파일을 출력시킨다.

사용예 cat temp/readme temp/readme 파일을 출력시킨다.

echo

기 능 주어진 인자를 단순히 출력시킨다.

문 법 echo <arg1> <arg2> …<argN> <arg1>부터 <argN>까지의 인자를 출력시킨다.

사용예 echo "Welcome to Linux world" "Welcome to Linux world"를 출력시킨다.

grep [CVbchilnsvwx]

기 능 주어진 패턴을 포함하는 파일의 라인을 출력시킨다.

문 법 grep <pattern> <file1> <file2> …<fileN> <pattern>은 규칙이 주어진 표현이며 <file1>부터 <fileN>은 조사하기 위한 파일들이다.

옵 션 -C 일치하는 문장의 상하 두 라인까지 포함하여 출력한다. -V 버전과 함께 출력한다. -b Byte 오프셋과 함께 출력한다. -c 일치하는 라인의 갯수를 출력한다. -h 파일명은 출력하지 않는다. -i 대소문자 구분하지 않는다. -l 일치하는 내용을 가지는 파일명만 출력한다. -n 일치하는 내용을 가지는 라인 번호를 출력한다. -s 에러 메시지만을 출력한다. -v 일치하지 않는 내용을 출력한다. -w 한 단어로 일치해야 출력한다. -x 전체 라인이 일치해야 출력한다.

사용예 grep linux /home/jspark/temp/readme /home/jspark/temp/readme의 파일 중에 "linux" 패턴을 포함한 모든 라인을 출력시킨다.

유용한 명령 실제로 많이 사용되는 몇가지 명령을 알아보자.

⋄ find -name <filename> 현재 디렉토리와 포함된 모든 서브 디렉토리에서 <filename>을 가지는 파일이나 디렉토리를 찾는다.

⋄ df <device> 하드의 전체 용량 및 남은 용량을 출력한다.

⋄ du 현재 디렉토리와 포함된 서브 디렉토리의 용량을 출력한다.

⋄ free 스웹 용량과 메모리에 대한 정보를 출력한다.

⋄ ls -lR 현재 디렉토리와 서브 디렉토리의 이름 및 포함되어 있는 파일을 출력시킨다.

⋄ su <사용자 ID> 현 상태에서 다른 사용자로 다시 login한다. <사용자 ID>를 입력하지 않으면, root로 login 할 수 있다.

⋄ zless <filename> 리눅스의 FAQ들(/usr/doc/)은 대부분 "gz" 파일로 압축이 되어 있다. 이 파일을 보기 위해서 필요한 명령어이다. 필요한 파일 선택에 와일드카드를 사용할 수 있다.

⋄ info 리눅스의 도움말 문서들은 주로 man 형식과 info 형식을 가지고 있다. man은 주로 사용되는 간단한 명령어에 대한 관련 도움말을 가지고 있으며, info는 주로 큰 패키지에 포함되는 하이퍼텍스트 형식의 자세한 도움말이다. info를 실행시키면, 메뉴 선택의 방식으로 문서 정보를 참조하게 된다. info 안에 열거된 메뉴를 선택하여 참조하며, 선택된 것은 여러 페이지에 걸친 설명이나 하위 메뉴(노드)가 존재하게 된다. 아래에 노드와 페이지를 선택하는 키를 설명한다.

Key 설명 SPACE 다음 페이지 BS/Delete 이전 페이지 n 다음 노드 p 이전 노드 l 바로 전에 위치했던 노드 b 노드의 첫 페이지 u 상위 노드 m 메뉴 선택 1 - 5 메뉴 선택(위부터 1) s 문자열 검색 Ctrl + p 프린트

info를 실행시키면, /usr/info의 디렉토리를 검사하여 해당하는 문서 자료들을 불러들인다. 이 디렉토리에 있는 "dir" 파일은 모든 info 파일에 관한 초기 도움말 화면을 가지고 있다. 따라서 새로운 info 파일을 보기 위해선 /usr/info 디렉토리에 info 파일을 복사한 후 "dir" 파일을 편집하여야 한다. 예를 들면, dosemu의 info 파일을 보기 위해서는 아래와 같은 문장을 "dir" 파일에 추가시킨다.

	DOSEMU: (dosemu). DOS emulator for Linux

유닉스는 수많은 명령어(실행 파일들)와 그에 따른 옵션이 많기 때문에 모든 것을 외우는 것은 거의 불가능할 것이다. 위의 명령어 중에 man 명령어는 원하는 명령어의 기능 및 옵션 설명, 간단한 예제, 관련된 다른 명령어들을 출력시키므로 리눅스를 사용하는데 많은 도움을 줄 것이다.

2.2 파일 시스템의 구조

리눅스를 설치하면, 상당히 많은 디렉토리가 자동으로 생성된다. 이러한 디렉토리는 대부분의 유닉스와 유사하다. DOS에서는 거의 사용자 임의대로 디렉토리의 이름을 정하여 사용하나, 유닉스에서는 아래와 같은 디렉토리의 이름들과 구조로 대부분 정해져 있다.

/bin /bin은 "binaries"의 약자이며, 실행 파일들이 모여 있다. 이 디렉토리에는 많은 필수적인 프로그램들이 포함되어 있다. "ls /bin"을 해보면 이 안의 파일들을 볼 수 있으며 cp, ls, mv 같은 몇 개의 명령어들은 알아볼 수 있을 것이다. 이것들은 이들 명령어들의 실제 프로그램들이다. 따라서, ‘cp’ 명령을 입력하면, /bin/cp 프로그램이 실행되는 것이다. “ls -F”를 사용하면, /bin의 대부분의 파일들에서 "*"가 파일명 끝에 추가되어 있는 것을 볼 수 있을 것이다. 이것은 이 파일이 실행 가능한 파일임을 표시한다.

/dev /dev 안의 파일들은 디바이스 드라이버들이다. 이것들은 디스크 드라이버, 모뎀, 메모리 등과 같은 시스템 디바이스나 자원들을 액세스하는데 사용된다. 예를 들면, 파일들로부터 정보를 읽어볼 수 있는 것과 같이, /dev/mouse를 액세스함으로써 마우스로부터 입력되는 정보를 읽어 올 수 있다. fd로 시작하는 파일 이름들은 플로피 장치들이다. fd0는 첫 번째의 플로피디스크 드라이브이며, fd1은 두 번째이다. 이 이외의 것들은 보통 플로피 디스크의 특정 형태를 표시한다. 예를 들면, fd0H1440은 첫 번째 드라이브(A: 드라이브)의 고밀도 3.5인치 디스켓을 말한다. 여기서는 가장 많이 사용되는 디바이스 파일을 열거하였다.

o /dev/console 시스템의 콘솔이며, 모니터가 시스템에 직접 연결되어 있음을 말한다.

o /dev/ttyS 와 /dev/cua 직렬 포트를 액세싱한다. 예를 들면, /dev/ttyS0는 도스 상의 "COM1"을 말하며, /dev/cua 는 "callout" 장치로써, 이것은 모뎀을 쓸 때 사용된다.

o hd로 시작하는 디바이스 이름 하드 디스크를 액세스한다. /dev/hda는 첫 번째 하드 디스크 전체를 말하며, hda1은 /dev/hda의 첫 번째 파티션을 말한다.

o sd로 시작하는 디바이스 이름 SCSI 하드 디스크 드라이브나 테이프 드라이브 같은 SCSI 장치들을 말한다. 만약 SCSI 하드 디스크를 가지고 있다면, /dev/hda를 액세스하는 대신에 /dev/sda를 액세스하여야 할 것이다.

o lp로 시작하는 디바이스 이름 병렬 포트를 말하며, /dev/lp1은 도스의 "LPT1"와 같다.

o /dev/null "black hole"로서 사용되는 것으로서 어떠한 데이터를 이 장치에 보내면 모두 없어지게 된다. 예를 들면, 화면에 아무 것도 출력되지 않기를 바랄경우, /dev/null로 출력을 보내면 된다.

o /dev/tty로 시작되는 디바이스 이름 시스템에 있는 "가상 콘솔 : Virtual Console(VC)"이다. /dev/tty1은 첫 번째 VC이며, /dev/tty2는 두 번째이다. 가상 콘솔은 한 화면이 여러개의 가상 터미날을 갖는 것이다. 각각의 터미날은 [alt-F1], [alt-F2] 등을 누름으로서 전환할 수 있으며, 같은 사용자나 다른 사용자로 login 할 수 있다.

o /dev/pty로 시작하는 디바이스 이름 이것들은 원격 login 세션에서 사용되는 "pseudo-terminal"들이다. 예를 들어, 사용중인 컴퓨터가 네트워크에 연결되어 있고, telnet으로 login하려고 할 때, /dev/pty 디바이스를 사용한다.

/etc /etc는 시스템 설정 파일, 프로그램, 유틸리티 등 다양한 프로그램들을 포함하고 있으며 대부분의 파일들은 관리자에 의해 사용되는 것이다. 이 디렉토리 안에 있는 파일들의 설명은 부록을 참조하길 바란다.

/home /home은 사용자의 홈 디렉토리로서 login하였을 경우, 처음으로 위치하게 되는 디렉토리이다. 예를 들어, /home/larry는 사용자 "larry"의 홈 디렉토리이다. 시스템이 새로 설치되면, 이 디렉토리 안에 아무 것도 포함되어 있지 않다.

/lib /lib는 공유 라이브러리 이미지를 포함하고 있다. 이 파일들은 일반적으로 사용되는 많은 프로그램에서 호출되는 코드들을 포함하고 있다. 어떤 프로그램이 공유 될 수 있는 루틴을 단독으로 포함하지 않고, 그 루틴을 일반 장소인 /lib 안에 저장한다. 이렇게 함으로서 실행 파일의 크기를 작게 만들어 사용자의 공간을 넓힐 수 있다.

/proc /proc는 "가상 파일 시스템"이다. 이 디렉토리의 내용들은 시스템에서 운영되고 있는 다양한 프로세서들에 관한 내용과 프로그램에 대한 정보를 포함하고 있다. 이 디렉토리에서 볼 수 있는 것은 실제 드라이브에 저장되어 있는 내용이 아니며, 메모리상에 저장되어 있는 것이다.

/tmp 많은 프로그램들은 여러 정보가 임시 파일 안에 저장되는 것을 필요로 한다. 이런 파일들이 위치할 장소가 /tmp 이다.

/usr /usr는 실제 작업을 위한 응용 패키지들이 설치되어 있는 디렉토리이다. 따라서 많은 서브디렉토리를 포함하고 있다.

/usr/X386 만약 X 윈도우 시스템을 설치하였다면 이 디렉토리에 설치될 것이다. X 윈도우 시스템은 방대하며, 많은 그래픽 유틸리티와 프로그램들이 그래픽 윈도우로 출력되는 강력한 그래픽 사용자 환경이다. 만약, 마이크로소프트의 윈도우즈나 맥킨토시 환경에 익숙하다면, X 윈도우즈가 아주 친숙해 보일 것이다. /usr/X386 디렉토리는 모든 X 윈도우즈 실행 파일, 사양 파일, 자원 파일들을 포함하고 있다.

/usr/adm /usr/adm은 시스템 관리자들을 위한 것과 시스템의 문제나 에러를 기록해 놓은 다양한 파일들이 포함되어 있다.

/usr/bin /usr/bin은 모든 유닉스 시스템이 소유하고 있는 소프트웨어를 담기 위한 진정한 warehouse이다. 이것은 /bin 같은 곳에는 없는 유용한 실행 파일들을 가지고 있다.

/usr/etc /etc는 시스템 파일과 사양 파일이 있는 것처럼, /usr/etc에는 더많은 유틸리티와 파일들이 있다. 일반적으로 /usr/etc에 있는 파일들은 /etc에 있는 것만큼의 반드시 필요로 한 것들은 아니다.

/usr/include /usr/include는 C 컴파일러를 위한 include 파일을 포함하고 있다. 이 파일은 데이터 구조 이름과 서브루틴, 상수 같은 C로 작성된 프로그램에서 사용되는 내용을 담고 있다. /usr/include/sys에 있는 파일들은 유닉스 시스템 레벨의 프로그래밍을 할 때 사용된다. 만약, C 프로그래밍 언어에 익숙하다면, 여기에 printf() 함수가 선언되어 있는 stdio.h 같은 헤더 파일을 찾을 수 있을 것이다.

/usr/g++-include /usr/g++-include는 C++ 컴파일러의 include 파일들을 포함하고 있다.

/usr/lib /usr/bin은 /lib에서 찾을 수 있는 "stub"와 "static"와 같은 라이브러리를 포함하고 있다. 프로그램을 컴파일할 때, 프로그램은 /usr/lib에 있는 파일들과 "link"되며 이 라이브러리 안에 실행 코드가 필요로 할 때, /lib를 찾는다. 또한, 많은 프로그램들이 /usr/lib 안에 사양 파일을 저장한다.

/usr/local /usr/local은 /usr에 포함된 것과 매우 유사하고, 시스템에 반드시 필요로 하는 것은 아니지만, 매우 유용한 것들을 포함하고 있다. 일반적으로, /usr/local에 있는 프로그램들은 시스템의 특성을 결정짓는 소프트웨어들이 있으며, 따라서, 유닉스 시스템마다 매우 다르다. TeX(문서 형식화 시스템)나 Emacs(에디터)를 설치하였다면 이 디렉토리에서 찾을 수 있을 것이다.

/usr/man 이 디렉토리는 실제적인 man page를 포함하고 있다. 또한, 모든 man page 를 위한 두 개의 서브 디렉토리가 있다. 예를 들면, /usr/man/man1 은 section 1 안에 man page를 위한 형식화되지 않은 소스가 포함되어 있으며, /usr/man/cat1은 section 1을 위한 형식화된 man page가 포함되어 있다.

/usr/spool /usr/spool 은 어떤 프로그램을 위한 "spool"된 파일들을 포함하고 있다. 예를 들면, 만약 사용중인 컴퓨터가 네트워크에 연결되어 있다면, 받은 메일은 /usr/spool/mail 안에 읽거나 지우기 전까지 저장될 것이다. 뉴스 글을 보내거나 받을 때는 그 내용이 /usr/spool/news에 있게 된다.

/usr/src /usr/src는 시스템에 있는 다양한 프로그램의 컴파일 되지 않은 소스 코드들을 포함하고 있다. 여기서 가장 중요한 것은 /usr/src/linux이며, 이것은 리눅스 커널의 소스 코드를 포함하고 있다.

/usr/tmp /tmp와 같은 임시 파일을 위한 또 다른 디렉토리이다.

2.3 Shell의 형태

독자도 알고 있듯이 유닉스의 강력한 점은 다중 작업과 다중 사용자를 지원한다는 것이다. 특히 다중 작업은 매우 유용하며, 또한 안전하게 작동한다. DOS의 변칙적인 다중 작업이나 MS-Windows 에서의 제한적인 다중 작업이 아닌 쓰레드(thread)차원의 다중작업은 매우 강력하며 안정적이다. 다중 작업을 사용하려면, 기본적으로 shell 명령어를 사용해야 하며, 이 shell 이라는 것은 DOS의 command.com 과 마찬가지로, 사용자가 프롬프트상에서 입력하는 명령을 해석, 처리하는 사용자 인터페이스이다. 유닉스 shell은 프로그램을 백그라운드로 실행시키며, 다중 작업들을 서로 전환하고, "pipeline"을 사용하여 단일 명령으로 복잡한 결과를 수행해 낼 수 있다. 또한, 이것은 언어로써의 기능을 가지고 있다. shell 스크립트(script)라고 불리우는 것은 배치 파일과도 비교될 수 있지만, 실제로 하나의 언어로써 사용되는 매우 강력한 도구이며, 유닉스를 간편하고, 폭넓게 사용하도록 해줄 것이다.

유닉스 세계에서는 여러 개의 shell들이 있다. 가장 중요한 두 가지는 "Bourne shell"과 "C Shell"이다. Bourne shell은 시스템III와 같은 초기 유닉스의 오리지널 shell 과 유사한 명령 문법을 사용한다. 대부분의 유닉스 시스템의 Bourne shell의 이름은 /bin/sh 이다. C shell은 프로그래밍 언어인 C와 비슷한 복잡한 문법을 가지고 있으며 대부분의 유닉스 시스템에서의 이름은 /bin/csh 이다. 리눅스에서도 이런 shell 중 몇 가지가 쓰이는데, 일반적으로 사용되는 것은 Bourne Again Shell이나 “Bash”(/bin/bash)이다. Bash는 Bourne shell에 C shell의 특징과 향상된 많은 명령어들을 포함한 것이다. Bash는 Bourne shell 문법의 명령어 셋을 제공하기 때문에 표준 Bourne shell로 작성된 shell 스크립트는 Bash에서도 사용할 수 있다. 또한, C shell 문법을 사용할 수 있도록 리눅스에서는 ‘tcsh’가 제공되는데, 이것은 초기 C shell의 확장된 버전이며, 특히, 콘솔에서 한글을 사용하기 위해서는 이 csh shell을 사용하여야 한다. 먼저, 사용할 shell을 결정하여야 한다. 어떤 사람은 향상된 명령어가 포함된 Bash같은 문법을 사용한 Bourne shell이, 어떤 사람은 구조화된 C shell의 문법이 더 좋다고 한다. ‘cp’나 ‘ls’같은 일반적인 명령어의 문법은 같고, 단지 shell 스크립트를 작성하거나 shell의 향상된 기능을 사용하려고 할 때 shell의 종류에 따라 달라진다.

2.4 파이프의 사용

파이프라는 것은 여러 명령을 혼합하여 사용할 때, 한 명령의 결과가 다른 명령으로 전송되는 통로라고 이해할 수 있다. 따라서, 파이프를 이용하면, 개개의 명령을 나누어 사용하는 것을 한번에 처리할 수 있는 것이다. 실제로 어떤 파일의 입출력이든 간에 파이프 명령은 표준 입출력으로 간주한다. 아래의 예는 파이프를 사용했을 때와 그렇지 않을 때의 번거러움을 간단하게 소개한다. ‘ls’ 같은 어떤 명령의 결과를 소트하기 원한다면, 아래와 같이 입력할 수 있으며, 예제는 -r 옵션을 사용하여 역순으로 정렬하고 있다.

/home/larry/papers# ls english-list history-final masters-thesis notes /home/larry/papers# ls > file-list /home/larry/papers# sort -r file-list notes masters-thesis history-final english-list /home/larry/papers#

여기에서, 'ls' 명령의 출력을 파일로 저장했고, 그리고 그 파일에 'sort -r' 을 실행했다. 또한, 'ls'의 데이터를 저장하기 위해 임시적으로 file-list라는 파일을 사용했다.

위의 결과는 여러 단계를 거쳐 원하는 결과를 얻었다. 위와 유사한 명령을 간단하게 할 수 있는 방법은 파이프라인을 사용하는 것이다. 파이프라인은 shell의 또 다른 특징이며, 이것은 “pipe” 안에서 명령어를 서로 연결할 수 있도록 허용한 것이다. 첫 번째 명령의 표준 출력은 두 번째 명령어의 표준 입력으로 직접 보내어진 것이며, 여기에서 우리는 ‘ls’의 표준 출력을 ‘sort’의 표준 입력으로 보낸다. “|”기호는 파이프를 생성하는데 사용된다.

ls | sort -r notes masters-thesis history-final english-list /home/larry/papers#

이 명령은 보다 짧고, 입력하기도 간단하다.

또 다른 유용한 예를 사용해 보자.

/home/larry/papers# ls /usr/bin

이것은 파일들이 길게 출력될 것이며, 그것들을 읽기에는 너무 빨리 화면에서 지나갈 것이다. 그러면, /usr/bin의 파일들을 ‘more’를 사용하여 출력시켜 보자.

/home/larry/papers# ls /usr/bin | more

지금, 사용자의 기호대로 파일들의 리스트를 자유롭게 상하 페이지 이동하여 볼 수 있다.

두 명령어 이상을 함께 사용하여 pipe를 할 수 있다. 아래 명령 중 ‘head’는 입력 스트림으로부터 첫 번째 라인이 출력되는 필터이다. 만일, 현재 디렉토리에서 알파벳 순서로 마지막 파일 이름이 출력되기를 원한다면, 이렇게 쓰면 된다.

/home/larry/papers# ls | sort -r | head -1 notes /home/larry/papers#

여기에 ‘head -1’ 은 받은 입력의 첫 라인을 단순히 출력한다.(이 경우, ‘ls’ 로부터 역순으로 정렬된 것이다.)

리디렉션 리디렉션이란 출력의 방향을 바꾸는 것이다. 어떤 임의의 명령에 대한 결과는 일반적으로 콘솔일 것이다. 이런 명령의 결과를 이용하기 위한 또하나의 방법이 리디렉션이며, 이것을 이용함으로써 명령의 결과를 파일 또는 프린트물로써 얻을 수가 있다. 리디렉션의 기호는 “>”이다. 보통, “>” 을 이용하여 명령의 결과를 파일로 리디렉트시켰을 때 그 파일이 존재해 있었다면 파괴된다.; 달리 말하면, 아래의 명령어는

/home/larry/papers# ls > file-list

file-list 파일의 내용을 덮어쓴다. 만일, “»”기호를 사용하여 리디렉트시키면, 출력은 그 파일에 덮어쓰는 대신에 추가될 것이다.

/home/larry/papers# ls » file-list

이것은 ‘ls’ 명령어를 사용하여 그 출력을 file-list에 추가한다. 리디렉션과 파이프를 사용하는 것을 shell에 의해서 “>”, “»”, “_”가 제공되어진다. 이것은 명령어 그 자체로는 사용되어 질 수 없다.

2.5 파일 사용 허가

파일 사용 허가의 개념 유닉스 시스템은 다중 사용자 시스템이기 때문에 다른 사용자들로부터 각자의 파일들을 보호하기 위하여, 파일 사용 허가라 불리우는 메카니즘을 제공한다. 이 메카니즘은 파일과 디렉토리를 특별한 사용자들에게 소유되게 한다. 예를 들면, 사용자 junsok은 자신의 홈 디렉토리에 파일을 생성하였다면, junsok 자신이 그 파일이나 디렉토리의 소유자가 되어, 그것들을 액세스할 수 있다.

유닉스는 또한 사용자나 사용자 그룹에게 파일의 공유를 허용한다. 만일 파일의 소유자가 원한다면, 그는 다른 사용자의 그의 파일로의 접근을 불허할 수 있다. 어쨌든, 대부분의 시스템에서는 디폴트로 다른 사용자가 당신의 파일로의 접근이 허용하며, 그것을 어떠한 방법으로도 삭제나 수정이 불가능하게 되어 있다.

결국, 모든 파일은 특별한 사용자나 그룹에게 소유되어 있다. 사용자가 생성되면 모든 사용자는 최소한 한 그룹에 존재하게 되며, 시스템 관리자는 아마도 사용자가 하나 이상의 그룹을 액세스하는 것을 허용할 것이다.

그룹은 보통 컴퓨터를 액세스하는 사용자의 형태에 의해 정의된다. 예를 들면, 통합 유닉스 시스템 하에서 사용자는 아마도 학생, 스텝, 손님 중 하나의 그룹에 속하게 될 것이다. 또한, 작은 시스템에서는 정의된 그룹(bin, admin같은)을 시스템 자체가 자원의 접근을 제어하기 위해 사용하며, 아주 드물게는 이런 시스템 그룹에 실 사용자가 속하기도 한다.

그럼, 실제 파일 사용 허가의 종류를 알아보자. 사용 허가의 3가지 부분으로 나눠지며, 이것은 읽기(read), 쓰기(write), 실행(execute) 가능 허가이다. 이 세 가지 사용 허가는 파일의 소유자, 파일이 속한 그룹, 그룹을 제외한 모든 사용자의 부류에 허용된다.

읽기 사용 허가는 사용자가 그 파일의 내용이나 디렉토리의 경우 디렉토리에 포함된 파일 리스트들을 읽어 볼 수 있도록 허용한다. 쓰기 사용 허가는 사용자가 파일을 작성하거나 수정하는 것을 허용한다. 디렉토리의 쓰기 사용 허가는 사용자가 새로운 파일들을 생성하거나 그 디렉토리 안의 파일들을 지울 수 있음을 허용하며, 마지막으로, 실행 사용 허가는 프로그램이나 shell 스크립트의 파일들을 실행할 수 있게 하고, 디렉토리의 실행 사용 허가는 사용자가 cd 로서 디렉토리에 들어갈 수 있도록 허용한다.

파일 사용 허가의 해석 파일의 사용 허가를 예제들을 설명한다. ‘ls’ 명령에 -l 옵션을 사용하면 파일들의 목록이 파일 사용 허가를 포함하여 여러 다른 정보와 함께 출력될 것이다.

/home/larry/foo# /home/larry/foo# ls -l stuff

-rw-r–r– 1 larry users 505 Mar 13 19:05 stuff

/home/larry/foo#

출력 목록의 첫 번째 필드는 파일의 사용 허가를 표시한다. 세 번째 필드는 파일의 소유자, 4번째 필드는 사용자가 포함되어 있는 그룹이 출력된다. 마지막 필드는 파일의 이름이 출력된다.

따라서, 이 파일은 larry의 소유이며, 그룹 users에 속해 있다. 파일의 사용 허가를 보며, 문자열 “-rw-r–r–” 은 3칸씩 나누어 순서대로 파일의 소유자, 파일의 그룹, 모든 이의 사용 허가를 나타낸다.

사용 허가 문자열 중 첫 번째 문자인 “-” 것은 파일의 형태를 표시한다. “-”는 이 파일이 디렉토리(“d”로 표기)나 디바이스 파일(“c”로 표기)이 아닌 일반 파일임을 표시한다. 다음의 3개의 문자는 파일의 소유자의 larry에게 사용 허가를 나타낸다. “r”은 “read”, “w”는 “write” 를 각각 나타낸다. 따라서 larry는 파일 stuff의 읽기, 쓰기가 허용되어 있음을 알 수 있다.

read와 write는 언급을 하였고, “x”라고 허용 표현되는 “execute”가 있다. 여기서는 “x”의 자리에 “-”가 있다. 이것은 Larry가 이 파일의 실행 허용을 갖지 않는다는 것이다. 따라서, 이 파일이 실행 파일이라 할지라도 실행 시킬 수 없으나, 파일 소유자인 Larry가 원한다면 파일의 실행 사용 허가를 허용함으로써 실행시킬 수 있다.

다음의 3개의 문자 r– 는 이 파일의 그룹의 사용 허가를 표시한다. 그룹은 이 파일을 소유하는 사용자들이다. 오직 “r”이라고 써있는 것은 이 그룹에 속한 어떤 사용자라도 이 파일을 읽을 수만 있게 한다.

마지막 3개의 문자인 r–는 시스템의 모든 다른 사용자의 사용 허가를 표시한 것이다. 다시 말하면, 오직 “r”이라고 표시되어 있기 때문에 다른 사용자들은 이 파일을 읽을 수는 있으나, 쓰거나(write) 실행할 수는 없다.

여기에 그룹 사용 허가의 다른 몇 예제를 보인다.

-rwxr-xr-x 이 파일의 소유자는 파일을 읽기, 쓰기, 실행을 할 수 있다. 이 파일의 그룹에 속한 사용자와 모든 다른 사용자는 읽거나 실행할 수 있다.

-rw— 이 파일의 소유자는 읽기, 쓰기를 할 수 있으나 실행시킬 수는 없고, 다른 모든 사용자는 이 파일을 액세스 할 수 없다.

-rwxrwxrwx 모든 사용자가 읽기, 쓰기, 실행을 할 수 있다.

사용 허가에서 중요한 것은 파일을 허용하는 것과 그 파일이 위치해 있는 디렉토리의 허용여부 모두를 고려해야 한다는 것이다. 예를 들어, 파일을 심지어 -rwxrwxrwx라고 설정했더라도 그 파일이 위치해 있는 디렉토리가 읽기, 쓰기 접근 허용이 되어 있기전까지는 다른 사용자가 액세스 할 수 없다. 예를 들면, 만일 Larry가 다른 사용자로부터 그의 모든 파일의 접근을 제한하길 원한다면, 그는 그의 홈 디렉토리 /home/larry를 drwx— 로 간단히 설정할 수 있다. 이런 방법은 다른 어떤 사용자도 그의 디렉토리와 그 디렉토리에 포함된 모든 파일들을 액세스 할 수 없어, 그의 어떤 파일도 각각의 파일 사용 허가에 대해서 걱정할 필요가 없다.

다른 말로 한다면, 모든 파일을 액세스하게 한다면, 파일의 경로 안의 모든 디렉토리를 읽기, 실행 허용을 하면 된다.

일반적으로 유닉스 시스템의 사용자는 그들의 파일을 많이 개방한다. 보통 파일들의 사용 허가는 -rw-r–r– 인데, 이것은 다른 사용자들이 그 파일을 읽을 수는 있으나 어떻게든 바꿀 수는 없게 한다. 또 하나의 설정은 디렉토리를 -rwxr-xr-x 로 설정하는 것인데, 이것은 다른 사용자들이 당신의 모든 디렉토리를 볼 수 있게는 해주나 그 파일을 지우거나 생성하는 것을 허용하지는 않는다.

어쨌든, 많은 사용자들은 그들의 파일을 다른 사용자들로부터 지켜지길 바란다. 파일의 설정을 -rw— 은 다른 사용자들이 접근을 하지 못하게 해주며, 비슷하게, 디렉토리를 -rwx— 으로의 설정하는 것은 다른 사용자들로부터 지키게 해준다.

파일 사용 허가의 변경 명령어 ‘chmod’는 파일의 사용 허가를 설정하는데 사용된다. 오직 파일의 소유자만이 파일의 사용 허가를 변경할 수 있다. ‘chmod’ 의 문법은 아래와 같다.

	chmod {a,u,g,o}{+,-}{r,w,x} <filenames>

간단히, 당신은 all, user, group, other를 하나나 그 이상 허용할 수 있다. 그러려면 (-) 대신에 (+) 를 첨가하여 변경 시키면 된다. 결국, 하나 이상의 읽기, 쓰기, 실행을 정할 수 있다. 문법적인 여러 가지 예를 아래에 보인다.

chmod a+r stuff 모든 사용자가 이 파일을 읽을 수 있다.

chmod +r stuff 위와 같으며 a, u, g, o 가 정해져 있지 않으면, a(all)가 된다.

chmod og-x stuff 소유자 이외의 다른 사용자에게 실행 허가를 제거한다.

chmod u+rwx stuff 소유자에게 읽기, 쓰기, 실행을 허용한다.

chmod o-rwx stuff 사용자나 그 파일의 그룹을 제외한 사용자는 읽기, 쓰기, 사용 허가 여부를 제거한다.

2.6 Job 제어

Job과 프로세스 Job 제어는 많은 shell(Bash, Tcsh 포함)에서 제공되어지며, 다수의 명령어나 job을 동시에 제어할 수 있게 해준다. 이것을 더 설명하기 전에 프로세스에 대한 설명이 필요하다.

프로그램을 실행할 때는 언제나 운영되는 프로그램의 단순한 이름으로 시작한다. ‘ps’ 라는 명령어는 현재의 운영되는 프로세스의 목록을 출력해 준다. 예제를 아래와 같이 보인다.

/home/larry# ps

PID TT STAT TIME COMMAND 24 3 S 0:03 (bash) 161 3 R 0:00 ps

/home/larry#

첫 번째 칼럼의 PID 목록은 프로세스 ID이며, 이것은 모든 운영되는 프로세스에게 주어지는 단위 숫자이다. 마지막 칼럼의 COMMAND는 운영되는 명령어의 이름이다. 여기에, 우리는 Larry가 운영하고 있는 프로세서만을 볼 수 있으며, 현재 Larry의 shell인 ‘bash’와 ‘ps’ 명령만이 있다. - 실제로 시스템에 운영되는 많은 프로세스들이 있으며, 이것은 ‘ps -aux’로 볼 수 있다. - 여기서 볼 수 있는 것처럼, ‘bash’는 ‘ps’ 명령어와 동시에 운영됨을 알 수 있다. Larry가 명령어를 입력하면 ‘bash’가 ‘ps’를 실행한 것이다. ‘ps’ 이후는 운영이 끝나고(프로세스 목록의 출력이 끝나고) 제어권이 ‘bash’에게 되돌아오며, 프롬프트가 출력된후 다시 명령어 대기상태가 된다.

운영되는 프로세스는 shell에서 “job”이라고 한다. 프로세스와 job은 상호 변경될 수 있다. 어쨌든, 프로세스는 몇 개의 독립적인 “job”들 사이를 전환할 수 있으며, shell의 job 제어가 또한, "job"이라고 일컬어진다.

대부분의 경우 사용자가 shell에게 마지막 입력한 명령어가 단일 job으로 운영된다. job 제어를 사용하면, 여러 개의 job을 한번에 할 수 있으며, 필요할 때마다 전환할 수 있다. 예를 들어, 문서 파일을 편집하고 있으며, 어떤 다른 일들을 하기 위해 편집을 보류해야 할 경우가 있다고 하자. job 제어를 사용하면, 에디터를 임시적으로 잠시 보류하고, shell 프롬프트로 돌아와서 다른 작업을 할 수 있다. 작업이 끝나면, 에디터를 종료하지만 않았다면 어디에서든지 다시 에디터로 되돌아올 수 있다. 이것은 단순히 한 예에 불과하지만, 실제로 매우 유용하다.

포그라운드와 백그라운드 job은 포그라운드에서와 백그라운드에서 할 수 있다. 포그라운드에서의 job은 한번에 한 job만 할 수 있으며, 키보드로부터 입력을 받고, 화면으로 출력을 보내는 상호작용이 이루어지진다. (물론 입력과 출력을 리디렉트 시킬 수 있다.) 다른 말로 하면, 백그라운드에서의 job은 터미널로부터 입력을 받지 못한다. 따라서, 상호작용이 별로 필요하지 않는 작업에 일반적으로 사용된다.

프로그램 컴파일이나 압축같은 작업은 시간이 소요되며 또한, 처리되는 동안 어떠한 다른 입력을 필요로 하지 않는다. 이런 종류의 작업들을 백그라운드로 실행시키면, 다른 프로그램을 운영할 수 있는 여유를 갖게 된다. 또한, 하나이상의 작업을 백그라운드로 운영할 수 있으며, 포그라운드에서의 처리 속도와의 차이는 거의 나지 않는다.

job은 또한 보류될 수 있다. 보류된 job은 현재 운용되는 job은 아니고, 잠시 멈추는 것이다. job을 보류한 후에 포그라운드에서든지 백그라운드에서든지 그 job을 필요에 따라 계속하게 할 수 있다. 보류된 job은 어떠한 방법으로도 그 상태가 변하지 않으며 강제로 종료시키지 않을 때까지 계속 유지된다.

보류된 job은 인터럽팅된 job과는 같지 않다. 운영되는 프로세스를 인터럽트 시킬 때( 인터럽트 키는 stty 명령으로 설정할 수 있으며, 디폴트는 [ctrl-C]이다.) 는 프로세스를 제거하는(kill) 것이다. job이 제거되면, 그 job을 다시 할 수 없고, 명령을 다시 실행하여야 한다. 어떤 프로그램은 인터럽트를 [ctrl-C]로 즉시 job을 중지하지 못하게 한다. 이것은 프로그램이 실행하기 이전의 깨끗한 상태로 유지하기 위하여 단순히 인터럽트를 중지되는 것을 허용하지 않는 것이다.

백그라운드 시키기와 Job 제거 간단한 예제로 시작해 보자. 명령어 ‘yes’는 끊임없이 y를 출력하는 명령이다. 이것은 어떤 명령어가 계속적인 질문으로 답을 요구하는 경우, 그것이 보통 yes라는 답이 된다면, 파이프를 사용하여 y를 계속 보내 답을 하는 것으로 유용하게 사용되어 질 수 있다.

/home/larry# yes
 y
 y
 y

y가 계속 끊임없이 출력된다. 인터럽트 키, 보통 [ctrl-C] 같은 것으로서 프로세스를 제거할 수 있다. 이런 y의 출력들이 귀찮다면, yes의 표준 출력을 /dev/null 로 리디렉트 시켜 보자. /dev/null 은 데이터의 “black hole” 로 작용한다. 어떠한 데이터도 이곳으로 보내면 나타나지 않는다. 이것은 질문을 계속 물어 보는 성가신 프로그램을 조용하게 만드는 아주 효과적인 방법이다.

/home/larry# yes > /dev/null

아무것도 출력되지 않으며, shell 프롬프트로 되돌아오지도 않는다. 이것은 yes가 여전히 운영되고 있으며, 계속 /dev/null 로 ‘y’를 출력하고 있는 것이다. 따라서, job을 제거하기 위해서 인터럽트 키를 눌러야 한다.

가정을 해보자. 우리는 yes의 명령이 계속되기를 바라나, 다른 작업을 하기 위해서 shell 프롬프트로 되돌아오기를 원한다. 그러면, 우리는 백그라운드로 yes를 실행해 놓을 수 있다. 이것은 그것이 계속 운영되고 있는 있는 것이지만 상호 작용할 필요는 없는 것이다.

백그라운드로 프로세스를 놓는 방법은 명령어의 끝에 "&"를 추가하는 것이다.

/home/larry# yes > /dev/null & [1] 164 /home/larry#

위에서 볼 수 있는 것처럼, shell 프롬프트가 되돌아 왔다. 그런데, “[1] 164”는 무엇일까? 그리고, ‘yes’의 명령이 정말로 실행되고 있는 것일까?

“[1]”은 yes 프로세스의 job 번호를 표시하고 있다. shell은 모든 운영되는 job을 job 번호로 지정한다. yes는 현재 운영되고 있는 오직 하나의 job이기 때문에 job 번호 1인 것이다. "164"는 프로세스 ID 또는 PID 라는 것이며, 이것은 시스템이 job에게 주는 프로세스 번호이다. 이러한 번호들은 모두 job을 가르키는데 사용된다.

백그라운드로 yes 프로세스가 계속적으로 /dev/null에 ‘y’들을 보낼 수 있다. 이 프로세스의 상태를 검사하기 위해서는 셀 명령인 ‘jobs’ 을 사용하면 된다.

/home/larry# jobs [1]+ Running yes >/dev/null & /home/larry#

운영중인 것을 확인할 수 있다. 또한 ‘ps’명령어를 사용하여 위에서 검사한 것과 같은 job의 상태를 알 수 있다.

job를 정지시키기 위해서는 ‘kill’ 명령어를 사용해야 한다. 이 명령어는 job 번호나 프로세스 ID 번호를 인자로서 사용한다. 이것은 job 번호는 1이며, 명령어를 사용하기 위해서는 아래와 같이 입력한다.

/home/larry# kill %1

위와 같이 하면 job은 제거될 것이다. job이나 job 번호를 표시하려 할 때는 퍼센트 문자의 위치에 번호를 넣으면 된다.

지금 우리는 job을 제거하였고, ‘jobs’을 사용하고 그것을 다시 검사하고 있다.

/home/larry# jobs
[1]+ Terminated yes >/dev/null
/home/larry#

job은 확실히 제거되었고, ‘jobs’ 명령어를 다시 사용한다면, 아무것도 출력되지 않을 것이다.

또한 프로세스 ID(PID) 번호를 사용하여 job을 제거할 수 있다. PID는 job이 시작할 때 job ID와 함께 출력되는 것이다. 우리의 예제에서, 프로세서 ID는 164이다. 따라서,

/home/larry# kill 164

은, 아래와 동일한 기능을 수행한다,

/home/larry# kill %1

프로세스 ID에 의한 job을 언급할 때는 "%"를 사용할 필요가 없다.

Job의 보류와 계속하기 백그라운드 안으로 job을 넣는 또 다른 방법이 있다. job을 보통으로 실행(포그라운드로) 시킬 수 있으며, job을 멈출 수도 있고, 백그라운드로 재실행 시킬 수도 있다. 이것을 아래에 설명한다.

먼저, 포그라운드로 yes를 실행한다.

/home/larry# yes > /dev/null

yes가 포그라운드로 실행이 되었기 때문에, shell 프롬프트로 바로 돌아올 수 없다.

지금, ‘[ctrl-C]’로서 job을 인터럽팅하는 대신에, job을 보류해 보자. job을 제거하지 않고, 보류시킨다는 것은 재실행하기 전까지 잠시 멈춘다는 것을 의미한다. 이렇게 하기 위해서는 보류 키를 눌러야 하며, 일반적으로 ‘[ctrl-Z]’이다.

/home/larry# yes > /dev/null
[ctrl-Z]
[1]+ Stopped yes >/dev/null
/home/larry#

보류된 job은 단순히 실행이 멈춘 것이다. CPU 나 메모리는 job을 위해 전혀 사용되지 않는다. 여기서 아무것도 변하지 않은 보류되기 이전 job 상태로 재실행 할 수 있다.

이 job을 포그라운드로 재실행하기 위해서는 명령어 ‘fg’(forground)를 사용한다.

/home/larry# fg
yes >/dev/null

shell은 포그라운드로 바꾸었던 명령어의 이름을 다시 출력한다. 다시 job을 멈추게 하려면 ‘[ctrl-Z]’를 사용한다. 이번엔 명령어 ‘bg’를 사용하여 job을 백그라운드로 놓아 보자. 이것은 처음에 명령어를 입력할때 끝에 "&"를 사용하여 실행했었던 것과 같다.

/home/larry# bg
[1]+ yes >/dev/null &
/home/larry#

위와 같이 하면 프롬프트가 되돌아온다. job은 yes가 실행이 되었음을 보고한다. 먼저 번에 사용하였던 명령어 ‘kill’을 사용하여 job을 제거할 수 있다.

어떻게 job을 멈출 수 있을까? [ctrl-Z]을 사용하면 job이 백그라운드로 실행되기 때문에 작업을 할 수 없다. 이 답은 ‘fg’를 사용하여 포그라운드로 job을 놓아야만 하며, 그래야 멈출 수 있다. 멈춰진 job이나 백그라운드의 job을 ‘fg’를 사용하여 전환할 수 있다.

백그라운드에서의 job과 멈춰진 job은 커다란 차이가 있다. 보류된 job은 CPU 시간이나 메모리를 전혀 사용하지 않으며, 따라서 아무 일도 하지 않는다. 백그라운드로 운영되고 있는 job은 메모리를 사용하며, 또한 다른 작업을 하고 있을 동안에도 완벽하게 이 작업을 수행한다. 어쨌든, 백그라운드에서의 job은 터미널에서 문자를 출력하고자 하며, 어떤 다른 작업을 하고 있다면, 귀찮게 할 것이다. 예를 들어, 아래의 명령같이 입력한다면,

/home/larry# yes &

/dev/null 로 표준 출력을 리디렉팅하지 않는다면, y의 문자열들은 화면에 어떠한 인터럽트도 받지 않고 출력될 것이다. ‘[ctrl-C]’는 백그라운드의 job 에게 인터럽트를 걸 수 없다. 끊임없는 ‘y’들을 멈추기 위해서는 ‘kill’ 명령어를 사용해야 한다. 아마도, 입력하는 것을 보는 것은 불가능할 것이다.

또 중요한 것은, 명령어 ‘fg’나 ‘bg’를 인자없이 입력하면 최근에 멈추어진 job을 포그라운드나 백그라운드 시킨다. 만일 지금 복수개의 job을 동시에 운영하고 있다면, 특정 job은 주어진 job ID를 ‘fg’나 ‘bg’의 인자로서 사용하여 포그라운드나 백그라운드로 전환 시킬 수 있다.

/home/larry# fg %2

job 번호 2를 포그라운드로 전환 시킨다.

/home/larry# bg %3

job 번호 3을 백그라운드로 전환 시킨다.

프로세스 ID를 ‘fg’나 ‘bg’ 명령에서는 사용할 수 없다.

‘fg’, ‘bg’ 명령 없이 job 번호만을 사용할 수 있다. 따라서 아래의 두 명령은 동일하다.

/home/larry# %2
/home/larry# fg %2

job제어를 사용하는 것은 shell의 기능을 이용한다는 것을 기억해야 한다. 명령어 ‘fg’, ‘bg’, ‘jobs’는 shell의 명령어들이다. 만일 어떤 이유에서 shell이 job 제어를 제공하지 않는다면, 이러한 명령어들이 유용한지 알아낼 수 없다.

덧붙이면, job 제어의 형태는 Bash나 Tcsh에서 약간 다르다. 사실, 모든 shell이 job 제어를 제공하지 않으나, 리눅스의 대부분의 shell에서는 job 제어를 제공한다.

2.7 환경 기호화

shell은 작업 환경을 기호화하기 위해서 많은 메카니즘을 제공한다. 앞에서도 언급하였듯이, shell은 단순한 명령어 해석기 이상이며 강력한 프로그래밍 언어이다. shell 스크립트를 작성해 보는 동안 우리는 shell의 향상된 기능을 사용함으로써 유닉스 시스템에서의 작업이 단순화되는 몇 가지 방법을 소개하고자 한다.

위에서도 언급하였듯이, 각각의 shell들은 서로 다른 문법을 사용한다는 것을 shell 스크립트를 실행해봄으로써 확인할 수 있다. 예를 들어, Tcsh는 C와 유사한 문법을 사용하고 Bourne shell은 또 다른 문법의 형태를 사용한다. 이 장에서는 이 두 가지 사이에서 많은 차이점을 고려하여 shell을 작성하지 않고, Bourne shell 문법을 사용하여 실행해 보려 한다.

Shell 스크립트 명령어를 연이어 사용해야 될 경우를 생각해 보자. 단, 그 명령들이 그룹 지어 요구되는 입력 모두를 단 하나의 명령으로 짧게 하려 한다.

/home/larry# cat chapter1 chapter2 chapter3 > book
/home/larry# wc -l book
/home/larry# lp book

파일 chapter1, chapter2, chapter3가 연이어 있고, 그 결과가 파일 book 으로 저장된다. 그러면, book 파일의 총 라인 수가 출력되어지고, 마지막으로 book이 lp명령으로 프린트 될 것이다.

이러한 명령어를 모두 입력하는 대신에, shell 스크립트로 이들을 그룹 지울 수 있다. 이 shell 스크립트는 이러한 명령어의 모두를 실행하기 위해 아래와 같이 만든다.

%%#%%!/bin/sh
%%#%% A shell script to create and print the book

cat chapter1 chapter2 chapter3 > book

wc -l book
lp book

만일 이 스크립트가 파일 makebook이라는 이름으로 저장되면, 간단히 makebook를 입력할 수 있다.

/home/larry# makebook

하나의 스크립트 파일로 모든 명령어를 실행한다. shell 스크립트는 보는 바와 같이 단순한 문서 파일이다. emacs나 vi같은 에디터를 사용하여 이것들을 만들 수 있다.

이 shell 스크립트를 보자. 첫 번째 라인 "#!/bin/sh"은 shell 스크립트라는 파일임을 알리며, 스크립트를 실행하는 방법을 말해 준다. 이 명령은 실행을 위하여 shell이 ‘/bin/sh’로 스크립트를 보내는 것이며, ‘/bin/sh’은 shell 그 자신이다. 왜 이것이 중요한가? 대부분의 유닉스 시스템에서는 ‘/bin/sh’ 은 Bash 같은 Bourne shell이다. shell 스크립트를 실행하기위하여 /bin/sh를 사용하는 것이며, 우리는 Bourne shell의 문법으로 스크립트를 실행한다는 것을 확실하게 하는 것이다. 이것은 스크립트가 심지어 사용자가 login 한 Tcsh(C Shell)을 사용한다 할지라도 Bourne 문법을 사용한다는 것을 말해 준다.

두 번째 라인은 주석이다. 주석은 문자 "#"로 시작하며, 그 라인의 끝까지 계속된다. 주석은 shell에 의해 무시되고, 그것은 일반적으로 프로그래머에게 shell 스크립트를 설명하는데 사용된다.

스크립트의 마지막 라인은 명령어이다. 명령어를 shell에게 직접 입력하는 것이다. shell은 스크립트의 각 라인을 읽고 shell 프롬프트에서 입력했었던 것과 같이 실행한다.

사용 허가는 shell 스크립트에서 매우 중요하다. 만일, 사용자가 shell 스크립트를 생성한다면, 그것을 실행하기 위해서 스크립트를 실행 가능한 사용 허가로 확실하게 해야 한다. 작성된 문서파일의 디폴트 사용 허가는 보통 실행 허가를 포함하지 않는다. 따라서, 이 문서파일은 실행 사용 허가를 가져야 한다.

/home/larry# chmod +x makebook

이 명령은 당신 자신에게 shell 스크립트인 makebook을 실행 가능한 사용 허가로 주는데 사용된다.

Shell 변수와 환경 shell은 대부분의 프로그래밍 언어처럼 변수를 정의할 수 있게 하여 준다. 변수라는 것은 참조할 수 있는 이름이 주어진 데이터이다.

Tcsh나 다른 C형태의 shell들은 여기에서 기술되는 것보다 변수를 설정하는 다른 메카니즘을 사용한다. 여기서는 Bash같은 Bourne shell을 사용하며, Tcsh는 man page 로 상세한 설명을 보기 바란다.

변수의 값을 설정할 때에, "$"라는 변수 이름을 이용하여 변수를 참조할 수 있다.

/home/larry# foo="hello there"

변수 foo는 "hello there"라는 값이 주어진다. 변수 이름으로 변수의 내용을 지시할 수 있으며 "$" 문자가 앞에 붙는다.

/home/larry# echo $foo
hello there
/home/larry#

같은 결과로 아래와 같이 된다.

/home/larry# echo "hello there"
hello there
/home/larry#

이러한 변수들은 shell 안에 존재하게 된다. 오직 shell을 통해야 만이 이 변수들을 액세스 할 수 있다는 것이다. 이것은 shell 스크립트에 매우 유용하다. 만일 파일 이름을 추적하는 것이 필요하다면, 위에서 설명한 것처럼 그것을 변수로 저장할 수 있다. 명령어 ‘set’을 사용하면 정의된 shell 변수 목록이 출력된다.

어쨌든, shell은 환경을 위한 외부 변수를 사용할 수 있다. 이 환경은 사용자가 액세스하여 실행하려고 하는 모든 명령을 변수로 설정할 수 있다. shell 안에 변수를 정의하면, 그 환경 변수가 필요한 명령어들에게 보내어지며, 명령어에 의해 적절히 사용된다.

아래의 예제에서 환경 변수 PAGER는 ‘man’ 명령어에서 사용되는 것이다. 이것은 man page를 사용할 때에 한 번에 한 화면씩 출력시키는 것이다. 만일 PAGER를 다른 명령어로 설정한다면, man page를 출력하기 위한 명령어로 디폴트인 ‘more’ 대신에 사용될 것이다.

PAGER를 ‘cat’으로 설정하면, ‘man’ 으로부터의 출력은 한 페이지마다 세워지지 않고 한번에 모두 출력될 것이다.

/home/larry# PAGER="cat"

여기서 환경을 위해 export 명령을 사용해야 한다.

/home/larry# export PAGER

명령어 ‘man ls’를 해보면, man page는 멈추지 않고 모두 지나가 버릴 것이다.

그럼, PAGER를 ‘more’로 설정하면, ‘more’ 명령어는 man page의 출력으로 사용될 것이다.

/home/larry# PAGER="more"

PAGER의 값을 변화시킨 후에 ‘export’명령을 사용하면 안된다. 오직 값을 한번만 보내는 것이 필요하며, 변한 값들은 자동적으로 환경으로 전달될 것이다.

특정 명령을 위한 man page는 어떤 환경 변수를 사용하는 명령어가 있을 경우 이 변수를 사용자에게 알려준다. 또한, 어떤 명령어는 환경 변수를 공유한다. 예를 들면, 명령어가 에디터가 필요할 경우 디폴트로 "EDITOR" 환경 변수로 설정된 명령어를 사용한다.

환경은 또한, login 세션에 대한 중요한 정보를 알려주는 데 사용된다. 한 예로 HOME 환경 변수는 홈 디렉토리의 이름을 포함하고 있다.

/home/larry/papers# echo $HOME
/home/larry

또 다른 흥미 있는 환경 변수로는 PS1이 있다. 이것은 메인 shell 프롬프트를 정의한다.

/home/larry# PS1="Your command, please: "
Your command, please:

일반적인 현재 작업 디렉토리를 표시하는 프롬프트로 되돌아가기 위해서는 아래와 같이 설정하면 된다.

Your command, please: PS1="\w# " /home/larry#

bash의 man page는 프롬프트로 설정하는 데 사용하는 자세한 문법이 설명되어 있다.

PATH 환경 변수 ‘ls’명령어를 사용할 때, 어떻게 shell이 ‘ls’ 실행 파일 자체를 찾을 수 있을까? 사실 ‘ls’는 대부분의 시스템에서 /bin 디렉토리 안에 있다. shell은 환경 변수 PATH를 사용하여 사용자가 입력하는 명령들의 실행 파일 위치를 찾는다.

예를 들면, 당신의 PATH는 아래와 같이 설정되어 있을 것이다.

/bin:/usr/bin:/usr/local/bin:.

이것은 shell이 찾을 수 있는 디렉토리의 목록이며, 각 디렉토리는 “:” 으로 구별되어진다. 사용자가 명령어 ‘ls’를 입력할 때, shell은 먼저 /bin/ls를 찾고, 그리고 /usr/bin/ls 를 찾아가며, 마지막으로 현재 디렉토리를 찾는다.

PATH는 일반 파일을 찾을 때는 아무것도 하지 않는다. 만일 아래와 같이 입력하면,

/home/larry# cp foo bar

shell은 파일 foo나 bar의 위치를 찾는데 PATH를 사용하지 않는다. shell은 오직 ‘cp’ 실행 파일을 찾는데 PATH를 사용한다.

이것은 사용자에게 많은 시간을 벌어 준다. 이 말은 실행 파일들이 어디에 저장이 되어 있는지 기억을 하지 않아도 된다는 것이다. 많은 시스템에서 실행 파일들은 /usr/bin, /bin, /usr/local/bin 등 여러 장소에 흩어져 있다. 명령의 모든 경로( /usr/bin/cp 같은 )를 입력하는 대신에, 단순히 PATH로 shell이 자동으로 찾아갈 경로들을 설정해 주면 되는 것이다.

PATH가 포함하고 있는 “.” 은 현재 작업 디렉토리이다. 이것은 현재 디렉토리에 있는 실행파일을 명령할때 디렉토리를 포함하여 명령해야하는 부담을 줄여 준다.

Shell 초기화 스크립트 shell 스크립트를 생성하는데 추가적인 설명을 하자면, shell 스크립트는 특정 목적으로 사용되는 경우가 대부분이다. 이런 것들 중에 가장 중요한 것은 초기화 스크립트이며, 이것은 사용자가 login할 때 shell에 의해 자동적으로 실행된다.

초기화 스크립트는 위에서 설명한 것처럼 단순한 shell 스크립트이나, login 할 때 자동으로 실행하는 명령에 의해 환경을 설정하는데 매우 유용하다. 예를 들면, 만일 login 할 때 메일을 언제나 체크하고자 하면 ‘mail’명령을 사용해야 하나, 초기화 shell 스크립트 안에 그 명령을 넣으면 자동으로 실행한다.

Bash 와 Tcsh 모두는 login shell과 또 다른 shell의 요구와 구별된다. login shell은 login 시에 요구되는 shell이며, 보통 이것은 당신이 사용하는 유일한 shell일 것이다. 어쨌든, vi 같은 다른 프로그램이 "shell out"한다면, login shell이 아닌 다른 shell로서 시작해야 한다.

Bash에 의해 사용되는 초기화 파일은 아래와 같은 것이 있다.

/etc/profile 시스템 관리자에 의해 설정되며, login시에 모든 Bash 사용자에게 실행된다.

$HOME/.bash_profile	login Bash 세션에 의해 실행된다. 
$HOME/.bashrc		Bash로 login 하지 않았을 때 실행된다. 

Tcsh는 다음의 초기화 스크립트를 사용한다.

/etc/login.csh		login시에 모든 Tcsh 사용자에게 실행된다. 
$HOME/.tcshrc		login시에 실행된다.
$HOME/.login		login시에 실행된다.

이 파일들의 기능들을 완전히 이해하기 위해서는 shell에 대하여 많은 지식이 필요하다. shell 프로그래밍은 완전한 한 과목이며, 이 글 전반에 걸쳐 있다. shell 환경을 기호화하려면 bash나 tcsh의 man page를 보는 것이 도움이 될 것이다.

3.시스템 관리

3.1 ROOT 3.2 시스템 부팅 3.3 셧 다운 3.4 사용자 관리 3.5 압축 파일 3.6 플로피의 사용과 백업 만들기 3.7 새로운 소프트웨어 설치 3.8 파일 시스템 관리 3.9 기타 작업 3.10 시스템 복구 3.11 초기화 파일들 3.12 /etc, /usr/etc 디렉토리 내의 파일 설명

이 장은 리눅스 시스템 관리의 전반에 대해서 설명한다. 일반적인 유닉스 시스템에서는 시스템 관리가 특별히 중요하지 않지만, PC상의 유닉스에서는 독자가 사용자인 동시에 관리자이므로 이 장은 매우 중요하다. 또한, 관리 작업이외에 여러가지 유용한 정보를 담고 있으므로, 많은 도움이 될 것이다. 시스템 관리에 대한 LDP 문서로는 “Linux System Administrator's Guide”가 있으며, 이 문서는 유닉스 시스템의 기술적인 사항이 많이 언급되어 있다.

3.1 ROOT

다중 사용자 유닉스는 다중 사용자 시스템이다. 여러 사용자가 동시에 login하여 사용할 수 있으며, 또한 각각의 사용자가 다중 작업을 할 수 있다. 다중 사용자는 여러 가지 방법으로 구현 할 수 있다. 대표적인 것은 랜카드를 이용하는 것이다. 또한, 멀티 포트를 이용하여 멀티 BBS 시스템을 구현할 수 있으며, 직렬 널(NULL) 케이블이나 병렬 널 케이블을 사용하면 별도의 소프트웨어 요구없이 간단히 구현할 수도 있다. 한 사람이 여러 사용자로 login할 수 도 있으며, 이것은 가상 콘솔 기능을 이용하는 것으로써, 간단히 [ALT+F1] 부터 [ALT+F8] 의 키를 누름으로써 가능하다. 이 기능은 혼자서 여러대의 컴퓨터를 사용하는 느낌을 가지게 할 것이다.

ROOT 계정 여러명의 사용자가 한 대의 컴퓨터를 이용하는 것이기 때문에 시스템 전체를 관리할 특정한 사용자(supervisor)가 필요하다. 이 수퍼바이저는 보통 “root”라는 계정을 가지며, 시스템 전체를 관리한다.

모든 사용자는 계정이 주어지면, 사용자 이름과 홈 디렉토리 등을 갖게 된다. 일반 사용자는 보통, 시스템의 다른 사용자들에게나 그들 자신에게도 손상을 주지 못하도록 제한되어 있다. 시스템의 파일 사용 허가는 모든 사용자를 위한 공유 디렉토리의 파일들을 일반 사용자가 지우거나 수정하지 못하게 되어 있으며, 또한 대부분의 사용자는 다른 사용자가 자신의 파일들을 액세스하거나 수정하지 못하도록 하기 위해서 적당한 파일 사용 허가로 그들 자신의 파일들을 보호하게 된다.

그러나, root는 아무런 제한을 받지 않는다. 시스템의 어떠한 파일이라도 읽고, 수정하고, 지울 수 있으며, 파일의 사용 허가를 바꿀 수도 있고, 드라이브 파티션을 잡거나 파일 시스템을 만드는 등의 특별한 프로그램을 실행할 수 있다. 리눅스 사용자로써는 사용자가 곧 관리자이므로, root 의 계정이 필요할 경우 root로 login하여 조심스럽게 시스템을 운영해야 한다.

따라서, root는 무엇이든지 할 수 있기 때문에 이 계정으로 login하면 큰 실수를 하기 쉽다. 예를 들면, 일반 사용자로서 만일, 부주의하게 /etc의 파일들 모두를 지우려 한다면, 시스템은 그렇게 하는 것을 허용하지 않을 것이다. 그러나, root로서 login을 했다면, 시스템은 아무런 제재을 가하지 않는다. 따라서, root를 사용하면 시스템의 어떤 작업이라도 할 수 있지만, 동시에 망가뜨릴 우려가 있다. 이런 경우를 막는 최선의 방법을 아래에 소개한다.

o 명령을 입력하고 [return]을 누르기 전에 어떤 손상이 오지 않는지 검사한다. 예를 들어, 디렉토리를 깨끗이 지우려고 할 때, [return]을 누르기 전에 지금까지 입력한 전체 명령을 다시 읽고, 올바른지 확인한다. 유닉스에서는 Undelete나 Unformat 같은 기능이 없다.

o root를 많이 사용하지 않는다. root 사용자로서의 역할이 더 편안하다면, 일반 사용자에 대한 관리자의 특권을 너무 남용하고 있는 것이다. 예를 들면, larry로 login했을 경우와 root로 login했을 경우를 생각해 보라.

o root 계정을 위해 다른 프롬프트를 사용한다. root의 .bashrc 나 .login 파일을 일반 사용자 프롬프트와는 다른 shell 프롬프트로 설정해 놓는다. 예를 들면, 많은 사용자들은 일반 사용자들의 프롬프트로 "$"을 사용하고, root사용자의 프롬프트는 "#"으로 정해 놓는다.

o root로서의 login은 정말 필요할 경우에만 하고, root로서의 작업이 끝나면, 바로 logout 하여라. root 계정으로서의 사용이 없을 수록, 시스템이 손상되는 일도 없을 것이다.

3.2 시스템 부팅

유닉스 시스템을 부팅하기 위해서는 커널 이미지와 루트 디바이스가 있어야 한다. 커널 이미지는 운영체제가 필요한 최소한의 코드가 포함되어 있으며, 그 자체로 부팅할 수 있다. 루트 디바이스는 커널로 부팅한 후에 실제로 작업이 이루어질 파티션으로서 최소한 하나의 루트 디바이스가 있어야 한다.

부트 플로피의 사용 대부분의 사용자는 리눅스 커널을 포함하고 있는 “boot floppy”를 사용하여 리눅스를 부팅한다. 이 커널은 리눅스의 루트 파티션 코드를 가지고 있으며, 루트 파일 시스템이 하드의 어디에 있는지 알고 있다( ‘rdev’ 명령은 커널 이미지의 루트 파티션을 설정하는 데 사용될 수 있다.). 이것은 설치하는 동안 배포본에 의해 생성된 플로피의 형태이다.

사용자 고유의 부트 플로피를 만들기 위해서는, 먼저 하드에 커널 이미지의 위치를 알아야 한다. 이것은 /Image나 /etc/Image일 것이다. 설치 방법에 따라 커널을 위해 /vmlinux를 사용하기도 한다.

또한, 압축된 커널을 대신 가질 수 있다. 압축된 커널은 부팅 시에 메모리로 압축이 풀어지게 되며 따라서, 하드 드라이브의 공간을 적게 차지한다. 만일 압축된 커널을 가지고 있다면, /zImage나 /etc/zImage 를 찾을 수 있을 것이다.

커널이 어디에 있는지 알았다면, ‘rdev’ 명령으로 커널 이미지 안의 루트 디바이스를 리눅스 루트 파티션의 이름으로 설정한다. 이 명령의 형식은

rdev <kernel-name> <root-device>

<kernel-name>은 커널 이미지의 이름이며, <root-device>는 리눅스 루트 파티션의 이름이다. 예를 들면, /etc/Image 커널의 루트 디바이스를 설정하기 위해서는 아래와 같이 사용한다.

%%#%% rdev /etc/Image /dev/hda2

‘rdev’는 커널에서 부팅 시에 디폴트 SVGA 모드를 사용하는 것 같은 다른 옵션으로 설정할 수 있다. 단지 ‘rdev’를 인자 없이 입력하면 여러 도움말을 얻을 수 있다.

root 디바이스를 설정한 후에, 단순히 커널 이미지를 플로피로 복사하면 부트 시스템이 만들어진다. 데이터를 플로피로 복사할 때는, 플로피를 먼저 MS-DOS 포맷으로 하는 것이 좋은 방법이다. 이것은 플로피의 sector와 track 정보를 얻을 수 있으며, 고밀도와 저밀도를 자동으로 검출 할 수 있다.

예를 들면, /etc/Image 커널을 /etc/fd0의 A 드라이브의 플로피로 복사하기 위해서는 아래와 같이 명령할 수 있다.

%%#%% cp /etc/Image /dev/fd0

이 플로피는 지금 리눅스를 부팅할 수 있다.

LILO 사용 또 다른 부팅의 방법은 LILO를 사용하는 것이다. LILO는 하드 디스크의 부트 섹터에 덧붙게 되며, 하드 디스크로부터 부팅할 때, 자동으로 실행되어 하드 디스크 안에 저장되어 있는 커널 이미지로부터 리눅스를 자동으로 부팅한다.

LILO는 또한 여러 운영체제를 함께 사용할 때 첫 단의 부트 로더로써 사용되어질 수 있으며, 따라서, 리눅스, DOS, OS/2 등 중 어떤 운영체제로 부팅할 것인가를 선택할 수 있다. LILO를 사용하여 부팅할 때, [ctrl], [alt], [shift] 등을 누르기 전까지는 디폴트 운영체제가 자동으로 부팅된다. 이런 키들을 누르게 되면, 부트 프롬프트가 출력되고, “linux”나 “msdos” 등 부팅하고자 하는 운영체제의 이름을 입력하면 그것으로 부팅된다. 만일 부팅될 때 [tab]키를 누르고 있으면, 부팅될 수 있는 운영체제의 목록이 열거된다.

LILO는 /etc/lilo의 디렉토리에 있다. LILO를 설치하는 쉬운 방법은 설정 파일인 /etc/lilo/config를 편집한 후에 `install'를 실행하면 된다.

%%#%% /etc/lilo/install

LILO 설정 파일은 부트하기 원하는 각각의 운영체제의 문장들을 포함하고 있다. 아래의 셋업은 리눅스 루트 파티션이 /dev/hda1이고, MS-DOS 파티션이 /dev/hda2 에 있을 경우의 예제이다.

%%#%% Tell LILO to modify the boot record on /dev/hda (the first
%%#%% non-SCSI hard drive). If you boot from a drive other than /dev/hda,
%%#%% change the following line.
boot = /dev/hda
%%#%% Name of the boot loader. No reason to modify this unless you're doing
%%#%% some serious hacking on LILO.
install = /etc/lilo/boot.b
%%#%% Have LILO perform some optimization.
compact
%%#%% Stanza for Linux root partition on /dev/hda1.
image = /etc/Image # Location of kernel
label = linux # Name of OS (for the LILO boot menu)
root = /dev/hda1 # Location of root partition
vga = ask # Tell kernel to ask for SVGA modes at boot time
%%#%% Stanza for MSDOS partition on /dev/hda2.
other = /dev/hda2 # Location of partition
table = /dev/hda # Location of partition table for /dev/hda2
label = msdos # Name of OS (for boot menu)

설정 파일에 있는 첫 번째 운영체제 절은 디폴트 LILO로 부팅하기 위한 디폴트 OS일 것이다. LILO 부트 프롬프트는 위에서 설명했던 것처럼, 다른 OS로 부팅하게끔 선택할 수 있다.

기억해야 할 것은, 디스크의 커널이 갱신되거나 위치가 바뀌였다면, 언제나 ‘/etc/lilo/install’ 을 실행하여 드라이브 부트 섹터가 변화가 반영되게 하여야 한다.

또한, 위의 “root = ” 라인을 사용한다면, 커널 이미지 안의 루트 디렉토리를 설정하는 ‘rdev’의 기능을 LILO 가 부트 시 자동적으로 설정하므로, 사용하지 않아도 된다.

OS/2의 “Boot Manager”를 사용할 경우는 조심해야할 사항이 있다. 리눅스의 ‘fdisk’는 OS/2를 위한 파티션을 생성하는데 몇가지 버그가 있기 때문에 OS/2의 ‘fdisk’를 사용하는 것이 좋다.

3.3 셧 다운

리눅스 시스템을 shut down하기 위해서는 약간의 기교가 필요하다. 시스템이 운영되고 있는 동안 리셋 스위치를 누르거나 전원을 끄면 파일시스템에 손상이 오게 된다. 커널은 메모리 버퍼에 디스크 I/O의 정보를 담고 있기 때문에 만일, 커널이 그 버퍼를 디스크에 저장할 기회를 주지 않고 재부팅시키면, 파일 시스템이 손상된다.

또 다른 조심해야 할 것은, shutdown 시간을 주는 것이다. 모든 프로세스에게 필요한 정보의 저장이나 열려진 파일을 닫는 등의 안전하게 종료될 수 있도록 하게끔 신호를 보낼 여유를 주는 것이 좋다. 동시에 모든 파일 시스템은 안전하게 unmount 된다. 만일 root가 원한다면, 시스템에 접속되어 있는 모든 사용자에게 시스템이 down되고 있으며, 따라서 안전하게 log off 할 기회를 줄 수도 있다.

가장 쉬운 shutdown하는 방법은 shutdown명령어를 사용하는 것이며, 아래와 같은 문법을 갖는다.

shutdown <time> <warning-message>

<time> 인자는 (hh:mm:ss)의 형태를 갖는 것으로서 시스템이 shutdown되는 시간을 나타낸다. 그리고 <warning-message>는 shutdown 되기 이전에 모든 사용자의 터미널에 해당 메시지를 출력한다. 또한, <time>을 “now”로 정할 수 있는 데, 이것은 즉시 shutdown 하라는 것이며, -r 옵션을 포함하면 shutdown 후에 시스템이 재부팅되도록 shutdown에 주는 것이다.

예를 들면, 오후 8:00에 시스템을 재부팅 시키려 한다면, 아래와 같이 하면 된다.

%%#%% shutdown -r 20:00

‘halt’ 명령은 즉시 shutdown하기 이전에 사용되는 것이며, 어떠한 경고 메시지나 시간이 주어지지 않는다. 따라서, 시스템을 혼자 사용하고 있을때, 시스템을 shutdown 시키거나 turn off 시키는데 유용하다.

또한, 시스템이 완전히 정지되었다는 아래의 메시지가 출력되기 전까지는 전원을 끄거나 재부팅하지 말아야 한다.

The system is halted

이것은 시스템을 shutdown 이나 halt 명령어를 사용하여 시스템을 깨끗하게 shutdown 하는 중요한 것이다. 어떤 시스템에서는 [ctrl-ald-del]을 누름으로서, 즉시 재부팅할 수 있지만, 문제가 생길 수도 있다.

3.4 사용자 관리

시스템에 사용자가 많건 적건, 이것은 리눅스 하에서 사용자를 관리하는 형태를 이해하는 것은 중요하다. 심지어 당신이 유일한 사용자라 할지라도, 아마도 자신을 위한 몇 개의 계정을 가져야 할 것이며, 그 계정에서의 작업은 root보다 더 많이 사용할 것이다.

어떤 사용자는 시스템에 하나의 계정만을 가지고 있거나, 몇 사람이 하나의 계정을 공유하는 좋지 않는 경우도 있다. 보안에 관한 문제 뿐만 아니라 계정이 시스템에 하나만 사용되는 것도 좋지 않으며, 또한 root는 누가 무엇을 하고 있는지 알 필요가 있기 때문이다.

사용자 관리의 개념 사용자 관리에 필요한 몇가지 용어들을 먼저 알아보자.

username

username은 시스템의 모든 사용자에게 주어지는 단일 이름이다. 예를 들어, username은 soonshin, gildong2, jspark 등의 문자나 숫자도 사용될 수 있으며, "_", "."도 가능하다. Username은 보통 8글자로 제한되어 있다.

user ID

User ID 또는 UID는 시스템의 모든 사용자에게 주어지는 단일 번호이다. 시스템은 username이 아닌 UID 정보로써 사용자를 관리한다.

group ID

Group ID또는 GID는 사용자의 디폴트 그룹의 ID이다. 각 사용자는 시스템 관리자에 의해 하나나 그 이상의 그룹에 속할 수 있다.

password

시스템은 또한 사용자의 암호화된 패스워드를 저장하고 있다. 명령어 passwd는 사용자의 패스워드를 설정하거나 변경할 때 사용된다.

full name

사용자의 "real name" 또는 "full name"은 username과 함께 기록된다.

home directory

Home directory는 사용자가 login했을 때 처음으로 있게 되는 디렉토리이다. 모든 사용자는 반드시 그 자신의 home directory는 가지며, 보통 /home 하위에 위치하게 된다.

login shell

사용자의 login shell은 login시에 실행되는 shell이다. 예를 들면, /bin/bash와 /bin/tcsh가 있다.

사용자 관리는 /etc/passwd 파일에 의해서 관리 된다. 이 파일은 사용자에 대한 정보를 담고 있으며, 그 형식은 아래와 같다.

username:encrypted password:UID:GID:full name:home directory:login shell

예를 보이면,

foo:Xv8Q981g71oKK:102:100:Laura Poole:/home/foo:/bin/bash

위에서 볼 수 있는 것처럼 첫번째 필드 ‘kiwi’는 username이며, 다음 필드의 "Xv8Q981g71oKK" 는 암호화된 패스워드이다. 패스워드는 시스템이 사용자가 읽을 수 있는 형식으로는 저장되어 있지 않다. 패스워드는 비밀 키를 사용하여 그 자신을 암호화한다. 달리 말하면, 패스워드를 알기 위해서는 암호화된 코드를 본래 입력한 것으로 변환해야 한다. 이 암호화된 형태는 효율적인 보안의 방법이다.

어떤 시스템은 패스워드 정보를 /etc/shadow 파일에 위임하는 “shadow password” 를 사용한다. /etc/passwd는 읽혀질 수 있고, /etc/shadow는 읽을 수 없기 때문에 어떤 특별한 보안을 제공한다. Shadow 패스워드는 엄격한 보안을 위한 몇 개의 다른 특징을 갖고 있지만, 우리는 여기서 이런 특징까지 살피지는 않을 것이다.

3번째 필드 “102”는 UID이다. 이것은 각각의 사용자에게 하나씩 있어야 한다. 4번째 필드 “100”은 GID이다. 이 사용자는 그룹 번호 100에 속해 있다. 그룹 정보는 사용자 정보와 같으며, /etc/group에 저장되어 있다.

다섯 번째 필드는 사용자의 full name “Laura Poole”이다. 마지막으로 두개의 필드는 사용자 홈 디렉토리(/home/foo)와 login shell(/bin/bash)이다. 디렉토리는 username 과 같이 따로 요구되는 것은 아니며, 단지 디렉토리를 알리는 데 도움이 될 뿐이다.

사용자 추가 사용자를 추가할 때는 해야 할 여러 단계가 있다. 먼저, /etc/passwd 안에 단일 username과 UID를 포함한 사용자가 주어져야 한다. GID 나 fullname은 반드시 표기되어야 한다. 또한, 추가된 사용자를 위한 홈 디렉토리를 만들어 주어야 하며, 그 디렉토리를 사용할 수 있도록 그의 디렉토리 사용 허가 또한 반드시 설정해 주어야 한다. 그리고, 시스템을 활용할 수 있게 하는 Shell 초기화 파일이 사용자 홈 디렉토리 안에 있어야 하며, X나 seyon 등과 같은 응용 프로그램을 위한 시스템 사양파일이 있어야 한다.

사용자를 손수 추가하는 것이 어렵지 않더라도, 시스템에 많은 사용자가 있다면 어떤 사항을 잊을 수가 있다. 사용자를 추가시키는 가장 쉬운 방법은 상호작용하는 프로그램을 이용하는 것이다. 이 프로그램은 요구되는 정보를 질문하고 자동적으로 시스템 파일을 갱신한다. 이 프로그램의 이름은 ‘useradd’ 나 ‘adduser’이며, 설치된 소프트웨어에 따라 다르다.

예를 보이면,

%%#%% useradd -m foo
%%#%% passwd foo

이후에 패스워드를 입력하면 된다.

위와 같이 입력하면, foo 라는 사용자가 만들어지고, foo 소유의 디렉토리가 /HOME/foo 로 자동적으로 만들어진다. 또한, 반드시 초기 패스워드를 지정해 주어야 한다.

사용자 제거 유사하게, 사용자를 지우는 것은 ‘userdel’이나 ‘deluser’ 또는 시스템에 설치된 다른 소프트웨어로서 수행할 수 있다.

만일 사용자가 시스템에 login하려 할 때 사용자의 계정을 지우지 않고, 잠시 “desable”시키려면, /etc/passwd 파일의 패스워드 필드의 첫 번째 문자로 “*” 를 추가하면 된다. 예를 들면, foo의 /etc/passwd를 변경하려면 아래와 같으며, 시스템으로 login 하는 것이 제한될 것이다.

foo:*Xv8Q981g71oKK:102:100:Laura Poole:/home/foo:/bin/bash

사용자 제거의 예를 보이면 아래와 같다.

%%#%% userdel foobar

사용자 속성 설정 사용자를 생성한 후에, 홈 디렉토리나 패스워드 같은 사용자의 속성을 바꿀 필요가 있을 때, 가장 쉬운 방법은 /etc/passwd의 값을 직접 바꾸는 것이다. 또한, 사용자의 패스워드를 설정할 경우나 새로운 패스워드로 변경할 경우는 ‘passwd’ 명령어를 사용한다.

%%#%% passwd larry

이것은 사용자 larry의 패스워드를 바꾼다. 오직 root만이 다른 사용자의 패스워드를 바꿀 수 있으며, 사용자 자신의 패스워드도 ‘passwd’ 를 사용할 수 있다.

어떤 시스템에서는 ‘chfn’ 이나 ‘chsh’ 명령어를 사용하여, 사용자의 login shell 속성이나 fullname을 사용자 자신이 바꿀 수 있도록 허용되어 있다. 만일 이 기능이 없다면 여러 속성들을 변경하기 위해서 root로 login하여 새로이 설치하여야 한다.

그룹 그룹은 사용자들을 집단으로 묶는 것이며, 이렇게 함으로써 그 그룹에 속한 사용자들의 파일을 특정 그룹에 속하는 사용자 모두가 공유할 수 있게 해준다. 또한, 사용자는 복수의 그룹에 속할 수 있다. 일반적인 그룹 이외에 시스템에 정의되는 bin, mail, sys 같은 몇 개의 특수한 그룹이 있다. 이런 그룹 중에는 사용자가 어느 곳에도 속할 수 없으며, 그것들은 시스템 파일 사용 허가에 사용된다.

/etc/group는 그룹에 관한 정보가 담겨 있으며, 그 형식은 아래와 같다.

group name:password:GID:other members

이 파일의 예를 보인다.

root::0:
users::100:mdw,larry
guest::200:
other::250:kiwi

첫 번째 그룹 root는 root 계정을 위해 예약된 특별한 시스템 그룹이다. 다음 그룹 users는 일반 사용자들을 위한 것이다. 현재 이것은 GID 100을 갖으며, 사용자 mdw와 larry 는 이 그룹을 액세스 할 수 있다. 어쨌든, 사용자는 /etc/group의 다른 그룹 라인에 username을 추가함으로써 하나 이상의 그룹을 가질 수 있다. 명령어 ‘groups’ 는 사용자가 액세스 할 수 있는 주어진 그룹의 목록을 열거한다.

3번째 그룹 guest는 손님 사용자를 위한 것이며, 다른 것은 “other” 그룹들이다. 사용자 kiwi는 이 그룹을 액세스 할 수 있다. 여기서, /etc/group의 “password” 필드는 아주 드물게 사용된다. 이것은 때때로 그룹 액세스를 설정할 때 사용하지만 좀처럼 쓰이지 않는다.

명령어 ‘addgroup’나 ‘groupadd’ 는 시스템에 그룹을 추가할 때 사용된다. 일반적으로, 이것은 /etc/group안에 추가시키면 되며, 다른 설정들이 필요치 않다. 그룹을 지우기 위해서는 /etc/group 파일의 내용에서 사용자를 삭제하면 된다.

3.5 압축 파일

리눅스의 배포본은 전부 압축되어서 제공되며, 기타 다른 응용 소프트웨어도 압축된 형태로 제공된다. 유닉스에서는 디렉토리를 포함하여 여러 파일들을 하나로 묶는 명령어로 ‘tar’를 사용하며, 실제로 압축하는 것으로는 ‘gzip’을 주로 사용한다. 전자는 ‘.tar’가 파일명 뒤에 붙으며, 후자는 ‘.gz’ 또는 ‘z’가 붙는다. 또한, tar파일이 압축되었을 경우는 ‘.tar.gz’, ‘.tar.z’, ‘.tgz’ 등의 이름이 붙을 수 있다. DOS에서 많이 사용하는 lzh나 zip 파일을 이용할 수 있으며, 각각 ‘lharc’, ‘unzip’, ‘unarj’ 등의 유틸리티가 제공된다.

tar 의 사용 명령어 tar는 압축 소프트웨어중에서 가장 많이 사용되는 것이다.

tar 명령어의 문법은 아래와 같다.

tar <options> <file1> <file2> ...<fileN>

예를 보자.

%%#%% tar cvf backup.tar /etc

이 명령은 /etc 안의 모든 파일을 backup.tar의 이름으로 묶는다. 첫 번째 인자인 “cvf” 는 tar의 <options>으로서, “c”는 새로운 파일을 생성하며, “v”는 묶이게 될 각각의 파일들을 화면에 출력될 것을 지정한다. “f”는 다음에 나오는 인자인 backup.tar로 생성될 파일의 이름을 지정한다. 마지막 인자는 압축이 될 파일이나 디렉토리이다.

%%#%% tar xvf backup.tar

현재 디렉토리의 backup.tar 파일을 푼다. 이것은 tar로 묶은 것을 풀 때 기존의 파일들이 덮어써지기 때문에 때로는 위험하다. backup.tar 파일이 디렉토리를 포함한다면, 자동적으로 디렉토리가 생성되고 파일이 속하게 된다.

파일들을 풀 때, 파일이 어디로 풀리게 되는지 아는 것도 중요하다. 예를 들어, /etc/hosts, /etc/group, /etc/passwd 파일들을 묶는 다면,

%%#%% tar cvf backup.tar /etc/hosts /etc/group /etc/passwd

/etc/디렉토리의 각각의 파일들이 추가된다. 위와 같이 묶인 파일들을 올바른 장소로 풀기 위해서는 아래의 명령어를 사용해야 한다.

%%#%% cd /
%%#%% tar xvf backup.tar

왜냐하면, 묶어 놓은 파일에 저장되어 있는 경로도 풀어야 하기 때문이다. 만일, 아래의 명령으로 묶는다면,

%%#%% cd /etc
%%#%% tar cvf hosts group passwd

디렉토리 이름 ‘/etc’는 tar 파일에 저장이 되지 않을 것이다. 그러므로, 이 파일을 풀기 전에 “cd /etc”를 먼저 입력하여야 한다. 이 방식으로 tar파일을 만드는 것은, 파일을 어디로 풀어야 하는지에 대한 큰 차이를 갖게 된다.

%%#%% tar tvf backup.tar

이것은 파일을 풀기 전에 tar파일의 “index”를 출력한다. 이러한 방법은 tar 파일 안에 어떤 디렉토리의 파일들이 상대적으로 어떻게 저장이 되어있는지 볼 수 있으며, 따라서 올바른 장소로 풀 수 있다.

gzip과 compress MS-DOS의 프로그램과는 달리, tar는 파일을 묶을 때, 자동적으로 압축하지는 않는다. 그러므로, 만일 2개의 1MB의 파일을 묶으려 한다면, tar파일의 크기는 2MB일 것이다. 명령어 ‘gzip’ 은 파일을 압축하는데 사용된다(압축하기 위해서 tar 파일은 필요치 않다.).

%%#%% gzip -9 backup.tar

위의 명령은 backup.tar 파일을 압축하고, 이 파일의 압축 버전인 backup.tar.gz 파일을 만들 것이다. -9는 최상의 압축율로 압축하는 옵션이다. 명령어 ‘gunzip’은 ‘gzip’ 명령으로 압축된 파일을 풀기 위해 사용된다. 명령은 ‘gzip -d’ 이다.

‘gzip’은 유닉스의 새로운 도구이며, 지난 수년 동안 ‘compress’ 명령을 대신하여 사용되어 왔다. ‘compress’의 알고리즘에 대한 소프트웨어 특허권 문제와 ‘gzip’의 효율이 ‘compress’ 보다 좋다는 점 등의 이유로 ‘compress’는 물러나야 했지만 여전히 필요할 것이다.

compressed 파일의 끝에 확장자 .Z 가 붙는다. 예를 들면, backup.tar의 compress된 버전이 backup.tar.Z이며, backup.tar.gz는 gzip 버전이다.(때로는, 소문자 z가 gzipped 파일이다.) 명령어 ‘uncompress’는 compress 된 파일을 풀기 위해 사용한다. 또한, gunzip은 compressed 파일을 취급하는 방법을 알고 있기 때문에 .Z 파일도 gzip을 이용하여 압출을 풀 수 있다.

gzip과 tar의 혼합 사용 일반적으로 파일들을 하나로 묶은후, 그것을 압축시켜 백업해 놓는 경우가 많을 것이다.

%%#%% tar cvf backup.tar /etc
%%#%% gzip -9 backup.tar

따라서, 결과는 backup.tar.gz 이 생길 것이다. 파일을 풀기 위해서는 그 반대의 명령을 아래의 순서대로 사용한다.

%%#%% gunzip backup.tar.gz
%%#%% tar xvf backup.tar

물론, tar파일을 풀기 전에는 언제나 올바른 디렉토리에서 확인해야 할 것이다.

여기서, 파이프와 리디렉션을 사용하여 위의 명령을 한 라인으로 처리할 수 있다.

%%#%% tar cvf - /etc | gzip -9c > backup.tar.gz

이 명령은 먼저, tar 파일을 tar의 표준 출력(“-”로 표시)으로 보낸다. 이것은 gzip과 파이프되어 들어오는 tar 파일을 압축하며, 그 결과를 backup.tar.gz로 리디렉트 시킴으로서 파일로 저장된다.

gzip의 -c 옵션은 출력을 backup.tar.gz로 리디렉트하기 위해 표준 출력으로 보내라는 명령이다.

그럼, 한 라인의 명령으로 이 파일을 풀어보자.

%%#%% gunzip -c backup.tar.gz | tar cvf -

다시, gunzip은 backup.tar.gz의 내용을 풀고, 그 결과를 표준 출력으로 tar 파일에 보낸다. 이것은 tar를 파이프한 것이고, “-”는 tar의 표준 출력을 말한다.

리눅스로 이식된 tar 버젼은 -z 옵션이 있어, 압축과 해제를 자동적으로 시킬 수 있다.

%%#%% tar cvfz backup.tar.Z /etc

이것은 아래와 두 명령과 같다.

%%#%% tar cvf backup.tar /etc
%%#%% compress backup.tar

또한, 압축을 해제할때는 아래와 같으며,

%%#%% tar xvfz backup.tar.Z

이것은 아래와 두명령과 같은 것이다.

%%#%% uncompress backup.tar.Z
%%#%% tar xvf backup.tar

Man page에 tar와 gzip에 대한 더 많은 정보가 언급되어 있다.

3.6 플로피의 사용과 백업 만들기

플로피로 백업하기 플로피로 백업본을 만드는 방법은 아래와 같은 명령으로 할 수 있다.

%%#%% tar cvfzM /dev/fd0 /

위의 명령은 플로피 드라이브 /dev/fd0를 사용하여 시스템 전체를 백업한다. “M” 옵션은 여러 장의 디스켓으로 백업하는 것을 가능하게 하며, 이것은 한 장의 플로피가 모두 차면, tar는 다음 디스크를 기다린다.

%%#%% tar xvfzM /dev/fd0

위의 명령은 전체 백업된 것을 다시 하드로 재저장(restore)한다. 이 방법은 또한 테이프 드라이브(/dev/rmt0)가 시스템에 연결되었을 경우에도 사용할 수 있다.

파일 시스템으로서의 플로피 사용 하드 드라이브 파티션에서처럼 플로피에 파일 시스템을 만들 수 있다.

%%#%% mke2fs /dev/fd0 1440

위의 명령은 /dev/fd0의 플로피에 “extended 2 파일 시스템”을 만든다. 파일 시스템의 크기는 반드시 플로피의 크기와 일치해야 하며, 고밀도 3.5" 디스크는 1.44MB, 1440 블럭이며, 고밀도 5.25" 디스크는 1200 블럭이다.

플로피를 액세스하기 위해서 디스크에 포함되어 있는 파일 시스템을 먼저, 마운트(mount) 시켜야 한다.

%%#%% mount -t ext2 /dev/fd0 /mnt

이 명령은 디렉토리 /mnt에 /dev/fd0의 플로피를 마운트한다. 지금부터, 플로피의 모든 파일들은 드라이브의 /mnt 디렉토리 안에 보여지게 된다. “-t ext2” 옵션은 ext2fs 파일 시스템 형태로 마운트할 것을 말한다. 플로피에 “minix” 파일 시스템 이외의 파일 시스템을 만들려면, mount 명령에 그 형태를 반드시 정해 주어야만 한다.

또한, 파일 시스템을 마운트할 디렉토리(mount point)는 ‘mount’ 명령어를 사용하기 전에 반드시 먼저 존재해 있어야 한다. 그렇지 않다면, ‘mkdir’ 명령어로 간단히 만들 수 있다.

주의할 것은, 어떤 I/O는 하드 디스크의 I/O처럼 버퍼되므로, 만일 플로피 디스크의 데이터를 바꾼다면, 커널이 그 I/O버퍼를 flush 시키기 전까지는 드라이브의 불빛을 보지 못할 것이다. 이같은 이유로 unmount 시키지 전까지는 플로피 디스크를 제거하면 안된다. unmount는 아래의 명령어로서 가능하다.

%%#%% umount /dev/fd0

MS-DOS 시스템에서처럼 간단히 플로피들을 교체하면 안된다. 언제든지 플로피를 교체 할 때는 unmount를 먼저하고, mount를 다음에 하는 것이 안전하다.

3.7 새로운 소프트웨어의 설치

시스템 관리자의 또 다른 의무는 새로운 소프트웨어의 설치와 업그레이드이다.

리눅스 연합은 매우 동적이다. 새로운 커널은 몇 주마다 발표되고, 기타 다른 소프트웨어들도 자주 업그레이드된다. 따라서, 새로운 리눅스 사용자는 빠르게 배워가기 위해 시스템을 규칙적으로 업그레이드해야 할 필요성을 자주 느낀다. 리눅스 세계에서 모든 변화를 따라가기 위해선, 업그레이드 작업에 많은 시간을 써야 하고, 그렇게 되면 시스템을 사용할 시간은 거의 없게 될 것이다.

그러면, 언제 업그레이드 해야 할 것인가? 어떤 사람들은 새로운 배포본(SLS의 새 버전 같은)이 발표될 때라고 생각한다. 많은 리눅스 사용자들은 최신의 배포본 버전으로 전체를 매번 다시 설치한다. 이것은 시간 낭비이다. 일반적으로, 배포본의 변화는 작다. 다운 로딩하고 재 설치하는 30개 이상의 디스크들 중 소프트웨어의 10% 정도만 실제적으로 수정된다. 이것은 무의미한 것이다.

시스템을 업그레이드하는 데 가장 중요한 소프트웨어는 커널, 라이브러리, GCC 컴파일러이다. 이런 소프트웨어는 시스템의 필수적인 3부분이며, 어떤 작업을 할 경우 크게 의존하는 것들이다. 다른 소프트웨어들의 대부분은 주기적으로 업그레이드할 필요는 별로 없을 것이다.

커널 업그레이드 커널의 업그레이드는 소스를 구하고, 컴파일하는 일이다. 어떤 기능을 가능하게 하게 하거나 불가능하게 하기 위해서 스스로 커널을 컴파일해야 하며, 커널을 컴퓨터를 운영하기 위해서 최적화되게 해야 한다. 이 과정은 어렵지 않다.

커널 버전은 버전 번호와 패치 레벨로 표기된다. 예를 들면, 0.99.pl15와 0.99.15는 로 표시되는 것은 버전 0.99의 패치 레벨 15를 나타낸다.

커널 소스는 gzipped tar 파일로 배포된다. 예를 들면, 1.0의 커널 소스 파일은 linux-1.0.tar.gz 이다. 또한, 패치 파일은 ‘patch’ 프로그램을 이용하여 최신의 패치 레벨로 현재 커널을 패치시킬 수 있다.

커널 소스를 설치하기 위해서 먼저 /usr/src 디렉토리에 커널의 tar파일을 푼다. 파일을 풀면 /usr/src/linux를 생성하고 커널 소스를 포함하게 된다. 새 버전을 풀기 전에 이미 존재하는 /usr/src/linux 를 지우거나 이름을 바꾸는 것도 안전하게 푸는 방법이다.

소스가 풀리면, /usr/include 안에 먼저 symbolic link 만들어야 한다.

%%#%% ln -sf /usr/src/linux/include/linux /usr/include/linux
%%#%% ln -sf /usr/src/linux/include/asm /usr/include/asm

이런 links를 생성했으면, 커널 소스의 다음 버전을 설치할 때까지 이것을 다시 생성할 필요는 없게 된다.

커널을 컴파일 할 때 중요한 것은 먼저, gcc, g++ C, C++ 등의 컴파일러가 반드시 시스템에 설치되어 있어야 하며, 대부분 이런 컴파일러들의 가장 최신 버전들이 필요할 것이다.

커널을 컴파일하기 위해서, 먼저 /usr/src/linux로 ‘cd’ 하여야 하며, make config 를 실행한다. 이 명령은 새로운 커널에 포함될 파일 시스템 같은 사양 옵션의 질문을 많이 할 것이다.

다음은, /usr/src/linux/Makefile을 편집하는 것이다. ROOT_DEV의 정의가 바른지 확실히 해야 하며, 이것은 부팅 시에 root 파일 시스템으로서 디바이스 사용을 정의한다.

ROOT_DEV = CURRENT

root 파일 시스템 디바이스를 변경할 필요가 없다면, 이것은 바꿀 필요가 없다.

다음은 make 명령어를 실행해야 하는데, 이것은 매우 중요한 단계이다.

명령어 ‘make Image’는 커널을 컴파일하고 /usr/src/linux/Image 의 새로운 커널 이미지를 남겨 둔다. 또한, make zImage는 압축된 커널 이미지로 컴파일하며, 이것은 부트 시에 자동으로 압축해제 된다.

커널을 컴파일하였으면, 부트 플로피로 복사하거나 부팅하기 위해서 LILO를 사용하여 설치해야 한다. LILO를 사용한다면, 아래와 같이 먼저 zImage를 루트로 복사한후 LILO의 ‘install’ 명령 실행하면 된다.

%%#%% cp /usr/src/linux/zImage /
%%#%% /etc/lilo/install

라이브러리 업그레이드 시스템에 설치되어 있는 대부분의 소프트웨어는 고유한 라이브러리를 사용하여 컴파일되었다. 또한, 이 라이브러리는 서로 다른 프로그램과 일반적인 서브루틴을 공유한다. 만일 아래의 메시지를 보게 된다면,

Incompatible library version

프로그램을 실행할 때, 프로그램이 요구하는 라이브러리의 버전을 업그레이드해야 한다. 라이브러리는 하위 호환성을 갖기 때문에, 구 버전의 라이브러리를 사용해서 컴파일 된 것도 새 버전의 라이브러리에서 작업할 수 있다.

독자가 인터넷을 액세스할 수 있다면, 최신 버전의 라이브러리를 많은 리눅스 FTP site 에서 찾을 수 있다. image-version.tar.gz 는 /lib와 /usr/lib에 설치하고, inc-version.tar.gz 는 /usr/include 에 설치한다.

release-version.tar.gz의 .a 와 .sa파일은 /usr/lib에 설치해야 한다. 이 라이브러리는 컴파일 할 때 사용된다.

공유 라이브러리 이미지 파일인 libc.so.version은 /lib에 설치한다. 공유 라이브러리 이미지는 프로그램이 라이브러리를 사용할 때에 실시간 로드되며, 각각의 라이브러리는 /lib 안의 다수의 라이브러리의 메이저 버전을 사용하여 symbolic link 한다.

예를 들면, libc라이브러리 4.5.24의 메이저 버전은 4이다. 라이브러리에 포함되어 있는 파일은 libc.so.4.5.24 이다. 라이브러리를 업그레이드할 때, symbolic link를 변경시켜야 하며, 새 버전임을 가리키기 위해서 symbolic link를 변경시켜야 한다.

symbolic link를 바꾸는 것은 중요하다. 만일, symbolic link lib.so.4를 지우려고 하면, link에 의존하고 있는 ls, cat 같은 기본적인 프로그램이 작업을 멈출 것이다. 아래는 libc.so.4가 libc.so.4.5.24을 가리킬 수 있도록 업데이트하는 명령이다.

%%#%% ln -sf /lib/libc.so.4.5.24 /lib/libc.so.4

또한, 같은 방법으로 libm.so.version을 symbolic link 하는 것이 필요하다. 다른 버전의 라이브러리를 업그레이드 하려면, 위의 파일 이름을 적당하게 바꾸면 된다. 배포되는 라이브러리는 상세한 설명이 있을 것이다.

Gcc C나 C++ 컴파일러는 시스템의 소프트웨어 특히 커널을 컴파일하는데 주로 사용될 것이다.

기타 소프트웨어의 업그레이드 다른 소프트웨어를 업그레이드 하는데는 보통 적당한 파일을 다운로드하고 그들을 설치하면 된다. 리눅스의 대부분의 소프트웨어는 gzipped tar파일로 배포되며, 소스와 실행 파일 따로 존재하는 것이 많다. 만일 다운 받은 소프트웨어가 실행 파일이 포함되어 있지 않으면, 스스로 소스를 컴파일하여야 하며, 보통 이것은 소스가 있는 디렉토리에서 make라 입력하면 된다.

USENET의 comp.os.linux.announce 를 읽는 것이 새로운 소프트웨어를 찾는데 가장 쉬운 방법이다. FTP site에서 소프트웨어를 찾을 때는, FTP 에서 ls -lR index 하여 다운로드하거나, grep을 사용해서 파일을 찾는 것이 가장 쉬운 방법이다. 또한 archie를 사용할 수 있으면, 이것으로 도움을 받을 수 있다.

리눅스 소프트웨어 중 손쉽게 얻을 수 있는 소스는 SLS 배포 디스크 이미지이다. 각각의 디스크는 단순히 gzipped tar 파일로 된 많은 .tgz이다. 디스크들을 다운로드받는 대신에 FTP site에서 SLS 배포로부터 필요한 .tgz파일을 다운로드 받을 수 있고, 그 디렉토리에 설치할 수 있다.

다시 말하면, 새버젼의 배포본이나 다른 배포 디스크로 재설치하는 것은 좋은 생각이 아니다. SLS 배포본은 업그레이드가 용이하게 되어 있지는 않다. 만일 이런 방법으로 전부 재설치한다면, 이미 기호화된 설정이나, 사용자 디렉토리는 반드시 손상되기 마련이다. 따라서, 소프트웨어를 업그레이드하는 최선의 방법은 필요한 부분만 하는 것이며, 이것은 자주 사용하는 프로그램이 새 버전이 나왔을 경우에는 업그레이드하는 것이 좋다. 그렇지 않으면, 특별한 이유가 없는한 업그레이드 하지 않는 것이 좋다. 만일 사용하고 있는 소프트웨어로 충분히 작업을 할 수 있다면, 업그레이드할 이유가 없다.

3.8 파일 시스템 관리

시스템 관리자로써 해야 할 또 다른 작업은 파일 시스템을 관리하는 것이다. 이 일의 대부분은 위험하거나 손상된 파일들의 파일 시스템을 주기적으로 검사하는 데 필요한 작업들이다. 따라서 대부분의 배포본들은 부팅 시에 자동으로 파일 시스템을 검사하도록 설정되어 있다. 리눅스에서는 플로피 디스크를 사용하기 위해서 이 작업이 꼭 필요하다.

파일 시스템 마운팅 먼저, 파일 시스템에 대한 몇 가지 개념을 알아보자. 파일 시스템이 시스템에 액세스하기 전에 반드시 디렉토리가 마운트되어 있어야한다. 예를 들면, 플로피에 파일 시스템이 있으면, 그 안의 파일을 액세스하기 위해서 /mnt 같은 임의의 디렉토리에 반드시 마운트시켜야 한다. 디렉토리에 파일 시스템을 마운팅시킨 후에, 그 내용이 디렉토리안에 나타난다. 플로피의 경우, 플로피에 있는 파일들은 디렉토리 /mnt 안에 나타나며, Unmounting을 한 후에는 /mnt 디렉토리는 다시 비여 있게 된다.

하드 드라이브의 파일 시스템도 같다. 시스템은 부트 시에 하드 드라이브의 파일 시스템을 자동으로 마운트시킨다. “root filesystem” 이라고 불리는 것은 디렉토리 “/” 를 마운트한 것이다. 만일 /usr 에 여러 개의 파일 시스템이 존재한다면, /usr 가 마운트되어야 한다. 오직 root 파일 시스템만 있다면, 모든 파일은 그 파일 시스템에 /usr를 포함한 모든 파일이 있게 된다.

명령어 ‘mount’는 파일 시스템을 마운트하는데 사용된다.

mount -av

위의 명령은 /etc/rc (부트 시 실행되는 시스템 초기화 파일)의 파일로부터 자동으로 실행된다. mount -av 명령은 파일 시스템의 정보와 /etc/fstab 파일의 내용으로 부터 마운트 포인트를 얻는다. fstab파일의 내용은 아래와 유사할 것이다.

# device directory type options /dev/hda2 / ext2 defaults /dev/hda3 /usr ext2 defaults /dev/hda4 none swap sw /proc /proc proc none

첫 번째 필드는 마운트되기 위한 파티션의 디바이스 이름이다. 두 번째 필드는 마운트 포인트이며, 세 번째 필드는 ext2(e2fs)나 minix(미닉스 파일 시스템)같은 파일 시스템의 형태를 지정한다. 마지막 필드는 마운트 옵션이 포함되며, 보통 “default”로 설정되어 있다.

여기서 볼 수 있는 것처럼, 스웹 파티션도 /etc/fstab 에 포함되어 있다. 명령어 ‘swapon -a’ 는 /etc/rc 로부터 실행되며, 이것은 /etc/fstab 의 스웹 디바이스의 목록에서 스웹을 가능하게 하는데 사용된다.

파일 fstab에서 /proc 파일 시스템은 특별한 엔트리이다. /proc 파일 시스템은 시스템 프로세스나 사용 가능한 메모리 등에 대한 정보를 저장하고 있다. /proc가 마운트 되어있지 않으면, ‘ps’ 같은 명령어는 사용할 수 없다.

이와 같이, ‘mount -av’ 명령어는 root 파일 시스템 이외의 모든 파일 시스템을 실제적으로 마운트하며, root 파일 시스템은 커널에 의해 부트 시에 자동적으로 마운트된다. 이 명령을 사용하는 대신에, 아래와 같이 파일 시스템을 손수 마운트 시킬 수 있다.

%%#%% mount -t ext2 /dev/hda3 /usr

이 명령은 /dev/hda3 파티션을 “ext2” 파일시스템으로 /usr 안에 마운트시킨다.

그럼 여기서 DOS로 포맷된 디스크를 사용하는 예를 들어보자.

%%#%% mkdir driveA
%%#%% moune -t msdos /dev/fd0 /driveA
%%#%% ls /driveA

이러한 형식으로, 플로피 디스크를 사용할 수 있으며, DOS, minix, ext2fs 등의 파일 시스템을 가지는 플로피 디스크를 읽을 수 있다. 또한, 디스크를 교환하거나 사용이 끝난 후에는 반드시 unmount 시키는 것에 주의해야 하며, ‘shutdown’, ‘halt’ 등의 명령으로 시스템을 종료하면, 자동적으로 다운되기 전에 unmount된다.

파일 시스템 검사 파일 시스템의 위험이나 손상에 대비하기 위해서 종종 체크하는 것이 좋다. 대부분의 시스템은 부트 시에 /etc/rc 파일 안에 있는 명령어에 의해 자동적으로 그 파일 시스템을 체크해준다.

파일 시스템을 체크하는 것은 파일 시스템의 형태에 따라 다르며, ext2fs 파일 시스템은 일반적으로 많이 쓰이는 형태로써 명령어 e2fsck 를 사용한다.

%%#%% e2fsck -av /dev/hda2

위의 명령어는 /dev/hda2 의 ext2fs 파일 시스템을 체크하고 에러가 있을 경우 교정한다.

파일 시스템을 체크하기 전에 unmount시키는 것이 보다 안전하다.

%%#%% umount /dev/hda2

위의 명령은 /dev/hda2를 unmount시킬 것이고, 후에 파일 시스템을 체크할 수 있다. 예외라면, 일단 부팅된 후에는 root 파일 시스템을 unmount 시킬 수 없다. root 파일 시스템을 체크하기 위해서는 unmount 되어야 하는데, 이것은 따라 boot/root 디스크를 사용하여 부팅 되었을 경우에 가능한데, 이것은 운영되는 프로세스가 사용되는 어떤 파일들도 unmount 시킬 수 없기 때문이다. 예를 들어, 어떤 사용자가 파일 시스템의 커런트 작업 디렉토리에 있다면, unmount 시킬 수 없게 된다. 사용되고 있는 파일 시스템을 unmount시키려 하면 “Device busy”에러를 받을 것이다.

파일 시스템의 형태는 efsck를 비롯한 여려 형태가 있기 때문에, 검사할 파일시스템마다 고유의 검사 프로그램을 사용해야한다. 이런 경우, 간단히 ‘fsck’ 명령어를 사용하면, 파일 시스템의 형태를 자동으로 검출하여 알맞은 검사 프로그램을 동작시켜 해당하는 파일시스템을 검사한다.

파일 시스템을 체크한 후에 바로 재부트하여야 그 파일 시스템에 어떤 에러 교정에 완벽을 기할 수 있다. 예를 들면, 만일 e2fsck가 파일 시스템의 어떤 에러를 교정하였다고 보고하면, 시스템을 재부트하기 위해서 즉시 shutdown -r을 해야 한다. 이것은 fsck 가 에러를 교정한다면, 시스템이 파일 시스템에 대한 정보를 re-sync 하게 허용한다.

물론, /proc파일 시스템은 이런 방법으로도 결코 체크되지 못한다. /proc는 메모리 파일 시스템이며, 커널에 의해 직접 관리되기 때문이다.

3.9 기타 작업

초기 설정 파일 시스템이 부트되면, 어떤 사용자가 시스템에 login하기 전에 수많은 스크립트들이 자동적으로 실행된다.

부트 시, 커널은 /etc/init 프로세스를 spawn한다. init는 설정 파일 /etc/inittab를 읽고, 이 파일의 내용을 기본으로 다른 프로세스들을 spawn한다. inittab의 가장 중요하게 시작되는 프로세스는 각각의 가상 콘솔로 시작되는 /etc/getty 프로세스이다. 이 getty 프로세스는 사용가능한 가상 콘솔을 잡고, VC로부터 login 프로세스를 시작한다. 이것은 각각의 가상 콘솔에 login 할 수 있도록 해준다. 만일 /etc/inittab가 확실한 가상 콘솔 프로세스로부터 getty를 포함하지 못한다면, 그 가상 콘솔로 login하는 것은 불가능하다.

/etc/inittab 로부터 실행되는 또 다른 프로세스는 /etc/rc이며, 이것은 메인 시스템을 초기화하는 파일이다. 이 파일은 부트 시에 필요한 초기화 명령의 shell 스크립트이며, 파일 시스템을 마운트시키는 등의 일을 한다.

시스템은 /etc/rc.local 같은 또다른 초기화 스크립트를 실행시킬 수 있다. /etc/rc.local은 보통 hostname을 설정하는 것 같은 특정한 초기화 명령을 포함하며, /etc/rc나 /etc/inittab 로부터 직접 호출될 것이다.

hostname 설정 네트워크 환경에서는 hostname 이 특정 기계의 단일 ID로서 사용된다. 혼자 쓰는 컴퓨터 환경에서의 hostname은 단지 시스템의 개인적인 특성으로 줄 수 있다.

시스템의 hostname을 설정하기 위해서는 명령어 ‘hostname’을 사용하면 된다. 만일 네트워크에 연결되어 있다면, 당신의 hostname은 nic.nm.kr 같은 전체의 hostname이 될 것이다. 그러나, 어떤 종류의 네트워크에도 연결이 되어 있지 않으면, 독단적인 host나 domainname을 선택할 수 있다.

hostname을 설정할 때, hostname은 /etc/hosts 파일 안에 나타나고 각각의 호스트의 IP 주소로 지정된다. 네트워크에 연결이 되어 있지 않더라도, /etc/hosts 안에 hostname이 있다.

만일 TCP/IP 네트워크에 연결되어 있지 않고, hostname이 bgs.com 이면, 간단히 /etc/hosts 안에 아래의 내용이 있을 것이다.

127.0.0.1 bgs.com localhost

이것은 bgs.com으로 hostname을 지정한 것이며, 네트워크를 사용하지 않는 다면 주소 127.0.0.1 로 loopback 된다. localhost 라고 이름지어진 것은 이 주소를 로컬로 지정하는 것이다.

파일 링크 관리 Link는 하나의 파일이 복수의 이름을 갖게 한다. 파일은 실제적으로 시스템에 그들의 inode 번호로써 인식된다. (ls -i 명령어는 파일의 inode 번호를 출력한다.) 또한, 디렉토리는 각각의 파일 이름과 일치하는 inode 번호의 목록이며, 그 안에 있는 각각의 파일 이름은 특정 inode의 연결이다.

Hard links 명령어 ‘ln’ 은 하나의 파일에 다중의 연결을 생성하는데 사용한다. 예를 들면, 디렉토리 안의 파일 foo가 있다 하자. ‘ls -i’ 명령을 하면, 이 파일의 inode 번호를 볼 수 있을 것이다.

%%#%% ls -i foo
22192 foo
%%#%%

여기에서 파일 foo는 파일 시스템의 22192 라는 inode 번호를 가지고 있다. 우리는 foo와 연결하여 bar라는 것을 만들 수 있다.

%%#%% ln foo bar

‘ls -i’를 해보면, 우리는 같은 inode 의 두 파일을 볼 수 있다.

%%#%% ls -i foo bar
22192 bar 22192 foo

그럼, foo나 bar는 같은 파일 이름으로 액세스할 수 있다. 만일, foo를 변화 시키면 bar도 또한 변하게 된다. foo나 bar는 언제나 동일한 내용을 갖으며, 다른 이름을 갖는 두개의 파일이다.

이런 연결들은 하나의 inode로 직접 생성하기 때문에 hard link라고 부른다.

rm을 사용하여 파일을 지울 때, 실제적으로 파일의 한 link만 지운다.

# rm foo

이것은 오직, foo만 지워진 것이며, bar는 여전히 존재한다. 파일은 link가 전혀 없을 때 실제적으로 시스템에서 지워진다. 보통 파일은 하나의 link만을 가지고 있고, ‘rm’명령어로서 파일들은 지워진다. 어쨌든, 파일이 다중 연결되었을 경우 ‘rm’은 오직 하나의 link만 지우며, 파일을 완전히 지우기 위해서는 그 파일의 모든 link를 지워야 한다.

명령어 ‘ls -l’ 은 파일에 link 된 갯수를 포함하여 출력한다.

%%#%% ls -l foo bar
-rw-r--r-- 2 root root 12 Aug 5 16:51 bar
-rw-r--r-- 2 root root 12 Aug 5 16:50 foo
%%#%%

목록의 두 번째 칼럼의 “2”가 파일에 연결된 link된 수를 나타낸다.

Symbolic links Symbolic link는 link의 또 다른 형태이며, hard link보다 작업하기가 다소 어렵다. symbolic link는 하나의 파일에 다른 이름을 줄 수 있지만, inode에 의한 link는 아니다.

명령어 ln -s 는 파일의 symbolic link를 생성한다. 예를 들면, 아래와 같다.

%%#%% ln -s foo bar

Symbolic link 된 bar 파일은 파일 foo를 가리키는 것으로 생성된다. ‘ls -i’ 명령을 해보면, 우리는 두 개의 파일이 서로 다른 inode를 가지를 가지고 있음을 볼 수 있다.

%%#%% ls -i foo bar
22195 bar 22192 foo

어쨌든, ‘ls -l’을 사용하면, 파일 bar가 foo로 symlink 를 가리키고 있음을 볼 수 있다.

%%#%% ls -l foo bar
lrwxrwxrwx 1 root root 3 Aug 5 16:51 bar -> foo
-rw-r--r-- 1 root root 12 Aug 5 16:50 foo
%%#%%

기능적으로 symbolic link는 hard link와 유사하지만, 몇 가지 다른 점이 있다. 그 하나는 파일를 link 할 수는 있지만, 존재하지 않는다. 이것은 hard link와는 완전히 같지는 않지만 유사한 것이다. Symbolic link는 hard link와는 다르게 커널에 의해 처리되는데, 이것은 기술적인면이지만, 때로는 사용자에게 중요하다. Symbolic link는 파일이 어디를 가리키고 있는지 알려주어 도움이 되며, hard link는 파일이 같은 inode로 link 되기 때문에 쉽게 결정할 수 없다.

Link는 리눅스 시스템에서 많은 장소에 사용된다. Symbolic link는 /lib의 공유 라이브러리 이미지에 필수적으로 사용되는 중요한 것이다.

3.10 시스템 복구

시스템 관리자는 root 패스워드를 잊거나 파일 시스템이 깨지는 문제에 부닥칠 경우가 있다. 어려운 배우는 방법이기는 하지만 손상된 시스템을 실제로 복구해 보는 것이 훌륭한 관리자가 되는 최고의 방법인 것이다.

시스템을 처음부터 다시 설치하는 경우는 매우 적다. 대개의 새로운 사용자가 몇 개의 필수적인 시스템 파일을 지웠을 경우, 바로 배포본으로 부터 다시 설치하려고 하나 이것은 좋은 생각이 아니다. 이렇게 하기 전에 스스로 문제를 연구해 보고, 다른 이의 조언도 들어보면, 대부분, 관리 디스크로부터 시스템을 복구할 수 있을 것이다.

관리 디스크로부터 복구 시스템 관리자에게 필수적인 도구가 “boot/root disk”이며, 이것은 하드 드라이브의 의존 없이 리눅스 시스템을 완벽히 부트할 수 있는 플로피 디스크이다. Boot/root 디스크는 실제적으로 아주 간단하며, 플로피에 root 파일 시스템과 필요한 몇가지 유틸리티, LILO, 부트 커널을 포함한다. 또 다른 테크닉은 한 디스크는 커널을 위해 다른 하나는 root파일 시스템을 사용할 수 있다. 어느 것이나 결과는 같다. 또한, 플로피로 리눅스 시스템을 운영할 수 있다.

Boot/root 디스크의 표준적인 예제가 배포본의 a1 디스크이다. 이 디스크는 부팅 가능한 커널과, root 파일 시스템이 포함되어 있다. 보통, 이것은 배포본으로 설치할 때만 쓰이나, 시스템을 유지하는 데 매우 유용하다. 또한, H.J Lu boot/root 같은 다른 디스크도 있으며, 자신만의 boot/root 디스크를 직접 만들 수도 있다.

Boot/root 디스크의 사용은 매우 간단하다. 단지 시스템에 부트하고 root로 login (보통 패스워드는 없다.)하면 된다. 하드 드라이브의 파일을 액세스하려면, 아래와 같이 파일 시스템을 마운트시켜야 한다.

%%#%% mount -t ext2 /dev/hda2 /mnt

위의 명령은 /mnt 하에 /dev/hda2를 ext2fs 파일 시스템으로 마운트시킨다. 기억해 할 것은 여기서의 “/” 는 boot/root 디스크이다. 파일들을 액세스하기 위해 임의의 디렉토리에 하드 드라이브를 마운트시키는 것이 필요하다. 그러므로, /mnt에 root 파일 시스템을 마운트시키면, 결국 하드 드라이브의 /etc/passwd 는 /mnt/etc/passwd 가 된다.

root 패스워드 교정 만일 root 패스워드를 잊었을 경우는, 먼저 boot/root 디스크로 부트하고, /mnt 에 파일 시스템을 마운트한 후, /mnt/etc/password 안의 root의 패스워드 필드를 비우면 된다.

root::0:0:root:/:/bin/sh

이제 root는 패스워드가 없다. 하드 드라이브로 재부트하면, root로서 login할 수 있으며, passwd를 사용하여 패스워드를 재설정하면 된다.

Boot/root 디스크에는 Emacs같은 것은 아마도 없을 것이나 vi는 사용할 수 있을 것이다.

지운 파일의 복구 만일 시스템에서 중요한 파일을 실수로 지웠다면, “undelete”할 방법이 없다. 어쨌든, 관련 있는 파일을 플로피로부터 하드 드라이브로 복사할 수 있다. 예를 들어, 만일 시스템의 login할 수 있게 해주는 /bin/login을 지웠다면, 플로피로 부트하고, root 파일 시스템을 /mnt로 마운트한 후, 아래와 같은 명령으로 복사하면 된다.

%%#%% cp -a /bin/login /mnt/bin/login

여기서, -a 옵션은 파일이 복사된 후 사용 허가가 원본 그대로 보존되게 한다.

물론, 백업을 해 놓았다면, 언제든지 재저장할 수 있다.

3.11 초기화 파일들

Power on 부터 Prompt 까지 ㄱ. 컴퓨터가 켜지면, POST 과정에 의해 시스템이 초기화된다. ㄴ. Boot record 나 하드인 경우 Master boot record를 읽어 들인다. ㄷ. LILO가 실행된다. 만일, 디폴트인 리눅스가 로딩되기 전에 ctrl, shift, alt 중 하나를 누르고 있으면, LILO는 부팅할 운영체제를 물어 본다. ㄹ. Kernel이 메모리로 로딩되며, 만일 커널이 압축되었다면 압축을 해체한다. ㅁ. 커널은 하드, 플로피, 네트웤 어뎁터 등을 검사하며, 디바이스 드라이버를 설정한다. ㅂ. 리눅스는 프로세서를 보호 모드로 전환시킨다. 화면상의 변화는 나타나지 않는다. ㅅ. root 파일 시스템을 마운트시킨다. root 파일 시스템은 ‘rdev’나 LILO에 의해 설정되어 있으며, 파일 시스템의 형태는 자동적으로 검출된다. ㅇ. 커널은 /etc/init을 백그라운드로 실행한다. ‘init’는 ‘inittab’ 파일의 내용에 따라 실행된다. ㅈ. init는 /etc/rc 를 실행한다. ㅊ. ‘rc’ 는 /etc/rc.local 이나 /etc/rc.[0..9] 등을 실행시킨다. ㅋ. ‘init’ 프로그램은 가상 콘솔을 위해 /etc/gettytabs 에 의해 설정된 직렬 라인으로 getty를 실행한다. ㅌ. ID 와 패스워드를 입력한다. ㅍ. shell 이 작동하고, bash shell이면 .bashrc를 tcsh shell 이면 .profile을 불러들인다. ㅎ. 프롬프트가 표시된다.

INIT와 INITTAB init 실행 파일은 inittab 파일을 읽어 해당하는 프로세스를 수행한다. inittab파일은 아래의 형식을 가지고 있으며, 주로 사용자 login 레벨과 터미날 설정에 관한 명령들이 포함되어 있다.

id:runlevels:action:process

id : 각 엔트리를 구별하는 두 문자의 인식자이다. runlevels : 어떠한 runlevel로 실행할 것인가를 결정한다. action : 수행할 작업 process : 프로세스를 실행한다.

여기서, runlevel 이라는 것은 inittab파일을 실행할 때, 원하는 엔트리만을 수행하도록 1 부터 6까지의 숫자로 묶어 놓는다. runlevel이 문자 ‘s’ 라면, inittab 파일의 내용을 수행하지 않는다.

INITTAB 내용 설명

initdefault 시스템이 부팅한 후의 runlevel을 정한다. 만일 이 엔트리가 없다면, 부트 시에 물어 본다.

sysinit 부트 시에 자동으로 실행되는 것으로서 boot나 bootwait보다 먼저 실행된다.

boot 부트 시에 실행되는 것으로서 runlevel은 무시된다.

bootwait 부트 시에 실행되는 것으로서 /etc/rc 같은 외부 수행 프로세스가 끝날 때까지 기다린다.

respawn 해당하는 프로세스가 종료되면 바로 다시 실행한다.

powerwait 이 프로세스는 init가 전원에 문제가 있다는 SIGPWR 신호를 받을 때 실행되며, process가 종료될 때까지 기다린다.

ctrlaltdel init가 SIGINT 신호를 받을 때 실행한다. 이것은 CTRL-ALT-DEL가 눌려짐을 의미하며, 보통 시스템을 shutdown하고 재부팅한다.

INITTAB의 예제

%%#%%
%%#%% A sample of the new, SYSV compatible inittab.
%%#%%
%%#%% (This one runs on my machine every day)
%%#%%
%%#%% Level to run in. Set to 5 or 6 to allow serial port logins.
%%#%% If you comment this out, the system will ask you for a runlevel
%%#%% when it is booted.
%%#%%
id:6:initdefault:
%%#%%
%%#%% Sysinit: takes place only once, right after system boot, *before*
%%#%% possibly going single-user.
%%#%%
si::sysinit:/etc/update &
%%#%%
%%#%% boot & bootwait take place once too, but *after* possibly going
%%#%% single user.
%%#%%
rc::bootwait:/etc/rc
%%#%%
%%#%% Run the cron deamon.
%%#%% (This is now done from etc/rc)
%%#%%
%%#%%cr::boot:/usr/bin/crond
%%#%%
%%#%% Normal levels: 1-4 = virtual consoles 5,6 = COM ports.
%%#%% Ofcourse you can change this to suit your taste.
%%#%%
%%#%% BEWARE: where is your getty? in /bin or in /etc?
%%#%%
c1:123456:respawn:/etc/getty 9600 tty1
c2:23456:respawn:/etc/getty 9600 tty2
c3:3456:respawn:/etc/getty 9600 tty3
c4:456:respawn:/etc/getty 9600 tty4
c5:456:respawn:/etc/getty 9600 tty5
c6:456:respawn:/etc/getty 9600 tty6
%%#%%
%%#%% Uncomment the lines below for hard wired terminals.
%%#%%
%%#%%c7:456:respawn:/etc/getty 9600 ttyS0
%%#%%c8:456:respawn:/etc/getty 9600 ttyS1
%%#%%
%%#%% The lines below are for dial-in modems.
%%#%%
%%#%%c7:456:respawn:/etc/uugetty 9600 ttyS0
%%#%%c8:456:respawn:/etc/uugetty 9600 ttyS1
%%#%%
%%#%% The powerfail routines, that take care of a graceful shutdown.
%%#%% In our case, CTRL-ALT-DEL was pressed.
%%#%%
pf::powerwait:/etc/shutdown -rf now > /dev/console < /dev/console 2>&1
%%#%% What to do at the "Three Finger Salute".
ca::ctrlaltdel:/etc/shutdown -t3 -rf now
%%#%% End of /etc/inittab

RC 파일 RC 파일은 inittab 파일이 실행된 후에, 자동으로 실행되는 파일이며, 시스템을 부팅하기 위한 마운트 작업과 파일 시스템 검사등의 명령들이 포함되어 있다.

RC 예제

%%#%% /etc/rc
%%#%%
%%#%% These commands are executed at boot time by init(8).
%%#%% User customization should go in /etc/rc.local.
PATH=/bin:/usr/bin:/etc
%%#%% enable swapping
/etc/swapon -a /dev/hdb6
%%#%% Check the integrity of all filesystems
/bin/fsck -A -a
%%#%% If there was a failure, drop into single-user mode.
if [ $? -gt 1 ] ; then
 echo fsck failed. Please reboot.
 sh
fi
%%#%% Remount the root filesystem in read-write mode
ROOTDEV="`mount | head -1 | cut -b 1-10`"
echo "Remounting root device with read-write enabled."
/etc/remount/mount -n -o remount $ROOTDEV /
%%#%% remove /etc/mtab* so that mount will create it with a root entry
/bin/rm -f /etc/mtab* /etc/nologin /etc/utmp
%%#%% Looks like we have to create this.
cat /dev/null >> /etc/utmp
%%#%% mount file systems in fstab (and create an entry for /)
%%#%% but not NFS because TCP/IP is not yet configured
/etc/mount -avt nonfs
%%#%% start the update(8) sync demon
%%#%% Note: this is already done by inittab - so out it goes.
%%#%% /etc/update &
%%#%% remove stale locks (must be done after mount -a!)
/bin/rm -f /usr/spool/locks/* /usr/spool/uucp/LCK..* /tmp/.X*lock 1> /dev/null 2> /dev/null
%%#%% remove stale hunt sockets so the game can start
if [ -r /tmp/hunt ]; then
 echo "Removing your stale hunt sockets from /tmp..."
 /bin/rm -f /tmp/hunt*
fi
%%#%% This runs the cron daemon and enables 'at'
echo "Starting the cron daemon..."
/etc/crond
%%#%% This starts the line printer daemon:
if [ -x /etc/lpd ]; then
 echo "Starting the line printer daemon..."
 /etc/lpd
fi
%%#%% do any local stuff
/bin/sh /etc/rc.local
if [ -r /tmp/hunt.stats ]; then
 echo "Cleaning up your old hunt game sockets from /tmp..."
 rm -f /tmp/hunt*
fi

RC.LOCAL 파일 이 파일은 보통 rc 파일에 의해서 호출되는 프로그램이며, 시스템에 관련된 사항들, 즉 네트웍에 연결되어 있다면, hostname 이나 domainname 등의 명령이 포함되어 있다.

RC.LOCAL 예제

/bin/setterm -blank 10
if [ -x /etc/rc.d/rc.inet1 ]; 
 then
 /bin/hostname bgs
 /bin/domainname root.org
 /bin/sh /etc/rc.d/rc.inet1
 /bin/sh /etc/rc.d/rc.inet2
 else
 /etc/old.hostname darkstar
fi
if [ -x /etc/clock ]; then
 /etc/clock -s
fi
%%#%% This is done by /etc/rc.d/rc.inet2
%%#%% if [ -x /usr/etc/syslogd ]; then
%%#%% /usr/etc/syslogd # turn on logging of su's, logins etc.
%%#%% fi

if [ -x /usr/bin/syslogk ]; then

/usr/bin/syslogk on > /usr/adm/kernel& # log all kernel messages.

fi
%%#%% Apparently running this daemon is not required for smail to work...
%%#%% Start the smail daemon running
%%#%% echo "Starting the smail daemon..."
%%#%% /usr/lib/sendmail -q10m

3.12 /etc, /usr/etc Directory

/etc와 /usr/etc 디렉토리는 시스템의 부팅, 셧다운 시에 필요한 파일들과 시스템의 전반에 걸친 설정 파일들 및 초기 스크립트 파일들이 있다. 시스템에 어떠한 문제가 발생한다거나, 시스템 전체 환경에 관한 설정을 바꾸기 위해서는 이들 디렉토리내에 포함되어 있는 파일들에 대하여 잘 알아야 한다.

/etc/rc

/bin/sh shell이 시스템이 부트되면, 자동적으로 실행되는 스크립트이다. 이것은 update, crond, inetd 같은 프로그램을 백그라운드로 실행시키며, 파일 시스템 마운팅, 스웹 영역 활성, 그리고 이런 유사한 다른 작업들을 한다. /etc/rc.local 과 /etc/rc.[0-9] 파일이 포함되기도 한다.

/etc/passwd

사용자에 대한 정보를 포함하고 있는 문서 파일이다.

/etc/fdprm

플로피 디스크 파라미터 표이다.

/etc/fstab

이 파일은 /etc/rc 파일 안의 mount -a 명령에 의해 마운팅되는 파일 시스템과 스웹 영역의 목록이다.

/etc/getty

이 프로그램은 터미널로 누군가가 login하기를 기다린다. 명령어 init에 의해 자동적으로 실행되며, login가능한 터미널 라인이나 가상 콘솔 당 한번씩 실행된다. 또한, 사용자의 패스워드를 기다리며, login을 실행한다.

/etc/gettydefs or /etc/gettytab

getty가 터미널 라인의 속도, 패러티 검사 등을 어떻게 사용할 것인가를 설정한다.

/etc/group

/etc/passwd와 유사하며, 사용자 대신에 그룹을 설정한다.

/etc/init

이 프로그램은 부팅 시에 커널에 의해 첫 번째 프로세스로 실행된다. init가 실행된 후에 커널을 부팅이 완료된다. init는 /etc/rc와 gettys 등을 실행한다.

/etc/inittab

init가 시작할 때의 gettys의 목록 파일이다.

/etc/issue

로그인 프롬프트 이전에 출력되는 getty 출력 문서 파일이다.

/etc/magic

명령어 file의 설정 파일이며, file이 파일의 형식을 알게 해주는 다양한 형식이 기술되어 있다.

/etc/mtab

이 파일은 마운팅된 파일 시스템을 포함하고 있다. /etc/rc와 mount나 unmount 명령에 의한 셋업이며, 마운팅된 파일 시스템의 목록이 필요할 때 사용된다.

/etc/mtools

유닉스 상에서 MS-DOS 포맷 디스크를 사용하게 해주는 mtools를 위한 설정 파일이다.

/etc/shadow

시스템의 shadow 패스워드를 포함하는 파일이다.

/etc/login.defs

login 명령에 사용되는 설정 파일이다.

/etc/printcap

/etc/termcap 과 유사하며, 프린터를 사용할 때(lpr) 쓰인다.

/etc/profile

Bourne shell(/bin/sh or bash)에 의해 로그인할 때 실행되는 파일이다.

/etc/securetty

터미널을 보안하는 것으로서, root는 이 파일에 열거된 터미널로 로그인 할 수 있다. 보통 가상 콘솔들이 열거되어 있으며, 모뎀이나 네트웤으로 시스템에 접근하여 수퍼 유저의 권한을 얻는 것을 막을 수 있다.

/etc/shells

shell의 목록으로 chsh 명령으로 사용자 로그인 shell을 바꿀 때, 이 파일의 목록에 있는 shell만 바꿀 수 있게 한다.

/etc/termcap

터미널의 기능 데이터베이스이다. 이것은 문서 파일로서 ESCAPE 문자들로서 터미널을 제어할 때 사용된다.

/etc/ttytype

터미널 라인을 위한 디폴트 터미널 형태의 목록이다.

/etc/update

/etc/rc 에 의해 백그라운드로 실행되는 프로그램의 하나로 매 30 초마다 버퍼 캐시에 있는 하드로 쓰여지지 않은 데이터를 저장한다. 이러한 것은 전원의 단절이나, 커널의 이상 등을 대비하여 매 30초마다 데이터를 저장함으로서 데이터 손실의 위험부담을 줄이는 것이다.

/etc/utmp

각각의 터미널에 로그인한 사용자나, 로그인에 관한 정보가 기록되어 있는 이진 파일이다. 사용자가 로그인하면, login은 누가 로그인을 하고 언제 로그 아웃을 하였는가에 대한 정보를 기록한다.

/etc/wtmp

/etc/utmp와 유사하며, 단지 존재하는 정보를 덮어쓰지 않고 계속 추가된다.

/etc/ftpusers, /etc/ftpaccess, /etc/rpc, /etc/rpcint, /etc/exports 네트워크에 관한 파일들이다.

4.Advanced Features

4.1 The X Window System

설치와 사용

4.2 DOS 파일 액세스

Mtools

4.3 DOSEMU 4.4 파일 변환 프로그램 4.5 사운드

이 장은 리눅스를 활용하는 몇 가지의 사항에 대해서 소개하려 한다. 먼저, 유닉스 기반의 GUI 환경인 X Window System을 소개하며, DOS 파일 시스템을 억세스하는 방법과 DOS 응용 프로그램을 리눅스 상에서 사용할 수 있게 하는 DOSEMU 라는 에뮬레이터를 소개한다. 그리고, DOS 와의 문서 파일 교환을 위한 몇개의 프로그램들과 사운드 카드를 활용하는 방법을 소개한다.

4.1 The X Window System

X 윈도우 시스템은 크고 강력하며, 때로는 복잡하기도 한 유닉스 시스템의 그래픽 환경이다. 초기 X 윈도우 코드는 MIT에서 개발되었고, 상업 벤더들은 유닉스 플랫폼으로 산업 표준으로 만들었다. 세계의 모든 워크스테이션은 다양한 종류의 X 윈도우를 지원한다. 80386/80486 유닉스 시스템을 위한 공개 이식된 MIT X 윈도우즈 버전 11, 릴리즈 5(X11R5)는 David Wexelblat가 이끄는 프로그래머 팀에 의해서 개발되었다. 이 릴리즈는 XFree86으로 알려져 있으며, System V/386, 386BSD와 여러 i386 유닉스, 그리고 리눅스에서 구현되었다. 이것은 실행 파일, 유틸리티, 라이브러리 파일과 도구들이 포함되어 있다.

그럼, X 의 몇가지 특징에 대해서 알아보자. 첫째로, 뛰어난 이식성을 들 수 있다. 아마도, X의 이식성은 어떠한 소프트웨어나 환경보다도 가장 강력한 장점 중의 하나일 것이다. 유닉스를 운영하는 PC를 비롯하여, 거의 모든 워크스테이션에 이식되어 있으며, Mac 이나 Amiga 에서도 가능하며 Cray 같은 수퍼 컴퓨터에서도 구동된다. 당신이 만약 프로그래머라면, 가장 많은 종류의 컴퓨터에서 구동되는 프로그램을 짤 수 있을 것이다. 둘째로, 투명한 네트웍을 가진다. X는 단순한 그래픽 환경이 아닌 네트웍 기반의 그래픽 환경이다. 예를 들면, X 프로그램의 출력을 네트웍에 연결된 타 컴퓨터에 보낼 수 있으며 다른 컴퓨터에서 동작하고 있는 프로그램의 결과를 자신의 컴퓨터에서 보는 것도 가능하다. 세째로, 독립적 디스플레이를 가진다. X 프로그램은 디스플레이 장치에 특별히 의존하지 않는다. 따라서, 모노 스크린 부터 Super VGA에 이르기까지 별 제한없이 프로그램이 동작한다. 네째로 윈도우 자원들이 정의되어 있지 않다. 스크롤바, 아이콘, 색상 등의 그래픽 환경에 필요한 자원들이 특정한 형태로 정의되어 있지 않다. 따라서, 응용 프로그램들이 다양한 모습을 가질 수 있으며, 특정한 틀로서 구속되지 않는다. 또한 윈도우 메니저가 정해져 있지 않으므로 임의의 윈도우 메니져를 선택하여 사용할 수 있다. 현재는 Mitif 와 Open Look이 주류를 이루고 있으며, twm이나 fvwm 등도 많이 사용된다.

하드웨어 요구 XFree86은 다양한 비디오 컨트롤러와 모니터를 지원하며, SVGA 칩셋 및 액셀레이터 칩셋들도 제공한다.

Tseng ET3000, ET4000, ET4000/W32 Western Digital/Paradise PVGA1 Western Digital WD90C00, WD90C10, WD90C11, WD90C30, WD90C31 Genoa GVGA Trident TVGA8800CS, TVGA8900B, TVGA8900C, TVGA8900CL, TVGA9000 ATI 28800-4, 28800-5, 28800-a NCR77C22, 77C22E Cirrus Logic CLGD5420, CLGD5422, CLGD5424, CLGD5426, CLGD5428 Compaq AVGA. OAK OTI067, OTI077 8514/A ATI Mach8, Mach32 Cirrus CLGD5420, CLGD5422, CLGD5424, CLGD5426, CLGD5428 S3 86C911, 86C924, 86C801, 86C805, 86C8051, 86C928

위에 나열한 것은 모두 256 컬러와 모노크롬 모드가 제공되며, 단, ATI와 Cirrus 칩셋만이 256 컬러만 지원된다.

모노크롬 서버는 또한 단일 뱅크의 64k 비디오 메모리를 가지는 일반적인 VGA카드와 허큘리스 카드를 제공한다. Diamond SpeedStar 24는 ET4000을 사용하지만 지원되지 않으며, 로컬 버스도 지원하므로 보다 빠른 속도를 느낄 수 있다. 리눅스 하에서 XFree86을 486에 RAM 8MB, ET4000 VESA를 사용한 시스템에서 일반적인 셋업을 했을 때 매우 빠르다고 알려졌으며, 중저가의 컬러 워크스테이션의 성능과 비슷하거나 더 빠르다고 한다.

XFree86 설치 만일 XFree86을 SLS나 TAMU, Slackware 같은 표준 리눅스 배포본으로 설치하였다면 모든 파일들은 이미, 적당한 장소에 설치되어 있을 것이다.

만일 X가 포함되어 있지 않으면, 아래의 파일들을 구하여 설치할 수 있다. 실행 파일 배포본은 여러개의 gzipped far 파일로 되어 있으며 루트 디렉토리에서 풀면 된다. 설치는 간단히 이 tar 파일들을 풀면, 모든 파일은 적당한 디렉토리에 위치하게 될것이다.

Package Name Description — xf86-bin-2.1.tar.gz Essential binaries and setup files; required. xf86-kit-2.1.tar.gz X Server link kit. Only needed to hack the X Server. xf86-lib-2.1.tar.gz Dynamic libraries, bitmaps and minimal fonts xf86-man-2.1.tar.gz Man pages. xf86-pex-2.1.tar.gz PEX utilities, for the PEX programming environment. xf86-prg-2.1.tar.gz X11 include files and libraries. Needed to write X programs. xf86-fnt-2.1.tar.gz Extra fonts. XF86_VGA16.tar.gz A server for 16 color graphics modes. XF86_SVGA.tar.gz An SVGA server (most chipsets use this).

만일, 소스파일로 받았다면 알맞게 컴파일하여야 한다. 컴파일시에 사용되는 설정파일로는 /usr/X386/lib/Server/site.def 파일이 있다. 이 파일은 아래의 내용을 포함하고 있다.

%%#%%define XF86SVGAServer		YES
%%#%%define XF8616Server		YES
%%#%%define XF86MonoServer		YES
		:
		:

네트워크 환경이 아니라면, 위의 모든 서버를 컴파일 할 필요는 없으며, 필요한 서버만을 컴파일하기 위해 불필요한 선언문은 ‘NO’ 로 정의한다. 또한 아래의 선언문을 정의하면, PEX 를 구현할 수 있다.

%%#%%defind BuildPexExt		YES

PEX 프로그램으로는 Slackware의 경우에 ‘auto_box’, `pblpex' 등의 프로그램이 포함되어 있다.

설정이 끝난 후에는 아래의 순서대로 입력하여, 컴파일한다.

./mkmf
make
make install

이 과정까지 끝나면, 모든 파일은 적당한 장소로 옮겨 진다.

소프트웨어를 설치한 후에, /usr/X386/lib를 /lib로 공유 라이브러리를 link하는 것이 필요하다. 아래는 그 한 가지 방법이다.

%%#%% ln -s /usr/X386/lib/lib*.so.? /lib

만일 SVGA 컬러 서버로 사용하길 원한다면, /usr/bin/X11/X 파일을 /usr/bin/X11/XF86_SVGA 파일과 link 시켜야 한다. 모노크롬 서버로 대신하길 원한다면, 이 파일을 XF86_MONO과 relink시켜야 할 것이다.

%%#%% ln -sf /usr/bin/X11/XF86_SVGA /usr/bin/X11/X

XFree86 설정 XFree86의 셋업은 대부분 어렵지 않다. 단지, 표준이 아닌 하드웨어로 XFree86을 설정할 때는 어떤 문제점이 있을 수 있다.

XFree86의 주 설정 파일은 /usr/bin/X11/Xconfig 이다. 이 파일은 마우스, 비디오 카드 파라미터 등의 정보를 포함하고 있으며, 이 파일의 내용에 따라 XFree86의 동작이 결정된다. 파일 Xconfig.sample은 XFree86 배포본에 예제로 제공되므로 이 파일의 이름을 Xconfig로 바꾼후 홈 디렉토리로 복사하면 대부분 바로 사용할 수 있다. 비디오 카드는 수많은 "dot clocks"이라는 것으로, 화면의 해상도와 모니터의 주파수를 결정한다. 또한, Xconfig 파일은 각각의 컬러 SVGA 를 위한 vga256이 vga16 등과 같은 서버 목록이 존재하며, 마우스, 키보드 등을 설정하는 행들을 포함하고 있다.

각각의 서버의 행들은 비디오 카드의 가상 해상도와 칩셋 등을 설정한다. 또한, 보통 해상도라고 불리우는 Mode는 비디오 카드의 유용한 모드를 설정한다. Xconfig 파일의 내용을 보면 아래와 같은 사용 가능한 해상도를 설정하는 행이 있을 것이다.

Modes "640x480" "800x600" "1024x768"

이 행의 각각의 모드는 Xconfig 파일 끝에 있는 modeDB의 인덱스이다. 파일의 이 부분이 각 모드의 실제 비디오 파라미터를 결정하게 된다.

Xconfig 파일의 modeDB 부분이 가장 중요하다. 이부분은 각각의 비디오 카드와 모니터에 따른 여러 해상도의 타이밍과 동기주파수를 가지고 있으며, 이 타이밍과 동기주파수가 사용하는 하드웨어에 적당하지 않다면, 그래픽 모드로의 전환에 문제가 생길 것이다. /usr/lib/X11/etc/modeDB.txt 는 많이 사용되는 여러 모니터와 비디오 카드의 데이터를 포함하고 있다. 또한, 대부분의 카드와 모니터는 VESA 표준 타이밍을 사용하기 때문에 Xconfig.sample 을 그대로 사용할 수 있을 것이다.

/usr/lib/X11/etc 디렉토리의 다른 여러 문서를 반드시 읽는 것이 좋으며, 또한 VideoModes.txt 파일은 만일 modeDB.txt의 내용으로도 설정할 수 없을 경우 모니터의 주파수 타이밍을 해킹하는 방법을 가르쳐 줄 것이다.

.Xconfig 파일 예제 이 파일은 국내에서 많이 사용되는 저가의 14인치 컬러 모니터와 Tseng 칩셋과 Trident 칩셋의 비디오 카드에서 정확히 동작하는 것이다. 이 파일은 초기 해상도는 “800x600”이며, 가상해상도는 “1024x768”이다. 여분으로 설정한 “640x480”과 “1024x768” 해상도는 X가 실행된 후에 “CTRL-ALT-(+)”와 “CTRL-ALT-(-)” 키로서 변경할 수 있다.

RGBPath "/usr/X386/lib/X11/rgb" FontPath "/usr/lib/X11/fonts/75dpi/,/usr/lib/X11/fonts/Speedo/,/usr/lib/X11/fonts/misc/" Keyboard AutoRepeat 500 5 ServerNumLock LeftAlt Meta RightAlt Compose ScrollLock ModeLock Microsoft "/dev/mouse" BaudRate 1200 Emulate3Buttons vga256 Virtual 1024 1024 ViewPort 0 0 Modes "800x600" "640x480" "1024x768i" Chipset "et4000" Displaysize 800 600 Clocks 25.30 28.32 45.00 36.00 57.30 65.10 50.40 39.90 vga2 Virtual 800 600 ViewPort 0 0 Modes "800x600" "640x480" ModeDB # name clock horizontal timing vertical timing flags "640x480" 25 640 672 768 800 480 490 492 525 "800x600" 36 800 840 912 1024 600 600 602 625 "1024x768i" 45 1024 1048 1224 1264 768 768 776 816 Interlace

X 구동 XConfig 파일을 알맞게 설정하였다면, 명령어 ‘startx’나 ‘openwin’으로 서버를 시작할 수 있다. 그전에 몇 가지 고려해야 될 것이 있다. 디렉토리 /usr/bin/X11 이 사용자의 path에 있어야 한다. 이 디렉토리는 X의 모든 실행 파일과 서버 자신이 포함되어 있다.

또한, X 서버는 전환 가능한 여분의 가상 콘솔을 요구한다. X는 하나의 가상콘솔을 그래픽 모드로 설정한 후 시작하기 때문에 초기에 가상 콘솔을 설정하지 않았거나, 현재 모두 사용하고 있다면 X를 구동할 수 없다. 여분의 가상 콘솔이 초기에 설정되어 있지 않다면, /etc/initab를 편집하여 각 VC의 login process 를 시작할 수 있는 getty 행 중 하나를 지우는 것이다. 예를 들면, /dev/tty1 부터 /dev/tty7까지는 getty 가 되고, /dev/tty8은 설정하지 않는다. 제대로 설정되었다면, X를 운영하고 있는 도중에 [ctrl-alt-F1] 부터 [ctrl-alt-F12]의 키로서 가상 콘솔을 서로 전환할 수 있으며, 다시 X로의 전환은 [ALT+(X의 콘솔)] zlfhtj rksmdgkek.

X 윈도우를 실행하면, $HOME/.xinitrc를 읽어 들인다. 이 파일은 X 서버가 시작된 후에 실행될 명령어를 포함하고 있는 shell 스크립트이다. 만일 이 파일이 존재하지 않는다면, /usr/lib/X11/xinit/xinitrc 가 대신 사용된다.

X 사용법 shell의 종류도 여러 가지 듯이 X에서 사용하는 윈도우 매니저도 여러 가지가 있다. 많이 사용되는 것이, twm, fvwm, olvwm 등이 있으며, 여기서는 open look 윈도우 메니져인 olvwm(‘openwin’ 으로 실행)을 간단히 소개한다.

Olvwm(openwin) X가 뜨면, 화면의 좌상단에 가상 데스크탑(Virtual Desktop)이 보일 것이다. 이것은 화면을 넓게 사용하는 것으로서, 간단히 좌측 버튼을 더블 클릭하면, 해당하는 화면으로 이동할 수 있다. 또한, 가상 데스크탑 안에서 윈도우들을 드래깅하여 이동시킬 수도 있다.

윈도우 매니저는 마우스의 우측 버튼을 누르면(fvwm은 좌측 버튼), 윈도우 메뉴가 보이며, 윈도우 상단 좌측의 핀 위에서 버튼을 놓으면, 윈도우가 고정된다. 이렇게 고정된 윈도우는 핀을 해제하기 전까지는 계속 존재하게 된다.

윈도우에 관한 마우스의 사용은 Windows, OS/2 등과 유사하며, 몇 가지 다른 점은 아래와 같다.

윈도우 메뉴( Close, Move, Resize, Quit 등 )는 마우스 우측 버튼으로 호출한다. 프로그램에 따라 윈도우 안의 어디에서나 호출되는 것도 있으며, 그렇지 않은 경우는 타이틀바 위치에서 클릭하여야 한다.

프로그램마다 스크롤바가 다를 수 있다. 이것은 X의 특징이기도 한데, X에서는 자원들을 MS-Windows나 OS/2같이 특정한 형태를 정의되어 있지 않으며, 응용프로그램에 의해 결정된다. 특정형태로 스크롤 박스를 움직일 수 있는 것도 있으나 많지 않으며, 대부분은 좌측 버튼은 수평 스크롤바와 수직 스크롤바를 각각 우측과 아래로 스크롤되게 하며, 우측 버튼은 좌측과 위로 스크롤된다. 스크롤되는 정도를 조정하기 위해서는 각각의 스크롤바의 좌측과 상단 끝 위치에서의 클릭은 보통 한 라인 정도가 스크롤되며, 최하측과 최우측에서의 클릭은 한 페이지 단위로 스크롤된다.

Openwin의 윈도우 메뉴들은 `/usr/openwin' 디렉토리의 `openwin-menu'의 이름을 갖는 문서 파일로 저장되어 있다. 이 파일로부터 초기 메뉴가 출력되며, 서브 메뉴를 각각 호출하게 된다. 이 파일들을 수정함으로써 독자 나름대로의 윈도우 메뉴를 구성할 수 있다.

덧붙여, X 응용 프로그램 몇가지를 소개한다.

doc : 에디터이며, 뒤에 설명할 TeX 형식으로 저장해 준다. idraw : 그래픽 프로그램이며, Postscript 파일을 만들어 준다. xpaint : 드로잉 포로그램이며, 그림에 몇가지 효과를 넣는 기능을 갖는다. xdvi : dvi 파일을 화면상으로 보여준다. ghostview : Postscript 파일을 화면과 프린터로 출력시킨다. xmp : MID 음악파일 연주기. xmix : 음악 Mixer. xtetris : TETRIS ! xtank : 탱크 게임. xspread : Spread sheet. seyon : 통신 프로그램.

X 끝내기 보통, .xinitrc 파일의 마지막으로 시작한 클라이언트는 X 를 깨끗하게 shutdown시키는 데 사용된다. 예를 들면, .xinitrc의 마지막 명령이 exec twm 이면, twn 프로세스를 죽인다. 이것은 결국, X를 shutdown하는 것이다.

만일, 어떤 이유로 즉시 X 서버를 종료할 경우에는 [ctrl-alt-backspace]를 사용 할 수 있다.

4.2 DOS 파일 액세스

DOS 액세스 공개 배포본을 모두 설치하였다면, 아래의 과정들은 자동적으로 설정되었을 것이며, mtools도 설치되었을 것이다. 확인을 위해 “mdir a:”를 해볼 수 있다.

MS-DOS 파일을 액세스하려면, MS-DOS 파티션이나 플로피를 마운트시켜야 한다. 예를 들면, /dev/fd0 에 MS-DOS 플로피가 있다면,

%%#%% mount -t msdos /dev/fd0 /mnt

위의 명령은 /mnt 디렉토리로 A: 드라이브를 마운트한다.

또한 하드 드라이브의 MS-DOS 파티션을 마운트 시킬 수 있다. 만일 MS-DOS 파티션이 /dev/hda1 이라면, 아래의 명령으로 마운트 될 것이다.

%%#%% mount -t msdos /dev/hda1 /mnt

사용이 끝났으면 파티션을 반드시 umount 시켜야 한다.

/etc/fstab에 MS-DOS 파티션에 관한 정보를 포함시킴으로서 부트 시에 자동적으로 마운트 시킬 수 있다. 예를 들면, /etc/fstab 파일에 /dev/hda1 파티션을 /dos 디렉토리 마운트 시킬 수 있다. 이것은 아래의 행을 /etc/fstab 안에 포함시키면 된다.

/dev/hda1 /dos msdos defaults

덧붙여 말하면, X 윈도우 하에서 Microsoft Windows를 운영하는 방법이 개발 중에 있다(WINE 프로젝트). 뉴스 그룹이나 FTP site에 더 많은 정보가 있다.

Mtools Mtools는 유닉스에서 DOS를 액세스하는 유틸리티의 모음이다. 명령어들은 모두 "m"자로 시작하며, 그 뒤는 DOS의 명령어와 같다.

예를 들면, mdir, mcd, mcopy, mtype, mformat, mread, mwrite 등이 있으며, DOS에서와 동일하게 작동한다. 주의해야 할 것은 디렉토리는 DOS의 형태인 ‘\’가 아닌 유닉스의 형태인 ‘/’로 지정해야 한다.

보기를 보이면, “mcopy c:/i/down/emacs.tar .” C: 드라이브(DOS)의 emacs.tar 파일을 유닉스의 현재 디렉토리로 복사한다.

4.3 DOSEMU

리눅스 상에서 DOS용 프로그램을 사용할 수 있게 해주는 패키지이다. 현재까지는 속도와 호환성에 문제가 있지만, 유용하게 사용될 수 있다.

설치 1. 소스 파일로 제공된다면 아래의 명령으로 컴파일한다. make config; make dep; make install 2. 패키지에 포함되어 있는 hdimage 파일을 홈 디렉토리로 복사한다. cp /usr/src/dosemu/hdimage ~/ 3. config 파일을 편집한다.

config 예 아래의 예제는 A: 드라이브에 부팅 디스켓을 만들어 사용할 경우이다. C: 드라이브로 부팅할 경우는 bootA의 부분을 bootC로 바꾸어 주면 된다. DOSEMU가 동작하면, C: 드라이브는 DOSEMU에 의해 사용되는 램드라이브가 되며, 원래 C: 드라이브는 D: 드라이브로서 동작한다. 따라서 프로그램의 경로를 설정해야하는 DOS의 프로그램일 경우, D: 드라이브로 다시 셋업해 주어야 한다.

# Linux dosemu # debug +idv-kmx debug -a

keyint on timint on

serial { mouse device /dev/mouse }

video { vga console graphics chipset et4000 memsize 1024 } #video { vga console graphics } #video { vga console graphics chipset et4000 memsize 1024 vbios_file /etc/dosemu } #video { vga console }

RawKeyboard # don't include this if you don't want it mathco on # on or off cpu 80386 # or 80486 bootA # or bootC xms 2048 # XMS size in KiloByte, or off #ems 2048 # EMS size in KiloByte, or off

ports { 0x388 0x389 } # for SimEarth speaker native # also off or emulated

ports { 0x21e 0x22e 0x23e 0x24e 0x25e 0x26e 0x27e 0x28e 0x29e } # for jill

# HARD DISKS disk { image "hdimage" } #disk { partition "/dev/'hda1" 1 readonly } # 1st partition on 1st disk disk { wholedisk "/dev/hda" } # 1st partition on 1st disk

# FLOPPY DISK #floppy { heads 2 sectors 18 tranks 80 threeinch file diskimage } floppy { device /dev/fd0 threeinch } floppy { device /dev/fd1 fiveinch }

printer { options "%s" command "lpr" timeout 5 } #printer { options "-p %s" command "lpr" timoout 5 } # pr format it #printer { file "lpt3" }

사용 가능한 프로그램 PC SHELL, Q editor, 4DOS, Norton, Staker, Superstore, CShow, Window 3.0 ( real mode ), Borland TASM/TLINK, Turbo C, Turbo debugger, Turbo Pascal 5.5, Word Perfect, dBase III+, Fox Pro, Lotus, F19 , SimCity, Flight Simulator 등등.

4.4 파일 변환 프로그램

DOS의 문서 파일(TEXT)과 유닉스 하의 문서 파일은 완전히 일치하지는 않는다. DOS에서 유닉스의 문서 파일을 불러오면 개행(newline)이 되지 않으며, DOS의 문서 파일을 유닉스로 불러오면 한 라인의 끝마다 ‘^M’ 개행 문자가 표시된다. 아래의 프로그램들은 DOS와 유닉스간의 문서 파일을 적당히 변환시키는 프로그램들이다. 컴파일하는 방법은 “make 소스파일명” 하면, 원하는 실행 파일이 만들어진다.

MKCR.C 유닉스의 문서 파일을 DOS의 문서 파일로 변환시킨다. 또한, 몇몇 프린터(HP Deskjet)는 유닉스의 문서 파일을 바로 출력시킬 수 없기 때문에 인위적으로 개행 문자를 넣어 주어야 한다. 이 프로그램은 필터로 사용되며, 적당한 DOS 문서 파일이나 개행하지 않는 프린터가 개행할 수 있도록 변환시킨다.

#include <stdio.h>

void main() { char CHAR;

while ( ( CHAR = getchar() ) != EOF ) { if ( CHAR ===== 10 ) { CHAR = 13; putchar( 10 ); } putchar( CHAR ); } }

RMCR.C DOS의 문서 파일을 유닉스에서 불러올 경우 각 행의 끝에 개행 문자 '^M'이 붙어 있다. 이 프로그램은 이 개행 문자를 제거해 준다. 이것은, 파일 중에 특정 문자를 변환하거나 제거하는 ‘tr’ 명령을 사용할 수 있다.

#include <stdio.h>

void main() { char CHAR;

while ( ( CHAR = getchar() ) != EOF ) { if ( CHAR ===== 13 ) CHAR = 10; else putchar( CHAR ); } }

CLEAN.C 이 프로그램은 man 명령어에 의한 도움말을 DOS 문서 파일로 변환한다.

#include <stdio.h>

void main() { char CHAR;

while ( ( CHAR = getchar() ) != EOF ) { switch (CHAR) { case 10 : putchar(13); break; case 8 : CHAR = getchar(); CHAR = getchar(); break; case '_': CHAR = getchar(); if ( CHAR ===== 8 ) { CHAR = getchar(); break; } CHAR = getchar(); CHAR = getchar(); break; } putchar( CHAR ); } }

4.5 사운드

리눅스에서 사운드를 구현할려면, 먼저 커널을 다시 컴파일 해야하고, 적당한 드라이드 파일을 만들어야 한다.

커널의 컴파일

1. ‘make config’ 를 입력하여, 커널 사양을 변경 명령을 입력한다.

2. 커널 설정 일반적인 셋업은 변경하지 않고, 사운드 드라이버에 관련된 부분에서 ‘y’를 입력하면, 셋업 마지막 부분에서 사운드 드라이버 설정에 관한 셋업이 나온다.

3. 음악 카드 종류 설정 사용할 사운드 카드의 종류 Sound Blaster, PAS, Ultra Sound 모두를 설치할 것인지 아니면, 하나만 설치할 것인지 대해 답한다. PAS의 경우에는 Sound Blaster와 PAS 모두 설치할 수 있다.

4. IRQ와 DMA 를 값은 DOS에서와 같은 값을 입력한다.

5. 사운드 드라이드 파일을 만들어야 한다. 이것은 ‘/usr/src/linux/drivers/sound/README’ 파일을 이용할 수 있다. 이 파일 안에는 스크립트 파일이 포함되어 있으며, 아래에 그 내용을 보인다.

#!/bin/sh # # soudinstall # # by Craig Metz - [email protected] # # Create the devices # # Mixer (14, 0) # if [ -e /dev/mixer ]; then

rm -f /dev/mixer 

fi mknod -m 666 /dev/mixer c 14 0

if [ -e /dev/mixer1 ]; then

rm -f /dev/mixer1 

fi mknod -m 666 /dev/mixer1 c 14 16 # # Sequencer (14, 1) # if [ -e /dev/sequencer ]; then

rm -f /dev/sequencer

fi mknod -m 666 /dev/sequencer c 14 1 # # MIDI (14, 2) [ Not implemented ] # if [ -e /dev/midi ]; then

rm -f /dev/midi

fi mknod -m 666 /dev/midi c 14 2 # # DSP (14, 3) # if [ -e /dev/dsp ]; then

rm -f /dev/dsp

fi mknod -m 666 /dev/dsp c 14 3 # # SPARC audio (14, 4) [ Not fully implemented ] # if [ -e /dev/audio ]; then

rm -f /dev/audio

fi mknod -m 666 /dev/audio c 14 4 # # DSP2 (14, 19) /dev/dsp for the second soundcard. # Also the SB emulation part of the # PAS16 card. # if [ -e /dev/dsp1 ]; then

rm -f /dev/dsp1

fi mknod -m 666 /dev/dsp1 c 14 19 # # SPARC audio1 (14, 20) [ Not fully implemented ] # /dev/audio for the second soundcard. # Also the SB emulation part of the # PAS16 card. # if [ -e /dev/audio1 ]; then

rm -f /dev/audio1

fi mknod -m 666 /dev/audio1 c 14 20 # # /dev/sndstat (14,6) For debugging purposes # if [ -e /dev/sndstat ]; then

rm -f /dev/sndstat

fi mknod -m 666 /dev/sndstat c 14 6 exit 0

6. ‘make dep’, ‘make zImage’를 차례로 입력해서 커널을 컴파일 한다.

7. 커널 재설치 컴파일이 끝나면, ‘cp zImage /’를 입력해서, 커널을 루트 디렉토리로 복사한 후, LILO에게 커널이 바뀌였음을 알리기 위해 ‘/etc/lilo/install’ 를 입력한다.

음악카드 테스트 음악 카드에 관한 정보는 ‘/dev/sndstat’ 파일이 가지고 있다. 따라서, `cat /dev/sndstat'를 입력하면, 그 내용을 볼 수 있으며, 아래와 예를 PAS16을 설치했을때의 출력이다.

HW config:
Type 3: ProAudioSpectrum at 0x388 irq 7 drq 5
Type 2: SoundBlaster at 0x220 irq 5 drq 1
Type 1: Adlib at 0x388 irq 0 drq 0
PCM devices:
0: Pro Audio Spectrum
1: SoundBlaster 2.0
Synth devices:
0: Yamaha OPL-3
Midi devices:
0: Pro Audio Spectrum
Mixer(s) installed

음악카드를 테스트해보기 위해서, 녹음과 재생을 해보기로 하자. 별도의 유틸리티는 필요없다.

1. `cat /dev/dsp>noise' 마이크로 녹음되는 내용이 ‘noise’ 파일로 저장하기 위한 명령이다. 2. 음성을 입력하고, `ctrl+c'를 눌러 녹음을 종료한다. 3. `cat noise>/dev/dsp' 녹음된 음성파일인 ‘noise’를 /dev/dsp 로 보내 스피커로 듣는다.

말소리가 들리면, 음악카드는 성공적으로 설치되었다.

만일, IRQ나 DRQ 를 잘못 설정하였다면, 커널의 재컴파일의 과정없이 부팅 시마다 알려 주는 방법도 있다. 이 방법은 반드시 LILO를 사용하고 있을 경우만 가능하다.

LILO 가 부팅되기 전에, CTRL 이나 ALT 키를 눌러 LILO를 잠시 정지 시킨 후 아래의 형식으로 입력한다.

	linux sound=0x222071,0x138800

여기서, 첫번째 숫자는 2, 220, 7, 1 로 나뉘며 각각은 아래와 같은 의미를 가지고 있다.

2 : 카드 종류

1=FM Synth (YM3812 or OPL3)
2=SoundBlaster (1.0 to 2.0, Pro, 16)
3=ProAudioSpectrum16
4=Gravis UltraSound
5=MPU-401 UART midi
6=SB16 (16 bit DMA number)
7=SB16 Midi (MPU-401 emulation)

220 : I/O 주소 7 : IRQ 1 : DMA 채널

또한, 두번째 숫자는 SoundBlaster의 경우 ADLIB을 ProAudioSpectrum 에서는 ADLIB과 SoundBlaster 를 각각 에뮬레이션하기 위한 숫자이다. 이들의 값은 음악카드 매뉴얼을 참조하길 바라며 아래에 몇가지 예를 보인다.

사운드 드라이브를 포함하지 않을 경우,

sound=0

AdLib을 사용할 경우,

sound=0x138800

SoundBlaster를 사용할 경우,

sound=0x2220Id,0x138800 ( I:IRQ, d:DRQ를 설정해야함 )

SoundBlaster 16 또는 16 ASP를 사용할 경우,

sound=0x2220Id,0x6220ID,0x73X0I0,0x138800 ( I:IRQ, d:DRQ를 설정해야함 )

ProAudioSpectrum16 또는 ProAudioStudio16 를 사용할 경우,

sound=0x3388Id,0x2220Id,0x138800 ( I:IRQ, d:DRQ를 설정해야함 )

디바이스와 유틸리티

음악 카드에 관련된 대표적인 디바이스는 아래와 같은 것이 있으며, 유틸리티에 따라서 사용하는 디바이스가 정해져 있다.

1. /dev/audio SUN 워크스테이션 호환 오디오 디바이스로서, .au 파일을 사용할 수 있음.

2. /dev/dsp 디지탈 샘플링 디바이스. 음성신호롤 녹음및 재생할 수 있으며, ‘tracker’나 ‘wavplay’는 이 디바이스를 이용한다.

‘tracker’ 는 아미가 모듈파일인 .mod 파일을 재생하는 프로그램이다. 주의할 것은 컴퓨터의 속도에 출력이 좌우되기 때문에 시스템에 따라 적당한 주파수로 들어야 한다. 예를 들면, 386기종에는 10000Hz 이상의 샘플링 주파수를 얻기 힘들다(소리가 끈어짐). 따라서, 아래와 같이 입력하여 들을 수 있다.

# tracker -frequency 10000 sample.mod

‘wavplay’ 는 MS-Windows에서 사용하는 ‘.wav’ 파일을 재생한다. 포함되어 있는 프로그램은 ‘play’와 ‘xplay’가 있다.

3. /dev/sequencer MIDI와 FM 사운드에 사용된다.

‘adagio’ 는 ‘.mid’ 파일을 재생시켜 주며 아래와 같은 유틸리티가 포함되어 있다.

ad 

악보 문서 파일인 `.gio' 파일을 출력. `.mid' 파일로 상호 변환 가능하다.

mp

`.mid' 파일을 출력.

xmp

X 용. 볼륨 미터기가 있으며, 곡선곡및 셋업 메뉴가 있다.

* /dev/sequencer 와 /dev/dsp 를 동시에 사용할 수 있음.

4. /dev/mixer 사운드 믹서로서 CD, FM, DSP, Mike 등의 볼륨을 조정할 수 있다. 유틸리티로는 aumix 와 xmix 가 있다.

5.한글 및 주요 응용 프로그램

5.1 한텀 5.2 helvis 5.3 Mule/Emacs 5.4 한글 LaTeX 5.5 Seyon

이 장에서는 한글과 관련된 응용 프로그램을 다룬다. 한텀은 리눅스하에서 한글을 사용하기 위한 가장 기반이 되는 프로그램이며, 이것을 이용하여 문서작성이나 통신등을 할 수 있다. DOS 사용자를 위한 리눅스에서의 작업

1. 워드 프로세싱 리눅스 상에서는 DOS에서의 워드 작업보다 사실 쉽지는 않다. 아래아 한글을 비롯한 여러가지 WYSWYG을 제공하는 워드 프로세서에 비하면, 사용하는 방법은 어려운 편이다. 그러나, 리눅스상에서는 TeX를 사용함으로서 강력한 워드 프로세싱 작업을 할 수 있다. 실제로 외서인 경우 많은 책들이 TeX를 사용하여 출판되고 있다. 배우는 과정은 조금 어렵지만, 결국 원하는 결과인 인쇄물을 얻기 위한 작업까지 생각한다면, TeX은 상당한 능력을 제공한다.

2. 통신 Seyon이라는 통신 에뮬레이터와 한텀을 사용하면, 한글 통신을 할 수 있다.

3. Spread sheet 리눅스에서는 기본적으로 sc 와 xspread(X window 용)를 제공한다. 한글은 되지 않는다.

4. Data Base 관계형 데이타베이스인 postgres와 ingres를 사용할 수 있다.

5. GUI 유닉스 상에서는 X-window 라는 강력한 GUI 환경이 있다. 리눅스에서는 공개용 버젼인 XFree-86을 기본적으로 제공하며, 여러가지의 Window manager와 File manager, 그리고 다양한 유틸리티 등이 제공된다.

6. Programming C, C++, Object C, Smalltalk, LISP, XLIB(X Window), PEX( 3D Interface Library in X), Tcl/Tk(Script), gdb(Debugger), f2c(Fortran to C), p2c(Pascal to C) 등등.. C, 개체지향 프로그래밍(OOP), 인공지능(AI), X 프로그래밍, 디버깅 등 프로그램 개발용 툴들이 기본적으로 제공된다.

7. Game 유닉스 상의 게임은 BSD용 게임들이 리눅스로 포팅된 TEXT 모드 게임들이 대부분이다. 어드벤쳐 게임이 주류이며, 체스나 테스리스 같은 게임도 있다. DOS용 게임은 DOSEMU를 사용할 수 있으나, 극히 제한되어 있으며, X용 게임으로서는 테트리스, 핵사, 마작, 솔리테어 등이 있다. 사운드를 지원하는 것으로는 b-dash 와 xboing 등이 있다.

8. Sound ADLIB을 비롯하여, SoundBlaster 시리즈, ProAudoSpectrum 시리즈, MPU-401 Midi 인터페이스 등을 지원한다. 응용 프로그램으로는 adagio, aumix, auplay, lsox, speaker, tracker, wavplay 등이 있다.

9. Graphics PEX(3차원 그래픽 X 프로토콜), xpaint(2D 패인팅), xv, Khoros(이미지 프로세싱)

5.1 한텀(Hanterm)

한텀이란? 한텀이란 과학원의 송재경님이 만드신 한글을 사용할 수 있는 터미날 에뮬레이션 프로그램이다. 따라서, 리눅스에서 한글을 사용하려면, 기본적으로 XFree86에서 한텀을 띄운 후, 한글이 사용가능한 응용프로그램을 실행시키는 것이다. 이 프로그램은 Xterm을 한글이 사용가능하도록 개조된 것이다. Xterm이라는 것은 X상에서 터미날 모드를 에뮬레이션 해주는 것으로써 이 안에서 일반 콘솔에서와 같이 명령어를 입력하고 그에 따른 결과를 볼 수 있다. 실행되는 프로그램이 X 응용 프로그램이라면 자동적으로 윈도우가 생성된다.

설치 방법 한텀은 소스로 제공되므로, 사용자의 시스템에 따라 알맞게 컴파일 하여야 한다. 리눅스에서의 컴파일은 아래의 순서를 따르면 된다. 이 순서는 한텀 배포본 안에 언급되어 있으며, 버전마다 약간의 차이가 있다.

1. 한텀은 hanterm.tgz의 압축파일로 제공되므로 tar나 gzip을 사용하여 적당한 디렉토리에 푼다. 2. 풀린 파일중 리눅스용으로 컴파일 하기 위해서 아래와 같이 이름을 바꾼다. 리눅스용으로 배포되는 것은 이 과정이 필요 없다. "mv Imagefile.linux Imagefile" "mv main.c.linux main.c" 3. "xmkmf" 실행 4. "make depend" 실행, 에러가 나는 시스템도 있으며, 무시해도 된다. 5. "make" 6. "cp hanterm /usr/local/bin" 7. "cp Hanterm.ad /usr/lib/X11/app-defaults" 8. "bdftopcf johabg16.bdf > johabg16.pcf"

"bdftopcf johabm16.bdf > johabm16.pcf"
"bdftopcf johabp16.bdf > johabp16.pcf"

9. "cp *.pcf /usr/lib/X11/fonts/misc" 10. "cd /usr/lib/X11/fonts/misc"

"mkfontdir"

11. "xset fp rehash" ← X 윈도우를 띄운 상태에서 실행가능하다. 12. 추가적으로 hanterm을 Desktop shell안에 등록하여 사용할 수 있다. Openwin을 사용할 경우, /usr/openwin/lib/openwin-menu.s 의 파일의 내용을 에디터를 사용하여 그 안에 있는 다른 내용들을 참조함으로써 쉽게 설정할 수 있으며, 기본적으로 xterm과 같으므로, xterm의 옵션을 그대로 사용할 수 있다. 예) hanterm -sb -sl 500 & 한텀을 스크롤바를 만들고 500 라인까지 기억시키며, 백그라운드로 실행시킨다.

한텀이나 Xterm 등의 터미날 에뮬레이터는 일반적으로 좌측 컨트롤키와 마우스버튼의 조합으로 환경설정메뉴를 호출할 수 있다. 좌측 마우스 버튼은 터미날 신호 설정, 우측 마우스 버튼은 폰트 및 크기 설정, 중앙 마우스 버튼(3Button 에뮬레이션인 경우는 좌우 버튼을 동시에)은 화면의 역상 모드나 스크롤바 생성등의 화면 설정메뉴가 있다.

5.2 helvis

helvis 란? helvis는 기존의 vi(스크린 에디터)의 클론인 elvis에서 한글사용시 깨지지 않도록 개조한 것이다. 물론, X를 띄운 후 한텀하에서 한글을 사용할 수 있다. vi는 유닉스에서 가장 기본이 되는 스크린 에디터이다. DOS의 스크린 에디터에 비하면, 사용이 어려운 편이므로 간단한 것은 vi를 사용하고 그 이외는 Emacs나 Mule을 사용하는 것이 좋을 것이다.

설치와 간단한 사용법 소스로 배포되므로, 컴파일하여 사용해야 한다.

1. helvis.tar.gz 파일을 풀기 위해서 아래의 명령을 사용한다. 먼저 적당한 디렉토리로 이동한다. "cd /usr" "tar xvzf helvis.tar.gz" 2. "make" 3. "make install"

설치가 되었으면, 간단하게 사용해보자. 사용법은 vi 와 동일하며, 초기 실행 옵션이 다르고, 화면에 80 칼럼이 넘게 출력되면 스크롤되는 것이 vi와 다르다. 여기서는 vi의 기본적인 사용법에 대해 설명한다. 아래의 예는 아마도 최소한의 문서편집일 것이다.

1. $ helvis [파일명] 2. ‘i’키를 눌러 삽입 상태로 전환한다. 3. 문자들을 입력한다. 4. ESC 를 눌러 삽입상태를 종료한다. 5. “:x”를 눌러 저장하고 프롬프트 상태로 빠져나간다.

위의 예 중 2부터 4까지의 과정이 대부분의 편집 작업이다. 삽입 상태에서 문자를 입력하면, 문자들이 계속 삽입되어 입력되어 지고, 방향키로서 원하는 곳으로 이동할 수 있다. 여기서 문자를 지울려면, ESC키를 눌러 삽입 상태를 종료하고 삭제 키인 “x”나 “dd” 등을 이용하여 지울 수 있다. “R” 명령은 덮어쓰기 모드로 전환한다. 입력하는 모든 문자는 현재 커서가 위치한 곳부터 ESC키가 눌리기 전까지 계속 덮어써 나간다. 여기서 삽입모드로의 전환은 ESC를 눌러 덮어쓰기 모드를 종료한 후 “i”를 눌러야 한다. 편집중인 파일을 저장하거나 에디터를 종료할 경우는 먼저 삽입 상태나 덮어쓰기 상태를 ESC키로 빠져나온후, “:w [파일명]” 명령은 [파일명]으로 저장하고, “:q!” 명령은 저장않고 종료하며, “:x” 명령은 현재 파일명으로 저장하고 종료한다.

사용법 아래에 주로 사용되는 키를 설명한다.

커서이동과 출력 상하좌우 방향키, HOME, END, PgUP, PgDN 로서 움직일 수 있다. PgUP과 PgDN은 화면의 반만 이동한다.

키 사용 설 명 ‘ctrl-f’ 전화면 PageDown ‘ctrl-b’ 전화면 PageUP ‘ctrl-d’ 반화면 PageDown ‘ctrl-u’ 반화면 PageUP ‘w’ 다음 단어 ‘b’ 이전 단어 ‘e’ END ‘0(zero)’ HOME

파일 명령

키 사용 설 명 ‘:e [filename]’ 파일을 불러옴 ‘:q!’ 저장하지 않고 종료 ‘:x’ 저장하고 종료 ‘:w [filename]’ 저장 ‘/[pattern]’, [pattern] 문자열 찾기 명령, ‘/’ 현재 패턴으로 다음 문자열 찾기 ‘:! [command]’ shell 명령어 실행

편집 명령

키 사용 설 명 ‘i’ 현재 커서 위치에서 삽입모드로 변경, 문자 삽입 ‘I’ 현재 라인의 맨 앞부터 문자 삽입 ‘r’ 한 글자만을 덮어씀 ‘R’ ESC가 눌리기 전까지 계속 덮어씀 ‘a’ 추가 모드, 커서의 다음 위치부터 문자삽입 ‘A’ 추가 모드, 라인의 끝부터 문자 삽입 ‘dd’ 현재 라인 삭제 ‘dw’ 단어 삭제 ‘D’ 커서위치부터 라인 끝까지 삭제 ‘x’ 한 글자 삭제

5.3 Mule

Mule은 Emacs 에디터를 2 바이트 문자권에서 사용할 수 있도록 개조된 프로그램이다. Emacs는 Richard Stallman 이 제작한 거의 모든 운영체제로 이식된 가장 강력한, 에디터 이상의 에디터이다. 에디터 이상의 에디터라고 말할 수 있는 것은, Emacs의 유연성과 확장성 때문이다. 일반 DOS사용자들은 아마도 여러개의 에디터를 가지고 있을 것이다. 예를 들면, 문서 작성기인 아래아 한글이나 MS-Word, 간단한 문서 편집기인 DOS의 EDIT나 한글이 가능한 이야기의 내장 에디터나 산 에디터, 프로그래밍을 편하게 해주는 Borland C의 내장 에디터나 Q 에디터 등, 용도가 서로 다르기는 하나 모두 문서파일을 만드는 에디터들이다. 이런 면에서 본다면, Emacs는 통합 에디터이다. Emacs의 유연성으로 편집 모드를 간단한 에디터 모드에서 부터 C, FORTRAN, LISP 등의 프로그래밍에 적합한 모드, 문서 형식기인 TeX이나 LaTeX 에 적합한 모드등 작업에 따라 적합한 환경으로 변환할 수 있다. 또한, 사용자의 임의대로 수정하거나 새로운 모드를 만들 수 있다.

들어가기 전에 Emacs 만이 갖는 몇가지 용어와 앞으로 설명할 키를 누르는 방법을 소개한다.

버 퍼 현재 편집중인 파일을 버퍼라고 부른다.

모 드 Emacs는 각각의 버퍼에 최소한 하나의 주 모드(Major Mode)를 갖는다. 문서를 편집하는 환경에 모두 동일한 편집방식이 존재하는 것이 아니라, 편집하고 있는 내용에 따라 적합한 환경을 갖는 것이다. 또한, 각각의 주 모드에 부 모드 (Minor Mode) 를 가질 수 있다. 부 모드는 현재 버퍼의 환경을 임시적으로 바꿀때 사용된다.

	주 모드 : Fundamental, Text, Lisp, C mode 등
	부 모드 : Auto Fill, Abbrev, Overwrite, Narrow 등

명 령 Emacs는 1500개 이상의 기능(명령)을 가지고 있다. 자주 사용되는 몇가지의 명령들이 단축키로 정의 되어 있으며, 그렇지 않은 것은 모두 "M-x 명령"의 형식으로 입력할 수 있다. 명령어들은 대부분 약어가 아닌 완전한 단어들로 구성되어 있으며, 하나 이상의 단어들이 "-"로 구분되어 있다.

입 력 설명에 표시되는 단축키는 키보드 상에 아래와 같다.

M	Meta 키로서 Alt 키나 ESC 키이다.
C	Control
TAB	TAB
SPC	Space
DEL	Delete

몇가지 예를 들면,

`C-a'		Control 키와 a 키를 동시에 누른다.
`M-a'		Alt 키와 a 키를 동시에 누른다.
`C-x u'		Control 키와 x키를 동시에 누른 후, 다시 u 키만 누른다.
`C-x C-f'	Control 키와 x키를 동시에 누른 후, 다시 Control 키와 f키를 동시에 누른다.

대소문자를 구분하므로, Shift 키를 적절히 눌러야 한다.

화면 구성 Mule의 전체 화면은 크게 3가지로 나눌 수 있다.

1. 작업 영역 ; 실제 문서를 입력하는 영역.

2. 모드 선 ; 현재 편집상태를 출력하는 한 라인이다. 구조는 아래와 같다.

[한/영] CH-Mule: 버퍼 (Major Minor) –Position—

[한/영] 한글/영문 전환은 "M-SPC"로 하며, 한글 입력상태이면 "한글" 이라고 표시된다.

CH 현재 버퍼가 변환되었는지의 여부를 나타내며 아래의 3가지 출력상태가 있다.

	%%**%% : 최근에 저장된 후 다시 수정되었음.
	-- : 저장후에 수정되지 않았음.
	% % : 읽기 전용 버퍼

버퍼 버퍼이름(편집되고 있는 파일 이름) Major 편집중인 버퍼의 주 모드를 표시 Minor 편집중인 버퍼의 부 모드를 표시 Position 전체 파일내용 중 현재 편집하고 있는 곳의 위치.

	ALL	 : 현재 화면에 전체 파일 내용이 표시되고 있음.
	Top	 : 문서의 최상단에 있음.
	Bot	 : 문서의 최하단에 있음.
	NN%	 : 전체 내용중 현재 표시되고 있는 화면을 퍼센트로 표시.

3. Echo 영역 화면의 최하단에 위치하는 영역으로 사용자가 입력하는 특수키를 출력하는 영역으로 TAB키와 SPACE키를 조합함으로서 수많은 기능들을 쉽게 실행할 수 있다. “M-x”로 시작하는 명령어들을 찾을 때, 입력하는 도중에 TAB을 입력하면 현재 입력된 내용중 일치되는 것들 화면상에 출력하고, 더이상 일치되지 않는 유일한 것이라면, 명령의 완벽한 이름이 출력된다. SPACE 키는 TAB과 유사하나 “-”까지의 일치하는 내용을 출력한다. 또한 “?”을 삽입하면 현재까지의 내용을 포함하는 모든 명령들이 열거된다. 또한, 에러 메세지가 출력되는 곳이기도 하다.

명령어 요약 Mule 의 사용법을 이동, 삭제, 커서 위치 정보, 반복, UNDO, Yanking 등의 명령어로 구분하여 알아보기로 하자.

이동 명령

사 용 키 설 명 `C-f' 오른쪽 한칸 이동 `C-b' 왼쪽 한칸 이동 `C-n' 아래 줄로 이동 `C-p' 위 줄로 이동 `C-a' 라인의 첫번째 칼럼으로 이동 `C-e' 라인의 마지막 칼럼으로 이동 `M-f' 오른쪽 한단어 뒤로 이동 `M-b' 왼쪽 한단어 앞으로 이동 `M-a' 앞 문장의 처음으로 이동 `M-e' 뒤 문장의 끝으로 이동 `M-r' 현재 화면의 중간이 되는 줄의 첫째 칼럼으로 이동 `M-<' 편집중인 버퍼들 중 첫번째 버퍼로 이동 버퍼가 하나일 경우 문서의 처음으로 이동 `M→' 편집중인 버퍼들 중 마지막 버퍼로 이동 버퍼가 하나일 경우 문서의 끝으로 이동 `M-x goto-char' 문서의 처음부터 N번째의 문자로 이동 `M-x goto-line' 문서의 처음부터 N번째의 줄로 이동 `C-x C-n' 상하 줄로 이동 할때 현재 커서가 위치한 칼럼으로만 이동(goal column) `C-u C-x C-n' goal column 기능 취소

삭제 명령

사 용 키 설 명 `DEL' 커서가 위치한 문자의 앞문자를 지움, BS 키도 같음. `C-d' 커서가 위치한 문자의 다음문자를 지움. `C-k' 커서 이후의 모든 문자 삭제 `M-d' 커서 이후의 한 단어만 삭제 `M-DEL' 커서 이전의 한 단어만 삭제 `M-k' 커서가 위치한 문장을 지움

파일 명령

사 용 키 설 명 `C-x C-f' 파일을 로드한다. 파일이 없을 경우는 새로운 파일을 생성하며, 편집 중인 파일이 없으면, 디렉토리의 모든 파일을 출력시킨다. `C-x C-s' 파일을 저장한다. `M-x recover-file' 파일을 복구시킨다.

커서 위치 정보

사 용 키 설 명 `M-x what-page' 현재 위치의 해당 페이지 번호와 줄번호를 출력 `M-x what-line' 줄번호 출력 `M-=' 현재 영역의 줄번호를 출력 `C-x =' 현재 커서가 위치한 곳의 문자와 8진수 출력 전체 문자중에서의 현재 문자의 위치 및 칼럼 표시

반복 실행 동일한 명령을 반복해야 할 경우 아래와 같이 할 수 있다.

사 용 키 설 명 `C-u 반복횟수 명령' 명령을 반복 횟수 만큼 반복한다. `ESC 반복횟수 명령' 명령을 반복 횟수 만큼 반복한다.

UNDO

사 용 키 설 명 `C-x u' 최근에 한 작업을 그 이전 상태로 되돌린다. `C-_' 위와 같다.

디폴트 30,000 개의 입력을 Undo 할 수 있다.

영역 지정

사 용 키 설 명 `C-SPC' 또는 `[email protected]' 현재 위치를 마크한다. 영역의 끝은 언제나 현재 커서 위치이다. `C-x C-x' 마크된 위치와 현재 커서 위치를 서로 바꾼다. `C-w' 지정된 영역을 지운다. `[email protected]' 커서가 위치한 다음 단어만을 영역으로 지정 `M-h' 커서가 위치한 문단을 영역으로 지정 `C-x h' 현재 버퍼 전체를 영역으로 지정

Yanking Yanking 이란, 이전에 제거된 문자들을 다시 삽입시키는 것이다.

사 용 키 설 명 `C-y' 최근에 지워진 문자(들)를 다시 삽입한다.(Yanking 한다.) `M-y' Yanking 된 문자들을 그 이전에 지워진 것들로 대치한다. 먼저, `C-y'가 실행된 후에 사용할 수 있다. `M-w' 문자를 지우지 않고, 메모리로 복사한다.

영역의 추가와 삭제

사 용 키 설 명 `M-x append-to-buffer' 지정된 영역을 특정 버퍼에 추가 시킨다. `M-x prepend-to-buffer' 지정된 영역을 특정 버퍼에 추가 시킨다. 단, 해당 버퍼에 앞부분에 위치한다. `M-x copy-to-buffer' 지정된 영역을 특정 버퍼에 추가 시킨다. 단, 종래의 내용을 없어진다. `M-x insert-buffer' 특정 버퍼의 내용을 현재 편집중인 버퍼로 복사한다. `M-x append-to-file' 지정된 영역의 내용을 특정 파일에 추가시킨다.

사각 영역 사각 영역을 지정하는 특별한 명령이 존재하는 것은 아니며, 아래의 명령을 실행하면, 자동적으로 사각 영역으로 지정된다.

사 용 키 설 명 `M-x kill-rectangle' 현재 사각 영역을 지운다. 후에 Yanking 시킬 수 있다. `M-x yank-rectangle' 사각 영역으로 Yanking 한다. `M-x open-rectangle' 사각 영역안에 공백을 삽입한다. `M-x delete-rectangle' 사각 영역을 지운다. 후에 Yanking 시킬 수 없다. `M-x clear-rectangle' 사각 영역을 공백으로 채운다.

버퍼 관리

사 용 키 설 명 `C-x b BUFFER RET' 'BUFFER' 로 편집중인 문서를 바꾼다. `C-x 4 b BUFFER RET' 윈도우로 나누어 'BUFFER' 를 연다. `C-x C-b' 버퍼 목록을 출력한다. `C-x C-q' 편집중인 버퍼를 읽기 전용으로 만든다. `C-x k BUFFER RET' 'BUFFER' 를 버퍼 목록에서 제거한다. `M-x buffer-menu' 버퍼 메뉴를 호출한다.

버퍼 메뉴에서의 사용 키 버퍼 메뉴가 호출된 후에는 아래의 명령을 사용할 수 있다.

사용키 설 명 `d' 버퍼를 목록에서 제거한다. `s' 버퍼를 저장한다. `x' 버퍼 메뉴에서 설정된 것을 실행한다. `u' 버퍼 메뉴 명령을 취소한다. `%' 읽기 전용 버퍼로 만든다. `q' 버퍼 메뉴를 종료한다. `f' 버퍼를 편집상태로 전환한다. `o' 윈도우를 생성하고 버퍼를 편집상태로 전환한다. `1' 선택된 버퍼를 풀 스크린으로 전환한다. `2' 선택된 버퍼와 또다른 버퍼의 내용으로 화면을 나눈다. `m' 화면이 나누어질때 두번째 윈도우로 출력될 것으로 선택한다. `v' 선택된 버퍼와 `m'으로 선택된 버퍼 모두 출력시킨다.

다중 윈도우

사 용 키 설 명 `C-x o' 열려진 다른 윈도우로 이동한다. `C-x 1' 현재 윈도우를 풀 스크린으로 한다. `C-x 2' 현재 윈도우를 둘로 나눈다. `C-x 0' 현재 윈도우를 닫는다. `C-x 4 b BUFFER RET' 두번째 윈도우에 'BUFFER'를 출력한다. `C-x 4 f FILE RET' 두번째 윈도우에 'FILE'을 읽어 들여 출력한다. `C-x 4 DIRECTORY RET' 두번째 윈도우에 'DIRECTORY'의 파일들을 출력시킨다.

Mode Emacs 상의 모드 변환으로 다양한 일반 문서편집, C 편집, TeX 편집등의 작업을 편하게 할 수 있다. 또한, dired-mode(파일 관리 모드), calendar(달력 모드), mail(메일 모드) 등 에디터 이외의 기능도 가지고 있다.

C-MODE 설명

일반적인 TEXT 에디터나 Emacs상의 text-mode와 주된 차이점은 자동 들여쓰기와 괄호의 처리이다. 이런 기능들은 실제 C 코드를 깔끔하게 정렬시키기 위한 불필요한 손동작을 줄여준다. 또한, Emacs상에서 컴파일이 가능하며, 바로 실행시킬 수도 있다.

o 들여쓰기(Identation) 들여쓰기 키인 TAB을 사용하면, 각각의 문장마다 적당한 위치로 커서의 위치가 옮겨진다. 적당한 위치라는 것은 TAB키라 눌려졌을 때 절대적인 위치로 옮겨지는 것이 아니라, 윗라인의 열에 맞추게 된다. 또한, 윗라인이 ‘;’으로 끝나지 않았을 경우는 윗라인보다 더 안쪽으로 들어쓰기가 된다.

o 괄호(Brace) ‘{’, ‘}’, ‘[’, ‘]’, ‘(’, ‘)’ 등의 기호들은 자동으로 쌍이 맞추어 진다. ‘}’ 는 이미 열려진 `{'을 포함하는 문장의 열에 일치하게 된다.

o C Mode 에서의 유용한 명령

사 용 키 설 명 `M-x c-mode' C 모드로 주 모드를 변경한다. 또는, mule 실행시에 `.c'파일을 불러오면, 자동으로 C 모드로 변환된다. `M-a' 함수의 처음으로 이동. `M-e' 함수의 끝으로 이동. `M-x compile' 디폴트로 `make' 가 표시된다. 단순히 `hello.c' 파일만을 컴파일 한다고 가정하면, `make hello' 를 입력하면 된다. 실행 파일명으로 `hello'가 생성된다. `M-!' 셸 명령을 실행하는 것으로서 위와 같이 하였다면, `hello'를 입력하여 바로 실행할 수 있다. `M-x kill-compilation' 컴파일을 중지시킨다. `C-x `' 컴파일 에러 메세지를 추적한다. `M-x gdb RET FILE RET' 디버거를 실행시킨다.

5.4 한글 LaTeX

TeX, LaTeX, hLaTeX TeX은 문서의 형식화 프로그램이며, LaTeX은 TeX에서 사용되는 매크로를 정의해 놓은 것이며, hLaTex은 LaTeX에서 한글사용을 가능하게 해주는 매크로이다. 따라서, 어떠한 문서를 작성하여 출력(한글 포함)하려면, TeX의 문법(LaTeX의 문법)으로 에디터를 사용하여 글을 작성한 후에, 한글문서일 경우는 hlatex를 영문 문서일 경우는 latex를 사용하여 ".dvi"를 만든다. 이 파일은 프린터의 종류에 비종속(device independent)적인 출력 파일이다. 이 파일을 dvips를 사용하여 포스트스크립 파일로 만들면, Ghostscript를 이용하여 대부분의 프린터로 출력시킬 수 있다. 이 과정을 아래의 예제로 간단히 설명한다.

0. X-Windows를 구동시키고, 한텀을 실행시킨다.

1. 에디터를 사용하여 LaTeX의 문법으로 문서를 작성한다. # helvis report.ks 또는 mule report.ks

2. tex파일을 생성한다. # hlatex report.ks report.dvi 파일이 생성된다.

3. 생성된 tex 파일을 포스트스크립 파일로 변환한다. # dvips -oreport.ps report.tex report.ps 파일이 생성된다.

4. Ghostscript를 사용하여 HP-DESKJET 500 프린터로 출력한다. # gs -dNOPAUSE -sDEVICE=djet500 -sOutputFile=/dev/lp1 report.ps

프린터의 종류는 gs -h 라고 입력하면, 기본적인 몇가지 옵션과 프린터의 종류가 열거되므로, 해당하는 프린터 이름을 지정하면 된다.

설치 방법 TeX 과 LaTeX는 배포본에 일반적으로 기본적으로 설치되며, 여기서는 한글 LaTeX을 설치하는 방법을 설명한다. 한글 LaTeX을 설치하기 전에 반드시 TeX과 LaTeX이 설치 되어 있어야 한다.

아래의 예제는 TeX가 /usr/TeX의 디렉토리에 있음을 가정한다.

0. 먼저 한글 LaTeX을 적당한 디렉토리에 압축을 푼다. 1. “cp pk/* /usr/TeX/lib/tex/fonts” 2. “cp tfm/* /usr/TeX/lib/tex/fonts” 3. “cp inputs/* /usr/TeX/lib/tex/inputs” 4. “cp bin/hlatex /usr/TeX/bin” 5. “make src/htex” ; htex를 컴파일 한다. 6. “cp src/htex /usr/local/bin"

LaTeX 문법 여기서는 한글 LaTeX의 기본적인 문법을 설명한다.

먼저, 한글을 사용하기 위한 최소의 문법은 아래와 같다.

\document{harticle} \begin{document} 안녕하세요. \TeX의 세계로 오신것을 환영합니다. \end{document}

먼저, 인쇄될 종이의 크기와 문서의 성격은 다음과 같이 주어준다.

\document[option]{style}

option : 11pt, 12pt, twocolumn style : harticle, hreport, hbook

일반적으로 \document[doublesize, a4wide]{harticle} 를 많이 사용한다. 이것은 국내 규격의 A4 용지를 사용하고, 문서를 article 형식으로 하는 것을 의미하며, doublesize는 줄간격에 해당하는 것으로서 한글을 사용할 경우 이렇게 하는 것이 출력에 적당하다.

\textwidth = 길이 단위 : 문서의 가로폭 \textheight = 길이 단위 : 문서의 세로길이

위 두 명령은 해당 종이에 문서가 자리할 가로 세로크기를 정한다. 단위로는 cm(centimeter), in(inch), mm(millimeter), em(문자 M의 폭 기준) , ex(문자 x의 높이 기준) pc( pica로서 1pc는 12pt에 해당한다.), pt(point로서 72.27pt가 1in에 해당한다.) 등을 정의할 수 있다. 예를 들면,

\textwidth = 200 cm

이것은 문서의 가로폭이 200 cm의 크기를 갖게 된다.

그 다음으로는 보통 문단의 형식을 정의할 것이다. 이것에 관련된 명령을 아래에 기술한다.

\parindent = 길이 단위 : 문단을 단위의 길이만큼 들여쓰기 한다. \parskip = 길이 단위 : 문단을 단위의 길이만큼 간격을 갖게 한다. \baselineskip = 길이 단위 : 줄간격을 단위의 길이 만큼 설정한다.

정렬 방식, 즉 좌측 정렬, 중앙 정렬, 우측 정렬은 아래의 형식을 따른다.

\begin{정렬방식} 본문 \end{정렬방식}

예를 들면,

\begin{center} 문장을 문서의 중앙을 기준으로
정렬합니다. \end{center}

문장을 문서의 중앙을 기준으로 정렬합니다.

문서의 형식(style)에 따라 장과 절을 나눌 수 있다. harticle 로 설정하였다면, 본문을 \part, \section, \subsection, \subsubsection 으로, hreport나 hbook르 설정하였다면, \part, \chapter, \section, \subsection, \subsubsection 으로 나눌 수 있다. 이것은 자동적으로 번호가 매겨지며, 글자의 크기가 해당하는 부분에 의해 정의 되어진 크기로 설정된다. 예를 들어, harticle로 설정하였다면 본문의 내용 중에,

\part{지금은 part로 나누었읍니다}

를 입력하면, part 번호가 자동적으로 매겨 지고, part 이름이 한 페이지를 차지하며 그 페이지에 적당한 위치와 크기로 출력된다. 이러한 방법으로 장(chapter)과 절(section)등을 쉽게 나눌 수 있다.

장이나 절이외에 여러 목록들을 표시하기 위해서는 아래와 같은 방법을 사용한다.

\begin{형식} \item 첫번째 내용 \item 두번째 내용 \end{형식}

아래에 예제와 출력을 함께 보인다.

\begin{enumerate} \item 소프트웨어는? \begin{itemize} \item 무료로 공개되어야 한다. \item 소스를 공개해야 한다. \end{itemize} \item 약어 정리 \begin{description} \item [FSF] Free Software Foundation \item [GNU] Gnu's Not Unix \end{description} \end{enumerate}

- 결 과 -

1. 소프트웨어는? ‧ 무료로 공개되어야 한다. ‧ 소스를 공개해야 한다. 2. 약어 정리 FSF Free Software Foundation GNU Gnu's Not Unix

본문 내용을 입력할 때는 TeX의 제어코드와 겹치지 않기 위해서 몇가지 특수기호에 주의하여야 한다. # $ % & _ { } 문자들은 "\" 다음에 쓰여져야 하며, 인용부호( ‘, ’, “, ” )는 각각 `, ', ``, '' 로 쓰여져야 한다.

지원되는 글꼴들은 다음과 같다.

\rn : Roman type, 명조체 ( default ) \bf : Bold type, 굵은 명조체 \it : italic type \sf : sans serif type \sl : slanted type \sc : Small caps type \tt : Typewriter type \em : Emphasized type \gt : 고딕체 \gr : 그래픽체 \gs : 궁서체 \dr : 디나루체

글자의 크기는 다음의 순대로 커지며 오른쪽의 수치는 아래아 한글 신명조 글자의 크기이다.

tiny : 5 point \large : 11 point \scriptsize : 6 point \Large : 13 point \footnotesize : 7 point \LARGE : 16 point \small : 8 point \huge : 19 point \normalsize : 10 point \Huge : 21 point

한글 LaTeX 예제 아래의 예제는 한글 LaTeX의 간단한 예제이다. 직접 입력하여 결과를 보기 바란다.

\documentstyle[doublespace,a4wide]{harticle} \setstretch{1.5} \begin{document} \parindent = 20 pt \parskip = 10 pt \LARGE\bf \fbox{한글 \LaTeX ~예제} \begin{enumerate} \Large\rm\item 한글 \LaTeX ~이란? \begin{itemize} \normalsize \dr \item 한글 \LaTeX은 일반 TEXT파일에 문서 형식을 주어 지금 보시는 것과 같은 출력물을 얻을 수 있도록 만들어진 \TeX의 매크로 정의 패키지 입니다. \item 한글 \LaTeX은 KAIST의 한글 자유모 여러분들께서 수고해 주신 것입니다. \end{itemize} \item Linux 란? \begin{itemize} \gr \normalsize \item Linux는 핀란드 헬싱키 대학의 학생인 Linus Torvalds가 만든 시스템 커널을 중심으로 수많은 GNU\footnote{GNU는 FSF(Free Software Foundation)에서 모든 프로그램은 소스와 함께 공개되어야 실제로 소프트웨어 기술이 발전한다는 주의를 가지고 많은 프로그램을 공개 배포하는 Project의 이름입니다.} 소프트웨어들을 포함한 공개 유닉스 소프트웨어 패키지입니다. \item Linux는 상업 유닉스의 어떠한 코드도 사용하지 않으며, 보다 강력합니다. \end{itemize} \item 선택 리눅스 94!

\normalsize \begin{tabular}{|c||c|c|c|c|} \hline \hline &DOS & Windows /NT & OS/2 & Linux
\hline \hline O/S & 50,000 & 450,000 & 260,000 & 0
Compiler & 200,000 & 300,000 & 200,000 & 0
Word Processor & 200,000 & 200,000 & 200,000 & 0
기타 & . & . & . & 0
\hline \hline 합계 & ? & ? & ? & 0
\hline \hline \end{tabular}

  • Compiler를 비롯한 많은 프로그램들이 다양한 운영체제에서 사용될 수 있도록 포팅되어 있습니다.

\Large\rm\item수식 예제 $$\int\csc^2x\, dx=-cot x+ C \qquad\lim_{\alpha\to 0} {\sin\alpha\over \alpha} = 1 \qquad\lim_{\alpha\to\infty} {\sin\alpha \over \alpha } = 0.$$

\end{enumerate}

\gs\centerline{이 밖에도 수많은 기능들이 있습니다.}

\end{document}

도표와 수식 예제 아래의 예제는 도표편집을 보다 용이하게 해주는 S-Table 과 수식을 보다 활용한 예제이다.

\documentstyle{harticle} \input stables \begin{document} \begintable \multicolumn6 \hfill 금전 출납부\hfill\eltt \#\vt 날짜\vt 내용\vtt 수입\vt 지출\vtt 잔액\eltt 100|2–1|식비\vtt \hfill 10,000|\vtt \hfill 290,000\el 101|2–2|교통비\vtt \hfill 5,000|\vtt \hfill 285,000\el 102|2–3|의료비\vtt \hfill 200,000|\vtt \hfill 85,000\el 103|2–4|세금\vtt \hfill 50,000|\vtt \hfill 35,000\el 104|2–5|월급\vtt|\hfill 500,000\vtt \hfill 535,000\endtable

$$a+b=\alpha-\beta={1\over a}+{1\over b}+{1\over c}$$ $$(fg)'=f'g+fg'$$ $$I_4=\pmatrix{ 1 &0 &0 &0 \cr 0 &1 &0 &0 \cr 0 &0 &1 &0 \cr 0 &0 &0 &1 \cr}$$ $$\Gamma(n)$$ $$\root n \of {\proc_{i=1}^n X_i}$$ $${1 \over n} \sum_{i=1}^n X_i$$ $${\partial \over \partial x} f(x,y}$$ $$x\wedge (y\vee z)$$ \end{document}

- 결과 -

금전 출납부 # 날짜 내용 지출 수입 잔액 100 101 102 103 104 2-1 2-2 2-3 2-4 2-5 식비 교통비 의료비 세금 월급 10,000 5,000 200,000 50,000

500,000 290,000 285,000 85,000 35,000 535,000

5.5 Seyon

Seyon은 X Windows 하에 운용되는 통신프로그램으로, 한텀을 사용하여 한글을 사용할 수 있다.

Seyon의 기본적인 특징은 다음과 같다.

o 무제한의 전화목록부를 가지고 있다. 각각의 목록은 baud rate, parity bit, stop bit, script 파일을 가질 수 있으며, 또한 재다이얼, 재다이얼 대기시간을 지정할 수 있으며 여러 번호를 호출할 수 있다. 이러한 전화목록은 일반 문서파일을 편집하여 설정할 수 있다.

o 사용자가 원하는 터미날을 호출하여 통신 에뮬레이터로 사용할 수 있다. 우리는 한텀을 사용하여야 한글이 가능한 통신을 할 수 있다.

o 스크립트 언어는 원격 호스트에 연결하여 필요한 여러가지 입력을 자동적으로 수행한다. Seyon의 스크립트 해석기는 일반 문서의 형식으로 sh shell과 유사한 문법을 갖는다.

o 무제한의 외부 전송 프로토콜을 가질 수 있다.

o Z-modem 의 자동 다운로드 기능을 제공한다. Seyon의 Z-modem 의 전송 신호를 받고 자동적으로 다운로드한다.

o 변환 모드를 제공한다. BS를 delete로 개행을 CR로 변환하는 등의 변환모드를 제공한다.

o 터미날 에뮬레이터 상에서 프로그램 파라미터 설정 변경, 온라인 도움말, 흐름 제어(flow control), 캡쳐, 임시 shell 운영등을 할 수 있다.

기본 설정 Seyon을 실행하기 위한 기본적인 옵션은 아래의 사양 설정으로 반복을 피할 수 있다. 최소한 사용할 통신포트와 터미날을 설정하여야 하므로 아래와 같이 명령함으로써 Seyon을 실행할 수 있다. 먼저, $HOME 디렉토리의 .Xdefaults 의 내용에 아래의 문구를 포함한다.

	Seyon.modems : /dev/modem

이것은 사용할 통신포트를 /dev/modem 을 사용하는 것을 말하며, 이 디바이스는 /dev/cua? 와 링크 되어 있다.

다음으로, 터미날은 한글을 사용하기 위해서, 한텀을 seyon-emu 와 링크시켜야 한다. 이 파일은 /usr/X386/bin 디렉토리의 seyon-emu 파일을 hanterm 과 링크 시킨다.

	ln -s hanterm seyon-emu

환경 설정 seyon의 환경 설정은 여러곳에서 할 수 있다. 먼저, seyon을 실행할 때 실행 옵션을 주는 방법, 홈 디렉토리의 .Xdefault 파일을 편집하는 방법, 스크립트 파일을 편집하는 방법, 명령 센터(command center)를 이용하는 방법이 그것이다. 이런 여러 방법들은 실제로 복합적으로 쓰이며, 각 방법들은 서로 활용하는 방법이 다르다.

.Xdefault 파일은 X를 시작하였을 경우 읽어 들이는 파일이며, seyon에 해당하는 내용이 있을 경우 seyon의 디폴트 자원으로 설정한다. seyon의 실행시에 옵션을 주면, 이 default 값을 현재 실행할 때만 한정하여 값을 바꾼다. seyon이 실행되면 옵션에 따라 스크립트 파일을 실행시킨다. seyon의 실행중에 제어 판넬과 터미날 옵션을 통하여 기존 설정을 바꾼다.

실행 옵션

-modems <device> 이미 설정된 modem을 무시하고 <device>를 모뎀 포트로 사용한다.

-emulator <terminal emulator> 터미날 예뮬레이터로 사용할 프로그램을 <terminal emulator>로 지정한다. 만일 이 프로그램을 실행시키지 못한다면, seyon-emu 프로그램을 실행한다. seyon-emu는 보통 사용하기 원하는 에뮬레이터와 링크시킨다. 따라서, 한텀을 에뮬레이터로 사용한다면 한텀을 seyon-emu로 링크시키면 된다.

-script <script-file> startup 스크립트 파일이 실행된 후, 바로 <script-file>이 읽혀져 실행된다. 뒤에서 설명할 scriptDirectory 자원에 지정된 디렉토리에서 <script-file> 파일을 찾는다.

-entries <entries-list> 자원 defaultPhoneEntries 를 무시한다. <entries-list>가 하나 이상일 경우는 인용부호로 묶인다.

-dial, -nodial 자원 dialAutoStart 를 무시한다.

.Xdefault 자원 파일 편집 아래에 설명할 내용들은 .Xdefault 파일에 포함되는 것이다. seyon에 해당하는 자원임을 구분하기 위해 모든 자원앞에 “Seyon.”이 붙으며 값과의 사이에는 “:”이 붙는다. 설명끝의 괄호의 값은 디폴트 값이다.

backspaceTranslation (boolean) 사용자의 BS 키를 DELETE 키로 변환시킨다. 원격 유닉스 시스템에 접속하였을 때 유용하게 사용될 수 있다. ( off )

captureFile (string) 캡쳐파일의 파일 이름을 지정한다. ( capture )

connectString (string) 모뎀이 서로 연결되었을때 표시되는 메세지이다. ( CONNECT )

defaultBits (int) DATA 비트를 지정한다. ( 8 )

defaultBPS (string) Baud rate 를 지정한다. ( 9600 )

defaultDirectory (string) Seyon의 디폴트 디렉토리를 지정한다. 파일을 다운받거나 캡쳐되는 파일이 존재하게 될 디렉토리이다. ( ~/.seyon )

defaultParity (int) 패러티 비트를 지정한다. 홀수 패러티는 1, 짝수 패러티는 2, 패러티를 지정하지 않으려면 0의 값을 준다. ( 0 )

defaultPhoneEntries (int array) 전화 목록에 있는 엔트리의 순서대로 번호의 목록을 정한다.

defaultStopBits (int) Stop 비트를 지정한다. ( 1 )

dialAutoStart (boolean) defaultPhoneEntries에 의해 지정된 엔트리로 전화를 건다. ( off )

dialCancelString (string) Seyon이 모뎀에게 전화거는 것을 취소하는 문자를 지정한다. ( ^M )

dialDelay (int) 전화 연결이 되지 않았을 경우, 다음 번호로 전화를 걸기까지의 대기 시간(초)을 준다. ( 10 )

dialDirAutoOpen (boolean) 전화 목록을 자동으로 여는 것을 지정한다. 여기서 지정하지 않으면, 제어 센터에서 열 수 있다. ( off )

dialDirFormat (string) 전화 목록의 문자열 형식을 지정한다. 디폴트는 %-15s %-15s %6s %1c%1c%1c %1c%1c %s 이다. 이것은 호스트 이름, 번호, 속도, 데이타 비트, 패러티 비트, 스톱 비트, 접두어, 접미어, 스크립트 이름으로 정한 것이다.

dialPrefix (string) 전화번호를 모뎀에 보내기 전에 머릿말로 붙는 문자열을 지정한다. 보통 전화의 방식에 따르며 기계식인 경우는 ATDP, 전자식인 경우는 ATDT이다. ( ATDT )

dialRepeat (int) 전화 연결이 되지 않았을 경우 연결될때 까지의 반복 횟수를 지정한다. ( 5 )

dialSuffix (string) 모뎀으로 전화번호를 보내고 번호 마지막에 붙는 문자열이다. ( ^M )

dialTimeOut (int) 전화를 걸고 연결될때 까지의 대기시간(초)을 지정한다. ( 45 )

exitConfirm (boolean) Seyon을 종료할때 전화를 끊는 확인의 여부를 지정한다. ( on )

funMessages (string array) Seyon이 어떤 다른 중요한 정보를 표시할 필요가 없을 경우, 화면에 출력하는 여러 문자열들을 지정한다. ( 다양하다. )

funMessagesInterval (int) 메세지를 출력하는 간격을 지정한다. ( 15 )

idleGuard (boolean) 키보드가 눌려지지 않아 원격 호스트로부터 자동으로 연결이 끊어지는 것을 방지하기 위해 정해진 시간마다 문자를 보낼 것인가를 지정한다. ( off )

idleGuardInterval (int) 키보드가 눌려지지 않을 경우 자동으로 보내는 문자열의 시간 간격을 지정한다. ( 300 )

idleGuardString (string) 키보드가 눌려지지 않을 경우 정해진 시간마다 보내어질 문자열을 지정한다. ( /s^H ; space, backspace)

ignoreModemDCD (boolean) 모뎀의 DCD(Data Carrier Detect) 상태를 무시할 것인가를 정한다. ( off )

hangupBeforeDial (boolean) 전화를 걸기전에 현재 연결된 라인을 끊을 것인가 결정한다. ( on )

hangupConfirm (boolean) 접속을 끊을때 확인 여부를 정한다. ( on )

hangupViaDTR (boolean) 직접 DTR을 제어함으로서 전화를 끊는다. Hayes 호환 명령에 명령을 보내어 끊는 것보다 매우 빠르게 끊게 해준다. ( off )

metaKeyTranslation (boolean) 메타키 전환 여부를 결정한다. ( on )

modemAttentionString (string) hangupViaDTR이 유효하지 않을 때 모뎀을 명령어 모드로 전환하는 문자열을 지정한다. ( +++ )

modemHangupString (string) hangupViaDTR이 유효하지 않을때 모뎀에게 연결을 끊는 문자열을 정한다. ( ATH^M )

modems (string) 사용할 모뎀 장치를 정한다. ( 없음 )

modemStatusInterval (int) 모뎀 상태를 업데이트하는 시간(초)을 지정한다. ( 5 )

modemVMin (int) 수신 프로세스가 만족하기 전에 버퍼상에 저장할 최소 문자열을 정한다. ( 1 )

newlineTranslation (string) Enter 키가 눌려졌을 경우, nl(new line), cr(carriage return), cr/lf (carriage return 과 line feed) 중 하나를 결정하여 보낸다. ( cr )

noConnectStringX [X = 1-4] (string) 연결이 실패했을 경우의 응답 메세지. ( NO CARRIER, NO DIALTONE, BUSY, VOICE )

phonelistFile (string) 전화번호 목록을 저장하는 파일이름을 지정한다. ( phonelist )

postConnectAction (string) 원격 호스트에 연결된 후에 실행할 action을 지정한다. 이 action은 호스트에 접속하기 이전의 모든 스크립트보다 먼저 실행된다. ( Beep(); )

protocolsFile (string) 프로토콜의 정보를 저장하는 파일의 이름을 지정한다. ( protocols )

rtsctsFlowControl (boolean) RTS/CTS 하드웨어 흐름 제어의 여부를 결정한다. ( off )

scriptDirectory (string) Seyon 의 스크립트 파일들이 존재하는 디렉토리를 결정한다. ( defaultDirectory )

showFunMessages (boolean) 중요한 정보가 아닌 재미있는 메세지의 출력 여부를 결정한다. ( on )

startupFile (string) 초기 설정 스크립트 파일명을 지정한다. 이 파일명으로 지정된 파일은 다양한 통신 파라미터를 설정하는데 주로 사용된다. ( startup )

stripHighBit (boolean) 입력받은 문자중에 최상위 비트를 제거한다. ( off )

xonxoffFlowControl (boolean) XON/XOFF 흐름제어를 지정한다. ( off )

zmodemAutoDownload (boolean) Z-Modem 자동 다운로드의 여부를 지정한다. ( on )

zmodemAutoDownloadCommand (string) Z-Modem 자동 다운로드를 실행한다. ( $rz )

스크립트 작성 스크립트 파일은 원격 시스템에 login하는 것 같은 지루한 작업을 자동적으로 실행해 준다. 이것은 일반 문서 파일로 되어 있어 문서 에디터로 편집할 수 있다. 스크립트 파일은 한 라인씩 처리되고, 단어 사이의 공백은 무시되며, 주석은 "#"으로 시작한다. 라인의 처음에는 명령어가 오며, 명령어의 끝에 콜론(:)이 붙으면 goto 명령으로 이동할 수 있는 레이블로 간주된다. 스크립트 명령어는 대소문자를 구분하지 않는다. 어떤 명령어는 하나 이상의 인자를 갖으며, 각 인자는 이전에 정의된 한단어로 분석된다. 만일 인자가 공백을 포함하게 되면, 인용부호로 묶여야만 한다.

명령어 목록

debug on|off 모든 명령어를 로컬 화면에 표시할 것인가를 지정한다. 단, transmit 명령어에 의한 것은 표시되지 않는다. 디폴트는 off 이다.

dial <number> <number>로 전화를 건다. Seyon은 일반적인 "Hayes" 호환 모뎀을 지원한다.

echo <string> <string>을 모뎀으로 보내지않고 단지 터미날에 출력한다.

exit 스크립트를 종료하고 이전 터미날 모드로 돌아간다.

flush 모뎀을 초기화 시킨다.

goto <label> <label>로 명령 순서를 이동한다.

hanup 원격 호스트로부터 전화를 끊는다.

if, else, endif if <condition> <statements1> [else <statements2>] endif

<condition> 이 참이면, <statements1>을 실행하고, 추가적으로 참이 아닐 경우(else) <statements2>를 실행한다.

<condition>은 waitfor 와 linked가 있다.
waitfor : 최근 waitfor 명령이 성공적인 경우 참을 갖는다.
linked : 이 스크립트가 전화 목록으로부터 실행되었다면 참을 갖는다.
!waitfor 와 !linked 는 위의 결과에 not을 갖게 된다.

pause <time> <time> 초 동안 스크립트 실행을 보류한다.

purge 1초 동안 모뎀으로 부터 읽혀지는 모든 데이타를 받지 않는다.

quit 스크립트를 종료하고 shell 로 돌아간다.

redial dial 명령으로 사용되었던 마지막 전화번호로 재다이얼한다.

send_break 원격 호스트로 BREAK 신호를 보낸다.

set <parameter> <value> <parameter>를 <value>값으로 설정한다. 여러 호스트에 각각의 통신 파라미터를 설정할때 사용되어질 수 있으며, seyon에서 사용될 수 있는 파라미터는 아래와 같다.

baud* (defaultBPS) bits* (defaultBits) parity* (defaultParity) stopBits* (defaultStopBits) stripHighBit (stripHighBit) newlineTranslation (newlineTranslation) del (backspaceTranslation) meta_tr (metaKeyTranslation) xoff (xonxoffFlowControl) rtscts (rtsctsFlowControl) autozm (zmodemAutoDownload) idleGuard (idleGuard)

shell <shell-command> shell 명령어로 <shell-command>를 실행한다. sz나 rz 같은 외부 프로그램을 실행할때 유용하다. <shell-command>는 한 단어가 아닌 경우 반드시 인용부호로 묶여야 한다.

transmit <text> <text>를 원격 호스트에 전송한다. <text> 가 공백을 포함할 경우 인용부호를 사용해야 공백또한 전송된다.

은 제어 문자를 보낼때 사용된다. 예를 들어 M은 carriage return(0x0D)이며, J는 개행(0x0A)를 전송한다. \은 그 다음에 따라오는 문자를 그대로 보낼때 사용되며, 예를 들면, \

tty on|off 읽혀진 코드가 문자나 제어코드나 모두를 받을 것인지 결정한다. 스크립트 처리하는 동안에는 수신한 문자를 화면에 출력시키지 않기위해 tty off 명령을 사용할 수 있다.

waitfor <text> [timeout] 모뎀으로부터 <text>문자열이 [timeout] 시간안에 수신될때까지 기다린다.

when [<string-to-expect> <string-to-send>] waitfor 명령으로 대기하는 동안 <string-to-expect>의 문자가 읽혀지면 <string-to-send>를 전송한다. 예를 들면,

when "Continue?" "y^M" when "More?" "n^M" waitfor "BBS Command?" when

"BBS Command?"를 기다리는 동안 입력받는 모든 “Continue?”과 “More?" 문자열에 대해서 각각 ”y"와 "n"을 보낸다. 마지막 when은 이전의 모든 when 명령어를 무효화시킨다.

APPENDIX

A. Tips, Tricks, and Common Problems B. FTP Tuterial and Site List C. Networking D. Linux FAQ

Appendix A

Tips, Tricks, and Common Problems

A.1 다중 파일 시스템

만일 유닉스 시스템 관리자로서 경험이 있다면, 리눅스로 다중 파일시스템을 사용하기로 결정하기 쉬울 것이다. 예를 들면, root, /usr의 공간으로 구분되는 파일시스템을 사용할 수 있을 것이다.

리눅스를 다중 파일시스템으로 사용하면서 얻을 수 있는 특별한 이익은 없다. 어쨌든, 모든 것을 동시에 마운트 시키는 것에 생각이 있으면, 그렇게 할 수 있다. 예를 들면, 우연히 root파일 시스템이 손상을 입었다면, /usr 같은 것은 영향을 받지 않을 것이다. 어쨌든, 다중 파일시스템을 사용한다는 것은 하드의 공간을 조심스럽게 다루겠다는 것이며, 파일시스템의 크기를 바꿀 때 파괴되지 않는 방법은 없다.

스웹파티션이 16MB로 제한이 있기 때문에 다중 스웹 파티션을 사용할 수 있다. 당신의 시스템에 8MB의 스웹 파티션을 늘릴 수 있다.

다중 파일시스템을 사용하는 것은 쉽다. 먼저, 각 파일시스템을 위해 구별되는 파티션을 가져야 한다. 많은 파일시스템을 만들 수 있지만, 4개의 primary 파티션으로 제한되기 때문에 logical 파티션을 사용해야 한다. fdisk를 사용하면, 명령어 "n"으로 만들기 원하는 각 리눅스 파일시스템으로 새로운 파티션을 만들 수 있다.

소프트웨어를 설치하기 전에, 적당한 명령어 mke2fs으로 각각의 원하는 파일시스템을 만들어야 한다.

소프트웨어를 설치하기 전에, 설치를 위해서 파일시스템의 전부를 알려주는 부수적인 단계가 필요하다. 어떤 소프트웨어는 적당한 장소에서 모든 파일시스템을 마운트 시키는 작업을 필요로 한다.

SLS 를 설치하려면, doinstall 명령어에 부수적인 인자가 필요하다.

doinstall <rootfs> <mount-pt1> <fs1> <mount-pt2> <fs2> …<mount-ptN> <fsN>

예를 들면, /dev/hda2에 root 파일시스템이 있고, /dev/hda3는 /usr 파일시스템이 있고, /dev/hda4에 /tmp파일 시스템이 있다면, 아래와 같이 해야할 것이다.

# doinstall /dev/hda2 /usr /dev/hda3 /tmp /dev/hda4

A.2 rawrite를 대신하는 dd

유닉스 시스템에서 리눅스 설치 디스크를 만드는 것이 MS-DOS 시스템에서rawrite 를 이용해 만드는 것보다 낳을 것이다. 여기에서 그 과정을 설명한다. 이 과정은 MS-DOS로 포맷된 디스크(SLS의 a2부터 a4까지)를 만드는 것은 아니며, SLS a1 디스크 같은 것을 만들 때 사용되는 rawrite를 대신하는 것이다.

유닉스 시스템에서 사용되는 명령어 dd 는 rawrite의 사용을 대신한다. 명령어의 형식은 아래와 같다.

dd if=<input-file> of=<output-file> bs=16k conv=sync

<input-file>은 플로피로 저장될 파일의 이름이다.

<output-file>은 파일이 저장될 플로피 장치의 이름이다. 많은 시스템에서 이것은 /dev/rfdn이며, 여기서 n은 플로피 드라이브의 장치수인 0이나 1의 숫자이다. 예를 들면, 아래와 같이 할 수 있다.

# dd if=a1.3 of=/dev/rfd0 bs=16k conv=sync

리눅스 하에서는 플로피 디바이스의 이름은 /dev/fd0 나 /dev/fd1 이다. 따라서, 아래와 같이 명령할 수 있다.

# dd if=a1.3 of=/dev/fd0 bs=16k conv=sync

다른 리눅스 시스템으로부터 플로피를 "rawrite"하는 것이다. 그렇지 않으면, 간단하게 cp 명령을 사용할 수 있다.

# cp a1.3 /dev/fd0

A.3 스웹 파일

스웹 공간을 위한 예약된 하나의 파티션을 대신에서, 파일로 사용할 수 있다.

리눅스 시스템이 설치되었다면, 아래의 명령으로 스웹파일을 만들 수 있다. 아래의 명령은 8208 블럭(약 8 MB)의 스웹파일을 생성할 것이다.

# dd if=/dev/zero of=/swap bs=1024 count=8208 # swapon /swap

이렇게 함으로서 /swap 파일이 생성되었다.

이러한 방법으로 스웹파일을 사용하는 것은 스웹파일의 액세스가 파일시스템을 통하여 이루어지는 중요한 결점이 있다. 이것은 스웹파일이 연속적이지 못하다는 것이며 따라서, 언제나 연속적이고 I/O의 요구에 즉각 이루어지는 스웹 파티션을 사용하는 것보다 매우 성능이 떨어진다.

스웹파일의 또다른 단점은 커다란 스웹 파일을 사용함으로써 파일시스템의 데이터가 손상될 경우가 있다. 이것은 어떤 뭔가가 잘못되어서 파일시스템이 손상 될 수 있는 경우라는 것이다. 파일시스템을 지키고, 스웹 파티션을 구분하는 것이 이런 사건을 막는 것이다.

만일 임시적으로 스웹 공간이 더 필요하다면, 스웹 파일을 사용하는 것이 매우 유용하다. 예를 들면, 커다란 프로그램을 컴파일하거나, 속도가 필요한 어떤 작업을 한다면, 임시적으로 스웹 파일을 만들 수 있고, 현재의 스웹 공간에 더 추가 시켜 사용할 수도 있다.

아래의 명령은 스웹 파일을 제거하는 것이며, 먼저 swapoff 를 사용해야한다.

# swapoff /swap

# rm /swap

기억해야 할 것은 각각의 스웹파일이나 파티션은 16 MB정도의 크기이며 사용할 수 있는 스웹 파일이나 파티션은 8 MB정도를 사용해야 한다.

A.4 터미날 연결

리눅스는 별도의 다른 특별한 소프트웨어 필요없이, 기본적으로 터미날을 연결하여 사용할 수 있다. 연결하는 방법중 여기서는 널 케이블(NULL Cable)을 이용하는 것과 모뎀을 이용하는 것을 설명한다. DOS에서의 COM1과 COM2이는 각각ttyS0와 ttyS1 이다. 속도는 모뎀이 낼 수 있는 가장 빠른 것을 것을 적는다.

o 널 케이블을 이용한 터미날 연결 우선 널 케이블을 서로 연결하고, /etc/inittab의 파일을 수정해야 한다.

S1:456:respawn:/etc/getty [속도] [포트] DT속도 vt100

/etc/gettydef 파일을 아래의 예제와 같이 필요하다면 수정한다.

마지막으로 ‘init 6’을 입력한다.

터미날에서는 이야기 같은 통신 프로그램을 띄우고, 포트를 맞추면, login 메시지가 나올 것이다.

o 모뎀을 이용한 터미날 연결 /etc/inittab 파일을 에디터로 불러 다음과 같은 라인을 추가 시킨다.

S1:456:respawn:/etc/getty [포트] [속도]

파일을 저장한 후에, ‘init 6’을 입력한다.

다음으로, 전화를 받는 명령어를 실행해야 한다. 간단히 아래와 같이 구현할 수 있다.

echo "ats0=1" >/dev/modem

항상 작동하게 하려면, /etc/rc.local 파일에 추가시키면 된다.

o 설정파일

만일 제대로 작동하지 않는 다면, 디폴트 값을 바꾸어 줄 필요가 있다. 아래는 /etc/gettydef 파일의 내용으로서 터미날간의 적당한 연결을 만들어 준다.

# /etc/gettydef # default/virtual console entry: vc# B9600 SANE # B9600 SANE -ISTRIP CLOCAL #@S login: #vc

#아래의 한 라인은 터미날을 연결할 경우 추가한다. DT19200# B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL #@S @L login:#DT19200

38400# B38400 CS8 # B38400 SANE -ISTRIP HUPCL #@S @L @B login: #19200 19200# B19200 CS8 # B19200 SANE -ISTRIP HUPCL #@S @L @B login: #9600 9600# B9600 CS8 # B9600 SANE -ISTRIP HUPCL #@S @L @B login: #2400 2400# B2400 CS8 # B2400 SANE -ISTRIP HUPCL #@S @L @B login: #1200 1200# B1200 CS8 # B1200 SANE -ISTRIP HUPCL #@S @L @B login: #38400

Appendix B

FTP Tutorial and Site List

FTP("File Transfer Protocol")는 인터넷의 시스템사이에서 파일을 전송할 때 사용되는 프로그램이다. 인터넷상의 대부분의 유닉스, VMS, MS-DOS 시스템은 파일들을 전송하는 ftp프로그램을 가지고 있다. 만일 인터넷을 액세스할 수 있다면, 이 ftp 를 사용하므로써 최신 버젼의 리눅스나 GNU 소프트웨어를 다운로드 받을 수 있다.

FTP는 명령어 구동 프로그램이며, 인터넷 site 로 부터 업로드나 다운로드 모두 사용될 수 있는 프로그램이다. 인터넷에는 많은 공공의 FTP archive site들이 있고 누구나 ftp를 이용하여 공개 소프트웨어를 다운로드 할 수 있다. FTP archive site는 다른 곳의 소프트웨어를 mirror하는데, 이것은 한 site에서 소프트웨어가 업로드되면, 다른 많은 site에 자동적으로 복사되는 것이다. 많은 다른 archive site에서 같은 파일을 볼 수 있다.

B.1 Starting ftp

ftp를 시작하기 전에 연결할 site가 필요하다. 여기서는 예로서 "screens"으로서 중요한 정보만 소개하며, 이제로 약간 다를 수 도 있다.

ftp를 시작하여 site에 연결하기 위해서는 간단히 아래의 명령을 사용하면 된다.

ftp <hostname>

<hostname>은 연결될 site의 이름이다. 예를 들면, cair.kaist.ac.kr라는 site에 연결한다면, 아래의 명령을 사용하면 된다.

ftp cair.kaist.ac.kr

B.2 Logging In

ftp를 시작하면, 아래와 비슷한 것이 보일 것이다.

Connected to cair.kaist.ac.kr. 220 cair.kaist.ac.kr FTP ready at 15 Dec 1994 03:15:22 KST Name (cair.kaist.ac.kr:jspark):

여기에서, ftp는 username를 요구한다. 여기에서 default는 mdw이며, 나의 시스템의 username이 FTP에 사용된다. cair.kaist.ac.kr에 계정을 가지고 있지 않다면, login 할 수 없을 것이다. 대신에, anonymous로 FTP site로 login하면, 공공의 소프트웨어를 액세스 할 수 있으며, 당신의 인터넷 e-mail 어드레스가 패스워드로 사용된다.

Name (cair.kaist.ac.kr:jspark): anonymous 331-Guest login ok, send e-mail address as password. Password: [email protected]

230- Welcome to cair.kaist.ac.kr

ftp>

패스워드는 화면에 보이지 않을 것이다. 지금부터 소프트웨어를 다운로드할 준비가 되었다.

B.3 Poking Around

지금부터 프롬프트는 ftp> 이며, ftp는 명령어를 기다리고 있다. 몇가지 기본적인 명령어를 알아야 한다. 먼저,

ls <file> 또는 dir <file>

<file>은 특정한 파일을 표시하는 데 사용되는 선택가능한 인자이다. 위 두 명령은 파일의 목록을 출력 시킨다. 이 차이는 전자는 보통 파일이름들만 출력시키고, 후자는 파일의 크기, 수정된 날짜등 더 많은 정보를 출력시킨다.

명령어 cd <directory>

MS-DOS나 유닉스에서와 같이 디렉토리는 바꾼다.

cd ..

이것은 상위 디렉토리로 바꾼다. "cd" 와 ".." 사이에 공백이 있어야 한다.

명령어 help <command>

사용 명령어의 도움말을 출력한다. 아무런 <command>가 없다면, 사용 가능한 모든 명령어의 목록을 출력한다.

dir 명령을 내리면, 현재 있는 초기 디렉토리의 목록을 출력한다.

ftp> dir 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. total 1337

dr-xr-xr-x 2 root wheel 512 Aug 13 13:55 bin drwxr-xr-x 2 root wheel 512 Aug 13 13:58 dev drwxr-xr-x 2 root wheel 512 Jan 25 17:35 etc drwxr-xr-x 19 root wheel 1024 Jan 27 21:39 pub drwxrwx-wx 4 root ftp-admi 1024 Feb 6 22:10 uploads drwxr-xr-x 3 root wheel 512 Mar 11 199 2 usr

226 Transfer complete. 921 bytes received in 0.24 seconds (3.7 Kbytes/s) ftp>

각각의 엔트리들은 디렉토리이며, 개개의 파일을 다운로드 할 수 있는 파일들은 아니다.(첫번째 칼럼에 d 글자가 있다.). 대부분의 FTP archive sites 는 /pub 디렉토리에 유용한 소프트웨어들이 있다.

ftp> dir 200 PORT command successful. 150 ASCII data connection for /bin/ls (128.84.181.1,4525) (0 bytes). total 846

-rw-r–r– 1 root staff 1433 Jul 12 1988 README -r–r–r– 1 65534 65534 56456 Dec 17 1990 ataxx.tar.Z -rw-r–r– 1 root other 2013041 Jul 3 1991 gesyps.tar.Z -rw-r–r– 1 432 staff 41831 Jan 30 1989 gnexe.arc -rw-rw-rw- 1 615 staff 50315 Apr 16 1992 linpack.tar.Z -r–r–r– 1 root wheel 12168 Dec 25 1990 localtime.o -rw-r–r– 1 root staff 7035 Aug 27 1986 manualslist drwxr-xr-x 2 2195 staff 512 Mar 10 00:48 mdw -rw-r–r– 1 root staff 5593 Jul 19 1988 t.out.h

226 ASCII Transfer complete. 2443 bytes received in 0.35 seconds (6.8 Kbytes/s) ftp>

여기에 많은 파일들을 볼 수 있으며, 많은 FTP site들은 /pub 디렉토리에 README 파일이 있다.

B.4 Downloading files

파일을 다운로드 하기 전에, 조심해야할 몇가지 있다.

o Hash mark printing을 ON 한다. Hars mark는 전송이 되어갈때 화면에 얼마나 전송되었는지, 연결이 끊어지지 않았는지를 출력해 준다. 일반적으로 hash는 "#"기호로 출력되며, 시스템에 따라 1024나 8192 바이트가 전송되었을 때 출력된다.

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

o 다운로드할 파일의 형태를 결정해야 한다. FTP는 binary 와 text 두 가지로 파일을 받는다. 대부분의 다운로드 받을 파일은 binary 파일일 것이다. 이것은 프로그램, 압축된 파일, archive 파일등이다. 어쨌든 README 같은 많은 파일들은 text 파일이다. 왜 파일 형태가 있는 것인가? 이것은 MS-DOS 시스템 같은 몇몇 시스템 때문 인데, carriage return 같은 경우는 그 파일을 읽기 위해서 변환되는 것이 필요하다. binary 모드일 경우는 아무 변환이 없고 단순히 byte단위로 전송된다.

명령어 bin이나 ascii는 전송모드를 binary와 text로 변환한다. 의심스러우면, 언제나 binary 모드를 사용하여 전송하라. 만약 binary파일을 text 모드로 전송하면, 파일에 손상을 입어 사용하지 못할 것이다.(이것은 FTP 에서 가장 많이 하는 실수이다.) 어쨌든 text모드는 확장자가 .txt로 끝나는 문서파일에 사용된다.

예를 들면, README 파일을 다운로드 한다면, 아마도 text 파일일 것이다.

ftp> ascii 200 Type set to A. ftp>

o 로컬 디렉토리를 설정하라. 당신의 로컬 디렉토리는 시스템의 디렉토리이며, 다운로드되는 디렉토리이다. cd 명령을 사용하면 원격 디렉토리가 바뀌게 된다. lcd 명령은 로컬 디렉토리를 변경시켜준다.

예를 들면, 로컬 디렉토리를 /home/db/mdw/tmp 로 설정한다면,

ftp> lcd /home/db/mdw/tmp Local directory now /home/db/mdw/tmp ftp>

이제 실제적으로 다운로드할 준비가 되었다.

get <remote-name> <local-name>

<remote-name> 원격 컴퓨터의 파일의 이름이며, <local-name>은 로컬 컴퓨터에 저장될 파일의 이름으로 주어주는 것이다. <local-name> 인자는 선택적이며, default로는 원격이름과 동일하다. 예를 들면, foo.txt 파일을 다운 받으려고 할 때, 만일 로컬 디렉토리에 동일 이름의 파일이 있다면, <local-name>을 덮어써지는 것을 막기 위해서 바꾸어야 할 것이다.

예를 들면, README 파일을 다운 받으려면 아래와 같다.

ftp> get README 200 PORT command successful. 150 ASCII data connection for README (128.84.181.1,4527) (1433 bytes). # 226 ASCII Transfer complete. local: README remote: README 1493 bytes received in 0.03 seconds (49 Kbytes/s) ftp>

B.5 Quitting FTP

FTP를 종료하려면, 간단히 quit를 사용하면 된다.

명령어 close 는 원격 FTP site로 부터 연결을 닫는다. open명령을 사용하여 FTP 프로그램을 종료하지 않고 다른 site로 접속을 시작할 수 있다.

ftp> close 221 Goodbye. ftp> quit

B.6 Linux FTP Site List

아래의 목록은 리눅스 소프트웨어의 잘 알려진 FTP archive site이다. 많은 다른 site들은 이것들을 mirror하고 있으며, 이 목록 이외의 많은 site를 사용할 수 있다.

tsx-11.mit.edu, sunsite.unc.edu, nic.funet.fi는 대부분의 새로운 소프트웨어가 업로드되는 리눅스 소프트웨어의 "home sites"이다. 많은 다른 site는 이 세 site 를 mirror하고 있다. 네트워크를 체증을 줄이기 위해서 지역적으로 가까운 site를 선택하는 것이 좋다.

Linux FTP Sites

Site name IP Address Directory —

tsx-11.mit.edu 18.172.1.2 /pub/linux
sunsite.unc.edu 152.2.22.81 /pub/Linux
nic.funet.fi 128.214.6.100 /pub/OS/Linux
ftp.mcc.ac.uk 130.88.200.7 /pub/linux
fgb1.fgb.mw.tu-muenchen.de 129.187.200.1 /pub/linux
ftp.informatik.tu-muenchen.de 131.159.0.110 /pub/Linux
ftp.dfv.rwth-aachen.de 137.226.4.105 /pub/linux
ftp.informatik.rwth-aachen.de 137.226.112.172 /pub/Linux
ftp.ibp.fr 132.227.60.2 /pub/linux
kirk.bu.oz.au 131.244.1.1 /pub/OS/Linux
ftp.uu.net 137.39.1.9 /systems/unix/linux
wuarchive.wustl.edu 128.252.135.4 /systems/linux
ftp.win.tue.nl 131.155.70.100 /pub/linux
ftp.stack.urc.tue.nl 131.155.2.71 /pub/linux
ftp.ibr.cs.tu-bs.de 134.169.34.15 /pub/os/linux
ftp.denet.dk 129.142.6.74 /pub/OS/linux

Appendix C

Networking

리눅스는 TCP/IP(Transport Control Protocol/Internet Protocol) 네트워크 프로토콜을 지원한다. TCP/IP는 세계적으로 컴퓨터 네트워킹을 위한 최고의 성공적인 메카니즘이다. 리눅스와 Ethernet 카드를 설치하여, LAN, 인터넷, 다른 종류의 네트워크를 연결할 수 있다.

유닉스로 소규모 LAN을 구성하는 것은 쉽다. 각각의 컴퓨터에 Ethernet 컨트롤러와 적당한 케이블, 다른 하드웨어가 필요하다. 또한, 인터넷을 액세스하기 위해서는 회사나 대학에 액세스할 수 있다면, 당신의 컴퓨터를 이 네트워크에 추가하면 된다.

리눅스 TCP/IP는 SLIP(Serial Line Internet Protocol)를 제공한다. SLIP은 모뎀을 사용하여 전화로 인터넷에 액세스 할 수 있다. 회사나, 대학에서 SLIP 액세스 제공하면, SLIP 서버에 전화하여, 전화선으로 인터넷상에 당신의 컴퓨터를 놓을 수 있다. 또한 만일, 인터넷을 Ethernet로 액세스할 수 있으면, SLIP 서버로서 리눅스 박스를 설정할 수 있다.

하드웨어 요구(Hardware Requirements)

네트워크 하드웨어에 관계없이 리눅스 TCP/IP를 자신의 시스템과 통신하는 "loopback" 모드로 사용할 수 있다. 이것은, "loopback" 네트워크 장치를 사용하는 어떤 응용프로그램이나 게임에 있어서 반드시 필요하다.

어쨌든, Ethernet TCP/IP로 리눅스를 사용하기 원한다면 아래의 카드가 필요하다. 3com 3c503, 3c503/16; Novell NE1000, NE2000; Western Digital WD8003, WD8013; Hewlett Packard HP27245, HP27247, HP27250.

아래의 클론들도 사용할 수 있다.

WD-80x3 clones: LANNET LEC-45; NE2000 clones: Alta Combo, Artisoft LANtastic AE-2, AsanteEtherpak 2001/2003, D-Link Ethernet II, LTC E-NET/16 P/N 8300-200-002, Network Solutions HE-203, SVEC 4 Dimension Ethernet, 4-Dimension FD0490 EtherBoard 16, and D-Link DE-600.

리눅스는 또한 전화선을 통한 모뎀을 사용하여 인터넷을 액세스할 수 있게 하는 SLIP를 지원한다. 이런 경우, US Robotics Sportster, the Infotel 144DF Internal 같은 14.4bps V.32bis 모뎀이 SLIP 서버로 사용하는데 필요하다.

UUCP (Networking with UUCP)

UUCP (UNIX-to-UNIX Copy)는 유닉스 시스템간에 정보를 전송하는 오래된 메카니즘이다. UUCP를 사용하면, 모뎀을 통하여 다른 시스템에 메시지, 뉴스, 파일등을 전송할 수 있다. TCP/IP나 SLIP 액세스를 할 수 없다면, UUCP를 사용하여 통신할 수 있다. 대부분의 우편이나 소프트웨어들은 UUCP를 사용하여 다른 컴퓨터에 정보를 전송할 수 있도록 설정되어 있다. 사실, Internet site가 용이하다면, 이 site 로 부터 Internet 우편을 당신의 리눅스로 가져올 수 있다.

전자우편(Electronic Mail)

대부분의 다른 유닉스 시스템처럼, 리눅스도 전자메일을 이용하기위한 많은 소프트웨어를 제공한다. 시스템의 E-mail은 local(시스템의 다른 사용자에게 우편을 보내는 것), network(TCP/IP나 UUCP를 사용하여 네트워크된 다른 컴퓨터의 사용자에게 우편을 보내는 것) 모두 될 수 있다. E-mail 소프트웨어는 보통 두 부분으로 구성되어 있다. Mailer와 Transport이다. Mailer는 e-mail의 메시지를 읽거나 쓰는 사용자수준의 소프트웨어이다. 인기 있는 mailer는 elm과 mailx이다. Transport는 local이나 remote하게 우편을 전송하는 저급 소프트웨어이다. 사용자는 결코 transport 소프트웨어를 볼 수 없을 것이며, 그것은 mailer와 상호작용한다. 어쨌든, 시스템 관리자의 입장에서는 transport 소프트웨어의 개념과 어떻게 설정하는지를 이해하는 것은 중요하다.

리눅스에서 가장 유용한 transport 소프트웨어는 Smail이다. 이 소프트웨어는 설정하기가 용이하며, local이나 remote TCP/IP의 e-mail 모두 가능하다. 대부분의 유닉스에서는 더 강력한 sendmail transport를 사용한다. 어쨌든, 셋업하는 메카니즘이 복잡하기 때문에 대부분의 리눅스에서는 사용하지 않는다.

리눅스 UUCP-MAIL-NEWS FAQ는 리눅스를 위한 유용한 우편 소프트웨어에 대한 정보와 시스템에 설정하는 방법을 설명한다. 원격으로 우편을 보내려 한다면, TCP/IP나 UUCP에 대한 이해가 필요하며, 이것은 하드웨어에 의존하게 된다.

USENET(News and USENET)

만일 TCP/IP 나 UUCP 네트워크에 액세스할 수 있다면, 세계적인 네트워크 뉴스 서비스인 USENET에 참여할 수 있을 것이다.

뉴스 소프트웨어는 서버와 클라이언트의 두부분으로 되어 있다. 뉴스 서버는 뉴스그룹을 제어하거나 다른 컴퓨터로 뉴스를 전달하는 것이다. 뉴스 클라이언트 또는 뉴스리더(newsreder)는 뉴스를 읽기거나 쓰기 위해서 서버에 접속하는 소프트웨어이다.

리눅스에서 유용한 뉴스 서버는 여러 형태가 있다. 그것들은 같은 기본적인 프로토콜과 설계를 따른다. "C News"와 "INN"의 두 중요 버전이 있다. Newsreader은 rn, tin 같은 많은 형태가 있다. Newsreader는 취향에 따라 선택할 수 있을 것이다. 모든 Newsreder는 다른 여러 서버 소프트웨어에서도 같은 작업을 하려 할 것이다. 그것은 Newsreader가 서버 소프트웨어에 비독립적이라는 것이다.

USENET의 부분이 아닌 Local로서만 뉴스를 운영하고 싶다면, 시스템에 서버를 운영하고, 사용자를 위하여 newsreder를 설치하면 된다. 뉴스서버는/usr/spool/news 같은 디렉토리에 문서를 저장할 것이며, newsreader는 뉴스 문서를 보기위해 이 디렉토리에 모일 것이다.

어쨌든, 네트워크에 뉴스를 운영하고 싶다면, 몇가지 선택 해야하는 것이 있다. TCP/IP 네트웤 기반 뉴스는 NNTP(Network News Transmission Protocol)로 알려진 프로토콜을 사용한다. NNTP는 newsreader가 네트워크나, 원격 컴퓨터를 통하여 뉴스를 읽게 해준다. NNTP는 또한 뉴스 서버가 다른 네트워크 문서를 보내게 해준다. 이것은 USENET 기반의 소프트웨어이다. 대부분의 회사나 대학에서는 하나 이상의 NNTP 서버가 모든 USENET 뉴스를 취급하기 위해 설정되어 있을 것이다. NNTP 서버는 실제적으로 뉴스 문서를 디스크에 저장한다.

뉴스 설정에 몇가지 가능한 시나리오.

o 뉴스를 local로 운영한다. 어떤 네트워크에도 연결이 되어 있지 않은 경우 C News나 INN을 운영할 수 있으며, 뉴스를 읽기 위해서 newsreader를 설치한다.

o TCP/IP 네트워크와 NNTP 서버를 액세스 할 수 있다. 당신의 소속된 기관이 NNTP 뉴스서버를 설정하였다면, NNTP기반의 newsreader를 설치 함으로써 당신의 리눅스에 뉴스를 읽거나 보낼 수 있다. ( 대부분의 newsreader는 로컬로 운영하거나 NNTP를 사용을 설정함으로서 가능하다.) 이 경우, 시스템에 뉴스 서버를 설치하거나 뉴스 문서를 저장할 필요는 없다. Newsreader는 네트워크에서 뉴스를 읽거나 보낼 때 조심스럽게 다룰 것이다. 물론, 당신은 TCP/IP 설정하여야 하며, 네트워크에 액세스 할 수 있어야 한다.

o TCP/IP 네트워크를 액세스할 수 있으나, NNTP를 가지고 있지 않다. 리눅스시스템에 NNTP 뉴스서버를 운영할 수 있다. 로컬이나 NNTP 기반의 newsreader를 설치할 수 있고, 서버는 당신의 시스템에 뉴스 문서를 저장 시킬 것이다. 다른 NNTP 뉴스서버와 뉴스를 전송하기위한 통신을 서버에 설정할 수 있다.

o UUCP를 사용하여 뉴스를 전송하기 원한다. UUCP를 액세스할 수 있으면, USENET에 참여할 수 있으며, (local) 뉴스 서버와 뉴스 reader가 필요하다. UUCP 소프트웨어를 설정하여 가까운 다른 UUCP 컴퓨터에 주기적으로 문서를 전송시킬 수 있다.("news feed"라 부른다). UUCP는 뉴스를 전송하기 위해서 NNTP를 사용하지 않는다. 간단히, 말하면, UUCP는 뉴스문서를 전송하기 위하여 그 자신만의 독특한 메카니즘을 제공한다.

News 서버나 newsreader 소프트웨어는 손수 컴파일 해야하며, 사용하기 위해 설정을 할 필요는 없다. 대신에 이런 설정은 컴파일시에 결정된다.

Appendix D

Linux FAQ

Q. 386 랩탑에서 리눅스를 운영할 수 있는가? A. 충분히 할 수 있으며, X도 가능하다.

Q. 리눅스는 충분히 안정적인가? A. 매우 안정적이다. 실제적인 버그들은 알파버젼의 드라이버들이다.(왜 알파버젼인가?) 리눅스와 99%의 응용프로그램들은 충분히 안정적이며, Xwindow가 486-33에서 설치되었을때, 설치된 RAM 용량이 같다면 Sun 워크스테이션의 SunOS보다 빠르게 동작한다.

Q. 386의 총 주소지정 가능한 4GB를 처리할 수 있는가? 표준 미닉스는 64kB가 한계아닌가? A. 커널 0.97 버젼이후는 4GB의 처리 공간을 가지며, 3개의 사용자공간과 1개의 커널공간을 사용한다.

Q. 하드드라이브로 부터 LILO를 제거하는 방법은? A. 간단히, DOS나 OS/2로 부팅하여 FDISK /MBR 하면 된다. 이것은 부팅된 운영체제의 부트 레코드를 하드 드라이브에 마스터 부트 레코드(MBR)로 저장한다.

Q. 디폴트 비디오 모드를 설정하는 방법은? A. rdev를 사용하면 된다. “-v" 옵션은 비디오 모드를 커널안에 설정한다. 예를 들면, 부트시에 비디오 모드를 선택할 수 있게 하기 위해서는 "rdev -v /Image -3"과 같이 입력할 수 있다. 플로피상의 커널을 사용한다면, "rdev -v /dev/fd0 {video-mode}"를 입력하면 된다.

Q. 컴퓨터를 재부팅하면 “panic: trying to free unused inode.”라는 메세지와 함께 다운된다. A. 재부팅하기 전에 “sync”를 하지 않았기 때문이다. “sync”는 커널 버퍼에 있는 내용을 디스크에 물리적으로 저장하는 것이다. 완전히 다운되지 않았다면, “fsck”나 “e2fsck”로 치료를 시도해 볼 수 있고 그렇지 않다면, 파일 시스템을 다시만들거나(mkfs) 다시 설치하여야 한다. 정상적으로 종료하고 재부팅하는 명령은 “shutdown -r now”이다.

Q. 시스템 사용중에 “Kernel panic: free_inode: bit already cleared”라는 메세지가 나오며, 또한 디렉토리안의 모든 파일에 ENOENT 에러가 발생한다. A. 파일 시스템에 문제가 있다. 재부팅하기전에 sync를 하지 않았을 경우에 발생되기 쉽다. 리눅스는 보통 4MB 이하의 메모리 일 경우는 0.5MB의 4MB이상의 메모리일 경우는 1.5MB의 버퍼 공간을 갖는다. 이 버퍼의 내용이 디스크에 저장되지 않고 재부팅되면 문제가 생기는 것이다. "fsck -a [device]"로 복구하고, 복구되지 않으면 파일시스템을 다시 설치하여야 한다. sync는 매 30초 마다 자동적으로 실행되며, 손수 "sync"를 입력할 수 있다. 또한, 초기 shell로 부터 logout하면 자동적으로 sync된다. 파일시스템을 unmount 할 경우도 sync된다.

Q. 플로피 디스크에 파일시스템을 만드는 방법은? A. fdformat으로 디스크를 low-level 포맷하고, mkfs는 파일시스템을 생성해야 한다. A드라이브의 3.5인치 1.44MB인 디스켓을 예로 들면, 아래와 같다. fdformat /dev/hd0H1440 mkfs -t ext2 /dev/fd0H1440 1440 B드라이브의 5.25인치는 1.2MB인 디스켓인 경우, fdformat /dev/hd1H1200 mkfs -t ext2 /dev/fd1H1200 1200

Q. 바이너리 파일을 “cat” 명령어로 보았을 경우, ascii code 127이상의 문자들만 보여진다. A. echo "^V^O"를 한다.

Q. /etc/mtools 파일의 형식은 무엇인가? A. /etc/mtools 파일은 drive, device, fat, cylinders, heads, sectors, offset 의 내용으로 구성되어 있다. 예를 들면, A /dev/fd0 12 80 2 15 C /dev/hda1 16 0 0 0 DOS 디스크 A는 /dev/fd0 디바이스를 통하여 액세스하며, 이것은 12-bit FAT, 80 cylinders, 2 heads, 15 sectors/track를 가지고 있다. DOS 디스크 C는 /dev/hda1 디바이스를 통하여 액세스하며, 16-bit FAT를 가지고 있다. cylinders, heads, sectors를 0으로 할 경우 mtools가 자동으로 설정한다.

Q. setterm을 사용하는 방법은? A. setterm은 대부분의 가상콘솔의 기능을 액세스하게 해준다. 몇가지 예를 보이면, 1. 10분마다 화면을 검게한다.(screensaver) setterm -blank 10 2. VC 4의 내용을 파일 mydumpfile로 dump 한다. setterm -file mydumpfile -dump 4 3. VC 4의 내용을 현재 VC로 dump한다. setterm -file /dev/tty0 -dump 4 4. 현재 VC의 내용을 VC 4로 dump한다. setterm -file /dev/tty4 -dump 5. 현재 VC의 내용을 직렬포트로 dump한다. setterm -file /dev/ttys1 -dump

Q. 커널을 업그레이드 하였는데, login 화면은 과거 버젼이 표시된다. A. /etc/issue와 /etc/mtod 파일 내용을 수정해야 한다. 앞의 것은 login 이전에 출력되며, 뒤의 것은 login 이후에 출력되는 메세지를 담고 있다.

Q. doshell은 무엇인가? A. getty가 없었던 초기 리눅스 버젼에서 특정 tty로 login할 수 있도록 spawn하는데 사용되었던 프로그램이다.

Q. 리눅스로 부팅하면 화면에 8개의 가상콘솔이 있다는 메세지가 나오는데, 5-8까지의 콘솔을 사용할 수 없다. A. /etc/inittab 파일을 수정해도 되며, doshell을 실행하여 바로 가상콘솔을 사용할 수 있다.

Q. swap 파일을 지우는 방법은? A. /etc/rc 파일의 내용중 swapon 을 제거하면 된다.

Q. 어느 정도의 swap 공간이 필요한가? A. 리눅스는 실제로 swapping 하는 것이 아니라, paging 한다. swap 공간은 실제 메모리에 추가되는 가상 메모리라 할 수 있다. 예를 들면, 8MB RAM에 12MB의 swap 공간을 잡으면, 20MB 가상 메모리가 설정된다.

Q. VFS란 무엇인가? A. VFS(Virtual FileSystem)은 한 파일시스템을 전환할 수 있다. 이것은 새로운 파일시스템의 설계를 쉽게 해주며, 리눅스 커널애 기본적으로 포함된 미닉스 파일시스템의 형식을 포함한다. 따라서, 새로운 파일시스템과 미닉스 파일시스템을 동시에 마운팅할 수 있다.

Q. 리눅스상에서 작동하는 C 컴파일러는 무엇인가? A. 리눅스의 C 컴파일러는 GCC(GNU C Compiler)이다. 사실 이 컴파일러는 DOS, OS/2, Amiga 등 다양한 플랫폼에 이식되어 있다.

Q. gdb를 사용하여 디버그하려면 어떻게 컴파일하여야 하는가? A. 여러가지 방법이 있을 수 있다. 만일 gcc2.2.2 이상의 버젼을 사용한다면, 간단히 -g 옵션을 사용하면 된다.

Q. 소스 코드를 컴파일하면, cc1이 insn 코드가 있다고 한다. 이것은 무엇인가? A. insn은 gcc가 컴파일할때의 내부적인 표현이다. gcc의 메인 부분은 표준 C나 C++의 코드를 가지고 컴파일한다. insn부분은 소프트웨어나 하드웨어에 비의존적인 최적화를 수행하며, 나머지 부분은 insn를 하드웨어와 OS에 의존하는 어셈블리 언어로 변환한다. 그러므로, 컴파일시에 최적화 옵션인 -O를 하지 않으면 된다.

Q. 공유 라이브러리를 만드는 방법은? A. 툴을 이용하여 공유 라이브러리를 만들 수 있다. DLL 라이브러리 이전에는 많은 방법이 있었지만, 지금은 원시 코드의 수정없이 공유 라이브러리를 만들 수 있다. 이 툴은 tools-m-n.tar 파일로 존재한다.

Q. X를 사용함으로서 일반적으로 빠트리기 쉬운 것들이나 에러들은 무엇인가? A. 1) /usr/X386/bin/ (또는 /usr/bin/X11) 디렉토리를 PATH로 설정한다. 2) /etc/termcap 파일에 xterm termcap를 추가한다. 3) XBIN 디렉토리안에서 "ln -s X386 X"를 실행한다. 원하는 화면모드로 설정한다. 만약 흑백 서버를 사용하길 원한다면 ln -s X386mono X 4) root 로서 X를 실행해본다. 5) Xconfig 파일의 마우스 엔트리를 검사하라. 6) /tmp 디렉토리의 사용허가를 read/write/exec 모두 사용가능하게 설정한다. 7) startx 2> x.err 를 실행하면 에러메세지를 볼 수 있다. 8) 여분의 VC가 있어야한다. 9) /tmp/.Xn-lock 파일을 지운다.

Q. Xconfig의 일반적인 문제는 무엇인가? A. 1) 하나의 그래픽 모드만을 포함하여 테스트해본다. 2) 마우스 부분을 잘못 설정하였다면 에러 메세지가 출력될 것이다. 만일 에러없이 실행되었으나 마우스가 동작하지 않는다면 /dev/ttyxx 를 검사한다. 3) VGA 부분이나 modeDB 를 검사한다. 4) videoram 은 칩의 실제 램용량과 반드시 일치해야한다. 5) 가상 해상도는 비디오램에의해 결정된다.(512kb는 800x600)

Q. 리눅스를 DOS, OS/2, 386BSD, Minix등과 함께 사용할 수 있는가? A. 가능하다. 리눅스는 표준 PC 파티션을 사용하기 때문에 다른 운영체제와 하드 디스크를 나눌 수 있다. 또한, 리눅스는 DOS의 FAT나 OS/2 HPFS의 파일 시스템도 액세스할 수 있다. 커널 내부에 이러한 기능이 있으며, mtools나 dosemu등을 사용하여도 가능하다.

Q. 리눅스상에서 MS-Windows를 실행할 수 있는가? A. 아직은 불가능하다. 현재 에뮬레이터 프로젝트(WINE)가 진행중에 있다.

Q. OS/2의 부트 메니져로 부터 리눅스를 부팅하는 방법은 무엇인가? A. 1. OS/2 의 FDISK를 사용하여 파티션을 생성한다.(리눅스의 fdisk는 불가능하다.) 2. OS/2 상에서 OS/2의 파티션을 포맷한다. 3. 부트 메니져에 리눅스를 위한 파티션을 추가시킨다. 4. 리눅스로 부팅한 후, fdisk를 사용하여 리눅스 파티션의 파티션형(Linux Native)을 지정한다. 5. 파일 시스템을 생성한다. ( mkfs -t ext2 ) 6. 리눅스를 설치한다. 7. 리눅스 파티션에서 LILO를 설치한다. (마스터 부트 레코드상에서 하면 않된다.)

LILO config 파일인 /etc/lilo/config 파일안에 boot = /dev/hdxx를 추가한다. (xx 는 리눅스의 파티션이다.)

Q. 16MB이상의 swap 공간을 만들 수 있는가? A. 리눅스 커널 0.99.14 부터 128MB까지의 swap 공간을 만들 수 있다.

Q. 하드디스크로 login할 수 없다. A. 먼저, boot 디스켓으로 부팅한후 아래와 같이 마운팅한다. mount -t 파일시스템형 하드디스크파티션 /mnt ex) mount -t ext2 /dev/hdb5 /mnt 하드디스크는 /mnt 디렉토리내에 존재한다. logout할 경우는 반드시 unmount시켜야 한다. 루트 디렉토리에서 하지 않으면 “device busy”메세지가 나올 것이다.

Q. 리눅스와 관련 문서를 구할 수 있는 방법은? A. 리눅스는 주로 인터넷과 우편으로 배포된다. 만약, 주위에서 쉽게 구할 수 없다면, 필자가 도움이 되었으면 한다. (HITEL:bgscom1)

로긴 후 수정하실 수 있습니다. 관심있는 분들의 많은 참여 부탁드립니다. 문법은 Formatting Syntax참조하세요.

연결문서