ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux下HP LaserJet P1008驱动安装与CUPS配置实战

Linux下HP LaserJet P1008驱动安装与CUPS配置实战 1. 为什么一台老式打印机在Linux下值得折腾HP LaserJet P1008 是2008年前后上市的入门级黑白激光打印机鼓粉一体、结构简单、耗材便宜很多小办公室和家庭至今还在用。它的USB接口是标准的但问题出在固件和驱动上——惠普官方从来没有为这款机器提供过Linux驱动Windows下靠的是官方安装包macOS下靠的是系统内置的通用PCL驱动而Linux下如果直接插上USB线系统大概率能识别到一个HP LaserJet P1008设备但发送打印任务后毫无反应或者打印出一页空白。这个现象的根本原因在于P1008 属于所谓的GDI打印机也叫宿主型打印机它本身没有完整的页面描述语言解析能力打印任务需要由主机端把页面渲染成位图再通过USB以特定协议传给打印机。惠普在Windows下用官方驱动完成这个渲染工作在Linux下就需要一个替代方案。目前社区里最成熟的方案就是foo2zjs这个开源驱动包它专门支持一批基于 ZjStream 协议的惠普和柯尼卡美能达打印机P1008 正好在支持列表里。我这次折腾的起因很简单办公室一台闲置的 P1008Windows 电脑坏了手头只有一台装了 Ubuntu 的笔记本想把它利用起来。网上搜到的教程大多写于2015年前后有些步骤在2024年的发行版上已经跑不通了比如依赖包名字变了、systemd 的服务管理方式变了、有些镜像源里的包被移除了。所以我把自己从零到打印成功的过程完整记录下来包括中间踩的坑和排查思路给同样遇到这个问题的朋友一个可以直接抄的路径。这篇文章适合三类人一是手里有 P1008 或其他 ZjStream 协议打印机、想在 Linux 下用起来的普通用户二是想了解 Linux 打印子系统CUPS工作原理的运维新手三是喜欢折腾老硬件、不想为了打印一张纸去装 Windows 的极客。全文基于 Ubuntu 22.04 实测Debian 12 和 Linux Mint 21 的操作基本一致其他发行版我会在关键步骤里注明差异。2. 动手之前先搞清楚CUPS、foo2zjs 和固件三者的关系2.1 Linux 打印的通用架构CUPS 是总调度Linux 下所有打印任务都走CUPSCommon Unix Printing System。你可以把它理解成一个打印中介应用程序比如 LibreOffice、Firefox把文档交给 CUPSCUPS 根据目标打印机的驱动配置把文档转换成打印机认识的格式再通过 USB、网络或其他接口发出去。CUPS 本身不包含具体打印机的驱动它靠的是PPD 文件PostScript Printer Description来描述一台打印机的能力和转换规则。安装驱动的过程本质上就是把正确的 PPD 文件放到 CUPS 能找到的位置并让 CUPS 知道这台设备用这个 PPD。对于 P1008 这种 GDI 打印机PPD 文件里会指定一个过滤器filterCUPS 在打印时会调用这个过滤器把文档转成 ZjStream 位图流。foo2zjs 提供的正是这个过滤器加上对应的 PPD。2.2 foo2zjs 到底做了什么foo2zjs 是一个开源项目作者是 Rick Richardson项目里包含了一组针对 ZjStream 协议打印机的转换工具核心可执行文件叫foo2zjs。它的工作流程大致是CUPS 把待打印文档经过 Ghostscript 处理转成 PBM/PNG 等位图格式foo2zjs接收位图按照 ZjStream 协议编码成打印机固件能理解的指令流指令流通过 USB 发给打印机。这里有个关键点P1008 需要先加载固件才能工作。所谓固件firmware是一段由惠普提供的、在打印任务开始前上传到打印机内存里的二进制代码。打印机每次断电后内存清空下次打印前必须重新上传。Windows 驱动会自动做这件事Linux 下就需要我们手动或通过 udev 规则自动完成。foo2zjs 项目里包含了一个叫hplj1000的脚本也有叫hplj1005、hplj1020的变体专门负责在打印前把固件推送到 P1008。固件文件通常命名为sihpP1008.dl需要从打印机自带的 Windows 驱动包里提取或者从社区镜像获取。2.3 为什么不能直接装发行版仓库里的 foo2zjsUbuntu 和 Debian 的官方仓库里确实有printer-driver-foo2zjs这个包但根据我这次的实测仓库版本存在两个问题一是版本偏旧对某些较新的内核和 CUPS 版本兼容性不佳二是仓库包默认不包含 P1008 的固件文件因为固件版权归惠普不能直接打包分发需要额外运行一个下载脚本而这个脚本依赖的下载地址有时会失效。所以我的建议是优先用仓库包快速跑通如果不行再从源码编译。下面两节分别讲这两条路径。3. 路线一用发行版仓库包快速部署15分钟方案3.1 安装前的环境确认在动手之前先把打印机插上USB线开机然后执行lsusb | grep -i hp正常应该看到类似这样的输出Bus 001 Device 005: ID 03f0:0024 HP, Inc LaserJet P100803f0:0024是 P1008 的 USB 厂商/产品 ID记下它后面排查问题时会用到。如果lsusb里看不到设备先换一根USB线、换一个USB口试试别急着怀疑驱动——物理连接问题占了这类故障的一半以上。接着确认 CUPS 是否已安装并运行systemctl status cups如果没有安装先装sudo apt update sudo apt install cups cups-client sudo systemctl enable --now cups把当前用户加入lpadmin组否则后面添加打印机时会被权限拦住sudo usermod -aG lpadmin $USER执行完这条命令需要注销重新登录才生效别跳过这一步我见过太多人卡在这里以为是驱动问题。3.2 安装 foo2zjs 驱动包sudo apt install printer-driver-foo2zjs安装完成后检查关键文件是否就位dpkg -L printer-driver-foo2zjs | grep -E foo2zjs$|P1008你应该能看到/usr/bin/foo2zjs这个可执行文件以及/usr/share/ppd/foo2zjs/目录下的一堆 PPD 文件。P1008 对应的 PPD 通常是HP-LaserJet_P1008.ppd.gz。3.3 获取并放置固件文件这是仓库方案里最容易失败的一步。先尝试官方提供的获取脚本sudo getweb 1008这个命令会尝试从惠普官网下载 P1008 的 Windows 驱动包解压后提取固件。如果网络通畅它会自动把sihpP1008.dl放到/usr/share/foo2zjs/firmware/目录下。如果getweb报错常见的是下载地址404或超时就需要手动处理。手动方案的思路是在任何一台能上网的机器上去惠普官网搜索HP LaserJet P1008 驱动下载 Windows 版驱动通常是个.exe自解压包用7z或cabextract解开在里面找到sihpP1008.dl这个文件拷贝到 Linux 机器的/usr/share/foo2zjs/firmware/下。验证固件是否到位ls -l /usr/share/foo2zjs/firmware/sihpP1008.dl文件大小应该在 200KB 到 300KB 之间。如果文件是0字节或者不存在后面打印必然失败。3.4 配置 udev 规则实现固件自动加载固件文件放好了但每次打印前还得手动上传太麻烦。foo2zjs 包里自带了一个 udev 规则模板我们把它启用sudo cp /usr/share/foo2zjs/udev/90-foo2zjs.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger这条规则的作用是当系统检测到 P1008 插入时自动调用hplj1000脚本把固件推送到打印机。推送完成后打印机的状态会从需要固件变成就绪。验证方法是拔掉USB线再插上然后执行dmesg | tail -20如果看到类似usblp 1-1:1.0: usblp0: USB Bidirectional printer dev 5 if 0 alt 0 proto 2 vid 0x03F0 pid 0x0024的信息说明设备被正确识别。再执行ls -l /dev/usb/lp0设备节点存在就说明底层通了。3.5 在 CUPS 里添加打印机打开浏览器访问http://localhost:631这是 CUPS 的 Web 管理界面。依次点击Administration→Add Printer系统会列出检测到的本地打印机选中HP LaserJet P1008 (USB)点 Continue在 Name 栏填一个好记的名字比如P1008Location 和 Description 可留空在 Make 列表里选HPContinue在 Model 列表里找到HP LaserJet P1008 Foomatic/foo2zjs选中Add Printer设置默认选项纸张大小 A4、分辨率 600dpi 等Set Default Options添加完成后在打印机列表里点进 P1008点Maintenance→Print Test Page。如果一切正常打印机会嗡嗡响几声吐出一张测试页。3.6 仓库方案失败时的典型症状与对策症状可能原因对策测试页任务显示已完成但打印机无反应固件未加载检查/usr/share/foo2zjs/firmware/sihpP1008.dl是否存在手动执行sudo hplj1000打印出空白页PPD 选错或过滤器未生效重新添加打印机确认 Model 选的是 foo2zjs 版本CUPS 里看不到 USB 打印机权限或 udev 问题检查用户是否在 lpadmin 组重新加载 udev 规则打印任务卡在正在处理CUPS 后端卡死sudo systemctl restart cups查看/var/log/cups/error_log4. 路线二源码编译 foo2zjs仓库包失效时的兜底4.1 什么时候需要走源码路线仓库包方案在 Ubuntu 22.04 上大部分情况能跑通但如果你遇到以下情况就得考虑源码编译发行版仓库里的 foo2zjs 版本太老PPD 文件与当前 CUPS 不兼容getweb脚本彻底失效仓库包里又没有固件你用的是比较小众的发行版比如某些国产 Linux 发行版仓库里根本没有这个包你想用最新版的 foo2zjs它对新硬件的支持更好。源码编译并不复杂核心就是make和make install两条命令但依赖项要装齐。4.2 安装编译依赖sudo apt install build-essential git ghostscript \ libcups2-dev cups-bsd cups-client \ foomatic-db foomatic-db-engine \ tix imagemagick这里几个包的作用需要说明一下libcups2-dev是编译时链接 CUPS 库用的foomatic-db和foomatic-db-engine提供 PPD 生成工具imagemagick用于处理图像格式转换tix是作者写的一个辅助工具依赖虽然不装也能编译但装了更省事。4.3 拉取源码并编译git clone https://github.com/OpenPrinting/foo2zjs.git cd foo2zjs makemake过程会编译出foo2zjs、foo2xqx、foo2hp等一系列可执行文件。如果报错大概率是缺依赖根据报错信息补装对应的-dev包即可。编译完成后先别急着make install先获取固件./getweb 1008源码版的getweb脚本通常比仓库版的新成功率更高。执行后检查firmware/目录下是否出现了sihpP1008.dl。4.4 安装并注册到系统sudo make install sudo make install-hotplug sudo make cups三条命令的分工是make install把可执行文件和 PPD 装到系统目录make install-hotplug安装 udev 规则make cups重启 CUPS 让它重新扫描驱动。安装完成后重复 3.5 节的 CUPS 添加打印机步骤。源码版安装的 PPD 通常位于/usr/share/cups/model/或/usr/share/ppd/在 CUPS 的 Model 列表里应该能看到 foo2zjs 相关的条目。4.5 源码方案的一个隐藏坑udev 规则冲突如果你之前装过仓库版的printer-driver-foo2zjs系统里可能同时存在两套 udev 规则导致固件被重复推送或推送失败。排查方法是ls /etc/udev/rules.d/ | grep foo ls /lib/udev/rules.d/ | grep foo如果两个目录下都有 foo2zjs 相关规则把旧的那套删掉只保留一套然后重新加载sudo udevadm control --reload-rules sudo udevadm trigger这个坑我踩过症状是打印机偶尔能打、偶尔不能打排查了半天才发现是规则冲突导致固件推送时序错乱。5. 打印成功之后日常维护和几个实用技巧5.1 打印机断电后第一次打印慢是正常的P1008 每次断电后第一次打印需要重新上传固件这个过程大概需要5到10秒。你会听到打印机内部有轻微的机械动作声然后才开始走纸。这不是故障是 GDI 打印机的固有特性。如果你觉得等待太久可以让打印机保持通电待机状态固件在内存里不会丢失。5.2 查看打印队列和取消卡住的任务命令行下管理打印任务比图形界面更快lpstat -p P1008 # 查看打印机状态 lpstat -o # 查看待打印任务队列 cancel P1008-15 # 取消编号为15的任务 cancel -a P1008 # 取消该打印机所有任务如果任务卡住取消不掉重启 CUPS 服务sudo systemctl restart cups5.3 调整默认打印质量省墨P1008 的默认分辨率是 600dpi打印普通文档足够。如果想省墨可以在 CUPS 的打印机设置里把Toner Save Mode打开或者把分辨率降到 300dpi。实测 300dpi 打印纯文字文档完全可读碳粉消耗明显降低。在 Web 界面里操作路径是Printers → P1008 → Administration → Set Default Options找到 Resolution 和 Toner Save 两项调整。5.4 共享给局域网其他设备如果想让同一网络下的其他电脑也能用这台打印机在 CUPS 里勾选Share This Printer然后确保 CUPS 监听所有网络接口sudo cupsctl --share-printers其他 Linux 机器通过http://打印服务器IP:631/printers/P1008添加即可。Windows 机器添加网络打印机时需要安装对应的 PPD 或使用通用 PostScript 驱动这部分涉及跨平台配置展开讲篇幅太长这里先记一笔。5.5 一个排查问题的万能入口error_logCUPS 的所有错误都会记录在/var/log/cups/error_log。打印失败时先看这个文件的最后几十行sudo tail -50 /var/log/cups/error_log常见的错误信息和对策Unable to open device file /dev/usb/lp0权限问题或设备节点不存在检查 udev 规则Filter failed过滤器执行失败通常是固件没加载或 PPD 不匹配Job canceled任务被取消可能是打印机离线或队列堵塞。把 error_log 的报错信息拿去搜索比盲目试错效率高得多。6. 我踩过的三个坑和对应的解决思路6.1 坑一getweb 下载固件超时第一次执行sudo getweb 1008时脚本卡在下载环节等了五分钟超时退出。原因是脚本里写死的惠普下载地址是几年前的惠普官网改版后旧链接失效了。解决思路是绕过 getweb手动获取固件。具体做法在一台 Windows 机器上访问惠普官网搜索 P1008 驱动下载那个大约 300MB 的 Windows 驱动包文件名类似LJP1000_P1008_Full_Solution.exe用 7-Zip 打开这个 exe7-Zip 能直接解压自解压包在里面找到sihpP1008.dl拷到 Linux 机器的/usr/share/foo2zjs/firmware/目录。这个文件只有 200 多KB用U盘拷过去就行。6.2 坑二udev 规则加载了但固件没推送规则文件放对了位置udevadm trigger也执行了但插拔USB后打印机还是没反应。排查发现是规则文件里的设备ID和实际的不匹配——规则里写的是03f0:0024但我的打印机实际是03f0:0024看起来一样问题出在规则文件的执行权限上。/etc/udev/rules.d/下的规则文件权限必须是644如果是从别处拷贝过来的权限可能是600或其他udev 会忽略它。执行sudo chmod 644 /etc/udev/rules.d/90-foo2zjs.rules sudo udevadm control --reload-rules改完权限再插拔一次固件就正常推送了。这个细节网上教程基本没人提但确实会卡住人。6.3 坑三CUPS 里添加打印机时 Model 列表为空在 CUPS Web 界面选完 Make 为 HP 之后Model 列表是空的没有任何 foo2zjs 相关选项。原因是 CUPS 没有扫描到 PPD 文件或者 PPD 文件权限不对。排查步骤ls -l /usr/share/ppd/foo2zjs/ | head如果目录不存在或为空说明 foo2zjs 的 PPD 没装上。重新执行sudo make install或重装仓库包。如果目录存在但 CUPS 看不到检查 PPD 文件权限sudo chmod 644 /usr/share/ppd/foo2zjs/*.ppd.gz sudo systemctl restart cups重启 CUPS 后刷新 Web 界面Model 列表里应该就能看到HP LaserJet P1008 Foomatic/foo2zjs了。7. 这套方案能扩展到哪些其他打印机foo2zjs 支持的不止 P1008 一款。根据项目文档它覆盖了惠普 LaserJet 1000/1005/1018/1020/1022/P1005/P1006/P1007/P1008/P1505 等一大批 ZjStream 机型以及部分柯尼卡美能达的页式打印机。判断一台打印机是否适用最直接的方法是看它的 USB 产品ID是否在 foo2zjs 的支持列表里或者去 OpenPrinting 数据库搜一下型号。如果你手里是其他品牌的 GDI 打印机思路是类似的找到对应的开源驱动项目比如三星的splix、兄弟的brlaser安装驱动、获取固件、配置 udev、在 CUPS 里添加。Linux 打印的这套架构是通用的学会一个型号其他型号的排查思路可以复用。最后说一句个人体会老打印机在 Linux 下能不能用七成取决于驱动生态三成取决于你愿不愿意花半小时折腾。P1008 因为有 foo2zjs 这个成熟项目属于值得折腾的那一类。我现在的用法是把它接在一台常年开机的迷你主机上通过 CUPS 共享给全家设备打印成本几乎为零比买新打印机划算得多。
返回列表