夜雨聆风学习资料网

ARTICLE · 1044786

打印机又被一台电脑绑架?NAS上跑个免费打印服务,全家随手打

打印机又被一台电脑绑架?NAS上跑个免费打印服务,全家随手打

家里那台打印机,USB 线一头插电脑、一头插打印机,从搬来那天起就没挪过窝。

谁想打印谁就得坐那台电脑前。家里人想打印个东西,得先问那台电脑开没开;换台电脑用,打印机拔下来重新插,驱动又得在这台电脑上装一遍。一台打印机被一台电脑死死绑住。(虽然可以共享,但是也得开机才行)

说明书上写着「支持无线打印」——其实那只是能连路由器,不代表别的设备能直接找到它。Windows 加一次还得输 IP 装驱动;iPhone 想连?隔空打印搜半天找不到,最后只能微信转发到电脑再手动打。

群晖原生支持。DSM 套件中心里有两个官方套件,USB Printer Manager 管 USB 打印机,Network Printer Manager 管局域网里的网络打印机,装上之后控制面板里就能直接添加、共享打印机,系统本身就自带 cupsd 服务,不用碰 Docker,也不用去找第三方镜像。不过原生套件的驱动支持有限,官方兼容列表之外的机型不一定认,这也是不少群晖用户最后还是去搭容器版本的原因。

飞牛这块暂时还没支持。论坛上建议增加原生打印服务的帖子,官方回复基本都是「这个需求先记录下来,会根据评估结果推进」,至今没有明确时间表。所以现在用飞牛的,只能自己用 Docker 搭。

NAS 是家里唯一 24 小时开机的设备,本来就是给全家共享文件用的,凭什么不让它顺手把打印机也接管了?

我现在的方案:在 NAS 上用 Docker 跑一个网页打印服务,把打印机插到 NAS 上,让 NAS 变成打印服务器。全家任何设备——iPhone、iPad、Mac、Windows、安卓、电视盒子——都当成它是一台网络打印机,直接搜、直接打。USB 线只插一次,从此不挪窝。

它到底是什么

这个方案的核心叫 CUPS,全称 Common Unix Printing System,Linux 系统里标准的打印服务。它做两件事:

一是管理打印机。 NAS 插上打印机,CUPS 给它分配一个打印机名字、加载对应的驱动(PPD 文件),处理打印任务。

二是把这台打印机暴露给局域网。 CUPS 用 IPP 协议对外提供打印接口,端口是 631。配合 Avahi(mDNS 服务),家里的设备在搜索打印机时能自动发现它。iPhone 上的「隔空打印」就是靠 mDNS 找到 CUPS,然后走 IPP 送打印任务。

理解了这个,NAS 装 CUPS 的逻辑就清楚了:让 NAS 承担打印服务器角色,代替原来那台连着 USB 线的电脑。

我用的这个项目叫 CUPS Web,把 CUPS 和一套中文网页界面打进了同一个容器,GitHub 上一千多颗星,MIT 协议完全开源,今天还刚发了 v0.2.12。它最大的好处是驱动预装齐了——镜像里出厂就装了一堆常见品牌驱动,HP、Canon、Epson、Brother 这些主流品牌,包括爱普生、佳能激光机、惠普 1020 的固件都打包好了,不用再去官网一个个翻 Linux 驱动包下载。amd64、arm64、armv7 三种架构都覆盖,飞牛无论 x86 还是 ARM 版本都能跑。

选打印机、传文件、看打印记录

部署:一个容器搞定

我的 NAS 是飞牛 OS,系统自带 Docker 和 Docker Compose。威联通、绿联、极空间这些系统也都有 Docker,方法大同小异。

在文件管理里建一个 docker/cups-web 文件夹,放进去两个文件。

第一个是 docker-compose.yml

services:  cups:    image: hanxi/cups-web:latest    container_name: cups    user: root    hostname: CUPS    network_mode: host    security_opt:      - apparmor:unconfined    environment:      - CUPSADMIN=print      - CUPSPASSWORD=你的强密码      - TZ=Asia/Shanghai      - LISTEN_ADDR=:1180    volumes:      - ./.etc:/etc/cups      - ./.data:/data      - ./.uploads:/uploads      - ./.drivers:/opt/cups-drivers/data      - /dev/bus/usb:/dev/bus/usb      - /run/udev:/run/udev:ro    device_cgroup_rules:      - 'c 189:* rmw'    privileged: true    restart: unless-stopped

