CUPS – Trucchi utili

Brandon Nielsen, Zdenek Dohnal Version F31 onwards Last review: 2021-06-16

Come installare una coda di stampa

Il fatto di dover installare o meno una stampante dipende da diversi fattori:

  • qual è il dispositivo che si desidera installare: una stampante da un server CUPS remoto (chiamata coda di stampa remota) o una stampante,

  • dov’è il dispositivo che si desidera installare: collegato via USB al proprio PC, nella rete locale, in una rete diversa o installato su un server remoto,

  • quanto è vecchio il dispositivo che si vuole installare:

    • stampanti autonome: la maggior parte delle stampanti SOHO (Small Office, Home Office) e per ufficio prodotte dopo il 2010 supportano almeno un metodo di stampa senza driver, mentre i dispositivi più vecchi dipendono da driver, classici o applicazioni di stampa,

    • code di stampa remote su un server: qualsiasi sistema operativo con CUPS 2.2.8 e successivi o sistemi operativi in cui è stato effettuato il backport del supporto a IPP Everywhere (ad es. RHEL 8) sono in grado di supportare IPP Everywhere, altrimenti è necessaria una combinazione di driver e coda raw nella comunicazione client-server,

  • qual è lo scopo del dispositivo in cui si installa la stampante: dispositivo endpoint, utilizzato dall’utente come desktop, o un server, che condivide ulteriormente le stampanti installate,

  • quali sono le preferenze personali: utilizzare o meno il protocollo IPP, utilizzare o meno mDNS per l’autoinstallazione se il layout di rete lo consente.

In base a queste dipendenze, esistono diversi scenari d’uso, descritti più avanti.

Scenari d’uso comuni

Ho una stampante prodotta dopo il 2015, sono a casa e voglio stampare dal mio PC

  • la configurazione più comune su desktop

  • la stampante è abbastanza recente da supportare gli standard senza driver tramite USB e rete, quindi il supporto senza driver non dipende dalla connessione

  • il PC è un dispositivo endpoint, non voglio condividere la stampante

  • Non ho problemi a usare mDNS e IPP, mDNS è abilitato nel mio firewall, IPP e mDNS (o impostazioni simili) sono abilitati sulla stampante e la risoluzione mDNS funziona (verificata eseguendo il ping di un nome host .local)

Le code temporanee di CUPS per USB o per la rete sono ideali per questo caso d’uso.

Ho una stampante più vecchia, sono a casa e voglio stampare dal mio PC

  • la stampante non dispone di supporto senza driver: verificare tramite ipptool per le stampanti di rete (se la stampante dispone del supporto IPP e la porta è abilitata) e tramite lsusb per le stampanti USB,

  • il mio PC è un dispositivo endpoint

Attualmente ci sono due opzioni: installare la stampante in una applicazione di stampa e CUPS la vedrà automaticamente, oppure installarla con un driver classico in modo permanente. L’installazione con driver classico è deprecata e sarà rimossa in CUPS 3.0.

Sono in un’azienda che ha un server di stampa dove sono installate le stampanti dell’ufficio, voglio stampare sul server di stampa - senza mDNS, ma con supporto senza driver

  • il server di stampa supporta IPP Everywhere e si trova in una rete diversa, non si registra su mDNS, oppure non voglio usare mDNS

  • la coda di stampa remota ha l’URI ipp://<nome_host_server>:631/printers/<nome_coda>, dove <nome_host_server> è il nome host del server di stampa e <nome_coda> è il nome di una coda di stampa a cui voglio connettermi

  • il comando ipptool ha esito positivo se si usa l’URI

Tali stampanti devono essere installate in modo permanente con il driver IPP Everywhere.

Sono in un’azienda che ha un server di stampa dove sono installate le stampanti dell’ufficio, voglio stampare sul server di stampa - con mDNS funzionante nella rete locale

Tali stampanti remote vengono scoperte automaticamente tramite mDNS e utilizzate come code temporanee CUPS in rete: vengono viste su mDNS e rilevate automaticamente dalle finestre di dialogo.

