Linux a tisk

Radek Hrabčák
xhrabcak@fi.muni.cz

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.


Obsah

  1. Lpr
  2. LPRng
  3. Reference

 

Klasická varianta (balík lpr)

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í...


Soubory

  • /etc/printcap - konfigurační soubor popisující vlastnosti tiskárny, umístění adresářů pro tiskové úlohy.

    Formát /etc/printcap
    - řádek začínající znakem # (nebo posloupností bílých znaků a #) se považuje za komentář
    - každý řádek definuje jednu tiskárnu. Řádek ukončený zpětným lomítkem pokračuje na dalším řádku. Pozor! Zpětné lomítko již nesmí být na stejném řádku následováno jinými znaky (mezera, tabelátor apod...).
    - jednotlivé položky řádku jsou od sebe odděleny dvojtečkou
    - první položka každého záznamu obsahuje název tiskárny, případně více názvů oddělených znakem |
    - musí zde existovat alespoň jeden záznam pro implicitní tiskárnu. Má-li tiskárna jméno "lp", považuje se za implicitní. Toto jméno se doporučuje uvádět raději jako alias (jedno z dalších jmen za znakem |).
    - každá LOKÁLNÍ tiskárna musí mít nastavenu proměnnou lp na zařízení (typicky z adresáře /dev), přes které se na tiskárnu přistupuje, např. lp=/dev/lp0.


    Příklad /etc/printcap :
    # 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


  • /etc/hosts.lpd - seznam strojů, ze kterých je povolen vzdálený tisk
  • Programy


    Filtry

    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:

     


    Magické filtry

    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.


    LPRng

    LPRng je následníkem BSD softwaru pro tisk. Používá soubory s identickými názvy, ovšem podle autora s odlišnou implementací. Umožňuje rozsáhlejší kontrolu oprávnění, authentifikaci, kryptování, sofistikovanější konfiguraci tiskáren a větší kontrolu nad tiskovými službami. Prý i lepší diagnostikování ;o).

    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/%P
    
    Formát printcap

    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 ACCEPT
    
    Klíčová slova
    DEFAULTdefaultní výsledek
    SERVICEpodle služby lpC, lpR, lprM, lpQ a Print
    USERP (login) pole z tiskové úlohy
    REMOTEUSERjméno vzdáleného uživatele
    HOSTDNS a(nebo?) IP adresa počítače, na kterém je umístět lpd.perm
    REMOTEHOSTDNS a(nebo?) IP adresa vzdáleného počítače.
    IPalias pro HOST
    REMOTEIPalias pro REMOTEHOST
    REMOTEPORTTCP port na vzdáleném počítači (ze kterého je požadován tisk nebo jiná služba)
    SAMEUSERstejný uživatel jako USER či REMOTEUSER (match)
    SAMEHOSTstejný počítač jako HOST či REMOTEHOST (match)
    SERVERpožadavek z lpd serveru
    FORWARDcíl požadavku není (tento) počítač
    REMOTEGROUPREMOTEUSER je ve specifikované skupině či síťové skupině databáze skupin lpd serveru
    GROUPUSER je ve specifikované skupině či síťové skupině databázeskupin lpd serveru
    LPCpříkaz zaslaný prostřednictvím lpc
    CONTROLLINE shoda s řádkem v control souboru tiskové úlohy
    AUTHtyp autentikace
    AUTHUSERautentikovaný uživatel
    AUTHFROMautentikovaný zdroj v případě forwardu
    AUTHJOBautentikovaná 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é.


    Reference