第二个是同目录下的 .env,可选,用来覆盖上面的默认值:

CUPSADMIN=printCUPSPASSWORD=你的强密码TZ=Asia/ShanghaiLISTEN_ADDR=:1180

cd 到那个目录,执行:

docker compose up -d

等一两分钟,浏览器输入 http://你的 NAS IP:1180,就能看到网页界面了。默认账号是 print,密码就是 .env 里设的那个。第一次登录建议先去改个强密码——这个 Web 后台的 admin 密码等于容器的 root 权限,别拿默认密码直接挂外网。

几个关键参数解释一下,这几个是真正踩过的:

  • network_mode: host
    必选。CUPS 要暴露 631 端口,同时让 mDNS 广播能出去。桥接网络模式会拦组播报文,iPhone 上就发现不了打印机。代价是端口没法自定义映射,CUPS 固定占用宿主 631,Web 端口由 LISTEN_ADDR 决定。
  • user: root
    必选。容器里要跑 cupsd、lpadmin、装驱动,还要往系统路径写驱动文件。改成非 root 后,CUPS 的 USB 后端会降权运行,表现是队列永久卡在 「Waiting for printer to become available」。
  • - /dev/bus/usb:/dev/bus/usb
    :挂载整个 USB 目录而不是单个设备。设备节点挂载是启动时一次性绑定,打印机后开机时新节点不会传播进容器;目录挂载能实时反映新建节点,配合下面那行实现热插拔。
  • - /run/udev:/run/udev:ro
    :让 libusb 读到设备属性,改善识别。
  • privileged: true
    :x86 平台上面那两行通常够了,但 ARM、嵌入式平台(树莓派、各类 TV Box)的非特权容器里 /sys 是过滤视图,libusb 拿不到设备列表。开特权能一劳永逸。
  • LISTEN_ADDR=:1180
    :host 网络下没有端口映射,这一行决定 Web 界面监听哪个端口。默认 1180,跟旧的桥接方案保持一致,老书签不用改。

添加打印机

容器起来后,浏览器打开 http://你的 NAS IP:631,这是 CUPS 自己的管理后台,用刚才那组账号密码登录。

点 Administration → Add Printer,从识别到的 USB 设备里选你的打印机,一定要勾上「Share this printer」(不勾局域网其他设备就找不到),然后选驱动。这个镜像预装了海量驱动,绝大多数机型能直接选到对应型号;找不到精确型号的,选 IPP Everywhere 通用驱动,新款支持 AirPrint 的打印机走这条路就够了。

老古董打印机如果列表里没有,去品牌官网搜型号下载 Linux 版驱动包,在 CUPS 里选「Choose a Different Printer」上传 PPD 文件。实在找不到驱动的最后手段是选 Generic → Raw → Raw Queue,走光栅化打印,能用但只能打位图,彩色和缩放这些高级选项都不生效。

加完记得回到 CUPS 后台,确认这台打印机是 Shared 状态,否则网页端发现不了。

测试页打出来,就说明 CUPS 这一层通了。接下来是网页端打印。

日常怎么用

回到 http://NAS IP:1180,网页打印界面。

选打印机、拖文件上去,支持 PDF、图片(JPG/PNG/GIF/HEIC)、Office 文档(doc/xls/ppt 全家桶)、OFD、纯文本。Office 和 OFD 会自动转成 PDF,图片支持多张合并成一份。转完直接给个预览,能看到最终打印效果再下手。

预览页能切纵向横向、看纸张规格,确认排版没问题就往下走。

彩色/双面/份数/纸张/缩放/镜像

打印参数页该调的都有:彩色/黑白、纵向/横向、双面(默认单面)、份数、纸张大小、纸张类型、缩放(适应纸张)、页面范围(比如 1-5 8 这种跳页)、镜像打印。右下角还有打印机状态——空闲/忙、队列任务数、纸盒信息,缺纸了一眼能看出来。

打印记录自动留存,每条都记着文件名、打印机、页数、时间,谁打的什么一目了然。

用户管理和打印记录查询

需要多人用的话,管理后台能建多个用户、分角色、记联系人电话邮箱,打印记录按用户名和时间范围过滤。还有个数据保留策略,设个天数,过期记录和上传文件自动清理,省得 .uploads 目录越堆越大。

让全家设备连上它