Voglio stampare, ma non voglio o non posso usare mDNS, indipendentemente dal fatto che la mia stampante supporti la stampa senza driver

Ogni stampante che non può essere scoperta da mDNS deve essere installata in modo permanente in CUPS o, in CUPS 3.0, tramite un profilo di stampa.

  1. Stampanti senza driver:

    • tutte supportate dal modello IPP Everywhere sotto la voce Produttore nell’interfaccia web di CUPS e come everywhere nella CLI

    • tipi in base all’origine:

      • Rete:

        • URI: ipp://<nomehost_o_ip>:631/ipp/print, dove <nomehost_o_ip> è il nome host o l’indirizzo IP della stampante

      • Stampanti IPP-over-USB tramite ipp-usb:

        • URI: ipp://localhost:60000/ipp/print

      • Stampanti installate tramite applicazione di stampa:

        • URI: ipp://localhost:8000/ipp/print/<nome_stampante>, dove <nome_stampante> è il nome della stampante scelto nell’applicazione di stampa

  2. Code di stampa remote su un server di stampa:

    • URI: ipp://<ip_server_o_nomehost_server>:631/printers/<coda_stampa_remota>, dove <ip_server_o_nomehost_server> è l’indirizzo IP o il nome host del server e <coda_stampa_remota> è il nome della coda di stampa installata sul server

    • dipende da CUPS sul server se una stampante locale che punta a una stampante sul server può essere installata come modello IPP Everywhere; di solito CUPS 2.2.8 e successivi supportano la stampa senza driver e anche alcune distribuzioni come CentOS 8 hanno effettuato il backport di tale funzionalità

    • altrimenti dipende dal driver della stampante sul vecchio server: la chiave è evitare di applicare le opzioni più volte (quindi una delle connessioni deve essere raw e perde parte della funzionalità)

  3. Stampanti legacy o specializzate

    • (deprecato, da rimuovere in CUPS 3.0) possono essere scoperte da CUPS e installate con driver classici

    • possono essere installate nell’applicazione di stampa e quindi installate in CUPS come coda permanente (vedere sopra, stampanti senza driver - stampanti installate tramite applicazione di stampa)

Le opzioni senza driver non sono sufficienti per la mia stampante senza driver, voglio usare le funzionalità del driver

L’azione attualmente raccomandata è installare la stampante tramite una applicazione di stampa, che contiene il driver classico, poiché l’installazione permanente della stampante in CUPS con un driver classico è deprecata e sarà rimossa in CUPS 3.0. Quindi si può usare mDNS per farla rilevare da CUPS, oppure la stampante dall’applicazione di stampa deve essere installata in modo permanente in CUPS come stampante IPP Everywhere.

In caso di stampanti IPP-over-USB, è necessario aggiungere una regola di rifiuto come descritto nei problemi noti.

Installo la stampante su un server, che la condividerà ulteriormente

Le stampanti sul server devono essere installate in modo permanente per essere condivise. Il modello IPP Everywhere (direttamente alla stampante o tramite applicazione di stampa) è l’ideale, ma va bene anche un driver classico con opzioni PPD standardizzate su un server in grado di utilizzare la stampa senza driver: i client possono utilizzare il modello IPP Everywhere quando puntano al server e le opzioni vengono tradotte correttamente. Altrimenti c’è la possibilità che alcune opzioni non vengano applicate o vengano applicate due volte. Non dimenticare di abilitare IPP nel firewall, impostare le ACL per il server tramite /etc/cups/cupsd.conf e collegare il demone alla porta 631 invece che a localhost.

Sono in un’azienda con un vecchio server di stampa non in grado di supportare la stampa senza driver e voglio stampare

In questo scenario, la cosa importante è evitare di applicare le opzioni più volte. Ci sono diversi modi per farlo:

  • chiedere il driver al supporto IT (la coda di stampa sul server deve essere raw)

  • usare la direttiva ServerName in /etc/cups/client.conf o la variabile d’ambiente CUPS_SERVER per connettersi direttamente al server: non sarà possibile eseguire attività di amministrazione, ma si potrà stampare.

