Tisk

Lukáš Kokrment, xkokrmen@fi.muni.cz


Obsah


Úvod

Přístup k tiskárnám je v operačních systémech UNIXového typu realizován pomocí spoolingu, tiskových front. Požadavky na tisk jsou ukládány do fronty, odkud si je vybírají obslužné programy, které je po případných úpravách posílají na fyzické zařízení. Spooling umožňuje např. tisknout více procesům nebo uživatelům současně, bez nutnosti čekat na dokončení jednotlivých úloh.
 ________________
|  Job           |         ___________          ___________          ____________          _____________
|   _________    |        |           |        |           |        |            |        |             |
|  | Options |   |        |           |        |           |        |            |        |             |
|  |_________|   | -----> |  Network  | -----> |   Queue   | -----> |   Filter   | -----> |   Printer   |
|  |  Data   |   |        |           |        |           |        |            |        |             |
|  |_________|   |        |___________|        |___________|        |____________|        |_____________|
|________________|

Zjednodušeně řečeno probíhá tisk v následujících krocích:
  1. Uživatel pošle na tiskárnu úlohu, která se skládá z voleb a z dat.
  2. Tiskový subsystém pošle případně úlohu přes síť.
  3. Subsystém počká, dokud není tiskárna k dispozici.
  4. Na úlohu jsou aplikovány volby a ta je následně převedena do nativního jazyka tiskárny.
  5. Úloha je dokončena, provede se úklid, v případě chyby se pošle zpráva.
V UNIXovém světě existují dva základní druhy tiskových subsystémů. První vychází z BSD a jeho základem je démon lpd. Druhý se používá zejména v SYSTEM V a je založen na démonovi lpsched. Tisk pomocí lpd je oproti způsobu používanému v SYSTEM V asi přece jenom jednodušší a snáze konfigurovatelný. Mimo tyto dvě verze se lze ještě někde setkat také s tiskem pomocí CUPS (Common UNIX Printing Subsystem), PDQ nebo LPRng.

lpd

lpd (Line Printer Daemon) je démon, který se stará o tisk v BSD systémech. Mimo to je tak pojmenovaný protokol pro tisk po síti definovaný v RFC1179 (tento protokol používá standardně port 515). lpd běží nepřetržitě na pozadí a kontroluje, jestli se ve spool adresářích, které jsou definovány pro jednotlivé tiskárny, nenachází nějaká úloha. Pokud ano, vytvoří potomka, který se o vykonání dané úlohy postará. Pro ovládání tiskárny a tiskového démona se používá několik pomocných programů:
  1. lpc - ovládá tiskového démona, lze pomocí něj např. zakázat nebo povolit zařazování úloh do tiskových front, měnit pořadí úloh ve frontě atd
  2. lpr - pokyn k tisku dokumentu na tiskárně
  3. lpq - zjištění stavu tiskové fronty
  4. lprm - odebrání tiskové úlohy z fronty
Konfigurace démona je uložena v souboru /etc/printcap, ve kterém je vždy na jednom řádku definována jedna tiskárna. Každá tiskárna musí mít definovaný svůj spoolovací adresář (/var/spool/lpd/tiskárna).
Příklad konfigurace lokální tiskárny:

# LOCAL djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :sh:

Příklad konfigurace vzdálené tiskárny:

# REMOTE djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :rm=machine.out.there.com:\
        :rp=printername:\
        :sh:

Některé proměnné používané v souboru /etc/printcap:
s sd - adresář pro tiskovou frontu dané tiskárny
mx - maximální velikost tiskové úlohy
lp - na které zařízení se bude tisknout
rp - vzdálená tiskárna
rm - vzdálený počítač
sh - netisknout hlavičky
sf - noposílá na konci form feed
if - vstupní filtr
of - výstupní filtr

Některé současné distribuce Linuxu už obsahují i různé grafické klikací nástroje, které dokáží soubor /etc/printcap vygenerovat na základě uživatelovývh voleb. V RedHatu je to např. printtool.

Filtry

lpd byl vzvinut v době, kdy byly k dispozici pouze jednoduché řádkové tiskárny a uživatelé chtěli tisknout maximálně nějaký ASCII text. Proto když je potřeba vytisknout nějaký složitější formát, musíme na tiskovou úlohu aplikovat vstupní filtr. Tyto filtry mohou být od několikařádkových skriptíků až po velmi sofistikované nástroje.
Příklad jednoduchého filtru pro změnu znaku konce řádku:

#!/usr/bin/perl
while ()
{
  chop $_;print "$_\r\n";
};
print "\f";

Filtr pro tisk PostScriptu:

#!/bin/bash -
PRNAME="'basename $0'"
USER=nobody
MACHINE='uname -n'
renice 9 $$ > /dev/null 2>&1
while [ "$1" != "" ] ; do
	case "$1" in
	-n)
		shift ; USER=$1
		;;
	-h)
shift ; MACHINE=$1
;;
	esac
shift
done
gs -q -dSAFER -dNOPAUSE  -sDEVICE=cdj550 -sPAPERSIZE=a4 \
	-dBitsPerPixel=24 -dShingling=2 -r300x300 -sOutputFile=- -
logger -p notice "lp-daemon: User $USER, Machine $MACHINE, Printer $PRNAME" >&2
exit 0

Nejpropracovanější jsou tzv. magické filtry, které dokáží samy rozpoznat co mají na vstupu a na základě toho vybrat správný filtr a nagenerovat výstup na tiskárnu. Sem patří např. APS Filter nebo RHS-Printfilters.

LPRng

LPR next generation je rozšířená implementace tiskového subsystému BSD, která pracuje podle RFC1179. Za zmínku stojí, že LPRng rozumí i způsobu tisku používanému v SYSTEM V. Je zde velmi dobře vyřešena bezpečnost, podporována je autentizace přes Kerberos nebo PGP. LPRng nabízí také podrobnější logování, vyrovnávání zátěže, rovnoměrné rozložení úloh na více tiskáren atd. LPRng je šířeno pod GNU/GPL licencí.

Spolupráce se Sambou

Tisk z Linuxu na Windows:
Z Linuxu lze na Windows tisknout pomocí Samby. Tento balík obsahuje mimo jiné smbprint, který se nastaví v souboru /etc/printcap jako vstupní filtr. Lze také použít smbclient a poslat úlohu přímo na SMB tiskovou službu, bez nutnosti vyvolávat lpd.
Příklad konfigurace tiskárny:

lp|remote-smbprinter:\
    :sh:\
    :lp=/dev/null:\
    :sd=/var/spool/lpd/lp:\
    :if=/usr/local/sbin/smbprint:

Tisk z Windows na Linux:
I zde probíhá tisk za pomoci Samby. Abychom mohli z Windows tisknout na Linux musíme vyeditovat konfigurační soubor smb.conf:

[global]
   printing = bsd
   printcap name = /etc/printcap
   load printers = yes
   log file = /var/log/samba-log.%m
   lock directory = /var/lock/samba

[printers]
   comment = All Printers
   security = server
   path = /var/spool/lpd/lp
   browseable = no
   printable = yes
   public = yes
   writable = no
   create mode = 0700

[ljet]
   security = server
   path = /var/spool/lpd/lp
   printer name = lp
   writable = yes
   public = yes
   printable = yes
   print command = lpr -r -h -P %p %s

Odkazy

Manuálové stránky
Printing HOWTO
Linux Printing
Printing Usage HOWTO
LPRng
Samba
SMB HOWTO
UNIX - programování a správa systému II