Printing & Scanning

Good news: printing on Linux is way better than it used to be. Most modern printers from HP, Brother, and Epson work automatically or with minimal setup. Here's how to get everything running.

How Printing Works on Linux

Linux uses a system called CUPS (Common Unix Printing System) to handle all printing. Think of it as the engine running behind the scenes whenever you hit "Print." The great thing is that CUPS comes pre-installed on virtually every Linux distro, so you don't need to set it up yourself. When you plug in a printer or connect to one over your network, CUPS is what makes it work.

In most cases, you just plug in your printer and it shows up ready to go. If it doesn't, this guide will walk you through getting it working.

Setting Up a Printer

Automatic detection (USB printers)

The simplest scenario: plug your printer into a USB port, wait a few seconds, and try printing something. Many printers from HP, Brother, and Epson are detected and configured automatically. You might see a notification that a new printer was added. That's it — you're done.

Through your desktop settings

If your printer wasn't detected automatically, or you need to add a network printer, use the built-in settings app:

Your system will search for available printers. If yours shows up in the list, select it and follow the prompts. The system will usually pick the right driver for you.

Adding a network printer by IP address

If your printer is on the network but doesn't show up in the automatic search, you can add it manually using its IP address. You can usually find the IP address on your printer's display screen or by printing a network configuration page from the printer itself.

  1. Open the Printers settings (as described above)
  2. Choose Add Printer and look for an option like "Network Printer" or "Enter URI"
  3. Type in the address. Common formats:
    • ipp://192.168.1.100/ipp/print — for most modern printers that support IPP
    • socket://192.168.1.100:9100 — for printers using raw/JetDirect protocol
    • lpd://192.168.1.100/queue — for older printers using LPD
  4. Select the correct driver (or use the generic "IPP Everywhere" driver for modern printers)
IPP Everywhere: If your printer was made in the last few years, it probably supports "IPP Everywhere" or "driverless printing." This means Linux can talk to it without any extra drivers at all. Just select the IPP Everywhere option when adding your printer.

If Your Printer Isn't Detected

Some printers need manufacturer-specific drivers. Here's what to install depending on your printer brand:

HP printers — install HPLIP

HP has the best Linux support of any printer manufacturer. They provide an official package called HPLIP (HP Linux Imaging and Printing) that covers most HP printers and scanners. It's often pre-installed, but if your HP printer isn't working, install or update it:

Ubuntu / Debian / Mint
sudo apt update
sudo apt install hplip

# For the graphical setup tool:
sudo apt install hplip-gui

# Run the setup wizard:
hp-setup
Fedora
sudo dnf install hplip hplip-gui

# Run the setup wizard:
hp-setup
Arch / Manjaro
sudo pacman -S hplip

# Run the setup wizard:
hp-setup
openSUSE
sudo zypper install hplip

# Run the setup wizard:
hp-setup

The hp-setup command opens a wizard that walks you through adding your HP printer. It detects USB and network printers and installs the right driver automatically.

Newer HP printers: If your printer is very new and HPLIP from your distro's repository doesn't support it, download the latest version directly from HP's HPLIP website. Run the downloaded .run file with sh hplip-*.run and follow the prompts.
Brother printers — download from Brother

Brother provides Linux drivers for most of their printers, but they aren't included in distro repositories. You need to download them from Brother's website:

  1. Go to Brother's Linux driver page
  2. Search for your exact printer model
  3. Select "Linux" as the OS
  4. Download the "Driver Install Tool" — it's a shell script that handles everything
  5. Run it:
    # Make the script executable and run it
    sudo bash linux-brprinter-installer-*

The installer will ask for your printer model and whether it's USB or network-connected, then download and set up the correct driver.

32-bit libraries: Some Brother drivers require 32-bit libraries on 64-bit systems. If the installer fails, you may need to install them:
# Ubuntu / Debian / Mint
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install lib32stdc++6

# Fedora
sudo dnf install glibc.i686
Epson printers — install the ESC/P-R driver

Epson provides a Linux driver package for their inkjet printers. It's available in most distro repositories:

Ubuntu / Debian / Mint
sudo apt update
sudo apt install printer-driver-escpr

# For newer Epson printers, also try:
sudo apt install printer-driver-escpr2
Fedora
sudo dnf install epson-inkjet-printer-escpr

# For newer models:
sudo dnf install epson-inkjet-printer-escpr2
Arch / Manjaro
# Available in the AUR
yay -S epson-inkjet-printer-escpr
yay -S epson-inkjet-printer-escpr2
openSUSE
sudo zypper install epson-inkjet-printer-escpr

After installing the driver, go to your Printers settings and add the printer. It should now be detected with the correct driver.

For Epson laser printers or models not covered by the package, check Epson's Linux download page for your specific model.

Canon printers — limited but possible

Canon's Linux support is unfortunately the weakest of the major brands. Some models work with generic drivers, but many need Canon's proprietary drivers which can be tricky to install.

Here's what to try, in order:

  1. Try the generic IPP Everywhere driver first. Many newer Canon printers support driverless printing and this might be all you need.
  2. Check the Gutenprint drivers — these are community-made drivers that cover many Canon models:
    Ubuntu / Debian / Mint
    sudo apt install printer-driver-gutenprint
    Fedora
    sudo dnf install gutenprint gutenprint-cups
    Arch / Manjaro
    sudo pacman -S gutenprint
    openSUSE
    sudo zypper install gutenprint
  3. Download Canon's official driver from Canon's support page. Look for "Linux" in the OS filter. Canon provides .deb and .rpm packages for some models.
  4. Search community resources. The Arch Wiki CUPS page has detailed notes on many Canon models and is useful regardless of your distro.
