前言
家里的 USB 打印机通常只能连接电脑使用,如果电脑关机,其他设备就无法打印。
通过在群晖 NAS 上部署 CUPS(Common UNIX Printing System)和 Avahi,可以将普通 USB 打印机转换成局域网打印机,实现:
iPhone / iPad 使用 AirPrint 无线打印
Windows 添加网络打印机
家庭多设备共享一台 USB 打印机
不过,在群晖双网口环境下,部署过程中有一个容易忽略的问题:
CUPS 可以正常运行,打印机也可以添加,但是 iPhone 搜不到 AirPrint。
这个问题通常不是打印机驱动问题,而是:
mDNS(Bonjour / AirPrint)广播接口和 Docker CUPS 所在网络接口不一致。
本文记录完整部署过程以及双网口环境下的正确配置方式。
一、环境介绍
本文使用环境:
群晖 NAS
双网口:
ovs_eth0
ovs_eth1NAS 地址:
192.168.11.6打印机
USB 连接群晖:
HP DeskJet 2130 series网络环境
普通家庭局域网:
192.168.11.0/24所有设备:
手机
电脑
路由器
NAS
都在同一个局域网。
注意:
这里的重点不是手机连接哪个网口,而是:
Docker CUPS 使用哪个 NAS 网口,AirPrint 广播就需要从对应网口发出。
二、为什么不用 Docker host 网络?
很多教程会直接使用:
--network host但是群晖 DSM 本身已经运行 CUPS 服务。
查看:
netstat -lntp | grep 631可以看到:
/usr/bin/cupsd监听 631 端口。
如果 Docker 再使用 host 网络:
DSM CUPS
+
Docker CUPS两个服务会竞争:
192.168.11.6:631导致:
打开的页面不是 Docker CUPS
配置混乱
AirPrint 服务无法确定来源
因此采用 macvlan 给 Docker CUPS 分配独立 IP。
三、使用 macvlan 创建独立 IP
最终规划:
群晖 NAS:
192.168.11.6
Docker CUPS:
192.168.11.20这样:
访问:
http://192.168.11.20:631进入 Docker CUPS。
四、双网口最大的坑:macvlan 和 Avahi 广播接口
群晖双网口:
ovs_eth0
ovs_eth1两个网口虽然都连接同一个局域网,但是 Docker macvlan 必须绑定正确接口。
例如:
Docker CUPS 使用:
ovs_eth1那么:
macvlan parent 必须是 ovs_eth1
Avahi 广播接口也必须是 ovs_eth1
否则:
可能出现:
CUPS 页面正常
打印机添加成功
Windows 可以发现
iPhone 搜不到 AirPrint
原因:
AirPrint 使用 mDNS 广播。
如果广播从错误网口发送,手机无法发现服务。
创建 macvlan:
docker network create -d macvlan \
--subnet=192.168.11.0/24 \
--gateway=192.168.11.1 \
-o parent=ovs_eth1 \
cups_net检查:
docker network inspect cups_net确认:
"parent": "ovs_eth1"五、拉取 CUPS AirPrint 镜像
Docker Hub 国内访问可能不稳定,可以使用镜像代理:
docker pull dockerproxy.net/jichangfeng/cups-airprint:latest确认:
docker images | grep cups-airprint六、创建 CUPS AirPrint 容器
创建配置目录:
mkdir -p /volume1/docker/cups-airprint/etc-cups运行:
docker run -d \
--name cups-airprint \
--restart always \
--network cups_net \
--ip 192.168.11.20 \
--privileged \
-v /dev/bus/usb:/dev/bus/usb \
-v /volume1/docker/cups-airprint/etc-cups:/etc/cups \
-e TZ=Asia/Shanghai \
dockerproxy.net/jichangfeng/cups-airprint:latest查看:
docker ps | grep cups七、进入 CUPS 管理页面
浏览器访问:
http://192.168.11.20:631注意:
不要访问:
http://192.168.11.6:631因为:
192.168.11.6是群晖 DSM 自带 CUPS。
如果出现:
Web Interface is Disabled进入容器:
docker exec -it cups-airprint sh执行:
cupsctl WebInterface=yes检查:
cupsctl | grep WebInterface显示:
WebInterface=yes即可。
八、添加 HP USB 打印机
进入:
Administration
→ Add Printer选择:
HP DeskJet 2130 series USB CN78J4721W065Y HPLIP不要选择普通:
HP DeskJet 2130 series原因:
HPLIP 驱动提供更好的 HP 打印支持。
选择驱动:
HP DeskJet 2130 Series hpcups保存。
开启:
Share This Printer九、检查打印机状态
进入容器:
docker exec -it cups-airprint sh查看:
lpstat -p -d正常:
printer HP2130 is idle说明 CUPS 已经识别打印机。
十、配置 Avahi AirPrint 广播
AirPrint 依赖:
mDNS / BonjourLinux 使用:
Avahi进行广播。
双网口环境重点:
查看:
cat /etc/avahi/avahi-daemon.conf设置:
[server]
allow-interfaces=ovs_eth1这里的含义:
不是选择手机所在网络。
而是:
让 Avahi 从 Docker CUPS 所绑定的网口发送 AirPrint 广播。
检查:
avahi-browse -a | grep AirPrint正常:
AirPrint HP_DeskJet_2130_series十一、常见问题
1. 打开 192.168.11.6:631
看到:
Web Interface is Disabled原因:
访问的是 DSM 自带 CUPS。
解决:
访问:
192.168.11.20:6312. CUPS 正常,但是手机搜索不到打印机
检查三个地方:
Docker macvlan:
docker network inspect cups_net确认:
parent=ovs_eth1Avahi:
确认:
allow-interfaces=ovs_eth1不要混用网口:
错误:
Docker CUPS → ovs_eth1
Avahi → ovs_eth0正确:
Docker CUPS → ovs_eth1
Avahi → ovs_eth13. 不要映射 /etc/avahi
不要:
-v xxx:/etc/avahi因为空目录会覆盖容器内部 Avahi 配置。
只需要保存:
/etc/cups即可。
十二、最终效果
完成后:
家庭局域网
手机 / 电脑
|
路由器
|
群晖 NAS
192.168.11.6
|
ovs_eth1
|
macvlan
|
Docker CUPS
192.168.11.20:631
|
USB打印机
HP DeskJet 2130手机:
照片
→ 分享
→ 打印即可找到打印机。
总结
群晖双网口部署 CUPS AirPrint,真正需要注意的不是安装 CUPS,而是:
DSM 自带 CUPS 会占用 631 端口,不能使用 host 网络;
Docker 使用 macvlan 获取独立 IP;
macvlan 绑定的网口必须正确;
Avahi AirPrint 广播接口必须和 CUPS 网络接口一致。
只要保证:
CUPS 网络接口
=
macvlan parent接口
=
Avahi广播接口普通 USB 打印机也可以稳定升级成支持 iPhone AirPrint 的无线打印机。