☰
飞牛 NAS + Docker CUPS 搭建 HP LaserJet 1020 打印服务器操作记录
2026/10/8 6:47:20 网站建设 项目流程

目标:用 Docker 跑 CUPS,不污染飞牛宿主机系统,实现 HP 1020 局域网共享打印,支持 Windows / macOS / iOS / Android。
核心:CUPS 容器 + foo2zjs-z1 驱动 + 宿主机 udev 自动写固件。


一、前置条件

  • 飞牛 NAS 已开启 SSH,能sudo -i拿 root

  • Docker 已安装

  • HP LaserJet 1020 通过 USB 连接飞牛

  • 打印机先断电,等 NAS 完全启动后再给打印机通电

确认 USB 识别:

bash

lsusb | grep -i hp # 应看到 Bus 001 Device 00x: ID 03f0:2b17 HP, Inc LaserJet 1020 ls -l /dev/usb/lp* 2>/dev/null # 应看到 /dev/usb/lp0

如果/dev/usb/lp0不存在:

bash

modprobe -r usblp modprobe usblp ls -l /dev/usb/lp0

二、启动 CUPS 容器

用作者官方推荐的--device /dev/bus/usb(不要用-v /dev/:/dev/,否则容器里lpinfo -v看不到 USB):

bash

docker run -d --name cups --restart unless-stopped \ -p 631:631 \ --device /dev/bus/usb \ -e CUPSADMIN=admin \ -e CUPSPASSWORD=adminadmin \ -e TZ="Asia/Shanghai" \ anujdatar/cups

验证容器能看到打印机:

bash

docker exec -it cups lpinfo -v | grep usb

应看到:

text

direct usb://HP/LaserJet%201020?serial=S406EEX direct hp:/usb/HP_LaserJet_1020?serial=S406EEX

三、CUPS 网页添加打印机

  1. 浏览器打开http://飞牛IP:631

  2. 用户名/密码:admin / adminadmin

  3. Administration→Add Printer

  4. Local Printers 里选:

    text

    HP LaserJet 1020 USB S406EEX HPLIP (HP LaserJet 1020)

    Connection 对应:

    text

    hp:/usb/HP_LaserJet_1020?serial=S406EEX

    也可以选HP LaserJet 1020 (HP LaserJet 1020),对应usb://HP/LaserJet%201020?serial=S406EEX。

  5. 勾选Share This Printer

  6. Model 选:

    text

    HP LaserJet 1020 Foomatic/foo2zjs-z1

    不要选hpcups或带requires proprietary plugin的。

  7. Add Printer

  8. 设置默认:A4、600 dpi、Plain Paper →Set Default Options

添加成功后 CUPS 提示Printer drivers and raw queues are deprecated...是通用提示,忽略即可。


四、下载固件 sihp1020.dl

HP 1020 无内置存储,每次断电重启后必须写固件,否则打印任务石沉大海。

下载地址(社区镜像,可用):

bash

mkdir -p /root/hp1020 cd /root/hp1020 wget -O sihp1020.dl https://opt.cn2qq.com/opt-file/printer/sihp1020.dl ls -lh /root/hp1020/sihp1020.dl file /root/hp1020/sihp1020.dl

正常应为123KB 二进制文件,不是几字节文本。


五、把固件拷进容器

容器里默认没有firmware/目录,先建再拷:

bash

docker exec -it cups mkdir -p /usr/share/foo2zjs/firmware docker cp /root/hp1020/sihp1020.dl cups:/usr/share/foo2zjs/firmware/ docker exec -it cups ls -l /usr/share/foo2zjs/firmware/sihp1020.dl

六、手动写一次固件,测试打印

bash

cat /root/hp1020/sihp1020.dl > /dev/usb/lp0

打印机应响一声。

bash

docker exec -it cups lp -d HP_LaserJet_1020 /usr/share/cups/data/testprint

测试页应正常打出。


七、配 udev 自动写固件(宿主机)

1. 脚本/root/hp1020/hp1020.sh

bash

nano /root/hp1020/hp1020.sh

内容:

bash

#!/bin/bash logger "HP1020: firmware upload..." sleep 3 cat /root/hp1020/sihp1020.dl > /dev/usb/lp0 logger "HP1020: firmware uploaded."
# 新增这一行:让容器重新绑定新的 USB 设备节点 sleep 1 docker restart cups logger "HP1020: CUPS container restarted."

赋权:

bash

chmod +x /root/hp1020/hp1020.sh

2. udev 规则/etc/udev/rules.d/10-usb-hp1020.rules

bash

nano /etc/udev/rules.d/10-usb-hp1020.rules

内容(一行):

text

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

赋权并重载:

bash

chmod 644 /etc/udev/rules.d/10-usb-hp1020.rules chown root:root /etc/udev/rules.d/10-usb-hp1020.rules udevadm control --reload-rules udevadm trigger

3. 验证

拔掉打印机 USB,再插上,等 10 秒,打印机应自动响一声。

没响就手动跑一次:

bash

/root/hp1020/hp1020.sh

八、局域网设备连接

  • Windows / macOS:
    添加网络打印机,地址填:

    text

    http://飞牛IP:631/printers/HP_LaserJet_1020
  • iPhone / iPad:AirPrint 自动发现;搜不到用 IPP 手动加,地址同上。

  • Android(如 Mate 30):

    • 协议:IPP

    • 地址:飞牛IP

    • 端口:631

    • 路径:printers/HP_LaserJet_1020

    • 或直接:

      text

      ipp://飞牛IP:631/printers/HP_LaserJet_1020

九、常见问题排查

现象原因处理
容器里lpinfo -v无 USB用了-v /dev/:/dev/改用--device /dev/bus/usb重起容器
docker cp报no such directory容器里没有firmware/目录先docker exec -it cups mkdir -p /usr/share/foo2zjs/firmware
/dev/usb/lp0不存在usblp 模块掉了modprobe -r usblp && modprobe usblp,或物理拔插 USB
任务发出但打印机无反应固件未加载cat /root/hp1020/sihp1020.dl > /dev/usb/lp0
队列卡住任务异常docker exec -it cups cupsenable HP_LaserJet_1020、cupsaccept HP_LaserJet_1020
查看日志—docker exec -it cups tail -50 /var/log/cups/error_log

十、关键要点回顾

  1. 容器 USB 权限用--device /dev/bus/usb,不要用-v /dev/:/dev/

  2. 驱动必须选foo2zjs-z1,不要选hpcups或带 proprietary plugin 的

  3. 必须勾Share This Printer,否则局域网看不到

  4. HP 1020 每次断电重启必须写固件,用 udev 规则自动处理

  5. 固件文件必须拷进容器/usr/share/foo2zjs/firmware/

  6. 网络发现失效时,统一用 IPP 手动添加

  7. 只要打印机因为任何原因重新连接 USB(例如开机、休眠唤醒、供电波动),udev规则就会触发这个脚本,自动完成“写固件 + 重启容器”这两个动作


十一、文件清单

路径用途
/root/hp1020/sihp1020.dlHP 1020 固件
/root/hp1020/hp1020.shudev 触发脚本
/etc/udev/rules.d/10-usb-hp1020.rulesudev 规则
容器/usr/share/foo2zjs/firmware/sihp1020.dl容器内固件副本
容器 anujdatar/cupsCUPS 服务
http://飞牛IP:631/printers/HP_LaserJet_1020打印机共享地址

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询