Come scoprire se la mia stampante è in grado di stampare senza driver?

Le stampanti di rete hanno dei prerequisiti: l’abilitazione della porta IPP sulla stampante è il minimo, mDNS è richiesto per la scoperta automatica della stampante da parte di libcups. Se necessario, abilitare AirPrint, IPP Everywhere o qualsiasi altra opzione relativa agli standard senza driver nelle impostazioni della stampante, tramite il pannello della stampante o la sua interfaccia web.

  • Il comando ipptool, che invia una richiesta IPP Get-Printer-Attributes alla stampante di rete, ha esito positivo:

$ ipptool -tv ipp://printer.example.com:631/ipp/print get-printer-attributes.test
"/usr/share/cups/ipptool/get-printer-attributes.test":
    Get-Printer-Attributes:
        attributes-charset (charset) = utf-8
        attributes-natural-language (naturalLanguage) = en
        printer-uri (uri) = ipp://printer.example.com:631/ipp/print
        requested-attributes (1setOf keyword) = all,media-col-database
    Get printer attributes using get-printer-attributes                  [PASS]
...

, dove printer.example.com è il nome host o l’IP della stampante di rete,

  • cercare AirPrint tra le specifiche del dispositivo,

  • Stampanti certificate ufficialmente per IPP Everywhere,

  • consultare il manuale per abilitare le code temporanee di CUPS: se alla fine la stampante viene vista in quel modo nei comandi CUPS, significa che è in grado di stampare senza driver,

  • [Solo dispositivi USB] verificare la presenza di IPP over USB (manuale qui).

Come scoprire se il mio dispositivo USB supporta IPP over USB

Verificare se il proprio dispositivo USB presenta il seguente testo nell’output di lsusb -v:

...
      bInterfaceClass         7 Printer
      bInterfaceSubClass      1 Printer
      bInterfaceProtocol      4
      iInterface              0
...

Se il dispositivo presenta in sequenza bInterfaceClass 7, bInterfaceSubClass 1 e bInterfaceProtocol 4, supporta IPP over USB, che è fondamentale per la stampa e la scansione senza driver dei dispositivi USB.

Nota: alcuni produttori legano il supporto IPP over USB agli standard senza driver di rete, il che non è corretto. Se la stampante dispone di connettività di rete e USB e IPP over USB non viene mostrato nell’output di lsusb, provare a controllare le impostazioni della stampante, abilitare AirPrint e verificare di nuovo l’output di lsusb -v.

Come configurare le code temporanee di CUPS

Per configurare correttamente le code temporanee, ci sono diversi prerequisiti:

  • la stampante/coda di stampa remota ha il supporto senza driver e lo ha abilitato,

  • sul PC è in esecuzione il servizio avahi-daemon o il socket avahi-daemon,

  • sul PC è in esecuzione il socket o il servizio cups,

  • i nomi host mDNS sono risolvibili - verificare eseguendo il ping di un nome host .local

Come configurare le code temporanee di CUPS con una stampante di rete

  • requisito aggiuntivo:

    • abilitare mDNS nelle impostazioni del firewall

A questo punto, la coda temporanea apparirà nella finestra di dialogo di stampa e non sarà necessario installare una coda di stampa specifica, a meno che non ci sia un motivo per farlo.

È possibile verificare se la stampante viene vista nei messaggi mDNS con (avahi-tools deve essere installato):

$ avahi-browse -avrt
...
= enp0s25 IPv4 HP LaserJet M1536dnf MFP (42307C)             _ipp._tcp            local
   hostname = [NPI42307C.local]
   address = [192.168.1.10]
   port = [631]
   txt = ["UUID=434e4239-4243-4a42-5859-3c4a9242307c" "Scan=T" "Duplex=T" "Color=F" "note=" "adminurl=http://NPI42307C.local." "priority=10" "product=(HP LaserJet M1536dnf MFP)" "ty=HP LaserJet M1536dnf MFP" "URF=CP99,W8,OB10,PQ3-4-5,DM1,IS1-4,MT1-2-3-5,MT1-2-3-5,RS600" "rp=ipp/printer" "pdl=application/postscript,application/vnd.hp-PCL,application/vnd.hp-PCLXL,application/pdf,image/urf" "qtotal=1" "txtvers=1"]
