目标:用 Docker 跑 CUPS,不污染飞牛宿主机系统,实现 HP 1020 局域网共享打印,支持 Windows / macOS / iOS / Android。
核心:CUPS 容器 + foo2zjs-z1 驱动 + 宿主机 udev 自动写固件。
一、前置条件
飞牛 NAS 已开启 SSH,能
sudo -i拿 rootDocker 已安装
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 网页添加打印机
浏览器打开
http://飞牛IP:631用户名/密码:
admin / adminadminAdministration→Add PrinterLocal 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。勾选
Share This PrinterModel 选:
text
HP LaserJet 1020 Foomatic/foo2zjs-z1
不要选
hpcups或带requires proprietary plugin的。Add Printer
设置默认: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 |
十、关键要点回顾
容器 USB 权限用
--device /dev/bus/usb,不要用-v /dev/:/dev/驱动必须选
foo2zjs-z1,不要选hpcups或带 proprietary plugin 的必须勾
Share This Printer,否则局域网看不到HP 1020 每次断电重启必须写固件,用 udev 规则自动处理
固件文件必须拷进容器
/usr/share/foo2zjs/firmware/网络发现失效时,统一用 IPP 手动添加
只要打印机因为任何原因重新连接 USB(例如开机、休眠唤醒、供电波动),
udev规则就会触发这个脚本,自动完成“写固件 + 重启容器”这两个动作
十一、文件清单
| 路径 | 用途 |
|---|---|
/root/hp1020/sihp1020.dl | HP 1020 固件 |
/root/hp1020/hp1020.sh | udev 触发脚本 |
/etc/udev/rules.d/10-usb-hp1020.rules | udev 规则 |
容器/usr/share/foo2zjs/firmware/sihp1020.dl | 容器内固件副本 |
| 容器 anujdatar/cups | CUPS 服务 |
http://飞牛IP:631/printers/HP_LaserJet_1020 | 打印机共享地址 |