飞牛NAS系统搭建HP LaserJet 1020打印服务器(支持手机直连)

2025-04-07 11:20:29 4点赞 70收藏 41评论

飞牛NAS系统Docker搭建HP LaserJet 1020打印服务器(支持手机直连)

最近更换了一台HP LaserJet 1020激光打印机。实在无法忍受之前那台喷墨打印机——每次需要打印时,不是喷头堵塞就是墨水干了。最终在海鲜市场淘到这台HP经典款1020打印机来解决问题。原本计划通过USB将打印机接入NAS实现网络共享,但实际操作后发现自己还是太天真,遭遇了各种问题。现在基本解决完毕,特此记录踩坑经验。

基础环境搭建

首先需要在飞牛系统上安装CUPS打印机服务。经过测试,驱动支持最全面的镜像是anujdatar/cups​,可通过SSH一键部署:

docker run -d --name cups --restart unless-stopped -p 631:631 -v /dev/:/dev/ -v /var/run/dbus:/var/run/dbus -e CUPSADMIN=admin -e CUPSPASSWORD=adminadmin -e TZ="Asia/Shanghai" anujdatar/cups

访问http://NAS-IP:631​进入管理界面(用户名/密码为预设的admin/adminadmin​):

CUPS管理界面CUPS管理界面
  1. 点击【Administration】添加打印机

  2. 选择已识别的HP1020打印机型号

  3. 务必勾选"共享打印机"选项

  4. 必须选择"HP LaserJet 1020 Foomatic/foo2zjs-z1"驱动(其他驱动均有兼容性问题)

  5. 添加完成后记录打印机URL(后续步骤需要)

驱动选择界面驱动选择界面

疑难问题排查

看似顺利的流程背后暗藏玄机,主要遇到三大问题:

  1. 设备识别异常:Docker内的CUPS服务在打印机重启后丢失设备连接

  2. 间歇性打印失败:测试页时好时坏,CUPS日志无报错

  3. 网络发现失效:必须手动输入URL添加打印机(导致iOS设备无法使用)

根本原因分析

经查证发现HP1020存在两个特殊设计

  • 专为Windows设计的驱动架构,Linux支持不完善

  • 无内置闪存,每次开机需通过/dev/usb/lp0​接口写入固件

飞牛系统的额外问题
USB接口会不定期释放/dev/usb/lp0​设备节点

解决方案

通过监控脚本实现自动化处理(需提前下载固件文件sihp1020.dl​):

printer_monitor.sh

#!/bin/bash # 打印机数据文件路径 PRINTER_DATA_FILE="/vol3/1000/docker/cups/sihp1020.dl" # 监控检查间隔时间(秒) CHECK_INTERVAL=30 # 设置日志文件路径 LOG_FILE="/var/log/printer_monitor.log" # 创建日志函数 log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } # 检查日志文件是否存在,不存在则创建 if [ ! -f "$LOG_FILE" ]; then touch "$LOG_FILE" log_message "日志文件已创建" fi log_message "打印机监控服务启动" # 记录上一次设备状态 LAST_DEVICE_STATUS=0 while true; do # 检查打印机设备文件是否存在 if [ -c "/dev/usb/lp0" ]; then # 如果是设备首次出现(状态从不存在变为存在) if [ "$LAST_DEVICE_STATUS" -eq 0 ]; then log_message "检测到打印机设备连接" # 重启cups容器 if docker restart cups >> "$LOG_FILE" 2>&1; then log_message "cups容器重启成功" else log_message "cups容器重启失败" fi # 检查源文件是否存在 if [ -f "$PRINTER_DATA_FILE" ]; then log_message "开始执行打印任务" # 尝试执行打印命令 if cat "$PRINTER_DATA_FILE" > "/dev/usb/lp0" 2>> "$LOG_FILE"; then log_message "打印任务执行成功" else log_message "打印任务执行失败" fi else log_message "错误:源文件不存在 ($PRINTER_DATA_FILE)" fi # 更新设备状态 LAST_DEVICE_STATUS=1 fi else # 如果设备刚刚消失(状态从存在变为不存在) if [ "$LAST_DEVICE_STATUS" -eq 1 ]; then log_message "打印机设备已断开连接" LAST_DEVICE_STATUS=0 fi fi # 等待指定的检查间隔时间 sleep $CHECK_INTERVAL done

部署步骤:

  1. 将脚本和固件上传至NAS,并记录下实际位置(如/vol3/1000/docker/cups/​)

    直接在飞牛系统里面双击编辑printer_monitor.sh脚本

  2. 创建systemd服务/etc/systemd/system/printer_monitor.service​:

    ssh下直接vim /etc/systemd/system/printer_monitor.service

[Unit] Description=Printer monitoring service After=network.target [Service] Type=simple ExecStartPre=/bin/sleep 10 ExecStart=/vol3/1000/docker/cups/printer_monitor.sh User=root Restart=always [Install] WantedBy=multi-user.target

  1. 执行以下命令激活服务:

systemctl daemon-reload systemctl enable printer_monitor chmod +x /vol3/1000/docker/cups/printer_monitor.sh

遗留问题

目前仍存在网络打印机自动发现失效的情况,需通过以下方式手动添加:

  • Android/iOS:通过IPP协议手动输入http://NAS-IP:631/printers/HP_LaserJet_1020

  • Windows/macOS:添加网络打印机时指定上述地址

---------------------------------上面问题已经解决,来更新一下---------------------------------