...

e se CUPS o i suoi backend vedono la stampante con i comandi:

(elenca tutte le code di stampa esistenti, permanenti o temporanee; quelle temporanee contengono network come seconda stringa su una riga)

$ lpstat -l -e
HP_LaserJet_M1536dnf_MFP_42307C network none ipp://HP%20LaserJet%20M1536dnf%20MFP%20(42307C)._ipp._tcp.local/
myprinter permanent ipp://localhost/printers/myprinter beh:/1/3/5/socket://printer:9100

oppure

(elenca tutti i dispositivi che CUPS vede nella rete locale o tramite USB)

$ lpinfo -l -v
...
Device: uri = ipp://HP%20LaserJet%20M1536dnf%20MFP%20(42307C)._ipp._tcp.local/
        class = network
        info = HP LaserJet M1536dnf MFP (driverless)
        make-and-model = HP LaserJet M1536dnf MFP
        device-id = MFG:HP;MDL:LaserJet M1536dnf MFP;CMD:PDF,PS,PCL,AppleRaster,URF;
        location =
...

Come configurare le code temporanee di CUPS con una stampante USB

  • requisiti aggiuntivi:

    • installare ipp-usb, che trasformerà i dispositivi IPP over USB in una stampante di rete su localhost:

$ sudo dnf -y install ipp-usb

Quindi è possibile seguire i passaggi nel manuale per le stampanti di rete.

Come installare una coda di stampa permanente

Prerequisiti per le stampanti senza driver permanenti: abilitare IPP nel firewall, abilitare IPP sulla stampante se possibile.

Installazione tramite l’interfaccia web di CUPS

  • avviare cups.service

$ sudo systemctl start cups
  • andare su http://localhost:631 nel proprio browser

  • andare alla scheda Amministrazione

  • fare clic su Aggiungi stampante

  • inserire le proprie credenziali

  • scegliere il dispositivo trovato o la connessione che si preferisce; per una coda permanente senza driver scegliere Internet Printing Protocol (ipp)

  • nel caso non si sia scelto un dispositivo trovato, inserire l’URI del dispositivo nella pagina successiva; per le stampanti senza driver di solito sono:

Stampanti di rete:
ipp://<IP_stampante_o_nomehost_stampante>:631/ipp/print

Stampanti USB tramite ipp-usb:
ipp://localhost:60000/ipp/print

Stampanti non senza driver tramite applicazione di stampa:
ipp://localhost:8000/ipp/print/<nome_stampante>

Stampanti che puntano a un server CUPS remoto:
ipp://<ip_server_o_nomehost_server>:631/printers/<coda_stampa_remota>
  • scegliere produttore e modello del dispositivo (IPP Everywhere per stampanti senza driver)

  • impostare opzioni predefinite diverse se necessario e terminare

Note:

L’aggiunta di una coda permanente per stampanti USB senza driver o per stampanti non senza driver installate in un’applicazione di stampa è solitamente superflua, poiché vengono condivise tramite mDNS su localhost, quindi qualsiasi applicazione che utilizzi le funzioni API di CUPS 2.0+ (cupsGetDests(), cupsGetNamedDest(), cupsCopyDestInfo()) dovrebbe essere in grado di rilevarle automaticamente (per le stampanti di rete dipende se il dispositivo si trova nella stessa sottorete della macchina). L’installazione permanente dovrebbe essere necessaria solo se un’applicazione non utilizza l’API recente o per aggirare un bug che si verifica quando vengono utilizzate come code temporanee.

Se sono presenti più dispositivi tramite ipp-usb o applicazioni di stampa, essi sono in ascolto su porte diverse: i dispositivi tramite ipp-usb iniziano dalla porta 60000, le applicazioni di stampa separate iniziano dalla porta 8000.

