在家庭办公或小型工作室网络搭建中,如何在 OpenWrt/iStoreOS 安装 CUPS 服务? 是许多希望将旧款 USB 打印机变身为无线网络共享打印机(甚至支持苹果手机 AirPrint 打印)的软路由玩家重点关注的技术难题。

在 OpenWrt/iStoreOS 系统上部署 CUPS 打印服务器的标准步骤为:

第一步,SSH 登录路由器,运行 opkg update && opkg install cups cups-bjnp cups-filters kmod-usb-printer 以打好底层内核打印驱动;

第二步,将打印机通电并连接至路由器 USB 接口,确认 /dev/usb/lp0 设备节点已生成;

第三步,登录 CUPS 后台(http://ip:631),在 Administration 中添加打印机并勾选 Share This Printer,在 Make(品牌)处务必选择 Raw,在 Model(驱动)处选择 Raw Queue(以防路由器因解析渲染任务导致 CPU 占满而死机变砖);

第四步,在 Windows 等客户端上手动添加打印机地址(格式为 http://ip:631/printers/打印机名称)并导入本地客户端驱动即可。对于 HP LaserJet 1020 等需每次上传冷启动固件的 GDI 打印机,则需额外在 /etc/hotplug.d/usb/ 目录下编写热插拔自动灌入固件脚本以确保开机立用。


OpenWrt CUPS print server
OpenWrt/iStoreOS 安装 CUPS 共享打印服务


一、为什么选择 CUPS?它与 p910nd 有什么区别?

在 OpenWrt 共享 USB 打印机,通常有两种主流方案:

  1. p910nd 极轻量服务:它是一个超小型的打印机数据转发守护进程,只占用几十 KB 内存,不进行任何协议解析,单纯监听 9100 端口并把数据转发给 USB 口。
  2. CUPS 网页管理服务:它是一个功能完整的打印系统,自带 Web UI 管理界面,原生支持 IPP/AirPrint 协议,能够让 iOS、Android、macOS 设备直接在局域网内免驱发现打印机,具有更高级的安全控制和队列管理能力。

💡 选型建议:如果您的路由器内存小于 128MB 且不需要手机 AirPrint 打印,建议使用 p910nd。如果您的路由器内存充足(256MB 或以上)且希望获得完善的多端无线打印体验,CUPS 是无可争议的最佳选择。


二、OpenWrt/iStoreOS 手动部署 CUPS 流程

第一步:安装系统内核打印支持

使用 SSH 工具(如 PuTTY、Termius)或者网页自带终端登录路由器,运行以下命令安装基础组件:

BASH
opkg update
opkg install cups cups-client cups-filters kmod-usb-printer cups-backend-usb usbutils

第二步:物理连接与检测

  1. 用 USB 打印机线连接打印机与路由器的 USB 接口,并确保打印机电源已经打开。
  2. 在 SSH 终端中输入以下命令进行检测:
    BASH
    # 查看 USB 设备列表,确认您的打印机芯片已被识别
    lsusb
    
    # 查看是否已成功生成打印机字符设备节点
    ls -la /dev/usb/lp0
    如果显示 crw-rw---- 1 root lpt ... /dev/usb/lp0,说明内核已成功捕捉到打印机设备。

第三步:在 iStoreOS 中一键安装(备选)

如果您使用的是 iStoreOS,则无需在命令行手动跑 opkg 命令。只需登录 Web 后台,在 「iStore 软件商城」 搜索 CUPS打印服务,点击一键安装,并在「服务 -> CUPS打印服务」中勾选启用即可。


三、CUPS Web 界面详细配置 (避坑重点)

  1. 进入控制台: 在浏览器输入 http://您的路由器IP:631
  2. 进入管理页面: 点击顶部导航栏的 「Administration」。此时浏览器会弹出账密登录提示,请输入您的路由器超级管理员账号 root 和对应的登录密码。
  3. 添加打印机: 点击 「Add Printer」 按钮,系统会扫描 USB 口。在 Local Printers 中会显示检测到的打印机名称(例如 HP LaserJet 1020),选中它并点击 「Continue」
  4. 设置共享选项: 自定义打印机的 Name、Description,并在下方勾选 「Sharing: Share This Printer」,点击 Continue。
  5. 🔥 避坑:配置 Raw 队列模式(核心操作): 在接下来的驱动匹配页面中:
    • Make 列表中选择 Raw,点击 Continue。
    • Model 列表中选择 Raw Queue (en)
    • 点击 「Add Printer」 确认。
    • 最后在选项设置中点击 「Set Default Options」 确认。

⚠️ 为什么必须选择 Raw 模式? 普通路由器的 MIPS 或 ARM 芯片算力非常弱,内存也极其有限。如果我们在 CUPS 中为打印机安装了复杂的 PostScript 或 PPD 渲染驱动,当客户端发送一个包含几十兆图片的 PDF 打印任务时,路由器会在本地尝试对图像进行重渲染和栅格化处理,这会瞬间把 CPU 占满到 100%,内存爆满,进而导致路由器由于 OOM 崩溃无限重启。 选择 Raw (原始模式) 之后,软路由只做一个纯粹的管道转发,把客户端(电脑/手机)本地渲染好的打印数据原封不动丢给打印机,省电省资源,且速度极快。


四、针对 GDI / 宿主式打印机冷启动变砖避坑 (EEAT 特色)

很多经典且保有量极高的老打印机(如 HP LaserJet 1020 / 1005 / 1007 / P1008,以及 Canon LBP2900 / 3000 等)采用的是 GDI (Host-based) 协议。这些打印机为了压低生产成本,内部没有集成昂贵的固件 ROM 芯片。它们在每次断电开机时,内存中是一片空白的,必须由连接它的主机向它注入一段驱动固件(通常是 .dl 后缀文件),打印机才能正常初始化并开始工作。

如果您把 HP 1020 插上 OpenWrt 却怎么发指令都不打印,就是因为没有给它喂入固件。

【自动热插拔固件脚本配置方案】

  1. 获取固件文件: 以 HP 1020 为例,其官方固件文件为 sihp1020.dl。您可以在安装了 HPLIP 插件的 Linux 主机或网上搜索下载到该文件。
  2. 上传到路由器: 使用 SCP 或 WinSCP 等工具,将 sihp1020.dl 文件上传到路由器的 /lib/firmware/ 目录下。
  3. 编写 Hotplug 触发脚本: 为了在打印机每次开启电源或重新插拔 USB 线时自动发送固件,需要在软路由中配置热拔插脚本。在终端中运行:
    BASH
    vi /etc/hotplug.d/usb/30-hplj1020
    粘贴以下脚本内容:
    BASH
    #!/bin/sh
    # 这里的 3f0/2b17/100 是 HP 1020 的 USB 产品标识符,可以通过 lsusb 命令查看并替换
    if [ "$PRODUCT" = "3f0/2b17/100" ]; then
        if [ "$ACTION" = "add" ]; then
            # 等待系统lp0设备节点稳定生成
            sleep 3
            if [ -c /dev/usb/lp0 ]; then
                # 往 lp0 灌入固件
                cat /lib/firmware/sihp1020.dl > /dev/usb/lp0
                logger -t "CUPS-Hotplug" "Firmware loaded successfully to HP 1020"
            fi
        fi
    fi
  4. 赋予执行权限
    BASH
    chmod +x /etc/hotplug.d/usb/30-hplj1020
    配置好后,每次打开打印机电源,打印机内部指示灯会闪烁几秒,表示固件加载成功,即可开始打印。

五、客户端如何连接共享打印机?

1. Windows 系统连接配置

  1. 打开 Windows 设置 -> 蓝牙和其他设备 -> 打印机和扫描仪
  2. 点击 「添加设备」,等待几秒后点击最下方的 「我需要的打印机不在列表中 (手动添加)」
  3. 选中 「按名称选择共享打印机」,在文本框中输入您在 CUPS 复制的打印机 HTTP 地址,例如: http://192.168.1.1:631/printers/hp1020 (请替换为您的软路由 IP 和实际打印机队列名称)。
  4. 点击下一步,系统会要求您选择驱动程序。在此步骤中,选择您的打印机官方 Windows 驱动安装即可(因为软路由使用了 Raw 转发,真实的驱动渲染完全在您的 Windows 本地进行)。

2. Apple iOS / macOS 的 AirPrint 配置

为了让苹果设备在不装驱动的情况下实现一键无线打印,我们需要在 OpenWrt 上部署 Avahi 广播服务:

BASH
opkg install avahi-dbus-daemon
/etc/init.d/avahi-daemon enable
/etc/init.d/avahi-daemon start

并在 CUPS 配置文件 /etc/cups/cupsd.conf 中,确保以下两行被正确配置并开启:

TEXT
Port 631
BrowseWebIF Yes
BrowseLocalProtocols dnssd

随后重启 cups 服务(/etc/init.d/cupsd restart)。此时,您用 iPhone 连接家庭 Wi-Fi 并点击文档的“共享->打印”,就能自动发现这台连接在软路由上的老旧 USB 打印机,实现完美的移动端无缝打印。


六、总结

在 OpenWrt 或 iStoreOS 上利用 CUPS 搭载打印机服务器,可以低成本地实现局域网甚至外网(配合 VPN / 异地组网)无线打印。配置过程中的关键在于避开高算力的本地驱动,果断选择 Raw 队列模式,并通过 Hotplug 自动脚本为 GDI 打印机载入冷启动固件

如果您想深入了解软路由的系统美化与核心插件的运行稳定性,强烈推荐参考以下精品教程:

版权声明

作者: 易邦

链接: https://e8k.net/posts/openwrt-cups/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。