[OpenWrt] 从零搭建p910nd打印服务器:以HP 1020 Plus为例的完整避坑指南 1. 为什么选择OpenWrt搭建打印服务器家里那台老旧的HP LaserJet 1020 Plus打印机已经陪伴我十年了虽然打印效果依旧出色但每次都要插着USB线在电脑旁边打印实在不方便。特别是家里有多台设备需要打印时来回插拔USB线简直让人抓狂。这时候把打印机改造成网络打印机就成了最佳解决方案。OpenWrt作为一款开源路由器系统最大的优势就是轻量化和可定制性。我实测下来即便是十年前的TP-Link WR703N这种老路由器刷上OpenWrt后跑p910nd打印服务也完全无压力。相比动辄上千元的商用打印服务器这种方案成本几乎为零而且稳定性出乎意料的好——我的HP 1020 Plus已经连续工作三个月没出过任何问题。选择p910nd而不是CUPS的原因很简单p910nd足够轻量占用资源极少配置也简单。对于HP 1020 Plus这种经典机型来说完全够用。不过要注意的是这款打印机有个特殊之处它没有内置固件每次开机都需要电脑上传固件才能工作。这也正是我们需要特别处理的地方后面会详细说明。2. 准备工作硬件与软件需求2.1 硬件准备清单首先你需要准备以下硬件一台支持OpenWrt的路由器推荐MT7620/MT7621芯片的设备如Newifi D1、极路由等HP LaserJet 1020 Plus打印机1020系列都适用USB A to B打印线就是方口的那种网线或WiFi连接我用的是一台淘汰的小米路由器3G实测性能绰绰有余。如果你手头有更老的设备比如TP-Link WR703N也完全没问题但建议选择带USB2.0接口的设备USB3.0可能会有兼容性问题。2.2 软件准备需要下载的资源主要有两个HP 1020打印机固件sihp1020.img约1MB大小OpenWrt固件建议选择19.07或21.02稳定版这里有个坑要注意不同版本的OpenWrt对USB打印机的支持可能略有差异。我最初用的是最新版OpenWrt 22.03结果发现kmod-usb-printer模块经常加载失败后来换回21.02就稳定了。所以如果你遇到类似问题不妨试试老版本。3. OpenWrt基础配置与p910nd安装3.1 刷写OpenWrt固件这个步骤因设备而异我就不赘述了。刷好OpenWrt后建议先做几项基础配置修改LAN IP避免和主路由冲突比如改成192.168.2.1开启WiFi客户端模式连接主路由更新软件源国内用户建议换成清华源sed -i s_downloads.openwrt.org_mirrors.tuna.tsinghua.edu.cn/openwrt_ /etc/opkg/distfeeds.conf opkg update3.2 安装必要软件包通过SSH登录路由器后执行以下命令安装核心组件opkg install kmod-usb-printer p910nd luci-app-p910nd这里有个细节kmod-usb-printer是内核模块必须和OpenWrt内核版本完全匹配。如果你遇到安装失败可能是软件源没有对应版本的包。这时可以手动下载ipk安装wget https://downloads.openwrt.org/releases/21.02.7/packages/mipsel_24kc/kmod/kmod-usb-printer_5.4.188-1_mipsel_24kc.ipk opkg install kmod-usb-printer_5.4.188-1_mipsel_24kc.ipk安装完成后插上打印机应该就能在/dev下看到usb/lp0设备了。可以用lsusb命令检查是否识别成功lsusb如果看到类似HP LaserJet 1020的设备信息说明识别成功。4. HP 1020固件上传的特殊处理4.1 准备打印机固件HP 1020系列打印机的特别之处在于它没有内置固件每次开机都需要电脑上传固件。在OpenWrt环境下我们需要手动处理这个过程。首先下载固件文件sihp1020.img约1MB将其改名为sihp1020.dl并上传到路由器的/etc目录wget -O /etc/sihp1020.dl http://oleg.wl500g.info/hplj/sihp1020.dl chmod 644 /etc/sihp1020.dl4.2 配置热插拔脚本为了让路由器在检测到打印机连接时自动上传固件我们需要创建热插拔脚本mkdir -p /etc/hotplug.d/usb/ cat /etc/hotplug.d/usb/10-printer_hp1020 EOF #!/bin/sh set -e FIRMWARE/etc/sihp1020.dl DEVICE/dev/usb/lp0 LOGFILE/tmp/hp1020.log if [ $PRODUCT 3f0/2b17/100 -a $ACTION bind ]; then echo $(date): Printer connected $LOGFILE for i in $(seq 10); do if [ -c $DEVICE ]; then echo $(date): Device found, uploading firmware... $LOGFILE cat $FIRMWARE $DEVICE echo $(date): Firmware uploaded $LOGFILE exit 0 fi sleep 1 done echo $(date): Failed to find printer device $LOGFILE fi EOF chmod 755 /etc/hotplug.d/usb/10-printer_hp1020这个脚本做了几件事检测特定的USB设备接入HP 1020的VID/PID是3f0/2b17等待设备文件就绪最多10秒上传固件到打印机测试时可以手动触发脚本ACTIONbind PRODUCT3f0/2b17/100 /etc/hotplug.d/usb/10-printer_hp1020成功的话会看到打印机指示灯状态变化绿灯常亮→红绿交替闪烁→绿灯常亮。5. p910nd服务配置与优化5.1 基础配置通过Luci网页界面配置p910nd进入服务→p910nd打印服务器启用服务设备填写/dev/usb/lp0端口用默认的9100接口选择LAN务必取消双向模式的勾选这里有个大坑HP 1020开启双向支持会导致打印任务卡死。我当初就栽在这里打印机不停地吐白纸最后只能拔电源。5.2 防火墙配置为了让局域网设备能访问打印服务需要开放9100端口uci add firewall rule uci set firewall.rule[-1].nameAllow-Printing uci set firewall.rule[-1].srclan uci set firewall.rule[-1].prototcp uci set firewall.rule[-1].dest_port9100 uci set firewall.rule[-1].targetACCEPT uci commit firewall /etc/init.d/firewall restart5.3 服务自启与监控确保p910nd开机自启/etc/init.d/p910nd enable /etc/init.d/p910nd start可以创建一个简单的监控脚本定期检查服务状态cat /usr/bin/check_printer EOF #!/bin/sh if ! pgrep p910nd /dev/null; then /etc/init.d/p910nd restart echo $(date): p910nd restarted /tmp/printer_monitor.log fi EOF chmod 755 /usr/bin/check_printer (crontab -l 2/dev/null; echo */5 * * * * /usr/bin/check_printer) | crontab -6. Windows客户端配置指南6.1 安装官方驱动首先要在Windows电脑上安装HP官方驱动。注意一定要从HP官网下载最新驱动我试过用Windows自带的驱动结果打印出来的文档全是乱码。安装完成后可以先通过USB直连测试确保驱动工作正常。6.2 添加网络打印机打开设置→设备→打印机和扫描仪点击添加打印机或扫描仪选择我需要的打印机不在列表中选择使用TCP/IP地址或主机名添加打印机主机名填写OpenWrt路由器的IP端口填9100设备类型选Generic Network Card选择使用当前已安装的驱动程序给打印机取个容易识别的名字关键步骤来了一定要关闭双向支持右键打印机→打印机属性→端口确保勾选的是你刚添加的9100端口点击配置端口取消勾选启用双向支持6.3 测试打印建议先打印一个简单的文本文档测试。如果出现以下情况打印机不停吐白纸检查是否关闭了双向支持打印乱码检查是否正确安装了官方驱动无反应检查OpenWrt上的p910nd服务是否运行7. Linux客户端配置Linux下的配置相对简单以Ubuntu为例sudo apt install printer-driver-foo2zjs lpadmin -p HP1020 -E -v socket://192.168.1.100:9100 -m drv:///foo2zjs.drv/hp1020.ppd关键参数说明192.168.1.100要换成你的OpenWrt路由器IPfoo2zjs是HP LaserJet系列的开源驱动如果找不到ppd文件可以从Windows驱动中提取测试打印lp -d HP1020 /etc/hosts8. 常见问题与解决方案8.1 打印机无法识别症状lsusb看不到打印机 解决方法换USB线测试很多问题都是劣质线材导致的检查路由器USB口供电是否充足尝试在OpenWrt中加载usb相关内核模块insmod usbcore insmod uhci insmod ohci insmod ehci-hcd insmod xhci-hcd8.2 固件上传失败症状打印机指示灯不正常闪烁 解决方法检查/etc/hotplug.d/usb/10-printer_hp1020是否有执行权限查看/tmp/hp1020.log中的错误信息尝试手动上传固件cat /etc/sihp1020.dl /dev/usb/lp08.3 打印任务卡住症状打印队列显示正在打印但无输出 解决方法在OpenWrt上重启p910nd服务/etc/init.d/p910nd restart在Windows上清空打印队列net stop spooler del %systemroot%\System32\spool\printers\* /Q net start spooler8.4 打印质量差症状文字模糊或有条纹 解决方法执行打印机自清洁程序更换硒鼓或碳粉检查驱动设置中的打印质量选项经过以上步骤你的HP 1020 Plus应该已经变身为一台稳定的网络打印机了。这套方案我已经稳定使用一年多无论是日常文档打印还是孩子作业打印都没出过问题。相比购买新的网络打印机这种改造方案不仅省钱还能让老设备焕发新生何乐而不为呢