Installazione tramite comandi CLI

  • sarà necessario un URI del dispositivo - <uri_dispositivo>, che si può trovare con lpinfo -v:

$ lpinfo -v
direct usb://HP/Officejet%20Pro%208500%20A909a?serial=NNNNNNNNN&interface=1
       ====================================================================
network dnssd://Officejet%20Pro%208500%20A909a%20%5B43FD8E%5D._pdl-datastream._tcp.local/
        =================================================================================

o costruirlo manualmente, ad es. per le stampanti IPP:

ipp://<IP/nomehost>:631/ipp/print

e un nome del driver - <driver>, ad es.:

$ lpinfo -m
....
everywhere IPP Everywhere
==========
...
$ lpadmin -p <nome> -v <uri_dispositivo> -m <driver> -E

dove <uri_dispositivo> e <driver> sono le stringhe ottenute dai comandi precedenti e <nome> è un nome per la coda di stampa, scelto dall’utente.

Come installare una stampante tramite un’applicazione di stampa in formato SNAP e renderla disponibile per CUPS

Attualmente le applicazioni di stampa sono disponibili in formato SNAP su Fedora. Sto pianificando di rilasciarle come RPM, ma la base di codice sarà la stessa, quindi i test possono essere eseguiti anche con gli SNAP.

  • installare snapd,

Per prima cosa, dobbiamo installare snapd a scopo di test:

$ sudo dnf -y install snapd
$ sudo ln -s /var/lib/snapd/snap /snap
$ snap version

Se l’installazione è andata a buon fine, l’ultimo comando mostrerà la versione di snapd.

  • installare ed eseguire l’applicazione di stampa,

Per prima cosa, lo SNAP con l’applicazione di stampa deve essere installato e avviato con i comandi seguenti. Tutte le applicazioni di stampa sono disponibili nello SNAP Store con gli stessi nomi che hanno nei repository di OpenPrinting. Nei passaggi successivi utilizzeremo l’applicazione di stampa ps-printer-app.

$ sudo snapd install --edge ps-printer-app
$ sudo snapd run ps-printer-app

Dopo aver avviato l’applicazione di stampa, la sua interfaccia web diventa disponibile all’indirizzo http://localhost:8000; se l’utente installa ed esegue un’altra applicazione di stampa, questa sarà disponibile su localhost alla porta successiva (8001). L’applicazione di stampa può contenere diverse stampanti (come fa cupsd).

  • fare clic su Add Printer (Aggiungi stampante) nella pagina principale,

  • scegliere il nome della stampante,

  • selezionare il dispositivo trovato o scegliere Network printer (Stampante di rete) dal menu a discesa Device (Dispositivo) e fornire il nome host o l’IP del dispositivo,

  • scegliere di rilevare automaticamente il driver o selezionarlo manualmente,

  • fare clic su Add Printer (Aggiungi stampante),

  • ora la stampante dovrebbe essere disponibile almeno su localhost tramite mDNS (se avahi-daemon è in esecuzione e nss-mdns è installato) - verificarlo con avahi-browse (avahi-tools deve essere installato):

$ avahi-browse -avrt
...
=     lo IPv4 HP Laserjet M1536                             _ipp._tcp            local
   hostname = [fedora-2.local]
   address = [127.0.0.1]
   port = [8000]
   txt = ["Scan=F" "PaperMax=legal-A4" "Fax=F" "product=(HP LaserJet M1536dnf MFP Postscript (recommended))" "mopria-certified=1.3" "priority=0" "qtotal=1" "txtvers=1" "Duplex=T" "Color=F" "TLS=1.2" "URF=V1.5,W8,PQ3-4-5,DM1,FN3,IS0-20,MT1-5-6-3,OB10,RS300-600" "UUID=24837a30-5f87-3ac9-6d85-086d486092dd" "pdl=image/pwg-raster,image/urf,application/vnd.printer-specific,application/pdf,application/postscript,image/jpeg,image/png" "note=" "adminurl=http://fedora-2.local:8000/HP_Laserjet_M1536/" "ty=HP LaserJet M1536dnf MFP Postscript (recommended)" "rp=ipp/print/HP_Laserjet_M1536"]
