How to Install Canon Printer Drivers on Fedora

Install Canon printer drivers on Fedora by enabling RPM Fusion and installing the Canon-Printer-Drivers package via DNF.

You plug in a Canon printer and Fedora shows nothing

You unbox a Canon imageCLASS or MAXIFY, connect it via USB or Wi-Fi, and open the Settings application. The printer appears as an unknown device, or it prints a page of raw PostScript code. You visit Canon's support site, download a Linux .rpm, and run it. The package manager throws a dependency error or silently fails to register the backend. You need a working printer, not a dependency maze.

What is actually happening

Linux does not bundle proprietary printer firmware or vendor-specific drivers by default. The printing stack relies on CUPS, which acts as the spooling manager and job router. CUPS translates application print jobs into a format the printer understands. Scanning relies on SANE, which provides a unified API for scanner hardware. Canon splits its Linux support into two tracks. Older and mid-range models use open-source PPD files that ship with Fedora. Newer models require proprietary backend drivers that handle Canon's custom rasterization and firmware handshakes. Those proprietary packages live outside the default Fedora repositories.

RPM Fusion hosts the packaged versions that integrate cleanly with dnf, handle dependencies, and respect Fedora's filesystem layout. The repository splits into two tiers. The free tier contains open-source software. The nonfree tier contains proprietary firmware and drivers that cannot be distributed under Fedora's strict licensing guidelines. Enabling both tiers gives dnf access to the complete Canon driver stack without breaking package management invariants.

Config files in /etc/cups/ are user-modified. Files in /usr/lib/cups/ ship with the package. Edit /etc/. Never edit /usr/lib/. This convention prevents upgrades from overwriting your custom queue settings or firewall rules.

Install the printing stack and Canon drivers

Here is how to enable RPM Fusion and pull in the Canon drivers in one transaction.

# Enable the free RPM Fusion repository for your current Fedora release
sudo dnf install -y https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
# Enable the nonfree tier to access proprietary Canon backends
sudo dnf install -y https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
# Install CUPS core, client utilities, SANE scanning backend, and the Canon driver package
sudo dnf install -y cups cups-client cups-libs sane sane-backends Canon-Printer-Drivers
# Start and enable the CUPS daemon so it survives reboots
sudo systemctl enable --now cups

The Canon-Printer-Drivers package is a meta-package. It pulls in the correct backend binaries and PPD files for the most common Canon models. If you have a specific model number, you can search the repository with dnf search canon to find model-specific packages. The cups-browsed package usually installs as a dependency. It handles network printer discovery via mDNS and IPP.

Run dnf upgrade --refresh weekly to keep the driver stack aligned with Fedora's security patches. Do not confuse this with dnf system-upgrade, which crosses major Fedora releases. They are different commands.

Configure CUPS and open the firewall

CUPS listens on port 631 by default. The firewall blocks incoming connections until you explicitly allow the IPP service. Network discovery also requires the firewall to pass multicast packets.

Here is how to open the necessary ports and enable remote administration.

# Allow IPP traffic through the firewall persistently
sudo firewall-cmd --permanent --add-service=ipp
# Allow CUPS web interface access from your local network
sudo firewall-cmd --permanent --add-service=ipp-client
# Apply the runtime configuration immediately
sudo firewall-cmd --reload
# Enable remote administration in the CUPS configuration
sudo cupsctl --remote-any
# Restart CUPS to apply the new network settings
sudo systemctl restart cups

The cupsctl --remote-any flag changes the Listen directive in /etc/cups/cupsd.conf. It allows CUPS to accept connections from any interface instead of localhost only. You can verify the change by opening http://localhost:631 in your browser. The admin panel will show your Canon device under Printers. If the device does not appear, run sudo lpinfo -v to list available device URIs. USB printers show as usb://Canon/Model. Network printers show as socket://IP-ADDRESS or ipp://HOSTNAME/ipp/print.

Add the printer through the web interface or use lpadmin from the terminal. The web interface handles PPD selection automatically. The terminal requires you to specify the PPD path manually.

Verify the setup

Here is how to confirm the printer queue is active and the scanner backend loads correctly.

# List all configured printers and show the default queue
lpstat -p -d
# Send a raw test page to the default printer
lp -d <printer-name> /usr/share/cups/data/testprint
# List all detected SANE scanners
scanimage -L

The lpstat -p -d command returns the queue state and the default destination. A healthy queue shows enabled, accepting. If it shows disabled, not accepting, check the journal for permission errors. The scanimage -L command queries the SANE backend. A successful scan shows the device URI and model name. If it returns nothing, the SANE backend did not load or the USB permissions are restricted.

Run journalctl -xeu cups to read the actual error before guessing. The x flag adds explanatory text and the e flag jumps to the end. Most sysadmins type journalctl -xeu <unit> muscle-memory style.

Common pitfalls and error patterns

SELinux blocks CUPS from reading USB devices when the spool directory lacks the correct context. You will see a denial in the audit log that stops the print job from reaching the backend.

type=AVC msg=audit(1718432100.123:456): avc:  denied  { read } for  pid=1234 comm="cupsd" name="Canon-Model" dev="sda1" ino=567890 scontext=system_u:system_r:cupsd_t:s0 tcontext=system_u:object_r:usb_device_t:s0 tclass=chr_file permissive=0

Restore the correct context and reload the SELinux policy.

# Restore default SELinux contexts for CUPS spool and config directories
sudo restorecon -Rv /var/spool/cups /etc/cups
# Check for remaining denials in the setroubleshoot log
sudo journalctl -t setroubleshoot | tail -n 5

SELinux denials show up in journalctl -t setroubleshoot with a one-line summary. Read those before disabling SELinux. Disabling the security module breaks container isolation and breaks CUPS sandboxing.

Another common failure is driver conflict. If you manually installed Canon's official .rpm before enabling RPM Fusion, the package manager will refuse to proceed and print Error: Transaction test error: package Canon-Printer-Drivers conflicts with canon-pixma-driver-<version>. The conflict is intentional. RPM Fusion's package replaces the vendor's standalone installer. Remove the old package first.

# Remove the conflicting vendor package without breaking dependencies
sudo dnf remove -y canon-pixma-driver*
# Reinstall the RPM Fusion meta-package
sudo dnf install -y Canon-Printer-Drivers

Network printers sometimes fail to respond because the router blocks mDNS or the printer's DHCP lease expired. Check the printer's IP address in its web interface. Update the CUPS queue with the correct URI. Run firewall-cmd --reload after every rule change. Otherwise the runtime config and the persistent config diverge.

Choose the right driver path

Use RPM Fusion Canon drivers when you want a maintained package that integrates with dnf and respects Fedora's filesystem layout. Use generic PPD files when your model is older than five years and supports standard PostScript or PCL. Use Canon's official .rpm when you need a firmware update tool that only ships in the vendor's installer. Use IPP or AirPrint when your printer supports network printing natively and you want to avoid driver installation entirely. Stay on the upstream Workstation defaults if you only deviate from the standard stack occasionally.

Where to go next

Check the queue status before you reboot. A misconfigured backend will drop silently until you verify the URI.