简介:foo2zjs.tar.gz 是一份面向老式 HP 1020 等打印机的 Linux 驱动解决方案包,主要帮助使用者解决旧设备在现代操作系统下无法识别或无法正常输出打印任务的问题,也适合对 CUPS 打印服务、驱动编译和环境配置有一定基础的技术人员学习。压缩包共包含 471 个文件,包体大小为 8.54MB,其中以 XML 配置数据、PPD 打印机描述文件、C 语言源码、手册页和安装脚本为主,同时带有 makefile、readme、conf 配置文件及说明文档,文件类型清晰,便于按目录检索。对需要接入 CUPS 打印服务的场景,包内 PPD 和 conf 模块可直接支撑系统识别 HP 1020,并帮助完成打印队列设置与输出验证;源码和编译脚本则为进阶使用者提供了调整参数、重新打包的可能。当前已有 797 人浏览学习,适合正在维护旧打印机或希望借助实际案例熟悉 Linux 打印体系的技术人员与运维人员。
1. 一台“没有驱动”的老打印机,逼我翻出foo2zjs这个压缩包
1.1 事情是这样的:HP LaserJet 1020在Linux下的尴尬处境
前阵子帮朋友修一台老电脑,系统是Ubuntu,打印机是经典的HP LaserJet 1020。这台打印机在Windows下是插上就用的“老实人”,但在Linux下却是个刺头。官方驱动页面只给了Windows和Mac的安装包,点开全是.exe和.dmg,压根没有Linux的份儿。系统自带的打印机设置里倒是能识别出USB设备,但添加打印机时翻遍列表也找不到1020的驱动,手动指定PPD文件更是无从下手。
更坑的是,这台打印机用的是基于主机渲染(host-based)的打印方案,打印机本身没有完整的页面描述语言解释能力,必须靠电脑端的驱动把页面内容转换成打印机专用的数据格式再发过去。没有对应驱动,打印机就是一块“通电的砖头”。我当时搜遍论坛,看到一个回帖只扔了一个链接:foo2zjs.tar.gz,底下跟了一句“这个能救你”。说实话,光看文件名,鬼知道它是干嘛的。但死马当活马医,下载下来折腾了一下午,还真把这台老打印机救活了。后来我才搞清楚,foo2zjs就是专门解决这类问题的。
1.2 foo2zjs到底是个什么玩意,它凭什么解决这个问题
foo2zjs是一个开源打印机驱动项目,核心作用是把非PostScript的打印机数据格式转换成PCL、PostScript或Zebra等通用页面描述语言,再由配套的固件加载机制把打印任务推送给打印机。说直白点:很多老款HP喷墨打印机和Zebra标签打印机,官方只给Windows驱动,Linux下没有现成方案。foo2zjs通过两条腿走路解决这个痛点:
- 格式转换层:把Ghostscript渲染出来的光栅数据,按照每台打印机对应的协议封装成机器能识别的数据流。
- 固件加载层:很多老款打印机(尤其是HP LaserJet 1018、1020、1022这代)开机后需要从主机端上传一段固件才能开始工作,
foo2zjs自带的arm2html/getweb等工具能从官方源抓取固件文件(比如sihp1020.bin),在打印机初始化时把它推上去。
支持列表里覆盖了HP LaserJet 1018/1020/1022、P1005/P1006/P1007/P1008、M2727等一大批老机器,以及Zebra的多个标签打印机型号。如果你的打印机恰好在这张表里,那foo2zjs基本就是唯一靠谱的Linux方案了。
注意:
foo2zjs针对的是“主机渲染”型打印机,如果你的打印机本身就支持PCL或PostScript,那直接用系统自带驱动就行,不需要碰这个。判断方法很简单:看打印机内存是否极小(通常小于8MB),或者直接看Windows下安装的驱动是否特别巨大(100MB以上)。
文件名的.tar.gz后缀也顺便说清楚:它只是把一堆源码文件打包后用gzip压缩的产物,相当于Windows下的.zip。但Linux下不能双击解压了事,你得用命令行解开,然后按源码包的规矩编译安装。
2. 解压编译前的三个准备:别上来就make,先做这些
2.1 搞清楚你手上的tar.gz是源码包还是预编译包
很多人拿到foo2zjs.tar.gz,第一反应是解压、找可执行文件、运行,结果发现里面全是.c、.h、Makefile,当场懵掉。这个包是源码包,不是绿色软件,需要自己编译。这也是Linux下很多硬件驱动的常态:官方只发源码,编译工具链和依赖得自己配。
确定源码包的方法很简单:解压后看有没有Makefile或configure脚本,有就是源码包。foo2zjs走的是make直编路线,没有configure,所以更省事。下面我按Ubuntu/Debian系的操作来说,Fedora/openSUSE的差异点我会在括号里标注。
2.2 安装依赖:编译foo2zjs前必须装好的工具链
编译foo2zjs需要四个关键依赖,缺一个都会在make时报错,而且报错信息不一定直观。我的建议是先把这些装齐,别等报错再回头补。
- build-essential:提供
gcc、make等基础编译工具。 - libc6-dev:C标准库头文件,编译时必须有。
- ghostscript:负责把页面内容渲染成光栅数据,
foo2zjs的转换流程依赖它。 - libjpeg-dev / libtiff-dev:部分机型需要处理JPEG/TIFF格式的打印数据,缺了会导致编译到某个模块时报“找不到jpeglib.h”之类的头文件错误。
Ubuntu/Debian下一次性装齐:
sudo apt update sudo apt install build-essential libc6-dev ghostscript libjpeg-dev libtiff-devFedora系的对应包名是gcc make ghostscript libjpeg-turbo-devel libtiff-devel,用dnf install装;openSUSE则用zypper install装gcc make ghostscript libjpeg62-devel libtiff-devel。装完可以用which gs确认Ghostscript路径,后面配置时会用到。
2.3 完整安装流程:解压、编译、安装命令逐条过
依赖装好后,进入源码目录开始操作。我习惯把这类临时源码包放在/usr/local/src下,避免污染家目录:
tar -xzf foo2zjs.tar.gz cd foo2zjs make sudo make install三条命令走完,驱动的主体文件就装到了/usr/local/bin和/usr/local/lib下。但事情没完,还有一个关键步骤很容易被人漏掉——生成打印机对应的PPD文件。foo2zjs的源码包里带了一个foo2hp之类的工具,配上printer-profile可以动态生成PPD。市面上流传的教程一般会让你这么做:
./getweb 1020 sudo make installgetweb脚本会去HP官方源下载固件文件(等会儿细说)。下载完成后重新执行make install,固件会装到/usr/share/foo2zjs/firmware/目录下。这时候驱动才算真正完整。
提示:
make install之后,建议顺手执行sudo make install-hotplug或根据发行版规则手动添加udev规则。这个步骤的作用是让打印机在插入USB时自动加载固件,否则每次开机打印都要手动敲命令,非常烦人。
3. 固件下载失败这个老坑,我用一分钟定位到根因
3.1 报错信息里隐藏的真正问题
我第一次跑./getweb 1020的时候,脚本卡在下载阶段,最后打出一行错误,大意是“无法从指定URL获取文件”。当时我以为是网络问题,换了源、挂了代理都没用。后来仔细看了下脚本内容,才发现问题出在URL已经失效了。HP官方改了固件存放路径,而getweb脚本里写死的还是旧地址。
这不是我一个人的问题。很多用foo2zjs的网友都卡在这一步,因为项目已经好几年没更新,脚本里的下载链接早就过时了。解决办法有两个:
方案一:手动下载固件文件。
到foo2zjs的固件镜像站(网上搜foo2zjs firmware mirror能找到一个专门存firmware文件的仓库)下载对应的固件,比如HP LaserJet 1020对应的是sihp1020.bin,下载后手动放到/usr/share/foo2zjs/firmware/目录下,再执行一次sudo make install让安装脚本把它登记进配置。
方案二:改脚本里的URL。
如果你愿意折腾,可以直接编辑getweb脚本,把固件基地址改成镜像站地址,然后重新运行。我个人更推荐方案一,省时间,而且不依赖脚本的解析逻辑。
3.2 为什么有时候编译能过、装完却不能用
这大概是foo2zjs新手最容易碰到的诡异现象:make和make install全程没有任何报错,lsmod、dmesg也都正常,但点打印后打印机没反应,或者指示灯闪两下就熄了。
问题往往出在固件没有真正上传到打印机。插上USB后,内核识别出设备,但打印机还处于“待机但没解锁”的状态,需要驱动把sihp1020.bin这类固件推上去,它才肯接活。如果你没装固件,foo2zjs能识别出设备的PID/VID,但发送打印任务时打印机根本不接受。
排查方法很简单:插上打印机后看dmesg输出,如果出现usb 1-1: new full-speed USB device但没有任何固件加载日志,基本可以断定固件没up。再看/usr/share/foo2zjs/firmware/目录下有没有对应的.bin文件,没有就是没装上。
3.3 手动下载固件并验证的完整路径
以HP LaserJet 1020为例,我手动下载固件的完整操作是:
# 创建固件目录 sudo mkdir -p /usr/share/foo2zjs/firmware # 下载固件(用wget或curl都行) sudo wget -O /usr/share/foo2zjs/firmware/sihp1020.bin http://foo2zjs.rkkda.com/firmware/sihp1020.bin # 重新安装驱动使固件配置生效 sudo make install注意:固件文件名不能乱改,
foo2zjs是通过文件名匹配机型的。sihp1020.bin里的1020就是机型代号,改成123.bin之类驱动就找不到它了。
验证固件是否加载成功,可以用这条命令:
sudo journalctl -k --since "5 minutes ago" | grep -i firmware如果日志里出现了firmware upload successful之类字样,说明固件已经推进去了。此时再去系统设置里添加打印机,选对应端口,就能正常打印了。我第一次看到测试页打出来的时候,差点没把打印机供起来。
4. 驱动装完之后,配置打印机别漏了这三个细节
4.1 用foo2zjs动态生成的PPD文件添加打印机
固件装好、驱动装上,还差最后一块拼图:让系统的打印服务(CUPS)认识这台打印机。虽然foo2zjs装了一堆二进制文件,但CUPS不会自动知道它们的存在,你需要手动指定PPD文件。
foo2zjs源码包带了一个printer-profile工具,用它可以动态生成对应机型的PPD:
./printer-profile 1020 > foo2hp1020.ppd sudo cp foo2hp1020.ppd /usr/share/ppd/foo2zjs/然后把PPD文件路径填到CUPS里。用命令行操作的话:
sudo lpadmin -p LaserJet1020 -E -v usb://HP/LaserJet%201020 -P /usr/share/ppd/foo2zjs/foo2hp1020.ppd-v是设备URI,-P是PPD文件路径。如果你不确定设备URI,可以先用lpinfo -v | grep usb查一下,会列出所有USB打印机设备。
4.2 双面打印、灰度模式这些选项是怎么暴露出来的
foo2zjs的PPD文件里其实带了不少配置项,但很多默认是隐藏的,得在驱动层面打开。
- 灰度模式:HP LaserJet 1020这种老机器不支持彩色,但默认的PPD可能把颜色深度调得过高,导致打印速度奇慢。我建议在打印机选项里把
ColorModel设为Gray,速度能快一倍不止。 - 双面打印:如果你的打印机不带自动双面器,那
Duplex选项就别指望了。但支持双面的机型,PPD里会暴露Duplex=DuplexNoTumble之类的选项,可以手动开启。 - 分辨率:PPD里默认是300dpi,如果你的点阵比较密,可以调成600dpi,但打印速度会明显下降。老打印机我建议300dpi就够,打印文字完全清晰。
这些选项在系统自带的“打印机设置-选项”里都能调,不需要改配置文件。如果某些选项没出现,可能是PPD生成时参数不对,重新用printer-profile生成一次,或者手动编辑PPD文件打开对应的*OpenUI块。
4.3 权限与重启后失联:udev规则和持久化配置
很多人在foo2zjs装好后遇到一个玄学问题:今天打得好好的,明天开机打印机又“失联”了,设备灯亮,但系统找不到打印机。
这通常不是驱动坏了,而是udev规则没配好。打印机插入USB时,内核需要按规则触发固件加载,如果没有对应的udev规则,系统就不会自动上传固件,自然也就“找不到打印机”。
foo2zjs源码包里有一个foo2zjs.udev文件,把它安装到udev规则目录即可:
sudo cp foo2zjs.udev /etc/udev/rules.d/99-foo2zjs.rules sudo udevadm control --reload-rules sudo udevadm trigger装完后再重启一次,或重新插拔打印机,dmesg里应该能看到固件加载日志。这个步骤网上教程经常一笔带过,但恰恰是“今天能用、明天不能”的罪魁祸首。
提示:如果用了udev规则还是不行,检查一下当前用户是否在
lp组里。sudo usermod -aG lp $USER,退出重新登录后生效。CUPS对打印权限卡得很严,不在组里可能只显示打印机但无法发送任务。
5. 可能踩到的编译报错与排查思路,我一并写在这里
5.1 “jpeglib.h找不到”这类头文件报错
编译foo2zjs时最常见的报错就是缺少头文件。fatal error: jpeglib.h: No such file or directory,这一行看得人头皮发麻。原因就是前面提到的libjpeg-dev没装。Ubuntu/Debian下装上就行:
sudo apt install libjpeg-dev如果装了还报错,检查一下是不是版本冲突。Debian系从某个版本起把libjpeg拆分成了libjpeg62-turbo-dev和libjpeg8-dev,foo2zjs这种老项目可能只认其中一个。解决办法是都装上,或者做个软链接:
sudo ln -s /usr/include/x86_64-linux-gnu/jpeglib.h /usr/include/jpeglib.h这类头文件路径问题在老源码上特别常见,报错信息又不会直接告诉你要做什么,所以很多新手卡在这一步就放弃了。
5.2 “arm2html”和zjs转换工具缺失
另一种诡异情况是make完成了,但make install时提示arm2html或foo2zjs转换工具不存在。这通常是因为源码目录里有个子模块没编译到。foo2zjs的Makefile是按机型平台划分的,某些机器需要先编译辅助工具。
解决办法是在源码根目录执行:
make clean make all sudo make installmake clean是为了清掉之前编译的残留产物,避免旧的目标文件干扰新编译。如果这招还不行,检查一下是不是make时少传了参数,比如某些平台需要指定FCOPT之类的选项。
5.3 打印出现乱码或半个页面空白
这个问题的根源往往是PPD文件里的分辨率或颜色设置和打印机实际固件不匹配。我遇到一次乱码,排查了半天发现是PPD里默认的ModelName和NickName与实际机型不符,导致foo2zjs选错了转换模块。
解决办法:编辑PPD文件,把*ModelName改成实际机型,或者用printer-profile重新生成。乱码还会发生在打印机固件版本过低的情况下,这时候先升级固件(通过Windows下用官方工具升级一次),再回来用foo2zjs。
注意:遇到乱码不要急着重装驱动,先看
journalctl里有没有报错,大多数情况是配置问题,不是驱动崩溃。
5.4 冷启动后的第一次打印特别慢
foo2zjs依赖Ghostscript做光栅化,第一次打印时系统需要加载一堆动态库,速度慢是正常的。我实测下来,HP LaserJet 1020从发送任务到出纸,冷启动大约需要20-30秒,热启动不到5秒。
如果冷启动慢到1分钟以上,检查一下系统是不是启用了cups-filters的额外过滤链,多余的过滤环节会拖慢整条流水线。在/etc/cups/cups-filters.conf里可以关掉一些不必要的滤镜模块,比如pdftops的替代方案ghostscript处理。
6. 顺带说清一件事:conda里tar.gz创建环境跟这有什么关系
前面聊了这么多foo2zjs.tar.gz,其实正好可以回应一下最近的搜索热词——“conda 环境tar.gz创建环境”。这两个“tar.gz”字面相同,但完全是两码事,我在这里给你们捋清楚,免得搜资料时搞混。
6.1 两种用法的本质区别
foo2zjs.tar.gz是源码分发包,需要解压、编译、安装,是一套传统的“开发者把代码打包给你,你自己动手构建”的流程。而conda环境里的tar.gz是预构建好的环境快照导出文件,是conda pack这类工具把某个环境的所有库文件、二进制文件、包管理元数据整体打包成压缩档案,目的是让你在另一台机器上“免安装”恢复一个一模一样的运行时环境。
简单区分:
- 源码包tar.gz:需要
make && make install,重在对源码的修改和编译。 - conda环境tar.gz:解压后直接就是一个可用的Python/C++环境,通过设置环境变量就能
activate,省去conda install逐包安装的时间。
6.2 conda里用tar.gz导入环境的具体操作
如果你拿到一个myenv.tar.gz,想把它变成可用的conda环境,步骤是这样的:
# 1. 解压到你希望的环境目录(默认是~/miniconda3/envs/myenv) mkdir -p ~/miniconda3/envs/myenv tar -xzf myenv.tar.gz -C ~/miniconda3/envs/myenv # 2. 激活环境前,把PATH指过去,避免和系统Python冲突 conda activate myenv # 3. 验证 python --version conda list如果在激活时报“环境不存在”,检查一下解压后的目录结构。正常情况下,myenv/bin/下应该有python、pip等可执行文件。如果缺少这些,说明压缩时可能只打包了lib/和include/,那是部分打包工具导致的不完整快照,解压后还得用conda install python补一手。
这和foo2zjs.tar.gz的用法差异很明显:一个是要“造出驱动”,一个是要“还原环境”。两个东西都叫tar.gz,但操作思路完全不同。这也提醒我,网上下载的tar.gz文件,先看包里的内容再动手,别一上来就照着某个教程敲命令。
6.3 类比的启发:看清压缩包内容比记住命令更重要
我处理foo2zjs.tar.gz和conda tar.gz时最大的体会是:tar.gz只是一个外壳,真正的关键在里面的内容组织和来源渠道。
源码包看Makefile、README和依赖说明;conda环境包看有没有conda-meta目录(这是conda管理包记录的标志)。这些内容决定了你要用什么命令去处理它,而不是反过来——想用“解压-编译-安装”套所有tar.gz,大概率会在某个环节卡住。
本文还有配套的精品资源,点击获取