[Link] 리눅스 초보자를 위한 팁
Link:http://cafe.naver.com/hssbaby.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=329
■ 프로그램의 컴파일
C나 C++ 또는 Objective C로 쓰여진 프로그램을 컴파일하기 위한 준비사항들을 알아보자. 먼저 컴파일 전에 이미 설치가 되어있어야 할 내용을 확인해보면 다음과 같다.
gcc : 컴파일러
binutils : 지원 유틸리티
kernel-source : 몇 개의 중요한 헤더파일
libc-include : 대부분의 다른 헤더파일
libc-devel : 나머지 필요한 것들
그리고 Makefile을 사용한다면 make가 컴파일에 필요하다.
다른 필요한 패키지들은 다음과 같다.
bin86 : 리얼모드 바이너리 유틸리티 (이것은 커널과 dosemu 등에서 사용)
bison : yacc의 GNU 버전 (*.y 라는 파일에 사용되는 파서)
byacc : yacc의 BSD 버전 (bison을 사용하지 않는 몇몇 프로그램에서 사용)
flex : lex의 GNU 버전(*.l 파일에서 사용되는 구문분석기)
gcc-c++ : C++ 컴파일러 (*.cc, *.C, *.cxx, *.c++ 파일에서 사용)
libg++ : standard와 GNU c++ 라이브러리 (대부분의 C++ 프로그램에서 사용)
gcc-objc : Objective-C 컴파일러(*.m 파일에서 사용)
patch : patch 프로그램
diffutils : patch 생성기
pmake : make의 BSD 버전(BSD Makefile은 구문이 좀 차이가 있다.)
XFree86-devel : XFree86 라이브러리 (X용 프로그램을 만들 때 사용)
ImageMagick-devel : ImageMagick 라이브러리 (거의 안씀)
e2fsprogs-devel : ext2fs 라이브러리 (저 수준의 파일 시스템 프로그램을 만들 때)
libgr-devel : 여러 그래픽 라이브러리 (많은 그래픽 프로그램에서 사용)
ncurses-devel : 모든 사양의 curses 라이브러리 (텍스트 환경의 사용자 입력 프로그램의 개발에 사용)
slang-devel : SLang 라이브러리
svgalib-devel : 콘솔 그래픽 라이브러리 (약간의 프로그램에서 사용)
보통 프로그램 컴파일보다 커널의 컴파일을 어렵게 생각하는데 커널컴파일도 실제로 그렇게 어렵지 않다. 다음과 같은 순서로 한다.
make mrproper : 패치를 한 경우나 커널소스를 새로 설치한 경우에 실행시킨다.
불필요한 라이브러리를 삭제한다. make config 또는 make xconfig 또는 make
menuconfig : 커널에 포함될 내용을 설정한다.
make dep : 의존성 검사를 한다.
make clean : 필요없는 파일을 지워준다.
make zlilo 또는 make zImage : 커널을 만들어준다. zlilo는 lilo를 사용하는 사용자인 경우
make modules : 모듈을 컴파일한다.
make modules_install : 모듈을 설치한다.
프로그램을 컴파일할 때는 항상 README나 INSTALL 파일을 확인한다. 보통 컴파일하는 경우에 다음의 네 가지 중에 한가지에 해당된다. 먼저 Imakefile이 있는 경우는 다음과 같이 실행한다.
xmkmf -a
make all
두 번째로 Makefile.in이 있는 경우에는 다음과 같이 실행시킨다.
./configure ─prefix=/usr
make all
세 번째는 Makefile 만이 있는 경우에는 다음을 실행시켜 본다.
make all 또는 make program
네 번째는 직접 gcc를 부르는 경우이다. 만약 소스가 foo.c라면 다음과 같이 실행한다.
gcc -c foo.c -o foo.o
gcc foo.o -o foo
이 경우에는 foo라는 실행파일이 생성된다.
다음은 패치에 관한 것이다. 패치에 관한 매뉴얼 페이지나 info 파일을 참조해서 적당한 디렉토리를 선택하고 그 디렉토리에서 patch 명령어를 입력한다.
patch -s -pn <patchfile
n은 패치를 적용시킬 디렉토리의 수이다. n값은 소스 디렉토리에서 하면 0이다. 자세한 사항은 patch의 매뉴얼을 참조한다.
(위 내용은 레드햇 팁 시리즈를 번역한 것입니다.)
■ 부팅 절차
부팅 절차는 보통 다음과 같다.
init 프로그램은 부팅시에 커널에 의해서 실행되는 프로그램이다. 이 프로그램은 System V 계열과 BSD 계열이 있다. 각 배포본 마다 사용하는 계열에 차이가 있는데 레드햇 배포본의 경우는 System V 계열을 사용한다. System V와 BSD 계열의 차이는 /etc 아래의 설정파일들에 차이가 있다. Sys V 계열은 /etc 밑에 rc.d 디렉토리가 있다. 이 안에 rc.sysinit와 다음과 같은 디렉토리들이 있다.
init.d
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
init.d에는 기본적으로 부팅시에 또는 다른 실행레벨로 들어갈 때 각각의 서비스들에서 사용하는 스크립트 파일들이 들어있다. 서비스에는 network, nfs, sendmail. httpd 등이 있다. 그리고 자신에 필요한 서비스들은 rc.local 파일에 기술되어 있다.
이벤트의 실행순서는 다음과 같다.
init는 /etc/rc.d/rc.sysinit를 실행한다. rc.sysinit는 필요한 작업을 수행하고 필요한 경우 rc.serial을 실행시킨다. init는 기본 실행레벨에 있는 모든 스크립트를 실행한다.
그리고 rc.local을 실행한다. 기본 실행레벨은 /etc/inittab에 결정되어 있다. 기본 실행레벨을 바꾸려면 다음과 같은 행을 찾아서 수치를 바꾸어 주면 된다.
id:3:initdefault:
여기에서 기본 실행 레벨은 3이고 이것은 대부분의 시스템에서 사용하는 것이다.
inittab 파일을 변경할 때는 주의해야 하고 만약 잘못되었다면 다음과 같이 싱글모드로 부팅한 후 변경해야 한다.
LILO boot: linux single
그리고 스크립트가 정상적으로 수행이 되는가를 알려면 먼저 현재의 실행레벨을 알아보고 해당 디렉토리로 이동하여 각각의 파일들을 확인한다. 실행레벨이 3이면 rc3.d 디렉토리를 확인한다. 각각의 파일들을 보면 아래와 같이 나온다.
S10network-> ../init.d/network
S30syslog->../init.d/syslog
S40cron->../init.d/cron
S50inet->../init.d/inet
S60nfs->../init.d/nfs
.
.
.
.
S99local->../rc.local
파일들은 실제로는 init.d 디렉토리에 있는 파일들로의 링크들이다.
'S'는 start 스크립트이고 'K'는 stop 스크립트이다. 각 스크립트는 번호에 따라서 실행 순서가 주어진다. 'S'로 이루어진 스크립트는 부팅 시에 실행되고 'K'는 종료시에 실행된다. 만약 각 서비스를 부팅 후에 실행시키거나 종료시키려면 다음과 같이 start나 stop인자를 주어서 스크립트를 실행시키면 된다.
/etc/rc.d/init.d/httpd.init sop
위와 같이 실행을 시키면 httpd 서버를 종료시킬 수 있다.
레드햇 배포본의 경우에는 실행레벨 따른 서비스를 선택하기 위해서 Sys V Runlevel maganer가 있다. 다음은 그 화면이다. available에 있는 것 중에서 필요한 것을 start와 stop 항목에 실행레벨에 따라서 넣어주면 된다.
(위 내용은 레드햇 팁 시리즈를 번역한 것입니다.)
■ 리눅스에서의 인쇄
프린터를 사용하기 위해서는 먼저 자신의 디바이스를 확인한다. 확인은 부팅 메세지를 보면 된다. dmesg | more 명령을 사용하거나 또는 /var/log/messages 파일을 확인한다.
Serial driver version 4.13 with no serial
options enabled
tty00 at 0x03f8 (irq = 4) is a 16550A
tty01 at 0x02f8 (irq = 3) is a 16550A
lp 1 at 0x0378, (polling)
인쇄를 하려면 lpr 명령을 사용한다. 다음과 같이 사용한다.
[sjlee@bads log]$ lpr messages
lpr은 내용을 /var/spool 디렉토리로 복사한다. 그리고 스풀 디렉토리의 내용은 lpd라는 daemon 프로그램이 백그라운드로 인쇄를 한다. lpd가 인쇄를 하는 동안에는 /etc/printcap 파일이 사용된다. lpr 명령 중에서 -p 옵션을 사용해서 프린터를 지정할 수 있다. 옵션없이 사용하려면 환경변수를 지정해주면 된다.
PRINTER=hplj
export PRINTER
lpq로 프린트 큐를 확인할 수 있다.
[root@nikea /root]# lpq
lp is ready and printing
Rank Owner Job Files Total Size
active root 16 top.txt 135115bytes
1st root 17 wine.sym 279546bytes
lprm 명령은 큐에 있는 프린트의 내용을 지울 수 있다.
[root@nikea /root]# lprm 16
dfA016Aa00953 dequeued
cfA016Aa00953 dequeued
lpc 명령은 제어 프로그램이다. lpc를 실행시키면 lpc 프롬프트가 나타난다.
[root@nikea /root]# lpc
사용되는 명령어들을 보려면 help 명령을 입력한다.
lpc> help
Commands may be abbreviated. Commands are:
abort enable disable help restart status topq ?
clean exit down quit start stop up
lpc> status <- 상태를 확인한다.
lp:
queuing is enabled
printing is enabled
no entries
no daemon present
명령어에 대한 설명을 보려면 help 명령어등과 같이하면 된다.
lpc> help status
status show status of daemon and queue
다른 명령에 대한 내용도 확인하기 바란다.
스풀을 사용하지 않고 직접 프린터로 보낼 경우에는 다음과 같이 한다.
1. root로 로그인을 하고 프린터를 켠다.(루트로 로그인을 하는 이유는 write 퍼미션이
소유자만 되는데 소유자가 root 이기 때문이다.)
2. 명령행에서 cat 인쇄할 파일 > /dev/lp1과 같이 한다. lpr을 사용하는 경우엔
스풀 디렉토리에 인쇄할 내용에 대한 복사본이 저장되는데 인쇄할 파일이 큰 경우에는
불편하다. 이럴 때에는 원본 파일을 사용하여 직접 인쇄를 할 수 있다.
다음과 같이 명령을 내리면 이런 방식으로 사용할 수 있다.
lpr -s 프린트할 파일
-s는 symbolic link를 말한다.
이러한 사용의 단점은 인쇄할 파일에 대한 조작을 할 수 없다는 것이다.
인쇄시에 프린터에 대한 정보를 가지고 있는 /etc/printcap 파일은 내용을 이해하기가 쉽지 않다. 그래서 만약에 프린터를 설정해야 할 경우라면 배포본 등에 있는 프린터 설정 메뉴등을 이용하는 것이 편리하다. 자신의 프린터에서 지원하는 에뮬레이션을 잘 확인하고 이러한 설정을 해야 한다.
다음은 레드햇 배포본에 있는 프린터 설정 화면이다. 인쇄할 내용이 프린터로 가기 전에 입력 필터에서 적절히 가공된다.
위의 화면의 내용 중에서 만약 텍스트를 인쇄하는데 계단 모양으로 인쇄가 되면 다음의 내용을 선택해준다. 이런 식으로 설정해주고 테스트를 해보면 된다.
Fix stair-stepping text?