Printing: Difference between revisions
Apple AirPrint: mention AirPrint by name, add required cups-browsed and cups-filters configuration |
Improve formatting, add more syntax highlighting, add more links (to packages/options) |
||
Line 1: | Line 1: | ||
Printing in NixOS is done via the | Printing in NixOS is done via the {{nixos:option|services.printing}} module, to configure the local printing services which is provided by the software [https://openprinting.github.io/projects/00-cups CUPS]. Setting up physical printer devices is done using {{nixos:option|hardware.printers}} option. | ||
== Installation == | == Installation == | ||
Line 11: | Line 11: | ||
== Configuration == | == Configuration == | ||
=== Enable | === Enable auto-discovery of network printers === | ||
Most printers manufactured after 2013 support the [https://www.pwg.org/ipp/everywhere.html IPP Everywhere] protocol, i.e. printing without installing drivers. This is notably the case of all WiFi printers marketed as Apple AirPrint-compatible ([https://support.apple.com/en-ca/HT201311 list]). | Most printers manufactured after 2013 support the [https://www.pwg.org/ipp/everywhere.html IPP Everywhere] protocol, i.e. printing without installing drivers. This is notably the case of all WiFi printers marketed as Apple AirPrint-compatible ([https://support.apple.com/en-ca/HT201311 list]). | ||
Line 36: | Line 36: | ||
=== Adding printers === | === Adding printers === | ||
Beside manually adding printers with client tools, it is possible to permanently add printers to your system configuration (but be aware of [https://github.com/NixOS/nixpkgs/issues/78535 this bug] that sometimes expect the printer to be plugged in your system). The following example configures a network printer called <code>Dell_1250c</code> to your local system, reachable via IPP at <code>http://192.168.178.2:631/printers/Dell_1250c</code> | Beside manually adding printers with client tools, it is possible to permanently add printers to your system configuration (but be aware of [https://github.com/NixOS/nixpkgs/issues/78535 this bug] that sometimes expect the printer to be plugged in your system). The following example configures a network printer called <code>Dell_1250c</code> to your local system, reachable via IPP at <code><nowiki>http://192.168.178.2:631/printers/Dell_1250c</nowiki></code> | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
Line 76: | Line 76: | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware.printers | hardware.printers.ensurePrinters = [ | ||
{ | |||
name = "Dell_1250c"; | |||
location = "Home"; | |||
deviceUri = "usb://Dell/1250c%20Color%20Printer?serial=YNP023240"; | |||
model = "Dell-1250c.ppd.gz"; | |||
ppdOptions = { | |||
PageSize = "A4"; | |||
}; | |||
} | |||
]; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
To add a printer over the smb protocol, [[Samba]] needs to be enabled:<syntaxhighlight lang="nix"> | To add a printer over the smb protocol, [[Samba]] needs to be enabled: | ||
hardware.printers.ensurePrinters = [{ | <syntaxhighlight lang="nix"> | ||
hardware.printers.ensurePrinters = [ | |||
{ | |||
# (other stuff...) | # (other stuff...) | ||
deviceUri = "smb://print-server.com/printername"; | deviceUri = "smb://print-server.com/printername"; | ||
}]; | } | ||
]; | |||
services.samba.enable = true; | services.samba.enable = true; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Some local or network printers might need additional drivers. You can add them using the <code>drivers</code> option: | |||
Some local or network printers might need additional drivers. You can add them using the <code>drivers</code> option | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
Line 141: | Line 141: | ||
</pre> | </pre> | ||
The <code>model</code> string is the first column. For example, for the Samsung SCX-4300 series, set < | The <code>model</code> string is the first column. For example, for the Samsung SCX-4300 series, set <syntaxhighlight inline lang="nix">model = "samsung/SCX-4300.ppd";</syntaxhighlight>. | ||
=== Printer sharing === | === Printer sharing === | ||
Enable network sharing of the default local printer, also known as "AirPrinting". Note that < | Enable network sharing of the default local printer, also known as "AirPrinting". Note that <syntaxhighlight inline lang="nix">listenAddresses = [ "*:631" ];</syntaxhighlight>, <syntaxhighlight inline lang="nix">allowFrom = [ "all" ];</syntaxhighlight> and <syntaxhighlight inline lang="nix">openFirewall = true;</syntaxhighlight> will enable anonymous access to your printer on all interfaces, you might want to restrict this. | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
Line 166: | Line 166: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Once printer sharing is enabled, it could be additionally advertised in the home network via the Samba protocol, [[Samba#Printer_sharing | Once printer sharing is enabled, it could be additionally advertised in the home network via the Samba protocol, see [[Samba#Printer_sharing]]. | ||
== Usage == | == Usage == | ||
Line 172: | Line 172: | ||
After enabling the printing service you'll be able to configure and add network printers via http://localhost:631. You may need to authenticate with your local user when you add the printer. | After enabling the printing service you'll be able to configure and add network printers via http://localhost:631. You may need to authenticate with your local user when you add the printer. | ||
Depending on your desktop environment, there are several graphical tools available which will connect to this backend service and allow you a more convenient printer management, for example | Depending on your desktop environment, there are several graphical tools available which will connect to this backend service and allow you a more convenient printer management, for example {{nixos:package|system-config-printer}}. | ||
=== Command line === | === Command line === | ||
Line 179: | Line 179: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
lpstat -p | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 185: | Line 185: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
lp -o job-sheets=standard,none -d HP-LaserJet-1020 /dev/null | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 191: | Line 191: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
lpstat | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 197: | Line 197: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
cancel 1 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 205: | Line 205: | ||
===== Provide the PPD imperatively ===== | ===== Provide the PPD imperatively ===== | ||
If no driver is found for your printer, even when | If no driver is found for your printer, even when {{nixos:option|services.printing.drivers}} is correctly populated (see above), you can try to give cups a PPD file. | ||
you can try to give cups a PPD file. | |||
* Download the required PPD file, for example from [https://openprinting.org/printers openprinting.org] | * Download the required PPD file, for example from [https://openprinting.org/printers openprinting.org] | ||
* Open the PPD as a text file, and check that it does not mention FHS paths like <code>/usr/bin</code>. If it does, this method is unlikely to work, as the PPD file depends on executables not present on your system. You can certainly install the binaries yourself and point to the new binary, but it is certainly easier to patch the executables in a derivation (see below) to avoid garbage collection of your binaries. | * Open the PPD as a text file, and check that it does not mention FHS paths like <code>/usr/bin</code>. If it does, this method is unlikely to work, as the PPD file depends on executables not present on your system. You can certainly install the binaries yourself and point to the new binary, but it is certainly easier to patch the executables in a derivation (see below) to avoid garbage collection of your binaries. | ||
Line 265: | Line 264: | ||
=== Upgrade required === | === Upgrade required === | ||
Described in: [https://github.com/NixOS/nixpkgs/issues/23993 Github issue 23993] | Described in: [https://github.com/NixOS/nixpkgs/issues/23993 Github issue 23993] | ||
'''Problem'''<br /> | '''Problem'''<br /> | ||
Using the cups web interface, the page tells you "Upgrade Required" and then redirects you to a page that fails to load.<br /> | Using the cups web interface, the page tells you "Upgrade Required" and then redirects you to a page that fails to load.<br /> | ||
Line 274: | Line 274: | ||
'''Solution'''<br /> | '''Solution'''<br /> | ||
Either we can help cups to get ssl keys, or we can tell it to not use https at all. | Either we can help cups to get ssl keys, or we can tell it to not use https at all. | ||
''Generating ssl keys:''<br /> | ''Generating ssl keys:''<br /> | ||
First make sure the directory /etc/cups/ssl | First make sure the directory <code>/etc/cups/ssl</code> exists: | ||
< | |||
Try restarting cups and using the web interface again. This might be enough to get it working. | <syntaxhighlight lang="bash"> | ||
If this didn't help, then check if cups has generated ssl keys in /etc/cups/ssl< | sudo mkdir -p /etc/cups/ssl | ||
</syntaxhighlight> | |||
Try restarting cups and using the web interface again. This might be enough to get it working. | |||
If this didn't help, then check if cups has generated ssl keys in <code>/etc/cups/ssl</code>. | |||
''Disabling ssl:''<br /> | ''Disabling ssl:''<br /> | ||
Edit your <code>/etc/nixos/configuration.nix</code> and add the following lines:<br /> | Edit your <code>/etc/nixos/configuration.nix</code> and add the following lines:<br /> | ||
< | |||
<syntaxhighlight lang="nix"> | |||
services.printing.extraConf = '' | |||
DefaultEncryption Never | |||
''; | |||
</syntaxhighlight> | |||
===Unable to launch Ghostscript: gs: No such file or directory=== | ===Unable to launch Ghostscript: gs: No such file or directory=== | ||
Described in: [https://github.com/NixOS/nixpkgs/issues/20806 Github issue 20806] | Described in: [https://github.com/NixOS/nixpkgs/issues/20806 Github issue 20806] | ||
and [https://github.com/NixOS/nixpkgs/issues/22062 issues 22062]<br /> | and [https://github.com/NixOS/nixpkgs/issues/22062 issues 22062]<br /> | ||
'''Problem'''<br /> | '''Problem'''<br /> | ||
When printing, cups will report an error: Unable to launch Ghostscript: gs: No such file or directory<br /> | When printing, cups will report an error: <code>Unable to launch Ghostscript: gs: No such file or directory</code><br /> | ||
'''Cause'''<br /> | '''Cause'''<br /> | ||
Some drivers use the ghostscript binary.<br /> | Some drivers use the ghostscript binary.<br /> | ||
Cups will look for the binary path in it's config file: cupsd.conf<br /> | Cups will look for the binary path in it's config file: <code>cupsd.conf</code><br /> | ||
This file is normally a link. But it can be overwritten, and consequentially become outdated.<br /> | This file is normally a link. But it can be overwritten, and consequentially become outdated.<br /> | ||
'''Solution'''<br /> | '''Solution'''<br /> | ||
You could try to manually fix the path variable in /var/lib/cups/cupsd.conf<br /> | You could try to manually fix the path variable in <code>/var/lib/cups/cupsd.conf</code><br /> | ||
Alternatively you could try to delete the file and run <code>sudo nixos-rebuild switch</code> | Alternatively you could try to delete the file and run <code>sudo nixos-rebuild switch</code> | ||
Line 306: | Line 316: | ||
'''Problem'''<br /> | '''Problem'''<br /> | ||
But, later you may experience an error like | But, later you may experience an error like <code>/nix/store/.../lib/cups/filter/pstospl not available: No such file or directory</code>. | ||
'''Cause'''<br /> | '''Cause'''<br /> | ||
Line 316: | Line 326: | ||
=== Debugging a broken printer driver === | === Debugging a broken printer driver === | ||
Add to <code>/etc/nixos/configuration.nix</code> | Add to <code>/etc/nixos/configuration.nix</code>: | ||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
Line 324: | Line 334: | ||
Rebuild | Rebuild | ||
< | <syntaxhighlight lang="bash"> | ||
sudo nixos-rebuild switch | sudo nixos-rebuild switch | ||
</ | </syntaxhighlight> | ||
Watch the cups logs | Watch the cups logs | ||
<syntaxhighlight lang= | <syntaxhighlight lang="bash"> | ||
journalctl --follow --unit=cups | |||
</syntaxhighlight> | </syntaxhighlight> | ||
or | or | ||
<syntaxhighlight lang= | <syntaxhighlight lang="bash"> | ||
journalctl --follow --unit=cups | grep -C10 --color=always -i -e 'No such file or directory' -e 'error:' | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 352: | Line 362: | ||
'''Solution'''<br /> | '''Solution'''<br /> | ||
Use < | Use <syntaxhighlight inline lang="bash">NIXPKGS_ALLOW_UNFREE=1 nix-shell -p hplipWithPlugin --run 'sudo -E hp-setup'</syntaxhighlight> to add the printer. | ||
[[Category:Hardware]] | [[Category:Hardware]] |