简介:佳能CUPS Linux驱动包是一份面向Linux系统管理员、运维人员及打印机用户的驱动资源,适用于Debian、Ubuntu、CentOS等常见发行版,解决佳能打印机在Linux下无法直接识别、安装和网络共享打印的问题。压缩包共195个文件,大小约16.48MB,包含76个ICC色彩配置文件(用于色彩管理)、19个C语言头文件和11个C源码文件(便于二次编译)、6个Shell安装脚本、4个动态库(.so),以及README、ChangeLog、Makefile、rules等构建说明和打包配置文档,基本覆盖驱动安装、调试与色彩管理所需的完整文件集。目前已有1083人浏览学习。资源以cndrvcups-common通用驱动包为核心,提供PPD打印机描述文件和lpadmin、lpstat等命令行工具,用户可用图形向导或终端命令添加打印机、监控作业、管理队列。包内源码、脚本和色彩配置有助于进阶用户排查内核兼容性问题、重新编译驱动;初级用户可参照README和技术文档排错。通过学习可掌握从安装、色彩配置到队列管理的完整流程,在Linux环境中部署佳能打印机非常实用。
1. 佳能 CUPS Linux 驱动:不是装个包就能打印
在 Linux 上给佳能打印机配驱动,很多人以为下载驱动包、双击安装、再点添加打印机就完事。这套流程在 Windows 上行得通,在 CUPS 体系下却经常卡在最后一步:队列建好了,任务也提交了,打印机就是不动。
原因在于 CUPS 驱动不是一个可执行文件那么简单,它由 PPD 描述文件、后端通信程序和队列参数三块拼成,任何一块对不上,打印就成了玄学。更麻烦的是老机型走 CAPT 协议需要常驻守护进程,新机型走 UFR II 或 IPP 反而可以免驱动。
这篇笔记从装驱动前的环境确认写起,把接口类型、代次、PPD 注册、队列 URI 和常见翻车现场理成一条线,适合从 Windows 迁过来的运维同学照着复现。
2. 先摸清家底:接口、代次与 CUPS 版本决定驱动选型
2.1 接口类型定方向:USB、网络口还是并口
佳能打印机的物理接口决定后端程序选型。USB 直连的机器,CUPS 走 usb 后端,厂商驱动包里通常带一个专用后端程序,负责和设备的双向通信,文件名一般带 canon 字样。网络打印机走 socket 或 IPP 后端,驱动包里对应的是网络协议封装,URI 里直接写 IP 和端口。
并口机器(不少十年前的激光机还在用)不能直接被现代 CUPS 识别,需要先确认主板并口被内核驱动到 /dev/lp0,再用 lpadmin 手动指定 URI 为 parallel:/dev/lp0。我一般不建议在生产环境折腾并口,兼容性问题太多,优先级放到最后。
选型的核心经验是:能走 IPP 就走 IPP,其次网络 socket,再次 USB,并口是最后选项。这个顺序同时影响驱动下载的选型——佳能对新网络机型通常提供 UFR II 驱动,对老 USB 机型提供 CAPT 驱动,两者 PPD 结构和守护进程要求完全不同,选错后面全乱。
具体到命令上,USB 机器的 URI 长这样:usb://Canon/XXXX?serial=YYYY,网络机器是 socket://192.168.1.20:9100 或 ipp://192.168.1.20/ipp/print。CUPS 建队列时 URI 写错不会立刻报错,而是等任务提交后才在日志里暴露问题,所以这一步值得多看两眼。
2.2 代次与 PPD:为什么老激光机反而好驱动
佳能打印机的驱动代次大致分三档。最新一代支持 IPP Everywhere 或 AirPrint 的机型,在 CUPS 2.4 以上的系统里可以不装厂商驱动,直接按 IPP 打印机添加,PPD 由 CUPS 从打印机自带的能力描述里自动生成,这是最省心的一档。
中间档是近十年的 UFR II / PCL 机型,需要装官方驱动包,但结构简单:一个 PPD 加一个后端程序,注册完就很省事。最麻烦的是更早的 CAPT 机型,驱动包里带的是一套独立的打印通道,安装后需要单独启动 ccpd 守护进程才能干活。
这里有个反直觉的结论:老 CAPT 机器如果驱动装对了,反而非常好用。它完全绕开 CUPS 自带的过滤器链,从提交到打印全程走厂商自己的通道,不会出现字体替换、色彩转换的偏差。代价是系统一升级,守护进程的依赖链一断,机器立刻罢工。
判断代次不需要拆机器,看两点就够。一是打印机面板或管理页里有没有打印语言选项,带 UFR II / PCL 字样的是中间档;二是看官方驱动页给的是 UFR II 包还是 CAPT 包。这两点确认完,下载哪个驱动包基本不会错。
2.3 三条命令摸清当前打印环境
动手装驱动之前,我一般先用三条命令把环境底数记下来。第一条是 lsusb,确认 USB 打印机被内核识别,输出里能看到厂商 ID 和产品 ID,这两串数字在后面排查权限问题时用得上。第二条是 lpinfo -v,列出 CUPS 当前可用的后端类型,如果列表里连 usb 都没有,说明 CUPS 后端被裁剪了,装什么驱动都白搭。
lsusb # 确认 USB 打印机被内核识别 lpinfo -v | grep -E "usb|ipp|socket" # 列出 CUPS 可用后端 cupsd --version # 查看 CUPS 版本 cupsctl | grep LogLevel # 查看当前日志级别参数说明:lsusb 不带参数时列出所有 USB 总线上的设备,重点看打印机对应的厂商 ID;lpinfo -v 的 -v 表示 verbose,列出所有可用后端;cupsd --version 直接打印 CUPS 版本号,低于 2.2 的老版本要特别注意;cupsctl 输出当前服务的配置,grep 之后只留下日志级别一行。
CUPS 2.2 以下的老版本对 IPP 能力描述识别不全,很多新机型添加后打印选项不完整,这现象在老系统上很常见。先确认这三项再决定下载哪个驱动包,能省掉后面一多半的排错时间。如果 lpinfo -v 输出里 ipp 和 socket 都有但网络发现失败,再用 avahi-browse 扫一下打印机 IP,确认设备在网络里是活的。这条排查路径在后面讲网络打印机休眠问题时还会用到。
3. 从驱动包到打印队列:CUPS 安装的完整闭环
这篇笔记配套的驱动资源包里通常同时提供 deb、rpm、tar.gz 三种格式,对应 Debian/Ubuntu 系、RPM 系发行版和通用安装场景。下面按这三个格式分别走一遍安装、注册和建队列的完整闭环。
3.1 Debian/Ubuntu 系:deb 包装完不等于注册完
佳能对 Debian/Ubuntu 系提供 .deb 驱动包,装完后 PPD 文件被放到 /usr/share/cups/model/ 目录下,后端程序放进 /usr/lib/cups/backend/。这两处路径只要有一处权限不对,CUPS 就看不到新驱动。
装包时我习惯用 dpkg -i 而不是图形化软件中心,原因是能立刻看到依赖缺失的报错。如果报缺 libcups2 或 libcupsimage2 且版本不对,先用 apt -f install 修依赖,再重新配置包:
sudo dpkg -i cnlinuxdriver*.deb # 安装佳能驱动包 sudo apt -f install -y # 修复可能的依赖缺失 sudo lpinfo -m | grep -i canon # 验证 PPD 是否注册成功第三行的作用很关键——lpinfo -m 会列出 CUPS 当前能识别到的所有 PPD 型号。如果装完驱动后这行查不到任何佳能条目,说明 PPD 没有进到 CUPS 的 model 目录,后面建队列时就会找不到驱动,得回头检查 deb 包的安装路径。
注意:dpkg 报依赖错误时不要用 --force-all 硬装,缺依赖的后端程序装完也起不来,排错成本更高。
这里再补一个判断技巧:装完包后用 dpkg -L 看包内文件列表,确认 PPD 实际落在哪个目录。有的包装到 /opt/canon/ 下,CUPS 默认不扫描这个路径,需要手动把 PPD 链接到 model 目录。这属于最隐蔽的一类安装失败,日志里不会有任何报错。
3.2 RPM 系与 tar.gz:手动把 PPD 放进 model 目录
RPM 系发行版里,佳能官方有时只给 tar.gz 源包,里面是一堆 .rpm 文件加一个 install.sh。这种安装脚本我基本不直接跑,风险在于它可能往 /usr/lib64 里塞 32 位库,引发依赖混乱。更稳妥的做法是把 PPD 文件手动拷到 CUPS 的 model 目录,再重建 PPD 缓存:
sudo cp -r cn_pd /usr/share/cups/model/canon/ # 拷贝 PPD 到 model 目录 sudo systemctl restart cups # 刷新 PPD 缓存 sudo lpinfo -m | grep -i canon # 验证型号列表这里有个细节:CUPS 对 PPD 目录有缓存机制,直接拷文件后不重启 cups 服务的话,lpinfo -m 可能查不到新 PPD。重启服务这个动作不是形式主义,是在刷新驱动列表缓存。
提示:PPD 目录缓存的刷新依赖 cups 服务重启,拷完文件不重启就急着查列表,结果一定是空的。
RPM 包也可以直接用 rpm -ivh 安装,装完同样检查 /usr/share/cups/model/ 下有没有生成 PPD。部分发行版出于安全策略把 cups 的读取目录限定得很死,此时把 PPD 放进 /usr/local/share/cups/model/ 并在 cupsd.conf 里确认 Include 路径更保险。
3.3 lpadmin 建队列:URI 与驱动绑在一起
驱动就绪后,建队列这一步决定成败。用 lpadmin 建队列时,-v 参数指定设备 URI,-P 参数指定 PPD 文件路径或型号名,-E 参数激活队列。USB 直连的机器 URI 一般是 usb://Canon/XXXX,网络机器是 socket://ip:9100 或 ipp://ip/ipp/print:
# -p 队列名,-P PPD 路径,-v 设备 URI,-E 启用队列 sudo lpadmin -p canon_lbp -P /usr/share/cups/model/canon/xxx.ppd -v usb://Canon/series -E sudo lpadmin -p canon_ir -P /usr/share/cups/model/canon/xxx.ppd -v socket://192.168.1.20:9100 -E lpstat -v # 核验队列和 URI参数说明:-p 后面跟队列名,-P 是 PPD 完整路径,-v 是设备 URI,-E 表示建完立即启用。lpstat -v 用于核验队列是否建立成功,输出里能看到每个队列实际绑定的 URI。
我习惯把打印机 IP 固定下来再建队列,DHCP 分配的 IP 会导致重启后 URI 失效,这是网络打印最常见的坑。另外建队列时如果系统里已经有一个同名队列,lpadmin 会直接复用并覆盖配置,所以同名队列务必先 lpadmin -x 删除再重建。
4. 佳能 CUPS 驱动避坑:五个高频翻车现场
这一章列的是我在多台机器上实际踩过的坑,每一条都按现象、原因、解决三个层次展开,照顺序排查能省掉大量试错时间。
4.1 队列建好但任务卡在 pending
现象:用 lp 提交打印任务后,lpstat -o 里任务永远停在 pending 状态,打印机面板没有任何动作。这个状态最容易误导人,队列看起来正常,任务也排上了,就是不走。
原因:CUPS 调用后端程序时执行权限不对,或者 URI 里的设备地址已失效。佳能后端程序装在 /usr/lib/cups/backend 下时,如果文件不是 root 所有或没有执行位,CUPS 会静默跳过它,不报任何错误,表现就是任务永远 pending。
解决:检查后端目录权限并手动执行后端程序。佳能后端一般支持 --help 参数,能跑起来就说明依赖没问题:
ls -l /usr/lib/cups/backend/canon* # 检查后端权限 sudo chmod 755 /usr/lib/cups/backend/canon* # 修复执行位 sudo -u lp /usr/lib/cups/backend/canon* --help # 用 lp 用户身份测试后端第三行用 sudo -u lp 切到 CUPS 的运行用户执行,能同时暴露权限和共享库问题。如果提示找不到共享库,说明 32 位依赖没装齐,按发行版架构补装。任务卡 pending 还有一个隐藏原因:队列被 disable 了,lpstat -p 输出里能看到 disabled 状态,执行 cupsenable 队列名 恢复即可。
4.2 驱动装完但 PPD 搜不到
现象:驱动包装完,系统设置里添加打印机时型号列表为空,或者 lpinfo -m 查不到任何佳能型号。很多人在这一步就放弃,以为驱动不支持当前系统。
原因:PPD 没进 CUPS 的 model 目录,或者进了但 cups 服务没有重启,缓存没刷新。老版本 CUPS 对 model 目录的子目录递归扫描支持不全,放在深层子目录里的 PPD 会被忽略。
解决:先把 PPD 拷到 /usr/share/cups/model/ 顶层目录,再重启 cups 服务,最后用 lpinfo -m 验证。三步做完仍然查不到,就检查 PPD 文件首行格式,必须是以 *PPD-Adobe 开头的合法文件。我遇到过驱动包传输过程被截断、PPD 内容不完整导致 CUPS 拒绝加载的案例,用 head -1 看文件头就能判断。
4.3 USB 权限在容器环境下丢失
现象:容器环境或沙箱环境里 CUPS 能正常启动,但 USB 后端报 No device found,打印机明明插在宿主机上。第一次遇到时很容易误判成驱动损坏。
原因:CUPS 在容器里看不到宿主的 /dev/bus/usb 设备节点,或者节点权限只对 root 开放,而 cups 的 lp 用户无权限访问。容器和宿主之间隔着一层命名空间,设备节点不会自动映射进去。
解决:宿主机上把 lp 用户加入对应设备组的访问列表,容器模式启动时加 --device 参数映射 USB 设备节点。如果设备节点在热插拔后变化,用 udev 规则固定设备名更省心。检查设备节点权限用 ls -l /dev/bus/usb/xxx/yyy,看到的组权限位就是 CUPS 能否访问的关键。
4.4 网络打印机休眠后脱机
现象:队列显示 idle,但打印任务发送后超时,打印机面板进入睡眠后无法被唤醒。这类问题经常出现在上班第一单打印,任务丢得莫名其妙。
原因:佳能网络机休眠时会关闭 9100 端口的响应,CUPS 的 socket 后端默认超时时间太短,等不到设备从休眠中唤醒就把任务判定为失败。
解决:把 URI 从 socket:// 换成 ipp://,IPP 协议的唤醒机制比裸 socket 更可靠;同时到打印机管理页关闭节能模式,或设置定时唤醒。网络环境有 VLAN 隔离时,还要确认 CUPS 服务器和打印机在同一广播域内。排查时先用 ping 探活,再用 nc 测 9100 端口,两个都通才能排除网络层问题。
提示:打印机管理页里的节能模式默认开启,办公场景建议直接关闭,比调 CUPS 超时参数省心。
4.5 双面、色彩选项莫名消失
现象:队列能正常打印,但打印对话框里找不到双面、色彩模式这些硬件功能选项,看起来像驱动装了个简化版。
原因:选错了 PPD。同一个机型佳能可能提供 UFR II 和 PCL 两套 PPD,PCL 版对双面、色彩管理等硬件特性描述不全,导致 CUPS 没暴露对应选项。
解决:用 lpoptions -p 队列名 -l 查看当前队列实际暴露的参数,缺哪个功能就换成对应 PPD 重建队列。重建后用 lpadmin 重新绑定 PPD,再验证一次选项列表。双面在 PPD 里常见的键名是 Duplex 或 sides,色彩模式是 ColorModel,这三个键名在 -l 输出里都不出现的话,基本可以断定 PPD 选错了。
5. 验证驱动是否真正生效:lpstat、日志与测试页三重核验
5.1 用 lpstat 和 lpoptions 逐项核验
驱动装完不是跑通一次打印就算成功,我习惯按固定顺序检查。lpstat -p 看队列状态,lpstat -v 看后端 URI,lpoptions -p 队列名 -l 看驱动暴露的参数项。三者对齐才能确认驱动真正接管了打印机。
lpstat -p -d # 队列状态和默认队列 lpstat -v # 每个队列绑定的 URI lpoptions -p canon_lbp -l | head -20 # PPD 暴露的参数列表这段输出的意义:第一行确认队列启用和默认队列,第二行确认 CUPS 实际连接的地址是不是我设置的 URI,第三行看 PPD 里有哪些可调参数。如果 -l 输出为空或只有两三项,说明 PPD 没有正确匹配机型。
队列建好后,CUPS 会把 PPD 复制到 /etc/cups/ppd/ 目录下,文件名和队列名一致。直接查看这个文件里 *Default 开头的行,能看到当前默认值的真实来源,比在打印对话框里翻设置更接近底层。另外确认驱动版本可以看包管理器信息,dpkg -l | grep -i canon 或 rpm -qa | grep -i canon,版本号对比官网发布页就能判断当前驱动是否过旧。
验证时我会顺手打一张测试页,用 lp 直接提交一个文本文件,绕过应用层的打印对话框,这样能确认 CUPS 到打印机的链路是通的:
lp -d canon_lbp /etc/hostname # 提交测试任务 lpstat -o # 查看任务状态lp 提交后 lpstat -o 能看到任务状态从 pending 变 processing 再到 completed。任务长时间停在 processing 说明过滤器链在执行但后端通信卡住,结合下一节的日志定位。提交多个文件时,lp 后面可以直接跟多个路径,队列会按顺序排。
5.2 从 error_log 反推驱动问题
当打印失败时,/var/log/cups/error_log 是排错第一现场。默认日志级别是 warn,信息太少,我一般把级别临时调到 debug 再复现一次:
sudo cupsctl LogLevel=debug # 打开调试日志 lp -d canon_lbp /etc/hostname # 提交测试任务复现问题 tail -100 /var/log/cups/error_log sudo cupsctl LogLevel=warn # 恢复默认日志级别调试日志里常见的几类关键词和对应关系如下表:
| 日志关键词 | 问题指向 | 优先处理动作 |
|---|---|---|
| filter failed | PPD 指定的过滤器链执行失败 | 检查 PPD 里 filter 路径与依赖 |
| backend not found | 后端程序缺失或 URI 路径错误 | 检查 backend 目录权限和 URI |
| file permissions | lp 用户无访问权限 | 检查设备节点和临时目录权限 |
| Unable to open PPD | PPD 损坏或格式非法 | 重新拷贝 PPD 并重启 cups |
日志文件路径在不同发行版略有差异,多数在 /var/log/cups/error_log,用 journald 的发行版则通过 journalctl -u cups 查看。两套方式指向同一份输出,按系统习惯选一套即可。如果 error_log 里出现 ssl 或 tls 关键词,多半是打印机端证书过期,而不是驱动问题,别在驱动上浪费时间。
每次抓完日志,我会在队列里连续打三张不同的测试内容:纯文本、PDF、图片各一份。纯文本能过而 PDF 卡住,多半是过滤链里缺 poppler 或 ghostscript 这类转换组件;图片卡住则是 CUPS 的 image 过滤器问题。按介质类型区分排查,比闷头看日志快得多。
6. 把驱动调到顺手:PPD 定制与升级维护习惯
6.1 用 lpoptions 固化默认设置
队列建好以后,打印对话框里的默认值不一定是团队想要的。我一般用 lpoptions 把纸张、双面和分辨率直接写进队列,这样所有人提交任务时免去每次手动选:
# 写入队列默认值 lpoptions -p canon_lbp -o PageSize=A4 -o sides=two-sided-long-edge -o Resolution=600dpi # 复核选项是否生效 lpoptions -p canon_lbp -l | grep -E "PageSize|sides|Resolution"第一行写入队列默认值,第二行复核。注意这里的选项键名必须和 PPD 里声明的一致,不同驱动对双面的命名可能是 Duplex 而不是 sides,不确定时先跑一次 -l 看键名,再把对应键写进命令。
6.2 驱动升级时保留配置
佳能驱动升级偶尔会覆盖 PPD 或重置队列配置。我现在的习惯是升级前先把配置备份:printers.conf、PPD 目录和 lpoptions 输出各存一份。升级后对比这两份文件,差异一目了然,不用靠记忆恢复配置。
# 备份 PPD 目录、队列定义和队列参数 sudo cp -r /etc/cups/ppd ~/cups-backup-$(date +%F) sudo cp /etc/cups/printers.conf ~/cups-backup-$(date +%F) lpoptions -p canon_lbp -l > ~/cups-backup-$(date +%F)/options.txt三条命令把 PPD 目录、队列定义和队列参数分别落盘,日期后缀方便保留多份历史。升级后如果队列消失,用备份的 printers.conf 覆盖回去再重启 cups;如果只是选项丢失,把 options.txt 里的键值重新灌回 lpoptions 即可。
从那以后,我每次给办公区的打印机做驱动升级,都强制先走一遍这三条备份命令,再执行安装脚本。这个习惯救过我好几次,有一次升级后整个队列直接消失,全靠备份的 printers.conf 在五分钟内恢复。希望帮到你。
本文还有配套的精品资源,点击获取