群晖通过Docker运行CUPS实现AirPrint和安卓无线打印(理论支持Unix和类Unix系统)

技术渣 2021年07月08日

前言

我的打印机是佳能MP288,通过USB连接群晖,虽然可以无线打印,但在通过群晖内置的打印功能打印的时候很慢,经过折腾发现是群晖误将传统打印机认为是网络打印机了,出现了spooling假脱机的现象(此现象在OpenWrt上也出现了)。后发现群晖内置的是阉割版CUPS,并没有给WebInterface。因此无法进行更详细的配置,所以这个教程的大致思路是将群晖内置的CUPS停用,并通过共享usb介质利用docker中的完整版CUPS解决上述的问题。如果你的打印机在群晖上工作很出色,那么请忽略此教程。

由于群晖是基于Linux系统的,CUPS是Apple开发的开源项目,因此此教程理论上支持Unix和类Unix操作系统(如果性能够的话,OpenWrt理论也能用)安装打印机并实现无线打印功能。具体请自行测试。

过程

  1. 通过套件中心下载Docker,这是一个潘多拉魔盒。

  2. 创建共享文件夹docker,创建目录如下述目录树所示。

    image-20210708115938472

  3. 打开ssh,使用sudo -i

  4. 执行下述命令,禁用群晖自带CUPS(如无自带CUPS,可以跳过)

    synoservicecfg--hard-stop cupsd
    synoservicecfg --hard-stop cups-lpd
    synoservicectl --stop cupsd
    synoservicectl --stop cups-lpd
    

    并将上面的命令添加到计划任务,让它开机自动运行。

    【2021年7月10日更新】

    上述方法比较繁琐,可以直接修改/etc/cups/cupsd.conf将监听端口从631修改到其他不需要用到的端口,比如632,让它不要干扰我们Docker里面的CUPS工作,重启即可。

  5. 执行下述命令,下载并启动容器。

    其中CUPS_USER_ADMIN的值设置成登陆的账户名,

    CUPS_USER_PASSWORD是登陆的密码。

    账户名和密码请设置成得比较复杂,或者在设置完成后关闭WebInterface避免被恶意侵入。

    docker run -d --name=airprint \
    --net="host" \
    --privileged=true \
    -e "CUPS_USER_ADMIN"="admin" \
    -e "CUPS_USER_PASSWORD"="pass" \
    -e TZ="Asia/Shanghai" \
    -e HOST_OS="Synology" \
    -e "TCP_PORT_631"="631" \
    -v "/volume1/docker/airprint/config":"/config" \
    -v /dev:/dev \
    -v "/volume1/docker/airprint/avahi":"/etc/avahi/services" \
    -v /var/run/dbus:/var/run/dbus \
    "mnbf9rca/cups-google-print"
    
  6. 打开http://NAS的IP地址:631使用设置的账号密码登陆。

    (如果和我一样遇到了循环登陆的问题,则将docker/config/cups/cupsd.conf文件备份并将文件内的WebInterface修改为OnDefaultAuthType设置成None,并将文件内任何Request开头的行注释或删除,重启容器即可无需密码登入。但请记住,这样操作会给系统带来巨大风险,请在配置完成后及时替换回原来的文件并重启容器,或将DefaultAuthType设置为Basic并将WebInterface置为Off并重启容器。)

  7. USB连接打印机,并选中Administration->AddPrinter。

    image-20210708121616057

  8. 选择Local Printers上连接的打印机,Continue。

    image-20210708121818491

  9. 勾选Share This Printer,向网络共享打印机(此是无线打印的关键),Continue。

    image-20210708121940423

  10. 选择相应的驱动程序。本文使用的CUPS镜像已经内置大多数打印机驱动,一般是能搜到的。下图是macOS下的CUPS,只安装了这一个驱动。Add Printer。

    image-20210708122006546

  11. 大功告成。测试无线打印。如先前打印速度慢,可以找一张图片试试,是不是变快了。

  12. 为了安全起见,请关闭WebInterface。将docker/config/cups/cupsd.conf文件备份并将文件内的WebInterface修改为Off。如先前修改过无密码登陆,请将备份的文件替换回去。

  13. 重启容器。

写在后面

其实以前装过的Linux系统中,除了Deepin还是Ubuntu(记不清了),貌似都有打印慢的问题,而且没有无线打印。貌似内置的还是CUPS,理论上也可通过上述教程选择性修改系统上部分配置解决。另外Docker镜像也是一个不错的解决方案。