Per configurare le stampanti su NixOS esistono due approcci. Il primo utilizza CUPS insieme ad Avahi per il rilevamento automatico delle stampanti in rete. Il secondo definisce la stampante direttamente nel file di configurazione, garantendo la riproducibilità tipica di NixOS.

Creazione file per NixOS

Come prima cosa installiamo i protocolli necessari per gestire le stampanti. Lo script sotto configura CUPS e Avahi, le cui opzioni sono documentate nella documentazione ufficiale . Nel codice abbiamo utilizzato le opzioni standard che permettono di abilitare il sistema, attivare l’interfaccia web e avviare il servizio solo quando necessario.

nix
{ config, pkgs, ... }:

{

  services.printing = {
    enable = true;
    package = pkgs.cups;
    startWhenNeeded = true;
    webInterface = true;
  };
  
  services.avahi = {
    enable = true;
    nssmdns4 = true;
    openFirewall = true;
  };

}

Il primo blocco installa e attiva CUPS (Common UNIX Printing System), il sistema di stampa standard per Linux e macOS, che permette di gestire:

  • le code di stampa e job scheduling
  • la comunicazione con le stampanti (USB, rete, parallela)
  • i driver e filtri per convertire documenti in formati comprensibili dalle stampanti (come PostScript o PCL)
  • le interfacce web di amministrazione (porta 631)

Il secondo blocco configura Avahi , un’implementazione di Zeroconf/mDNS (multicast DNS), lo stesso protocollo che Apple chiama “Bonjour”. Avahi consente di trovare automaticamente le stampanti di rete che supportano AirPrint o IPP (Internet Printing Protocol), senza configurare manualmente indirizzi IP o nomi host. Il protocollo permette di:

  • rilevare automaticamente i dispositivi in rete locale senza configurazione manuale
  • gestire la pubblicazione e scoperta di servizi quali stampanti, file server, ecc.
  • risolvere i nomi .local senza bisogno di un server DNS

Utilizzo del Pannello CUPS

Dopo aver applicato la configurazione, possiamo accedere all’interfaccia web di CUPS all’indirizzo localhost:631. NixOS non fornisce un’applicazione grafica dedicata: la gestione delle stampanti avviene interamente da browser.

Nota

Questa è l’interfaccia per configurare le stampanti sulla macchina locale, non il pannello di gestione della stampante stessa.

La pagina principale mostra una guida alle funzionalità di CUPS. Per configurare le stampanti, utilizziamo il menu di navigazione in alto.

Interfaccia web di CUPS

Pannello di amministrazione