打印机加完,接下来是让家里设备能找到它。

iPhone / iPad(隔空打印):系统自带,不用装 App。打开要打印的文档 → 分享 → 打印 → 选打印机。第一次搜不到的话,确认两件事:手机和 NAS 在同一个 Wi-Fi 网段(访客网络不行),NAS 防火墙放行了 631 端口。

Mac:系统设置 → 打印机与扫描仪 → 点「+」→ 协议选「Internet Printing Protocol (IPP)」→ 地址填 NAS 的 IP、端口 631 → 队列填 printers/你的打印机名

Windows 10/11:设置 → 蓝牙和设备 → 打印机和扫描仪 → 添加设备 → 我需要的打印机未列出 → 使用 TCP/IP 地址或主机名 → 主机名填 http://NAS IP:631/printers/你的打印机名。装驱动时 Windows 会自己去微软驱动库找,找不到就手动从打印机官网下。

安卓:原生打印依赖 Google Play 服务,各家 ROM 都阉割了。装一个叫「PrintShare」或「PrinterShare」的第三方 App,走 IPP 协议连 NAS 上的 CUPS。

电视盒子 / 智能电视:部分系统自带打印功能(比如小米电视的「打印到」),走 mDNS 广播,能发现就直接用。发现不了就是 ROM 阉割了打印协议支持,改不了。

我踩的坑

坑一:宿主的 avahi 和容器里的抢 5353。 这个镜像内部自带 avahi 来广播 AirPrint,如果 NAS 系统上本身还开着 avahi-daemon,两边会抢 5353 端口,表现是 iPhone 隔空打印搜不到。部署前把宿主侧的 avahi-daemon 停掉就行,容器内自己会起。

坑二:631 端口打不开。 飞牛的防火墙默认没放行 631。在控制面板 → 安全 → 防火墙里把 631 加到允许规则里,或者 SSH 进 root 执行:

iptables -A INPUT -p tcp --dport 631 -j ACCEPT

坑三:打印机关电再开机,CUPS 认不到。 老式 USB 打印机(比如惠普 1020、佳能 LBP 系列)插拔的时候,CUPS 不会自动热插拔。打印机关机重启后,SSH 进 NAS 执行 docker restart cups 重扫一次,或者在容器里加监控脚本监听设备节点。新款支持 IPP Everywhere 的网络打印机没这个问题,连的都是网线不是 USB。

坑四:飞牛拉镜像慢。 这个镜像预装了一堆驱动和 LibreOffice,体积不小,国内直接拉 Docker Hub 经常超时。在 Docker 配置里加个镜像加速器,或者换个能用的镜像源,拉完就快了。

坑五:iPhone 上 AirPrint 只看到 Letter 看不到 A4。 这是 CUPS 老问题——镜像 locale 是 C 时默认按 Letter 走,A4 不出现在 iOS 面板里。这个镜像已经在启动脚本里修了(cupsd.conf 里补了 ReadyPaperSizes,HP 1020 的 PPD 默认纸张也自动切 A4),属于已修问题,提一句是为了让之前踩过坑的人知道不用再折腾了。

进阶:想要微信云打印

局域网内打印够用了,但人出差在外、手机里有份合同要打印,AirPrint 靠 mDNS 广播,出了家门就不通。

社区有个叫「互维云+」的方案,基于另一个开源项目 cloud-printer,把 CUPS 通过微信小程序接入。人在外面打开微信,搜小程序、绑设备 ID,选文件、设参数、点打印,任务就送到 NAS 上的打印机。

部署上再跑一个容器,从日志里取设备 ID,去微信小程序里绑定就行。但说实话这个方案成熟度低不少——GitHub 上才个位数星,论坛里用户反馈过容器启动后直接退出、ARM 镜像跑不起来、设备 ID 绑定不上需要联系管理员这类问题。想用的话先去 GitHub 看一眼最近提交时间,确认项目还活着再上手。

一句话总结

家里那台老打印机别再被一台电脑绑架了。直接在 NAS 上 Docker 跑一个网页打印服务,打印机插 NAS,全家设备都能找到它、连上它、打印它。驱动预装齐、单容器、中文界面、网页传文件带预览,折腾一次配好,之后打印机就是全家的公共设备。

你家的打印机现在怎么共享?是插一台电脑,还是搞了独立打印服务器?评论区聊聊 👇

点个关注不迷路 👆

相关学习资料