
手里有几台 这样的打印机正常要用起来的插到电脑连接然后其他人要用得共享,最起码也要开着台电脑给它才行,但又不是天天打印开着又浪费电,所以才有了用个其他设备把它连接到网络去。用开发板又属实浪费,刚好之前挖矿剩下一堆 老母鸡 玩客云可以派上用场,配置 1+8G armv7的S805。机器 就算常年通电也用不了多少电,刷上 armbian系统, 开始选用比较强大的cups,物理机直接装也行,自己配置一下,但是对于新手也是有些麻烦。。。 刚好 docker还有一个还有人维护的cups docker镜像,, 而且还贴心的支持 armv7 arm64 amd64 基本全了。。。。
对于这种老古董的理解 才能更好去配置它
关键事实
这些老打印机不可能“真正进入永久就绪态”
固件一定是 上电后加载
Docker 不能自动感知 USB 设备热插拔事件
但 udev + 后台固件加载脚本 + CUPS 可以做到:
打印机一通电
立刻写入固件
CUPS 队列保持可用
架构方案
[ USB Printer ]
│
▼
[ Linux Host ]
├─ udev (监听 USB)
├─ 固件文件
└─ Docker CUPS
├─ foo2zjs
├─ hp1020.fw / hp1018.fw
└─ IPP / AirPrint部署按照
Docker compose
部署cups 获取USB最大权限
version: "3.8"
services:
cups:
image: ydkn/cups
container_name: cups
restart: always
privileged: true
network_mode: host
devices:
- /dev/bus/usb:/dev/bus/usb
volumes:
- ./cups/etc:/etc/cups
- ./cups/spool:/var/spool/cups
- ./firmware:/usr/share/foo2zjs/firmware
- ./scripts:/opt/scripts
environment:
- TZ=Asia/Shanghai
command: >
/bin/sh -c "
/opt/scripts/auto-firmware.sh &
cupsd -f
"自动固件加载脚本(重点)
scripts/auto-firmware.sh
#!/bin/sh
FIRMWARE_DIR="/usr/share/foo2zjs/firmware"
echo "[auto-firmware] started"
while true; do
for dev in /dev/usb/lp*; do
[ -e "$dev" ] || continue
if ! fuser "$dev" >/dev/null 2>&1; then
echo "[auto-firmware] found printer $dev"
# 读取 USB ID
USBINFO=$(udevadm info --query=property --name="$dev" 2>/dev/null)
case "$USBINFO" in
*"HP_LaserJet_1020"*)
FW="hp1020.fw"
;;
*"HP_LaserJet_1018"*)
FW="hp1018.fw"
;;
*"HP_LaserJet_1005"*)
FW="hp1005.fw"
;;
*)
FW=""
;;
esac
if [ -n "$FW" ] && [ -f "$FIRMWARE_DIR/$FW" ]; then
echo "[auto-firmware] loading firmware $FW to $dev"
cat "$FIRMWARE_DIR/$FW" > "$dev"
else
echo "[auto-firmware] no firmware match for $dev"
fi
fi
done
sleep 5
done
说明
支持多型号
支持多 USB 打印机
打印机一上电 →
/dev/usb/lpX出现 → 自动写固件即使打印机断电重连,也会再次写入
firmware 目录结构
firmware/
├── hp1020.fw
├── hp1018.fw
├── hp1005.fw
固件获取方式(宿主机执行一次即可):
apt install foo2zjs
getweb 1020CUPS 队列配置建议
添加打印机时
设备:
USB Printer #1驱动:
HP LaserJet 1020 Foomatic/foo2zjs
启用共享
/etc/cups/cupsd.conf 关键项
Listen 0.0.0.0:631
Browsing On
BrowseLocalProtocols dnssd
DefaultShared Yes
移动端支持情况(最终效果)
这套方案的边界与现实
能做到的
打印机通电即就绪
多型号并存
无需人工干预
Docker 一次部署
做不到的(物理限制)
断电后永久保留固件(硬件不支持)
直接 AirPrint 到 USB 打印机(必须 CUPS 中转)
如果你要进一步增强(可选)
用 udev 在宿主机触发容器内脚本
给每台打印机 固定队列名
多容器隔离不同厂商驱动
前面做好运行登录 ip:631 转到 admini 用你服务器或指定的密码登录添加打印机即可
usb://HP/LaserJet%201020?serial=S42AXGR|HP LaserJet 1020

这是我打印机的信息和序列好 你们添加的话应该有对应的,

添加了后 顺便把这个玩客云加入到组网去。。。我这边用了 tailscale组网 easytier组网代理子网 ,不组本地局域可以用了。。。
组了主要在外面或 直接手机 往打印机发 懒得开电脑。。
此docker镜像已经基本全能了把 我的老古董都能直接使用了 其他测试
顺便贴上
cupsd.conf的配置
LogLevel warn
PageLogFormat
MaxLogSize 0
# Allow remote access
Port 631
Listen 0.0.0.0:631
Listen [::]:631
Listen /run/cups/cups.sock
# Share local printers on the local network.
Browsing On
BrowseLocalProtocols dnssd
BrowseOrder allow,deny
BrowseAddress @LOCAL
# Allow all local networks to access printers
DefaultAuthType Basic
WebInterface Yes
<Location />
# Allow shared printing and remote administration...
Order allow,deny
Allow all
</Location>
<Location /admin>
# Allow remote administration...
Order allow,deny
Allow all
</Location>
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
# Allow remote access to the configuration files...
Order allow,deny
Allow all
</Location>
<Location /admin/log>
AuthType Default
Require user @SYSTEM
Order allow,deny
# Allow remote access to the log files...
Order allow,deny
Allow all
</Location>
<Policy default>
JobPrivateAccess default
JobPrivateValues default
SubscriptionPrivateAccess default
SubscriptionPrivateValues default
<Limit Create-Job Print-Job Print-URI Validate-Job>
Order deny,allow
</Limit>
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job>
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default CUPS-Get-Devices>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Cancel-Job CUPS-Authenticate-Job>
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit All>
Order deny,allow
</Limit>
</Policy>
<Policy authenticated>
JobPrivateAccess default
JobPrivateValues default
SubscriptionPrivateAccess default
SubscriptionPrivateValues default
<Limit Create-Job Print-Job Print-URI Validate-Job>
AuthType Default
Order deny,allow
</Limit>
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job>
AuthType Default
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Cancel-Job CUPS-Authenticate-Job>
AuthType Default
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit All>
Order deny,allow
</Limit>
</Policy>
<Policy kerberos>
JobPrivateAccess default
JobPrivateValues default
SubscriptionPrivateAccess default
SubscriptionPrivateValues default
<Limit Create-Job Print-Job Print-URI Validate-Job>
AuthType Negotiate
Order deny,allow
</Limit>
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job>
AuthType Negotiate
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
<Limit Cancel-Job CUPS-Authenticate-Job>
AuthType Negotiate
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
<Limit All>
Order deny,allow
</Limit>
</Policy>
ServerAlias *