Ubuntu – Can’t get the Canon LBP printer to run under Ubuntu 14.04

14.04canonprinting

I downloaded Linux CAPT driver V2.60 from Canon and installed both .deb packages, which were listed under the 64bit folder with Ubuntu Software-Center. My Canon printer still won't be recognized. Is there anything else I have to do? My printer is connected over USB.

Ubuntu would make a great replacment for my office, but unfortunately without printer support I will still rely on Windows.

enter image description here

Best Answer

The Canon CAPT printer driver is closed source and the binary libraries supplied by Canon are compiled for i386. So if you are on amd64 you will need to first enable multiarch and install some libraries:

# amd64 only
dpkg --add-architecture i386
apt-get update
apt-get install libstdc++6:i386 libxml2:i386 zlib1g:i386 libpopt0:i386

Install cups if you do not already have it:

apt-get install cups

Download and unpack the Canon CAPT printer driver:

wget http://gdlp01.c-wss.com/gds/6/0100004596
tar -zxvf Linux_CAPT_PrinterDriver_V260_uk_EN.tar.gz/03/Linux_CAPT_PrinterDriver_V260_uk_EN.tar.gz

Install 32-bit or 64-bit driver depending on your architecture:

  • 32-bit

     dpkg -i Linux_CAPT_PrinterDriver_V260_uk_EN/32-bit_Driver/Debian/*.deb
    
  • 64-bit

     dpkg -i Linux_CAPT_PrinterDriver_V260_uk_EN/64-bit_Driver/Debian/*.deb
    

Now look in /usr/share/cups/model for the ppd files that describe the printers and choose the one that matches (or is closest to) your printer:

# grep -H ModelName /usr/share/cups/model/*.ppd | less
...
/usr/share/cups/model/CNCUPSLBP6018CAPTS.ppd:*ModelName: "Canon LBP6000/LBP6018 CAPT (US)"

In this case we chose CNCUPSLBP6018CAPTS.ppd which matches model LBP6000.

(Note - if you can not find a match for your printer, then view the README-capt-*txt file in the Canon tar.gz archive - in the section named "Object Printer" it contains an exact list of the printers supported by each .ppd file).

Add printer:

# lpadmin -p LBP6000 -m CNCUPSLBP6018CAPTS.ppd -v ccp://localhost:59687
# lpadmin -p LBP6000 -E
# ccpdadmin -p LBP6000 -o /dev/usb/lp0

And configure your system to start the Canon ccpd daemon automatically:

# update-rc.d ccpd defaults

Problems

There are several problems with the Canon printer driver:

  • It was built for Debian and last supported Ubuntu version was 12.04. It does work in 14.04 though.

  • It includes closed source binary libraries which are built for 32-bit i386, so can not be run natively on amd64 (even in the 64-bit package)

  • captstatusui includes an unbounded call to strcpy in cnsktmodule.c which fails with error aborted *** buffer overflow detected *** on some systems

  • The Canon printer driver is actually a separate daemon that talks to cups over a local or network socket - it leaves an open network port on your system, and I doubt the Canon code has ever been audited for security vulnerabilities

  • The printer can appear twice in cups (once for auto-detected USB printer, once as Canon CCPD daemon) but the "USB" printer will not work if you try and print to it. In printer settings, if you see your printer configured as USB printer, you must manually disable it (right click, disable)

  • Canon use their own proprietary software and protocol for talking to the printer, which is why it is not integrated with cups, does not get automatically detected, and requires a driver to be manually installed. It is reasonable to expect that a printer should be automatically detected and just work, but this is not possible with Canon LBP. My next printer will be a printer that "just works" with open source drivers, probably a network printer that supports the PCL - Printer Command Language standard, like the Brother HL-2250DN (cheap duplex network printer, previously Amazon's top selling laser printer), or a HP Linux recommended printer that works with their open source HPLIP software.

  • The build scripts for the source code are old and a bit of a mess. Due to the inclusion of closed source i386 binary libraries, and lack of support for multiarch in the build scripts, it would be very hard to compile a fully working 64-bit release. Compiling a 32-bit release, on a 32-bit system, is possible once you have worked around the various bugs in the build system.


Problem: ccpd hangs

Sometimes ccpd hangs and the queue just says "Processing since ..."

Try a manual restart:

pkill -9 -x ccpd
pkill -9 -x captmoncnabc
/etc/init.d/ccpd start
/etc/init.d/ccpd status

Problem: ccpd does not work - only one ccpd process running after system startup

For normal operation two ccpd processes should be running in a system. The ccpd daemon depends on running cups daemon before forking the second process. You can use the following method to workaround the problem:

  1. Enable the cups init script (update-rc.d cups defaults).

  2. Instruct the ccpd init script to run after the cups init (update-rc.d ccpd defaults 99), or add "sleep 10 && /etc/init.d/ccpd start" in /etc/rc.local script.

If you want to use UDEV rules and startup script, be aware that UDEV rules execute before the CUPS init script, so it may be useful to restart the ccpd init script rather then simply start. For example, you can place the following string in "/etc/rc.local":

sleep 10 && /etc/init.d/ccpd restart

(Solution from Ubuntu wiki)


Reporting bugs and issues to Canon support

Canon have an official email address for reporting any bugs and issues with the driver:

sup-debian@list.canon.co.jp

Build from source

If you are tempted to try building and installing from source, follow these instructions (the Arch build script may also help):

sudo apt-get install build-essential automake libtool libgtk2.0-dev libglade2-dev libcups2-dev

wget http://gdlp01.c-wss.com/gds/6/0100004596/03/Linux_CAPT_PrinterDriver_V260_uk_EN.tar.gz
tar -zxvf Linux_CAPT_PrinterDriver_V260_uk_EN.tar.gz
cd Linux_CAPT_PrinterDriver_V260_uk_EN/Src/

# do cndrvcups-common
sudo apt-get install build-essential automake libtool libgtk2.0-dev libglade2-dev libcups2-dev
rm -rf cndrvcups-common-2.60-1/
tar -zxvf cndrvcups-common-2.60-1.tar.gz
cd cndrvcups-common-2.60-1/
sed -i -e 's/-lcups/-lcups -lgmodule-2.0/' cngplp/src/Makefile.am
dpkg-buildpackage -b -uc
cd ..
sudo apt-get install cups
sudo dpkg -i cndrvcups-common_2.60-1_amd64.deb

# do cndrvcups-capt
rm -rf cndrvcups-capt-2.60-1/
tar -zxvf cndrvcups-capt-2.60-1.tar.gz
cd cndrvcups-capt-2.60-1/
export echo=echo
sed -i -e 's/dh_shlibdeps/dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info/' debian/rules
sed -i -e 's/eval cmds=\"$old_archive_cmds/echo/' cngplp/ltmain.sh
sed -i -e 's:uimain.h":uimain.h"\n#include <cups/ppd.h>:' statusui/src/ppapdata.c
sed -i -e 's/cnsktmodule.la/cnsktmodule.la -lpthread/' statusui/src/Makefile.am
debian/rules configure
sed -i -e 's/RANLIB=/#RANLIB=/' cngplp/libtool
debian/rules build
fakeroot debian/rules install
fakeroot debian/rules binary-arch
cd ..
sudo dpkg -i cndrvcups-capt_2.60-1_amd64.deb

I am including this just as a note for anyone inclined to follow this path. Most people should not attempt to build this from source. Even on an amd64 system, the resulting package will include the closed i386 libraries.

Related Question