首先是不需要用到循环检测脚本,直接用USB设备触发脚本来运行就可以了!

1. 修改 udev 规则(适配 HP1020)

(1) 创建或修改 udev 规则文件

路径:
/etc/udev/rules.d/10-usb-hp1020.rules​(推荐)
(文件名可以自定义,但建议以数字开头,如 10-​)

内容调整为 HP1020 的 USB ID:

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2b17", RUN+="/vol3/1000/Docker/hp1020/hp1020.sh"

说明:

  • ATTRS{idVendor}=="03f0"​(HP 的 USB 厂商 ID)

  • ATTRS{idProduct}=="2b17"​(HP1020 的产品 ID)

  • RUN+="/vol1/1000/Docker/hp1020/hp1020.sh"​(您的脚本路径,请确保存在)


(2) 设置正确权限

sudo chmod 644 /etc/udev/rules.d/10-usb-hp1020.rules sudo chown root:root /etc/udev/rules.d/10-usb-hp1020.rules

(3) 重新加载 udev 规则

sudo udevadm control --reload-rules sudo udevadm trigger


2. 修改脚本 hp1020.sh​(适配 HP1020)

(1) 创建或修改脚本

路径:
/vol1/1000/Docker/hp1020/hp1020.sh
(确保路径正确)

脚本内容(HP1020 需要用 sihp1020.dl​):

#!/bin/bash logger "HP LaserJet 1020: Triggering firmware upload..." sleep 3 # 等待 USB 设备初始化(3秒足够) cat /vol1/1000/Docker/hp1020/sihp1020.dl > /dev/usb/lp0 # 上传 HP1020 固件 sleep 1 docker restart cups # 重启 CUPS 服务 logger "HP LaserJet 1020: Firmware uploaded and CUPS restarted."

⚠️ 注意

  • 固件文件名 必须是 sihp1020.dl​(HP1020 专用,与 1008 的不同)。

  • 设备节点 可能是 /dev/usb/lp0​ 或 /dev/usblp0​,可以用 ls /dev/usb*​ 检查。

(2) 设置可执行权限

sudo chmod +x /vol1/1000/Docker/hp1020/hp1020.sh


3. 检查 USB 设备信息

找到 HP1020 的 USB ID

运行:

lsusb

输出应该包含类似:

Bus 001 Device 003: ID 03f0:2b17 Hewlett-Packard LaserJet 1020

  • 03f0​ 是 idVendor

  • 2b17``​idProduct`

如果不同,需修改 udev​ 规则!

检查设备节点

插入打印机后,运行:

ls /dev/usb*

确认打印机挂载为 /dev/usb/lp0​ 或 /dev/usblp0​(需在脚本中使用正确的路径)。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
41评论

  • 精彩
  • 最新
  • 好像用usb连接的打印机都很麻烦,还不如买个打印机WiFi盒子,绕过usb问题

    校验提示文案

    提交
    这种老打印机 WiFi盒子一样有兼容问题

    校验提示文案

    提交
    收起所有回复
  • 点击【Administration】添加打印机

    选择已识别的HP1020打印机型号 这一步usb打印机就识别不到

    校验提示文案

    提交
    现ssh到nas上看看 接入USB后 有没有 /dev/usb/lp0这个文件

    校验提示文案

    提交
    ssh在哪里 没找到

    校验提示文案

    提交
    收起所有回复
  • 以前在群晖可以识别到打印机就传送打印机固件,太久没搞了,忘了,还在研究,不需要长时间去定时发送

    校验提示文案

    提交
    主要是关机重新开机 或者 重新拔插USB docker里面识别不出来

    校验提示文案

    提交
    前两晚测试好了,关机后开机能发送固件,但是你说的CUPS识别不出来也发现了,重启飞牛好像得闲折腾DOCKER还检测不到,等我折腾完硬件再看看吧,或者换个CUPS。

    校验提示文案

    提交
    还有19条回复
    收起所有回复
  • 大佬输入完vim /etc/systemd/system/printer_monitor.service​这些后,下面要编辑的内容右键为什么不能复制啊,要手动一行一行输入吗

    校验提示文案

    提交
    有更新 看更新部分!

    校验提示文案

    提交
    奇怪创建​ vim /etc/udev/rules.d/10-usb-hp1020.rules 保存提示没权限,之前创建printer_monitor.sh还好好的

    校验提示文案

    提交
    收起所有回复
  • 我买了个蓝阔打印机盒子,贼好用

    校验提示文案

    提交
    兄弟,求回复,哪个型号的盒子?我是HP 1020 PLUS,之前买过一次蓝阔printbox-S,接打印机上不好用,局域网的台式机都打印不了,你买的是什么型号呢?

    校验提示文案

    提交
    还在吗?怎么不好用?装驱动了没?

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 佳能LBP2900+这款打印机能用不?搞了好几次没成功。

    校验提示文案

    提交
    理论上都是差不多的,cups能找到就是第一步了

    校验提示文案

    提交
    收起所有回复
  • 飞牛虚拟机搞个win然后共享打印机,简单粗暴 [吃]

    校验提示文案

    提交
  • sihp1020.dl可不可以发一下这个固件?

    校验提示文案

    提交
  • 都设置好了,最后一步ls /dev/usb* 提示没有文件,/dev里面也找了根本没有usb或者usblp0,但是我打印都是正常的,难道不是挂载在这个路径吗

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
70
扫一下,分享更方便,购买更轻松