Before you buy: If you're shopping for a new printer and plan to use Linux, Canon is probably not your best bet. HP and Brother give you a much smoother experience.

Scanning

If your printer doubles as a scanner (most all-in-one models do), Linux can handle that too. Here's what you need to know:

Scanning apps

Most Linux desktops come with a scanning app pre-installed:

If you don't have a scanning app installed:

# GNOME / Cinnamon / MATE desktops
sudo apt install simple-scan        # Ubuntu / Debian / Mint
sudo dnf install simple-scan        # Fedora
sudo pacman -S simple-scan          # Arch / Manjaro

# KDE Plasma desktops
sudo apt install skanlite           # Ubuntu / Debian / Mint
sudo dnf install skanlite           # Fedora
sudo pacman -S skanlite             # Arch / Manjaro

SANE — the scanning system

Behind the scenes, Linux uses a system called SANE (Scanner Access Now Easy) to communicate with scanners. It's the scanning equivalent of CUPS. You usually don't need to think about it, but if your scanner isn't being detected, installing the SANE backends can help:

# Install SANE backends (scanner drivers)
sudo apt install sane-backends libsane-extras    # Ubuntu / Debian / Mint
sudo dnf install sane-backends sane-frontends    # Fedora
sudo pacman -S sane                              # Arch / Manjaro
sudo zypper install sane-backends                # openSUSE

# Check if SANE can see your scanner
scanimage -L

If scanimage -L lists your scanner, your scanning app should be able to use it.

Scanner drivers by brand

Common Problems

Printer shows up but won't print

Your printer appears in the list but nothing comes out when you print? This is usually a CUPS issue. Try these steps:

# Check CUPS service status
systemctl status cups

# If it's not running, start it:
sudo systemctl start cups
sudo systemctl enable cups

# Restart CUPS (fixes most issues)
sudo systemctl restart cups

Also check if your printer is paused or in an error state:

# List all printers and their status
lpstat -p -d

# If your printer shows as "paused" or "disabled":
sudo cupsenable YourPrinterName
sudo cupsaccept YourPrinterName

# Clear the print queue (if jobs are stuck)
sudo cancel -a
Check the basics: Make sure the printer is turned on, has paper, and is actually connected (USB plugged in, or on the same network). It sounds obvious, but these are the most common causes.
Poor print quality or garbled output

If your prints come out looking wrong — garbled text, wrong colors, misaligned, or just garbage characters — the problem is usually the driver or PPD file (the file that tells CUPS how to talk to your printer).

  1. Make sure you have the right driver installed for your specific printer model (see the brand-specific sections above)
  2. Try a different PPD file: Go to your Printers settings, open your printer's properties, and try switching to a different driver. Sometimes the "recommended" driver isn't the best one.
  3. Try the generic driver: If your printer supports IPP, switch to the "IPP Everywhere" driver and see if that helps
  4. Check the print settings: Make sure the paper size matches what's actually loaded in the printer (A4 vs. Letter is a common mismatch)
Scanner not detected

If your scanning app says "No scanners detected," try the following:

# Install SANE backends if not already present
sudo apt install sane-backends       # Ubuntu / Debian / Mint
sudo dnf install sane-backends       # Fedora
sudo pacman -S sane                  # Arch / Manjaro

# Check if SANE can detect your scanner
scanimage -L

# If it's a USB scanner, check if the system sees the hardware
lsusb | grep -i -E 'scan|print|hp|brother|epson|canon'

# Make sure your user is in the scanner group
sudo usermod -aG scanner $USER
sudo usermod -aG lp $USER
# Log out and back in for group changes to take effect

If scanimage -L shows nothing, install the manufacturer-specific driver (HPLIP for HP, Brother's installer for Brother, etc.) and try again.

Network printer keeps disappearing

If your network printer shows up sometimes but then vanishes, it's usually a network discovery issue:

# Make sure Avahi (network discovery) is running
sudo systemctl start avahi-daemon
sudo systemctl enable avahi-daemon

# If the printer keeps disappearing, add it manually by IP
# instead of relying on auto-discovery (see "Adding a network printer" above)

Adding the printer by IP address is more reliable than automatic discovery because it doesn't depend on mDNS/Bonjour broadcasts, which can be flaky on some networks.

CUPS web interface — advanced printer management

CUPS has a built-in web interface that gives you full control over your printers. It's especially useful for debugging or for advanced configuration that your desktop settings app doesn't expose.

To access it, open your browser and go to:

http://localhost:631

From here you can:

  • Add, remove, or modify printers — sometimes this works when the desktop settings app doesn't
  • View the print queue and cancel or restart stuck jobs
  • Check error logs — click Troubleshooting or look at the error log for detailed info about what went wrong
  • Set default options — paper size, quality, duplex printing, etc.
  • Share a printer on your network so other computers can print to it
Login required: Some actions in the CUPS web interface require you to log in. Use your regular Linux username and password.

To increase CUPS logging for debugging:

# Set log level to debug
sudo cupsctl --debug-logging

# View the error log
sudo tail -f /var/log/cups/error_log

# Turn debug logging off when you're done (it fills up fast)
sudo cupsctl --no-debug-logging