linuxer
linuxer
发布于 2025-02-04 / 584 阅读
0
0

老古董打印机HP-1020加网络打印服务CUPS-docker版简单配置

手里有几台 这样的打印机正常要用起来的插到电脑连接然后其他人要用得共享,最起码也要开着台电脑给它才行,但又不是天天打印开着又浪费电,所以才有了用个其他设备把它连接到网络去。用开发板又属实浪费,刚好之前挖矿剩下一堆 老母鸡 玩客云可以派上用场,配置 1+8G armv7的S805。机器 就算常年通电也用不了多少电,刷上 armbian系统, 开始选用比较强大的cups,物理机直接装也行,自己配置一下,但是对于新手也是有些麻烦。。。 刚好 docker还有一个还有人维护的cups docker镜像,, 而且还贴心的支持 armv7 arm64 amd64 基本全了。。。。

对于这种老古董的理解 才能更好去配置它

关键事实

  1. 这些老打印机不可能“真正进入永久就绪态”

    • 固件一定是 上电后加载

  2. Docker 不能自动感知 USB 设备热插拔事件

  3. 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 1020

CUPS 队列配置建议

添加打印机时

  • 设备:USB Printer #1

  • 驱动:

    • HP LaserJet 1020 Foomatic/foo2zjs

  • 启用共享

/etc/cups/cupsd.conf 关键项

Listen 0.0.0.0:631
Browsing On
BrowseLocalProtocols dnssd
DefaultShared Yes

移动端支持情况(最终效果)

平台

是否自动发现

说明

iOS / iPadOS

✅ 是

原生 AirPrint

Android

✅ 是

Mopria

华为 HarmonyOS

✅ 是

系统打印

Windows / macOS

✅ 是

IPP

这套方案的边界与现实

能做到的

  • 打印机通电即就绪

  • 多型号并存

  • 无需人工干预

  • 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 *


评论