news 2026/9/25 1:04:34

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 正好在支持列表里。

我这次折腾的起因很简单:办公室一台闲置的 P1008,Windows 电脑坏了,手头只有一台装了 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 下所有打印任务都走CUPS(Common Unix Printing System)。你可以把它理解成一个"打印中介":应用程序(比如 LibreOffice、Firefox)把文档交给 CUPS,CUPS 根据目标打印机的驱动配置,把文档转换成打印机认识的格式,再通过 USB、网络或其他接口发出去。

CUPS 本身不包含具体打印机的驱动,它靠的是PPD 文件(PostScript Printer Description)来描述一台打印机的能力和转换规则。安装驱动的过程,本质上就是把正确的 PPD 文件放到 CUPS 能找到的位置,并让 CUPS 知道"这台设备用这个 PPD"。

对于 P1008 这种 GDI 打印机,PPD 文件里会指定一个"过滤器"(filter),CUPS 在打印时会调用这个过滤器把文档转成 ZjStream 位图流。foo2zjs 提供的正是这个过滤器加上对应的 PPD。

2.2 foo2zjs 到底做了什么

foo2zjs 是一个开源项目,作者是 Rick Richardson,项目里包含了一组针对 ZjStream 协议打印机的转换工具,核心可执行文件叫foo2zjs。它的工作流程大致是:

  1. CUPS 把待打印文档(经过 Ghostscript 处理)转成 PBM/PNG 等位图格式;
  2. foo2zjs接收位图,按照 ZjStream 协议编码成打印机固件能理解的指令流;
  3. 指令流通过 USB 发给打印机。

这里有个关键点:P1008 需要先加载固件才能工作。所谓"固件"(firmware),是一段由惠普提供的、在打印任务开始前上传到打印机内存里的二进制代码。打印机每次断电后内存清空,下次打印前必须重新上传。Windows 驱动会自动做这件事,Linux 下就需要我们手动或通过 udev 规则自动完成。

foo2zjs 项目里包含了一个叫hplj1000的脚本(也有叫hplj1005hplj1020的变体),专门负责在打印前把固件推送到 P1008。固件文件通常命名为sihpP1008.dl,需要从打印机自带的 Windows 驱动包里提取,或者从社区镜像获取。

2.3 为什么不能直接装发行版仓库里的 foo2zjs

Ubuntu 和 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 P1008

03f0: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自解压包),用7zcabextract解开,在里面找到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 管理界面。依次点击:

  1. AdministrationAdd Printer
  2. 系统会列出检测到的本地打印机,选中HP LaserJet P1008 (USB),点 Continue
  3. 在 Name 栏填一个好记的名字,比如P1008,Location 和 Description 可留空
  4. 在 Make 列表里选HP,Continue
  5. 在 Model 列表里找到HP LaserJet P1008 Foomatic/foo2zjs,选中,Add Printer
  6. 设置默认选项(纸张大小 A4、分辨率 600dpi 等),Set Default Options

添加完成后,在打印机列表里点进 P1008,点MaintenancePrint 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_log

4. 路线二:源码编译 foo2zjs(仓库包失效时的兜底)

4.1 什么时候需要走源码路线

仓库包方案在 Ubuntu 22.04 上大部分情况能跑通,但如果你遇到以下情况,就得考虑源码编译:

  • 发行版仓库里的 foo2zjs 版本太老,PPD 文件与当前 CUPS 不兼容;
  • getweb脚本彻底失效,仓库包里又没有固件;
  • 你用的是比较小众的发行版(比如某些国产 Linux 发行版),仓库里根本没有这个包;
  • 你想用最新版的 foo2zjs,它对新硬件的支持更好。

源码编译并不复杂,核心就是makemake 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-dbfoomatic-db-engine提供 PPD 生成工具;imagemagick用于处理图像格式转换;tix是作者写的一个辅助工具依赖,虽然不装也能编译,但装了更省事。

4.3 拉取源码并编译

git clone https://github.com/OpenPrinting/foo2zjs.git cd foo2zjs make

make过程会编译出foo2zjsfoo2xqxfoo2hp等一系列可执行文件。如果报错,大概率是缺依赖,根据报错信息补装对应的-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 cups

5.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_log

CUPS 的所有错误都会记录在/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 打开这个 exe(7-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 共享给全家设备,打印成本几乎为零,比买新打印机划算得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 1:03:30

智能车竞赛PCB设计避坑指南:嘉立创审核要点与层叠方案选择

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 1:01:58

STM32四足机器狗全栈开发:从运动控制到语音交互

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 1:01:49

京东JDS测评与校招全攻略:从笔试真题到Star面试的完整链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 1:01:49

PDFLIB 不只是生成库:用 pCOS 读取 PDF 元数据、页面尺寸与加密状态

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/25 1:01:48

2024数学建模国赛C题农作物种植策略:Python优化建模与求解全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华