Per aggiungere una stampante, accediamo alla sezione “Administration” (http://localhost:631/admin). Da qui possiamo installare nuove stampanti, definire le classi e gestire i lavori di stampa.

Credenziali di accesso

Se appare un popup che richiede l’inserimento di credenziali, utilizzare nome utente e password del proprio account di sistema (quelli usati per accedere al computer), non le credenziali della stampante.

Pannello amministrazione in CUPS

In questa guida non mostreremo come aggiungere una stampante tramite interfaccia web o come gestire classi e lavori di stampa. Il processo di aggiunta è semplice e basta seguire la procedura guidata, che risulta essenziale ma intuitiva.

Configurazione Dichiarativa della Stampante

Nota

Questa sezione è stata sviluppata utilizzando una HP LaserJet MFP M130fw, semplicemente perché era l’unica stampante disponibile al momento della stesura. Non si tratta di una sponsorizzazione o raccomandazione. I comandi e gli output mostrati di seguito sono a titolo esemplificativo: URI, driver e opzioni variano in base alla tipologia, marca e modello della stampante.

Identificare la Stampante

Per definire una stampante direttamente nel file di configurazione NixOS, dobbiamo prima raccogliere alcune informazioni sulla stampante. Nel caso di questa guida si tratta di una stampante di rete, ma avendo installato Avahi, è possibile identificarla senza problemi utilizzando il comando lpinfo -v, il quale elenca tutti i dispositivi di stampa rilevati dal sistema, restituendo l’URI da usare in seguito.

bash
lpinfo -v

L’utilizzo del comando dovrebbe restituire un output nel terminale simile a quello riportato sotto (la stampante è abbastanza evidente).

network socket
network ipps
network http
network lpd
network https
network beh
network ipp
network smb
network dnssd://HP%20LaserJet%20MFP%20M130fw%20(0CA23B)._ipp._tcp.local/?uuid=e1111-1111-1111-1111-11e11c1ca11b

Il formato dell’URI varia in base al tipo di connessione della stampante. La tabella seguente mostra i formati più comuni che possiamo trovare nell’output.

Tipo connessione Esempio URI
USB usb://HP/LaserJet%20Pro?serial=ABC123
IPP (rete) ipp://192.168.1.100/ipp/print
Socket (rete) socket://192.168.1.100:9100
DNS-SD/mDNS dnssd://Stampante._ipp._tcp.local/

Identificare il Driver

Il secondo passo è identificare il driver corretto. Il comando lpinfo -m mostra tutti i modelli e driver disponibili all’interno del sistema che stiamo utilizzando.

bash
lpinfo -m

Qui possiamo vedere un esempio di come può essere l’output del comando, dove possiamo verificare quali siano i driver disponibili nel nostro sistema. I driver elencati sono quelli già installati sul sistema, non quelli disponibili online. CUPS cerca i file PPD (PostScript Printer Description) nelle directory locali, che in NixOS provengono dai pacchetti cups e cups-filters installati di default.

drv:///sample.drv/dymo.ppd DYMO Label Printer
drv:///sample.drv/epson9.ppd Epson 9-Pin Series
drv:///sample.drv/epson24.ppd Epson 24-Pin Series
drv:///cupsfilters.drv/pwgrast.ppd Generic IPP Everywhere Printer
drv:///sample.drv/generpcl.ppd Generic PCL Laser Printer
drv:///sample.drv/generic.ppd Generic PostScript Printer
drv:///cupsfilters.drv/dsgnjt600pcl.ppd HP DesignJet 600 pcl, 2.0
drv:///cupsfilters.drv/dsgnjt750cpcl.ppd HP DesignJet 750c pcl, 2.0
drv:///cupsfilters.drv/dsgnjt1050cpcl.ppd HP DesignJet 1050c pcl, 2.0
drv:///cupsfilters.drv/dsgnjt4000pcl.ppd HP DesignJet 4000 pcl, 2.0
drv:///cupsfilters.drv/dsgnjtt790pcl.ppd HP DesignJet T790 pcl, 2.0
drv:///cupsfilters.drv/dsgnjtt1100pcl.ppd HP DesignJet T1100 pcl, 2.0
drv:///sample.drv/deskjet.ppd HP DeskJet Series
drv:///sample.drv/laserjet.ppd HP LaserJet Series PCL 4/5
drv:///sample.drv/intelbar.ppd Intellitech IntelliBar Label Printer, 2.4
drv:///sample.drv/okidata9.ppd Oki 9-Pin Series
drv:///sample.drv/okidat24.ppd Oki 24-Pin Series
raw Raw Queue
drv:///sample.drv/zebracpl.ppd Zebra CPCL Label Printer
drv:///sample.drv/zebraep1.ppd Zebra EPL1 Label Printer
drv:///sample.drv/zebraep2.ppd Zebra EPL2 Label Printer
drv:///sample.drv/zebra.ppd Zebra ZPL Label Printer
everywhere IPP Everywhere

Se la stampante non compare nell’elenco o necessita di funzionalità avanzate (come scanner integrato o monitoraggio livelli inchiostro), è possibile installare driver aggiuntivi modificando il file di configurazione NixOS per quello che riguarda il driver CUPS.

nix
{ config, pkgs, ... }:

{
  services.printing = {
    enable = true;
    package = pkgs.cups;
    startWhenNeeded = true;
    webInterface = true;
    drivers = with pkgs; [
      hplip        # Driver HP (stampa, scanner, fax)
      gutenprint   # Driver di alta qualità per molte marche
      brlaser      # Driver Brother laser
      epson-escpr  # Driver Epson inkjet
    ];
  };
}

Dopo aver aggiunto i driver e ricostruito il sistema con nixos-rebuild switch, il comando lpinfo -m mostrerà i nuovi driver disponibili all’interno del sistema. Essendo il numero di risultati molto elevato, sarà necessario associare il comando grep utilizzando come parola chiave gli elementi della vostra stampante, ad esempio lpinfo -m | grep -i m130, in modo da filtrare i risultati.

Come mai la mia stampante non è elencata?

Nel caso della HP LaserJet MFP M130fw utilizzata in questa guida, il pacchetto hplip non include un driver specifico per questo modello. Questo accade perché alcune stampanti moderne, pur essendo di marca HP, sono progettate per funzionare esclusivamente tramite il protocollo IPP Everywhere, senza necessità di driver proprietari. Per questo motivo, nel codice finale utilizziamo everywhere come valore del campo model.

L’output di lpinfo -m fornisce il valore da inserire nel campo model della configurazione. Se non troviamo un driver specifico per la nostra stampante, possiamo usare uno dei driver generici:

Driver Utilizzo
everywhere Stampanti moderne con supporto IPP Everywhere (consigliato)
drv:///sample.drv/generic.ppd Driver generico PostScript
drv:///sample.drv/generpcl.ppd Driver generico PCL
drv:///cupsfilters.drv/pwgrast.ppd Driver generico IPP

Codice Finalizzato

Il codice seguente raccoglie tutti gli elementi visti in questa guida in un unico file di configurazione NixOS. Nel primo blocco viene installato CUPS con il driver hplip per stampanti HP.

Il secondo blocco abilita Avahi per il rilevamento automatico delle stampanti in rete tramite protocollo mDNS.

Infine, il terzo blocco definisce la stampante in modo dichiarativo tramite hardware.printers, specificando nome, posizione, URI del dispositivo (ottenuto con lpinfo -v) e driver da utilizzare (in questo caso everywhere per IPP). Questa configurazione garantisce che la stampante sia sempre disponibile dopo ogni ricostruzione del sistema.

nix
{ config, pkgs, ... }:

{
# Installazione CUPS & Drivers
  services.printing = {
    enable = true;
    package = pkgs.cups;
    startWhenNeeded = true;
    webInterface = true;
    drivers = with pkgs; [
      hplip
    ];
  };

# Installazione Avahi
  services.avahi = {
    enable = true;
    nssmdns4 = true;
    openFirewall = true;
  };

# Installazione Stampante Specifica  
  hardware.printers = {
    ensurePrinters = [
      {
        name = "Stampante_Ufficio";
        location = "Ufficio";
        deviceUri = "dnssd://HP%20LaserJet%20MFP%20M130fw%20(0CA23B)._ipp._tcp.local/?uuid=111e1111-1111-1111-1111-11e11c1ca11b";
        model = "everywhere";
        ppdOptions = {
          PageSize = "A4";
        };
      }
    ];
    ensureDefaultPrinter = "Stampante_Ufficio";
  };
}