다음 이전 차례

7. 기본적인 환경설정 (How to set things up, basic)

7.1 일반적인 lpd 설정(Traditional lpd configuration)

lpd에 최소한의 설정을 통해서 시스템은 화일을 프린트 큐로 보내어 출력할 수 있다. 이 과정은 해당 파일을 프린터가 이해할 수 있는지의 여부, 출력 물이 보기좋게 나올 수 있는가에 대해서는 전혀 고려하지 않았다. 그렇지만, 가장 기본적인 단계이다. 계속 읽어 보도록! 기본적으로, lpd에 프린트 큐를 추가하려면 /etc/printcap의 목록을 편집 해야 하며, /var/spool/lpd에 새로운 스풀 디렉토리를 만들어야 한다.

/etc/printcap의 목록은 다음의 형식을 가진다.
# LOCAL djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:sh:
위의 내용은 lp, dj, deskjet이라는 (가상의) 프린터를 정의하며, /var/spool/lpd/dj 디렉토리에 자료를 임시저장하고, 파일(작업)당 최대 크기의 한계가 없으며, 디바이스 /dev/lp0으로 자료를 출력한다. 그리고, 해당 작업의 앞쪽에 추가되는 banner page - 출력 작업을 명령한 사람과 기타 정보를 포시한다. - 가 없다. printcap의 맨페이지를 자세히 읽어 보길 권장한다. 위의 내용은 아주 간단해 보이지만, 함정(catch)이 있다 - DeskJet 500이 이해할 수 없는 내용의 파일을 보낸다면, 프린터는 이상한(?) 결과물을 출력할 것이다. 예를 들어 보통의 unix 문서 파일을 DeskJet 프린터로 보 내면 newline을 그대로 읽어들여 다음과 같이 출력한다.(계단현상의 예)
This is line one.
   This is line two.
      This is line three.
PS(PostScript 이하 PS) 파일을 이렇게 스풀로 보내어 출력하면 이쁘게 나열된 PS명령어만 잔뜩 만나게 될 것이다.8^) 물론 위에서 언급된 계단현상(staircase effect)도 함께... 분명히 별도의 설정이 필요하다. 이를 위해서 필터(filter)가 사용된다. printcap의 맨페이지를 열심히 읽은 사람이라면 spool의 특징으로 ``if''와 ``of''를 주목할 것이다. 여기서 if - input filter - 가 우리에 게 필요한 부분이다.

newline 이전에 CR(Carriage Returen)을 삽입하는 스크립트를 사용한다면 계단현상을 해결할 수 있다. 그러므로, 위의 printcap의 내용에 if로 시작 하는 줄을 추가해야 한다.

lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:if=/var/spool/lpd/dj/filter:\
:sh:
간단한 필터 스크립트는 다음의 내용처럼 작성하면 된다. (아래의 스크립트는 perl을 이용했다.) #!perl while(<STDIN>){chop $_; print "$_\r\n";}; 위의 지시대로 한다면, 일반적인 유닉스 텍스트 파일을 출력할 수 있는 스풀 환경을 가지게 될 것이다. (물론 위의 필터를 작성하는 방법은 수백만 가지가 있지만, 예제로 삼기에 적당한 것은 적은 편이다. 위의 작업이 좀 더 효율적으로 수행될 수 있도록 생각해 보라) 이제는 일반 텍스트 파일의 출력이 널리 애용되는 방법이 아니라는 문제가 남아있다. - 아마도 PS나 다른 종류의 문서양식(dvi등)이나 그래픽 파일들을 출력할 수 있어야 할 것이다. 중요한 문제이며, 실제로 환경설정도 쉽다. 위에서 사용된 line-feed 필터의 확장된 형태를 사용하면 된다.

출력시 입력된 임의의 파일형태를 이해하여 DeskJet이 받아들일 수 있는 형식으로 변환해 주는 필터를 작성한다면, 아주 훌륭한 출력 환경을 갖춘 것이다. 일반적인 경우, 자기만의 필터를 작성하려고 애쓰지 말라. 인터넷에는 유용한 필터가 널려 있기 때문이다.

7.2 파일 권한(File Permissions)

다른 사람들의 부탁때문에 내 리눅스 박스의 파일 권한에 대한 설명을 추가했다. 권한 설정에 대한 방법은 매우 많다. SGID 설정된 바이너리만을 사용하고 관련된 모든 것들을 SUID root로 설정하지 않는 것이 가장 이상적이다. 다음은 내 리눅스 박스의 내용이며, 내 경우 잘 돌아간다.

-r-sr-sr-x 1 root    lp      /usr/bin/lpr*
-r-sr-sr-x 1 root    lp      /usr/bin/lprm*
-rwxr--r-- 1 root    root    /usr/sbin/lpd*
-r-xr-sr-x 1 root    lp      /usr/sbin/lpc*
drwxrwxr-x 4 root    lp      /var/spool/lpd/
drwxr-xr-x 2 root    lp      /var/spool/lpd/lp/
현재 lpd는 lp 서비스 포트를 바인드(bind)하기 위해서 root로 실행 되어야 한다. bind이후 UID가 lp나 다른 것으로 되어야 하겠지만, 그럴 필요는 없을 것 같다. Bummer....
다음 이전 차례