...
  • e con lpstat -e:

$ lpstat -e
...
HP_Laserjet_M1536
...

Le opzioni di stampa disponibili per la stampante installata tramite l’applicazione di stampa possono essere verificate con il comando lpoptions:

$ lpoptions -p HP_Laserjet_M1536 -l
PageSize/Dimensioni supporto: 184.15x260mm 195.09x269.88mm A4 A5 B5 DoublePostcardRotated Env10 EnvC5 EnvDL EnvMonarch Executive FanFoldGermanLegal ISOB5 Legal *Letter Postcard roc16k Custom.WIDTHxHEIGHT
InputSlot/Sorgente supporto: *Auto Tray1 Auto
MediaType/Tipo di supporto: *Unspecified Stationery Light6074 MidWeight96110 Heavy111130 ExtraHeavy131175 MonochromeLaserTransparency Labels StationeryLetterhead Envelope StationeryPreprinted Prepunched Colored Bond StationeryRecycled Rough Vellum
cupsPrintQuality/cupsPrintQuality: Draft *Normal High
ColorModel/Modalità di output: *Gray
Duplex/Duplex: *None DuplexNoTumble DuplexTumble
OutputBin/OutputBin: *FaceDown

Come installare uno scanner

In Linux gli scanner non devono essere installati allo stesso modo delle stampanti se si trovano nella stessa rete o sono collegati via USB: è sufficiente che sia installato sane-backends e qualsiasi applicazione di scansione comunicherà con lo scanner/dispositivo multifunzione tramite il backend che supporta lo scanner.

Tuttavia, gli scanner e i dispositivi multifunzione HP più vecchi richiedono un pacchetto aggiuntivo, hplip, e i suoi plugin binari scaricati tramite hp-plugin -i se non sono già supportati da sane-backends.

Come scoprire se il mio dispositivo multifunzione o scanner autonomo è in grado di eseguire la scansione senza driver?

  • controllare le specifiche del dispositivo e cercare eSCL/AirScan/WSD: se uno di questi è menzionato, il dispositivo è in grado di eseguire la scansione senza driver

  • la maggior parte dei dispositivi che pubblicizzano il supporto ad AirPrint sono in grado di utilizzare anche AirScan

  • [Solo dispositivi USB] verificare la presenza di IPP over USB (manuale qui).

Come far funzionare la scansione senza driver

Per dispositivi in LAN e USB:

  • avere avahi-daemon abilitato e in esecuzione

$ sudo systemctl enable avahi-daemon
$ sudo systemctl start avahi-daemon
  • abilitare mDNS nel firewall

  • [Solo dispositivi USB] installare ipp-usb

Per scanner di rete in una rete diversa:

  • impostare l’URI del dispositivo scanner in /etc/sane.d/airscan.conf - vedere:

man sane-airscan

Come configurare mDNS con systemd-resolved

systemd-resolved è abilitato e in esecuzione per impostazione predefinita da F33 e può essere configurato per funzionare con Avahi per il supporto mDNS di cui CUPS ha bisogno: Avahi si occupa di pubblicizzare, registrare e condividere i dispositivi, mentre resolved gestirà la risoluzione degli indirizzi «.local». Funzionerà con i seguenti passaggi:

  • inserire MulticastDNS=resolve in /etc/systemd/resolved.conf

$ sudo systemctl restart systemd-resolved
$ sudo nmcli connection modify <nome_connessione> connection.mdns yes connection.llmnr yes
$ sudo systemctl restart NetworkManager

Come comprimere i file

Esempio:

$ tar -czvf cups-information.tar.gz /etc/cups cups.logs troubleshoot.txt lpinfo.log

Riavviare il servizio cups

È possibile riavviare il servizio cups con:

su -c 'systemctl restart cups.service'