
HP P1008 这机器放在今天看确实是老古董了但它的保有量实在太大——当年出货量巨大很多小公司、工作室、甚至个人家里都还留着一台在服役。问题在于这台机器官方从来没有提供过 Linux 驱动插上 USB 之后系统能识别到设备但就是打不出东西CUPS 里加进去也是各种报错。我前前后后在不同发行版上折腾过好几回最近一次是在一台国产 Linux 上重新装了一遍把过程完整记录了下来。这篇内容就是把这套流程从头到尾讲清楚包括驱动原理、安装步骤、参数选择、踩过的坑以及遇到问题怎么排查。适合手里有这台机器、又想在 Linux 下正常使用的朋友参考不管你是刚接触 Linux 的新手还是已经用了几年想省点事的老用户都能直接照着做。1. 先搞清楚这台机器为什么在 Linux 下这么难搞1.1 HP P1008 的驱动困境到底出在哪HP P1008 属于 HP 的 LaserJet P1000 系列这个系列包括 P1005、P1006、P1007、P1008 等几个型号。它们有一个共同特点属于所谓的 GDI 打印机也叫宿主型打印机Host-based Printer。这类打印机的核心逻辑是——打印机本身不带完整的页面描述语言解析能力它把大部分渲染工作交给电脑上的驱动程序来完成驱动把页面渲染成点阵位图之后再通过 USB 传给打印机打印机只负责把位图打到纸上。这就带来一个直接后果没有驱动打印机就是一块砖。不像 PostScript 打印机或者 PCL 打印机那些机器本身能理解标准页面描述语言Linux 下用通用驱动就能凑合打。P1008 不行它必须有一个能把页面转成它认识的位图格式的驱动。HP 官方对这台机器的 Linux 支持态度很明确——不提供。官网上能找到的驱动只有 Windows 和 macOS 版本Linux 那一栏是空的。HP 自己的 HPLIP 项目虽然支持了大量 HP 打印机但 P1000 系列里只有部分型号被覆盖P1008 恰好不在官方支持列表里。你如果去装 HPLIP会发现它根本认不出这台机器或者认出来了也找不到匹配的驱动。那怎么办社区里早就有人解决了这个问题方案就是foo2zjs。1.2 foo2zjs 是什么为什么它能救这台机器foo2zjs 是一个开源项目专门针对一类使用 ZJSZenographics JetStream页面描述语言的打印机。这个项目最早是为了支持 Minolta、HP、Samsung 等品牌的一批 GDI 打印机而开发的。它的核心思路是在电脑端实现一个完整的渲染管线把页面内容转成打印机固件能接受的 ZJS 位图流然后通过 USB 发过去。foo2zjs 项目里包含了好几个工具针对不同打印机系列foo2zjs用于 ZJS 语言的打印机HP P1005/P1006/P1007/P1008 就在这个范畴foo2hp用于 HP 的另一种格式foo2lava用于 Lava 格式foo2qpdl用于 QPDL 格式foo2slx用于 SLX 格式foo2xqx用于 XQX 格式对 P1008 来说用的就是foo2zjs这个工具。它会把 CUPS 传过来的页面数据通常是 PDF 或 PostScript先转成位图再编码成 ZJS 流最后通过 USB 送到打印机。这里有个关键点需要理解foo2zjs 不是一个传统意义上的驱动。它更像是一个转换器加传输工具的组合。CUPS 负责接收打印任务、管理队列foo2zjs 负责把任务内容转成打印机认识的格式并送出去。所以安装 foo2zjs 之后你还需要在 CUPS 里配置一个对应的打印机条目把 foo2zjs 挂上去。1.3 为什么不用其他方案有人可能会想能不能用通用的 PostScript 或者 PCL 驱动凑合答案是基本不行。P1008 的固件只认 ZJS 格式的数据流你给它发 PostScript它要么直接忽略要么打出乱码。我试过用 generic PostScript 驱动强行配置结果就是打印机指示灯闪烁但不出纸CUPS 任务显示完成但实际什么都没发生。也有人尝试用 Windows 驱动配合某种转发方案但那套东西在 Linux 下配置起来极其繁琐而且稳定性很差不值得折腾。foo2zjs 是社区验证过最成熟的方案也是目前唯一靠谱的选择。还有一个常见误区有人以为装了 HPLIP 就能解决。HPLIP 确实支持很多 HP 打印机但它对 P1000 系列的支持是残缺的。你装完 HPLIP 跑hp-setup它可能会检测到 USB 设备但到了选择驱动那一步就会发现没有匹配项。所以 HPLIP 在这台机器上基本帮不上忙可以直接跳过。2. 安装前的准备工作与依赖梳理2.1 确认系统环境和打印机连接状态在动手之前先把基础环境确认清楚。我这次测试用的是一台装了国产 Linux 的机器内核版本 5.10桌面环境是 UKUI。不同发行版的具体命令会有差异但整体思路一致。第一步把打印机通过 USB 线连上电脑开机。然后在终端里执行lsusb你应该能在输出里看到类似这样的一行Bus 001 Device 004: ID 03f0:4817 HP, Inc LaserJet P1008这里的03f0是 HP 的厂商 ID4817是 P1008 的产品 ID。如果你看到的是别的数字比如4817变成了其他值那可能是固件版本不同但一般不影响。关键是能识别到 HP 的设备。如果lsusb里完全看不到 HP 相关的条目那说明 USB 层面就没通。这时候要检查USB 线是不是好的有些线只能充电不能传数据、打印机是不是处于就绪状态不是休眠或错误状态、换个 USB 口试试。这一步不通后面全都白搭。接着确认 CUPS 是否已经安装并运行systemctl status cups如果显示active (running)说明 CUPS 服务正常。如果没有安装先装上# Debian/Ubuntu 系 sudo apt install cups # RedHat/Fedora 系 sudo dnf install cups # Arch 系 sudo pacman -S cups装完之后启动并设置开机自启sudo systemctl enable --now cups2.2 安装编译工具和依赖库foo2zjs 需要从源码编译所以得先把编译环境准备好。不同发行版包名不一样我列一下常见的# Debian/Ubuntu 系 sudo apt install build-essential git wget cups libcups2-dev libjbig-dev # RedHat/Fedora 系 sudo dnf install gcc make git wget cups-devel libjbig-devel # Arch 系 sudo pacman -S base-devel git wget cups libjbig这里解释一下几个关键依赖的作用build-essential / base-devel提供 gcc、make 等编译工具没有这个没法编译源码libcups2-dev / cups-develCUPS 的开发头文件foo2zjs 需要链接 CUPS 的库libjbig-dev / libjbig-develJBIG 压缩库foo2zjs 用它来压缩位图数据减小传输量git用来克隆源码仓库wget用来下载打印机固件文件注意有些发行版把开发包和运行时包分开命名比如 Debian 系是libcups2-dev而运行时是libcups2。装开发包的时候会自动带上运行时包所以不用单独装。如果你的系统里已经有这些工具可以跳过。不确定的话直接跑一遍安装命令包管理器会自动处理已安装的情况。2.3 获取 foo2zjs 源码foo2zjs 的官方仓库在 GitHub 上直接克隆下来git clone https://github.com/koenkooi/foo2zjs.git cd foo2zjs这里说明一下foo2zjs 有几个不同的仓库镜像我用的这个是社区维护比较活跃的一个。克隆下来之后你会看到目录里有一堆文件核心的是foo2zjs.c、foo2zjs-wrapper、Makefile等。如果你网络环境不方便用 git也可以直接下载压缩包wget https://github.com/koenkooi/foo2zjs/archive/refs/heads/master.zip unzip master.zip cd foo2zjs-master两种方式效果一样看哪个方便用哪个。3. 编译安装 foo2zjs 并配置打印机3.1 编译前的固件准备这是整个流程里最关键、也最容易出错的一步。P1008 这台打印机在每次上电之后需要先往它里面加载一段固件firmware它才能正常工作。这段固件原本是包含在 Windows 驱动里的Linux 下需要单独获取。foo2zjs 项目提供了一个脚本getweb来下载固件但说实话这个脚本经常因为网络问题失败。我试过好几次成功率不高。所以更稳妥的做法是手动获取固件文件。P1008 需要的固件文件叫sihpP1008.dl。这个文件可以从几个途径拿到从 Windows 驱动的安装目录里提取如果你有 Windows 机器或者驱动安装包从 foo2zjs 项目的一些镜像站点下载从一些 Linux 发行版的软件仓库里找部分发行版打包了这些固件我这次是从一个镜像站点拿到的。拿到之后把文件放到 foo2zjs 源码目录下cp sihpP1008.dl /path/to/foo2zjs/然后确认文件存在且大小合理ls -lh sihpP1008.dl正常的话这个文件大小在 200KB 到 500KB 之间。如果只有几 KB那说明下载不完整得重新弄。提示固件文件是打印机厂商的版权内容foo2zjs 项目本身不直接分发这些文件而是提供下载脚本。你自己获取的时候注意来源可靠性文件损坏会导致打印机无法正常工作。3.2 编译与安装固件准备好之后就可以编译了。在 foo2zjs 源码目录下执行make编译过程一般很快几十秒到一两分钟。如果报错通常是缺依赖回头检查 2.2 节里列的包是不是都装齐了。编译成功后安装sudo make install这个命令会做几件事把编译出来的foo2zjs等可执行文件复制到/usr/local/bin/把 PPD 文件打印机描述文件复制到/usr/share/cups/model/把固件加载工具usb_printerid等复制到合适位置安装 udev 规则让打印机插上时自动加载固件安装完成后还需要单独安装固件sudo make install-hotplug这一步会把固件文件复制到/usr/share/foo2zjs/firmware/目录并配置 udev 规则使得打印机每次插上 USB 时自动把固件推送到打印机。如果你用的是较新的 systemd 系统可能还需要sudo make cups这个命令会重启 CUPS 服务让新安装的 PPD 文件生效。3.3 验证固件加载是否成功固件加载这一步如果没成功后面打印一定失败。所以装完之后先验证一下。把打印机 USB 拔掉再插上然后执行sudo usb_printerid /dev/usb/lp0如果输出里包含FWVER或者类似固件版本信息说明固件加载成功了。如果报错说设备不存在或者无法识别那可能是设备节点不对先确认ls /dev/usb/看看有没有lp0或者类似的设备节点。如果没有可能是 USB 打印机模块没加载sudo modprobe usblp加载后再看。有些新内核默认不加载usblp模块需要手动加一下或者把它加到/etc/modules里让它开机自动加载。另一个验证方法是看内核日志dmesg | tail -20插拔打印机的时候日志里应该能看到 USB 设备识别和固件加载相关的信息。如果看到usblp相关的错误那就要针对性排查。4. 在 CUPS 里添加打印机并测试4.1 通过 Web 界面添加打印机CUPS 自带一个 Web 管理界面默认监听在localhost:631。打开浏览器访问http://localhost:631进去之后点 Administration 标签然后点 Add Printer。系统会要求输入用户名和密码用你的系统账号就行需要是管理员组或者有 sudo 权限的账号。接下来几步选择连接方式在 Local Printers 里应该能看到 HP LaserJet P1008 (HP LaserJet P1008) 这样的条目选中它。如果看不到说明 USB 层面或者 CUPS 后端有问题回头检查前面的步骤。填写打印机信息Name 随便填比如HP_P1008Description 和 Location 可填可不填。选择驱动这一步最关键。在 Make 列表里找到 HP然后在 Model 列表里找到 HP LaserJet P1008 Foomatic/foo2zjs (en)。注意一定要选带foo2zjs字样的那个不要选成别的。设置默认选项纸张大小选 A4分辨率一般选 600x600 dpi 就行。P1008 最高支持 600x600 dpi选更高的也没用。点 Add Printer 完成添加。添加完成后CUPS 会显示打印机状态。如果显示 Idle 或者 Processing说明配置基本正常。4.2 命令行方式添加备用方案如果 Web 界面不方便用或者你想脚本化部署可以用命令行添加。先找到打印机的 URIlpinfo -v输出里应该能看到类似direct usb://HP/LaserJet%20P1008?serialXXXXXX记下这个 URI然后用lpadmin添加sudo lpadmin -p HP_P1008 -E -v usb://HP/LaserJet%20P1008?serialXXXXXX -m drv:///foo2zjs.drv/HP-LaserJet-P1008.ppd这里的-m参数指定 PPD 文件。如果drv:///这种方式不工作可以直接指定 PPD 文件路径sudo lpadmin -p HP_P1008 -E -v usb://HP/LaserJet%20P1008?serialXXXXXX -P /usr/share/cups/model/HP-LaserJet-P1008.ppd添加完成后设置默认打印机lpadmin -d HP_P1008然后启用并接受任务sudo cupsenable HP_P1008 sudo cupsaccept HP_P10084.3 打印测试页配置完成后先打一张测试页验证lp -d HP_P1008 /usr/share/cups/data/testprint或者直接打印一个文本文件echo Hello, HP P1008 on Linux | lp -d HP_P1008观察打印机反应。正常情况下打印机会先响一下加载固件然后开始进纸打印。如果等了几秒没反应检查 CUPS 任务状态lpstat -o看看任务是不是卡在队列里。如果任务显示 completed 但打印机没动那多半是固件没加载成功或者 foo2zjs 转换环节出了问题。5. 常见问题排查与避坑经验5.1 打印机识别不到怎么办这是最常见的问题。表现是lsusb能看到设备但 CUPS 里添加打印机时找不到或者lpinfo -v里没有 USB 打印机条目。排查思路按顺序来第一确认usblp模块加载了lsmod | grep usblp如果没有输出手动加载sudo modprobe usblp然后重启 CUPSsudo systemctl restart cups第二检查设备权限。CUPS 运行在lp用户下需要能访问 USB 设备。看看设备节点权限ls -l /dev/usb/lp0正常应该是crw-rw---- 1 root lp。如果组不对可以加个 udev 规则。不过一般装完 foo2zjs 之后 udev 规则会自动处理好。第三确认没有其他进程占用设备。有时候 HPLIP 的后台进程会抢占 USB 设备导致 CUPS 无法访问。检查一下ps aux | grep hp如果有hp相关的进程在跑先停掉sudo systemctl stop hplip sudo systemctl disable hplip然后再试。5.2 打印出来是乱码或者空白页这种情况通常是驱动选错了或者 foo2zjs 转换环节有问题。先确认 PPD 文件选对了。在 CUPS Web 界面里进打印机设置看 Make and Model 是不是HP LaserJet P1008 Foomatic/foo2zjs。如果选成了别的删掉重新添加。如果 PPD 没问题那可能是固件版本不匹配。不同批次的 P1008 可能固件略有差异试试换一个版本的sihpP1008.dl文件。我遇到过一台机器用某个固件打出来是空白换了个固件文件就正常了。还有一种可能是分辨率设置过高。P1008 的内存有限如果设成 1200 dpi虽然它标称不支持但有些 PPD 里可能有这个选项会导致数据量过大打印机处理不过来打出空白或者半页。把分辨率降到 600x600 再试。5.3 打印任务卡在队列里不动任务提交后一直显示 processing 但打印机没反应这种情况多半是 USB 通信出了问题。先看 CUPS 错误日志sudo tail -f /var/log/cups/error_log提交一个打印任务观察日志输出。常见的错误信息有usb_print: could not writeUSB 写入失败通常是设备被占用或者线缆问题foo2zjs: invalid argument转换参数有问题检查 PPD 配置Unable to open device设备节点权限问题如果是 USB 写入失败试试换根 USB 线或者换个 USB 口。有些老机器对 USB 2.0 和 3.0 口的兼容性不一样换到 USB 2.0 口可能就好了。另外如果系统里同时装了 HPLIP 和 foo2zjs两者可能会冲突。建议把 HPLIP 相关服务停掉只用 foo2zjs。5.4 每次开机都要重新配置正常情况下装完 foo2zjs 并配置好 udev 规则后打印机应该每次插上都能自动加载固件。如果每次重启后都要手动折腾检查几个地方udev 规则是否安装ls /etc/udev/rules.d/ | grep -i foo应该能看到类似11-hpijs.rules或者foo2zjs.rules的文件。如果没有回到源码目录重新执行sudo make install-hotplug。固件文件是否在正确位置ls /usr/share/foo2zjs/firmware/应该能看到sihpP1008.dl。如果没有手动复制过去sudo cp sihpP1008.dl /usr/share/foo2zjs/firmware/CUPS 服务是否开机自启systemctl is-enabled cups如果不是enabled设置一下sudo systemctl enable cups5.5 常见问题速查表问题现象可能原因解决方法CUPS 里找不到打印机usblp 模块未加载sudo modprobe usblp并重启 CUPS打印空白页固件未加载或版本不匹配检查固件文件重新安装 hotplug打印乱码PPD 选错重新添加打印机选 foo2zjs 驱动任务卡住不动USB 通信失败换线、换口、检查设备权限重启后失效udev 规则或服务未自启重新安装 hotplug启用 CUPS 自启提示设备被占用HPLIP 进程冲突停用 HPLIP 相关服务6. 一些实操心得和后续使用建议6.1 关于固件获取的实操经验固件文件是这套方案里最脆弱的一环。foo2zjs 项目本身不直接分发固件因为版权问题它只提供下载脚本。但那些下载源经常失效尤其是国内网络环境下成功率很低。我的做法是提前把固件文件备份好。一旦成功获取到sihpP1008.dl就把它存到一个安全的地方比如自己的网盘或者本地备份目录。以后换系统、重装机器直接拿过来用不用再折腾下载。另外如果你手头有 Windows 机器从 HP 官方驱动安装包里提取固件是最可靠的途径。HP 的驱动安装包本质上是个自解压文件用解压工具打开在里面找.dl后缀的文件一般就是固件。P1008 的驱动包里通常包含sihpP1008.dl这个文件。6.2 打印质量与速度的取舍P1008 是台老机器打印速度不快标称 16 页每分钟实际用下来大概 10 到 12 页。在 Linux 下通过 foo2zjs 驱动速度基本和 Windows 下持平没有明显差异。打印质量方面600x600 dpi 是它的原生分辨率打文档完全够用。如果你需要打图片效果一般毕竟是黑白激光而且分辨率有限。建议在打印图片时先在图像处理软件里把图片转成灰度调整好对比度再打印效果会好一些。有个小技巧在 CUPS 里把打印质量设成 Draft 模式可以明显提升速度耗材也更省。日常打文档用 Draft 模式完全够看只有打正式文件时才需要切到 Normal 或 High。6.3 共享打印的注意事项如果你想让局域网里其他机器也能用这台打印机可以在 CUPS 里开启共享。在 Web 界面的 Administration 里勾选 Share printers connected to this system然后保存。不过要注意共享打印涉及到网络配置和权限管理如果是在公司环境里建议先和网络管理员确认一下避免和现有打印服务器冲突。另外共享打印时其他机器需要安装对应的驱动Windows 机器可以用 HP 官方驱动Linux 机器同样需要 foo2zjs。如果共享打印出现问题比如其他机器连不上或者提示凭证错误先检查 CUPS 的监听地址sudo nano /etc/cups/cupsd.conf确认Listen那一行不是只监听localhost而是监听所有接口或者局域网 IP。改完之后重启 CUPS 生效。6.4 长期使用的维护建议这台机器在 Linux 下跑起来之后日常使用基本没什么问题。但有几个地方需要留意内核升级后检查 usblp 模块。有些新内核默认不编译usblp或者把它改成了可选模块。升级内核后如果打印机突然不工作了先检查这个模块。CUPS 升级后检查 PPD 兼容性。CUPS 大版本升级有时会改变 PPD 的处理方式导致旧 PPD 失效。如果升级后打印异常重新安装一遍 foo2zjs 通常能解决。定期清理打印队列。如果经常打印失败队列里会堆积很多残留任务影响新任务的处理。用这个命令清理cancel -a HP_P1008保持固件文件备份。前面说过了这个再强调一遍因为真的太重要了。我见过太多人因为固件文件丢失不得不重新折腾一遍下载流程。最后说一个我自己的习惯每次在新系统上配置这台打印机我都会把整个流程记一遍包括用的命令、遇到的问题、解决方法。这样下次再装的时候直接翻记录就行不用重新踩坑。这套流程我已经在 Ubuntu、Debian、Fedora、Arch 和几个国产 Linux 上都验证过核心步骤完全一致差异只在包管理命令上。只要你理解了原理换什么发行版都能搞定。