The printer won't print
You plug a USB printer into your Fedora laptop, or you join a new office network with a shared multifunction device, and nothing happens. You open LibreOffice, click Print, and the dialog shows an empty list. You expect the system to detect the hardware and start accepting jobs. It does not. The kernel sees the USB controller or the network interface, but the desktop environment has no queue to route documents to. You are left staring at a silent machine and a confused application.
How Fedora handles printing
Fedora routes all print jobs through CUPS, the Common Unix Printing System. CUPS acts as a spooling daemon. Think of it like a mail sorting facility. Applications hand off documents to the facility. The facility translates the document into a language the specific machine understands, queues it, and feeds it to the hardware one page at a time. If the queue does not exist, or if the translator is missing, the document sits in limbo.
Modern printers speak IPP, the Internet Printing Protocol. IPP-capable devices embed their own driver instructions inside the firmware. CUPS requests those instructions over the network and applies them automatically. Older printers or specialized models rely on PPD files, which are static driver descriptions stored locally. Fedora ships with the core spooler and a baseline set of open drivers. You only need to intervene when automatic detection misses the device, or when the default driver lacks the features you require.
Run journalctl -xe when the desktop reports a generic failure. The x flag adds explanatory context and the e flag jumps to the end of the log. Most spooler issues show up as a single line about a missing filter or a refused connection. Read that line before restarting services.
Discover and register the device
Start with the desktop interface. Open Settings and navigate to Printers. Click Add a Printer. The system scans USB buses and broadcasts on the local network. If the device appears, select it and click Add. Fedora will pull a driver from the repository and create the queue automatically. This covers most IPP-capable devices and standard USB models.
If the GUI does not show the device, or if you prefer the terminal, run a discovery scan first. The lpinfo command queries the network and hardware buses for available endpoints.
# Query the system for all detected printer device URIs
lpinfo -v
# Filter the output to see only network endpoints if the list is long
lpinfo -v | grep ipp
# Check USB buses directly when network discovery returns nothing
lpinfo -v | grep usb
The output returns strings like ipp://192.168.1.50/ipp/print or usb://HP/LaserJet. Copy the exact URI. You will need it for the queue creation step. Network discovery relies on cups-browsed, a background service that listens for mDNS and DNS-SD broadcasts. If your office network blocks multicast traffic, cups-browsed will not find the printer. Use the direct IP address in the URI instead.
Check the device URI before proceeding. A mismatched path causes silent failures later.
Install missing driver packages
Automatic detection relies on the cups-filters package and the printer-driver-gutenprint collection. These cover the majority of consumer and office hardware. Some manufacturers ship proprietary firmware or advanced feature sets that require a dedicated package. Install the correct package before creating the queue. The package manager will place the driver files in /usr/lib/cups/filter/. The spooler reads that directory on startup.
# Install the broad Gutenprint collection for inkjet and laser models
sudo dnf install gutenprint
# Install the HP Linux Imaging and Printing stack for HP devices
sudo dnf install hplip
# Launch the HP configuration wizard after the package installs
hp-setup
# Install the Epson ESC/P-R driver when the default Gutenprint profile fails
sudo dnf install epson-inkjet-printer-escpr
Run hp-setup only for HP hardware. The wizard scans the network, downloads firmware if required, and registers the queue automatically. Skip it for other brands. The gutenprint package is safe to install on any system. It does not interfere with existing queues. Package files in /usr/lib/ belong to the distribution. Never edit them directly. Place custom overrides in /etc/ instead. The package manager will overwrite /usr/lib/ on the next update.
Install the driver before creating the queue. CUPS caches driver lists on startup.
Configure the queue from the terminal
When the GUI is unavailable or you are managing a headless server, create the queue manually. The lpadmin command registers the device URI and assigns a driver model. Modern printers support IPP Everywhere. This standard embeds the driver instructions inside the printer itself. You can use the everywhere model to skip manual driver selection.
# Register a new queue named OfficePrinter with the discovered URI
sudo lpadmin -p OfficePrinter -E -v ipp://192.168.1.50/ipp/print -m everywhere
# Enable the queue immediately so it accepts jobs without a reboot
sudo cupsenable OfficePrinter
# Accept jobs for this queue so applications can send pages
sudo cupsaccept OfficePrinter
# Set this queue as the system default for all applications
sudo lpoptions -d OfficePrinter
The -E flag enables the queue. The -m everywhere flag tells CUPS to request the printer's native capabilities over the network. If your printer is older than 2013 or lacks IPP Everywhere support, replace everywhere with a specific PPD model name. Run lpinfo -m to list available models. Match the model name exactly. A mismatched model causes garbled output or silent failures.
Set the default queue once. Applications will inherit it automatically.
Verify the queue and run a test
Do not assume the queue is ready. Applications will send jobs to a misconfigured queue and report success while the printer sits idle. Check the queue state and send a test page.
# List all configured queues and show which one is marked default
lpstat -p -d
# Send a built-in test page to the default queue
lp -d OfficePrinter /usr/share/cups/data/testprint
# Watch the queue status to confirm the job moves from pending to processing
lpq -P OfficePrinter
The test page file lives in /usr/share/cups/data/. It is a plain text file formatted for basic printer commands. If the job prints cleanly, the spooler, the driver, and the network path are all working. If the job stays in pending or held, check the error log before restarting services.
Run the test page from the terminal. Desktop print dialogs do not show queue errors clearly.
When jobs hang or fail
CUPS logs everything to the journal. The spooler rarely crashes. It usually pauses a queue because of a missing driver, a network timeout, or a paper jam reported by the hardware. Run the status check first. Then pull the logs.
# Check the active state of the CUPS service
systemctl status cups
# Pull recent error lines from the CUPS unit journal
journalctl -u cups --since today -n 20
# Restart the spooler only when the queue state is stuck
sudo systemctl restart cups
You will often see scheduler shutting down or error: unable to connect to printer in the journal. The first message is normal during a restart. The second message points to a network routing issue or a firewall rule blocking port 631. Fedora's default firewall allows local CUPS traffic. If you moved the printer to a different subnet, open the port or adjust the ServerAlias directive in /etc/cups/cupsd.conf.
The CUPS web interface at http://localhost:631 provides a visual queue manager. Use it to cancel stuck jobs or change default page sizes. The interface requires root authentication. It mirrors the exact same configuration files the terminal commands modify.
If you see this exact error in the journal, the driver filter failed to translate the document:
E [28/Oct/2024:14:22:01 +0000] [Job 42] Filter "application/vnd.cups-postscript to application/vnd.cups-raster" failed: No such file or directory
The missing filter usually means the wrong driver package is installed. Reinstall the correct manufacturer package and restart the spooler. Do not disable SELinux. The denial is almost always a missing policy module or a misconfigured path. Run audit2allow on the journal output to generate the correct policy instead.
Check the journal before guessing. Half the time the error names the missing file directly.
Pick your setup method
Use the GNOME Settings interface when you are on a desktop system and want automatic driver selection. Use the lpinfo and lpadmin commands when you are managing a headless server or need scriptable queue creation. Use the hplip wizard when you own an HP multifunction device that requires firmware flashing or duplex calibration. Use the everywhere model when your printer supports IPP and you want to avoid manual PPD matching. Stay on the default cups-filters stack when you only need basic text and PDF output.