V porovnání s jinými operačními systémy má Linux poměrně složitý systém služeb pro tisk. Umožňuje odesílat dokumenty pro tisk několika uživatelům najednou, a to ještě může každý uživatel tisknout z několika aplikací, aniž by se muselo čekat, až se tisk nějakého dokumentu dokončí. Systém služeb pro tisk zpracovává soubory tak, aby byly správně vytištěny na různých tiskárnách připojených k systému. Pokud realizujete tisk prostřednictvím sítě, mohou být soubory vytvářeny na jednom počítači a tisknuty na jiném, který má připojenu tiskárnu.
Tištěné dokumenty nejsou odesílány přímo na tiskárnu, ale ukládají se do adresáře pro souběžný tisk (spool directory). V systému by měl běžet démon lpd (line printer daemon), který kontroluje, zda ve spool adresáři nejsou nějaké soubory pro tisk. V případě, že jsou, je pro tento spool directory nastartován nový program lpd, který zajistí uložení dokumentů ze spool directory do tiskové fronty, a tedy ve většině případů jejich vytištění. Po vyprázdnění aktuálního spool directory se související lpd ukončí.
Přístup na tiskárnu má v Linuxu typicky pouze root. (a lpd démon, suid root).
Data pro tisk mají podobu tzv. tiskových úloh (jobs). Každá úloha se skládá de facto ze dvou souborů - jeden se samotnými daty, druhý s instrukcemi pro tiskárnu, filtry, formátování...
# lokalni laserova tiskarna ljet|lp|ps|LPT1:\ :lp=/dev/lp0:\ :rw:\ :sd=/var/spool/lpd/ljet4:\ :mx#0:\ :mc#0:\ :if=/usr/local/cap/ljet4: # vzdalena inkoustova tiskarna na stroji pc5.lab.fi.muni.cz # jmenuje se tiskarka deskjet:\ :rp=tiskarka:\ :rm=pc5.lab.fi.muni.cz:\ :mx#0
Proměnné v /etc/printcap
lp - line printer, typicky /dev/lp0, /dev/lp1, či jiné zařízení, pod kterým je tiskárna přístupná
sd - spool directory, je dobré pro každou tiskárnu mít jiný spool directory nazvaný stejně jako tiskárna
if - input filter, tj. cesta ke spustitelnému souboru, kterému jsou na vstup předána data
tiskové úlohy a který tato data přeformátuje (typicky do tvaru vhodného pro tiskárnu).
of - output filter, pokud není současně nastaven if, použije se tento filtr pouze jednou při
otevření zařízení. Všechny úlohy ve frontě se pak odesílají bez aplikace tohoto filtru. (není-li nastaven ani of ani if, použije se implicitní /usr/sbin/lpf.
rw - otevření zařízení pro čtení i zápis. Může být užitečné, pokud tiskárna dokáže vracet informace (např. chybové hlášky).
rp - remote printer, název vzdálené tiskárny
rm - remote machine, název vzdáleného počítače, který provádí tisk.
mc - maxim. copies, maximální počet kopií. mc#0 značí, že počet kopií není omezen.
mx - maximální velikost úlohy. mx#0 značí neomezenou velikost
další položky viz. man printcap
K tomu, aby tiskárna porozuměla tištěné úloze, je často třeba data úlohy přeformátovat do jazyka, který tiskárna zná. Tiskneme-li ascii text nebo postscript na postscriptové tiskárně, není to většinou problém a text můžeme posílat i přímo na tiskárnu (s oprávněním root, samozřejmě).
Ovšem ve všech ostatních případech je zpravidla nutné používat před tiskem patřičné filtry. Přičemž filtrem se rozumí spustitelný soubor, který provádí (zpravidla) nějaké transformace textu do jiné podoby.
Pro převod postscriptů do jazyka tiskárny se používá většinou ghostscript.
Příklad jednoduchého filtru:
#!/bin/sh DEVICE=ljet4 RESOLUTION=600x600 PAPERSIZE=letter SENDEOF= gs -q -sDEVICE=$DEVICE \ -r$RESOLUTION \ -sPAPERSIZE=$PAPERSIZE \ -dNOPAUSE \ -dSAFER \ -sOutputFile=- - exit 0
Poznámky:
není-li specifikován OutputFile, potom ghostscript pošle výstup do temporary souboru gs-neco_nahodneho Toto se dá s výhodou použít pro testování parametrů pro ghostview. z příkazového řádku použijeme gs -sDEVICE=neco DALSI_PARAMETRY soubor.ps Ghostscript vygeneruje svůj gs-neco_nahodneho soubor, který příkazem lpr pošleme na tiskárnu a pokud jsme ghostscriptu předhodili dostatečně sofistikované parametry, budeme se radovat s krásně vytištěného souboru :o).
Magický filtr je v podstatě filtr, který se pokusí analyzovat typ souboru, který chceme tisknout a až podle toho zařídí patřičné transformace. Příkladem jsou filtry APSfilter, Magic-Filter, gslp.ps . Posledně jmenoný je dodávaný s kompletní distribucí Ghostscriptu.
APSfilter
APSfilter nebyl původně určen pro instalaci pod Linuxem, je nutné provést před instalací jisté změny, konkrétně upravit soubor /usr/lib/apsfilter/global/Global.sh .
case $SYSTEM in . . . *Linux) LP_OWNER=root LP_GROUP=lp SPOOL=/var/spool/lpd MAGIC=/etc/magic ;; . . . esac
Poté je ještě třeba restartovat lpd, nejlépe příkazem lpc restart
all . Systémové proměnné pro tiskárnu nastavuje APSfilter v souboru
/etc/apsfilterrc.
Balík LPRng
Při startování systému se nastartuje i lpd, a to s efektivním UID 0. Ovšem
všechny operace se soubory provádí s efektivními právy neprivilegovaného uživatele
(implicitně uživatel daemon, skupina daemon). Toto lze změnit v konfiguraci
--with-userid=UID, --with-groupid=GID.
printcap
Systémový printcap je uložen v adresáři specifikovaném při kompilaci jako ${sysconfdir}. Kromě toho si může každý uživatel vytvořit ve svém domovském adresáři svůj vlastní .printcap. Pokud takový existuje, používá se přednostně. Pokud neexistuje při instalaci /etc/printcap, pak je defaultně jako systémový printcap nainstalován soubor:
# dummy printcap file lp:cm=Dummy Printcap Entry: :lp=/dev/null :sd=/var/spool/lpd/%PFormát printcap
#seen only by server lp2:lp=/dev/lp:server #seen only by client lp2:lp=lp@pr2:client
%P | primární jméno záznamu |
%Q | požadovaná fronta |
%h | jméno počítače ve zkráceném tvaru (např. aisa) |
%H | jméno počítače v doménovém tvaru (např. aisa.fi.muni.cz) |
%R | jméno vzdálené tiskárny (hodnota rp option) |
%M | jméno vzdáleného počítače (hodnota rm option) |
%D | datum ve tvaru YYYY-MM-DD |
.hp: :sd=/usr/local/spool/%P :mx=0 hp1:tc=.hp,.filter :lp=lp@10.0.0.1 hp2:tc=.hp,.filter :lp=lp@10.0.0.2 .filter: :filter=/usr/local/libexec/filters/ifhpdá po zpracování následující záznamy:
hp1 :lp=lp@10.0.0.1 :filter=/usr/local/libexec/filters/ifhp :mx=0 :sd=/usr/local/spool/%P hp2 :lp=lp@10.0.0.2 :filter=/usr/local/libexec/filters/ifhp :mx=0 :sd=/usr/local/spool/%P
Formát lpd.conf
Podobně jako pro printcap platí, že proměnné (options) v záznamu mohou být
nastaveny buď na logickou hodnotu nebo string:
# komentář # set option value to 1 or ON ab :ab # set otion value to 0 or OFF ab@ :ab #set option value to string str=name
Příklad:
# ENG LPRng sample Configuration #-------------------------------------------------------- # nazev implicitni tiskarny default_printer lp1 # nazev pocitace default_host %H # cesta k lock. souboru lockfile /usr/spool/LPD/lpd.lock # cesta k log souboru logfile /usr/adm/lpd.log # port, na kterem posloucha lpd lpd_port 4000 # porty, ze kterych jsou akceptovane pozadavky originate_port 721 731 user daemon group daemon # cesta k systemovemu printcapu printcap_path /tmp/LPD/printcap.%H # cesta k souboru s opravnenimi printer_perms_path /tmp/LPD/printer_perms.%H . . .
lpd.perms
Soubor s nastavením přístupových a výkonných práv pro tiskové služby. Je zpracováván
sekvenčně, proto záleží na pořadí pravidel!!! Podrobnější popis možných pravidel
je uveden v samotném lpd.perms na začátku...
Příklad:
# allow root on server to control jobs ACCEPT SERVICE=C SERVER REMOTEUSER=root REJECT SERVICE=C # # allow same user on originating host to remove a job ACCEPT SERVICE=M SAMEHOST SAMEUSER # allow root on server to remove a job ACCEPT SERVICE=M SERVER REMOTEUSER=root REJECT SERVICE=M # all other operations allowed # DEFAULT ACCEPTKlíčová slova
DEFAULT | defaultní výsledek |
SERVICE | podle služby lpC, lpR, lprM, lpQ a Print |
USER | P (login) pole z tiskové úlohy |
REMOTEUSER | jméno vzdáleného uživatele |
HOST | DNS a(nebo?) IP adresa počítače, na kterém je umístět lpd.perm |
REMOTEHOST | DNS a(nebo?) IP adresa vzdáleného počítače. |
IP | alias pro HOST |
REMOTEIP | alias pro REMOTEHOST |
REMOTEPORT | TCP port na vzdáleném počítači (ze kterého je požadován tisk nebo jiná služba) |
SAMEUSER | stejný uživatel jako USER či REMOTEUSER (match) |
SAMEHOST | stejný počítač jako HOST či REMOTEHOST (match) |
SERVER | požadavek z lpd serveru |
FORWARD | cíl požadavku není (tento) počítač |
REMOTEGROUP | REMOTEUSER je ve specifikované skupině či síťové skupině databáze skupin lpd serveru |
GROUP | USER je ve specifikované skupině či síťové skupině databázeskupin lpd serveru |
LPC | příkaz zaslaný prostřednictvím lpc |
CONTROLLINE | shoda s řádkem v control souboru tiskové úlohy |
AUTH | typ autentikace |
AUTHUSER | autentikovaný uživatel |
AUTHFROM | autentikovaný zdroj v případě forwardu |
AUTHJOB | autentikovaná tisková úloha ve frontě |
LPRng versus SAMBA
Pro použití linuxové tiskárny windowsovskými klienty by mělo stačit nakonfigurovat sekci [printers] v samba.conf. Viz. následující příklad:
[printers] path = /var/spool/lpd/samba # --- do not use the Samba default path = /tmp print ok = yes printing = lprng # TOTO JE PODSTATNE load printers = yes guest ok = no printcap name = /etc/printcap print command = /usr/bin/lpr -P%p -r %s lpq command = /usr/bin/lpq -P%p lprm command = /usr/bin/lprm -P%p %j lppause command = /usr/sbin/lpc hold %p %j lpresume command = /usr/sbin/lpc release %p %j queuepause command = /usr/sbin/lpc -P%p stop queueresume command = /usr/sbin/lpc -P%p start
Adresář specifikovaný v option path by měl mít stejná přístupová práva jako /tmp . Doporučuje se jeho obsah periodicky čistit od starších souborů, například příkazem spousteným cronem:
find /var/spool/lpd/samba -type f -mtime 2d -exec rm -f {} \;
Program checkpc
Při volání bez parametrů zkontroluje přístupová práva všech adresářů souvisejících s tiskem, formát printcap souboru, apod. Při použití přepínače -f zároveň opravuje chyby, vytváří chybějící adresáře definované v printcap souboru... V takovém případě je dobré použít i přepínač -V (verbose).
Několik poznámek
Nedoporučuje se umisťovat spool adresáře na svazky montované přes NFS, nebo do adresářových stromů, které se přes NFS exportují.LPRng lpd print server používá ve velké míře zamykání souborů, což je na NFS problematické.