先把结论放这儿:HP DeskJet 1212这台机器出厂就带Wi-Fi和固件级AirPrint支持,但实际用起来经常是“能用但不稳”。手机隔三差五找不到打印机、换了路由器就要重新配网、打印任务发起后打印机在休眠状态里半天没反应,这些都是入门级喷墨一体机的通病。我后来腾出一台常年开机的Linux小主机,通过CUPS把1212重新包装成一台标准AirPrint打印机,iPhone、iPad、Mac、Windows乃至其他Linux设备都能稳定走同一个打印通道,彻底摆脱了厂商App的反复引导。这篇文章就是按我实际动手的顺序,完整记录HP DeskJet 1212配置CUPS实现AirPrint无线打印的全过程,包括环境部署、驱动选型、Web后台操作、mDNS广播原理,以及统信、麒麟这些系统上最容易踩的几个CUPS坑。
1. 先把无线打印这层逻辑拆清楚:1212、CUPS、AirPrint各自该干什么
1.1 DeskJet 1212自带的“无线”其实很基础
HP DeskJet 1212在中国市场定位就是入门家用机,价格便宜,功能上打印、复印、扫描都有,适合放家里或者小型办公室。它的无线连接方式主要是2.4GHz Wi-Fi,不支持蓝牙,机身也没有液晶屏,第一次配网只能靠两种途径:一个是按路由器上的WPS键做快速配对,另一个是通过HP Smart应用给打印机下发Wi-Fi配置。
这两种方式本身没毛病,但问题出在稳定性和后续策略上。打印机固件里确实有AirPrint的广播服务,可机身的处理器和内存非常有限,它能在网络上保持mDNS广播,不代表它能持续稳定地响应打印任务。我在实际使用中遇到的情况是:白天空闲一阵子后,打印机进入深度休眠,iPhone上的打印列表里直接搜不到它;有时候搜得到,打印任务发过去之后又卡在队列里,必须等打印机自己睡醒才能出纸。这种体验对入门级喷墨机来说太正常了。
1.2 CUPS在中间扮演的角色
CUPS,全称Common Unix Printing System,是Linux和macOS上通用的打印调度服务。它在网络里的作用可以理解成一个快递中转站:所有打印任务先发给CUPS,CUPS负责把任务排队、转换成打印机认识的页面描述语言、再发送给打印机,同时还要向外广播打印机的存在。
当我们说“把1212变成AirPrint打印机”时,本质上不是去魔改打印机固件,而是在Linux主机上让CUPS接管打印机的对外服务。苹果设备通过Bonjour/mDNS发现的是CUPS,打印任务也先到CUPS的队列里,再由CUPS通过驱动或IPP协议转交给1212。这样做的直接好处是:打印任务的调度、重试、日志、权限管理都跑在性能更好的Linux主机上,而不是挤在打印机那点可怜的内存里。
1.3 什么场景才需要加装CUPS打印服务器
不是所有人都需要单独搭一个CUPS服务器,但下面几类情况确实值得做:
- 打印机原生AirPrint不稳定,或者打印机在无线网络里经常“消失”。
- 家里有多个平台的设备,iOS、Android、Windows、Linux都可能有打印需求,希望统一入口管理。
- 老电脑或闲置小主机正好闲着,花二十分钟配置一下就能彻底解决全家的打印问题。
- 你用的是统信UOS、麒麟这类国产Linux桌面系统,打印服务本身就和CUPS深度绑定,理解CUPS的工作方式等于理解了系统“打印服务”这一整套逻辑。
这第4点很关键。很多人在统信、麒麟系统里折腾打印机,看到“CUPS服务器未运行”“CUPS默认密码错误”这些提示就懵了,其实都是同一个东西在不同发行版上的表现差异。
2. 环境准备:装CUPS和HPLIP驱动时的“半套”坑
2.1 一次性装齐依赖而不是一个个碰运气
我在Ubuntu 22.04上操作,Debian系和基于Debian的国产系统基本通用。先更新源,然后一次性安装CUPS、avahi和HPLIP:
sudo apt update sudo apt install cups avahi-daemon avahi-utils hplip这里最容易犯的错是只装了cups,漏掉avahi-daemon。avahi是mDNS/Bonjour的具体实现,AirPrint的打印机发现机制依赖它。没有avahi-daemon,CUPS管得再好,iPhone那边也搜不到打印服务。所以严格来说,一个跑AirPrint服务的CUPS环境里,cups和avahi-daemon是必须同时存在的两个进程,缺一个都不行。
装完后设置开机自启并启动服务:
sudo systemctl enable --now cups sudo systemctl enable --now avahi-daemon这两个命令执行完,确认一下运行状态:
systemctl status cups systemctl status avahi-daemon看到active (running)才算第一步过关。
2.2 别忽略lpadmin用户组,否则后台密码永远不对
CUPS的后台登录不是用打印机自己的密码,而是用Linux系统的用户密码。但有一个隐藏条件:这个用户必须在lpadmin组里,否则即使密码正确,进入管理层后也没有权限添加或修改打印机。
把当前用户加进组:
sudo usermod -aG lpadmin $USER执行完一定要重新登录或者注销一次,组权限才能在当前会话生效。很多教程没提这一步,用户直接打开http://localhost:631,在认证框里输入正确的用户名和密码,却发现“没有权限执行此操作”,还以为密码记错了。其实纯粹是组权限问题。
2.3 防火墙和cupsd.conf:局域网能访问才是基础
CUPS装好后默认只监听本机的localhost:631。为了AirPrint设备能访问打印队列,必须让CUPS监听网络接口,并在防火墙放行对应端口。
修改/etc/cups/cupsd.conf,找到监听配置部分:
# 默认只有本机 Listen localhost:631 # 增加,监听所有网络接口 Port 631 Listen 0.0.0.0:631接着在Location部分确认局域网访问权限。我这里的配置是:
<Location /> Order allow,deny Allow localhost Allow @LOCAL </Location> <Location /admin> Order allow,deny Allow localhost Allow @LOCAL </Location>@LOCAL表示允许本地局域网的所有地址访问。保存后重启CUPS:
sudo systemctl restart cups防火墙这边,Ubuntu常用的是UFW:
sudo ufw allow 631/tcp sudo ufw allow 5353/udp631是CUPS的HTTP端口,5353是mDNS广播的端口。如果你用其他发行版,防火墙规则里放行这两个端口也是同样的原理。
2.4 驱动选型:hplip还是IPP Everywhere
HP DeskJet 1212在Linux下有两种驱动路线。第一是装HPLIP,它会提供完整的HP打印机驱动支持,在CUPS添加打印机时可以看到“HP DeskJet 1210 series, hpcups”这样的型号条目。第二是走IPP Everywhere,也就是所谓的driverless模式,不需要装特定驱动,让CUPS通过打印机的IPP能力自动协商参数。
我的建议是:如果CUPS的“添加打印机”页面里能直接发现1212,优先选择IPP Everywhere。原因很简单:1212本身支持AirPrint协议,而AirPrint的底层就是IPP,CUPS用driverless后端能直接对接,少一层专有驱动的转换,更稳定。
只有在自动发现不到,或者IPP Everywhere打出来格式不对时,才考虑回到HPLIP驱动。安装好HPLIP后,也可以用命令行工具进行打印机设置:
hp-setup -i它会交互式地搜索网络里的HP打印机,配置后自动添加到CUPS里。实测下来,HPLIP对1210系列的识别率不错,但比起IPP Everywhere,运行速度稍慢,占用资源也大一点。做打印服务器的话,优先轻量方案。
3. 把打印机注册进CUPS:Web后台完整配置流程
3.1 进入Web管理后台并完成认证
浏览器打开http://localhost:631,能正常显示CUPS界面就说明服务没问题。点“Administration”进入管理页,系统会弹出一个HTTP Basic认证框,要求输入Linux系统用户名和密码。
很多人到这里就会去搜索“CUPS默认密码是多少”,实际情况是CUPS压根没有独立的默认密码库。你输入的是操作系统的账号密码,并且该账号必须在lpadmin组里。用Ubuntu的root用户登录往往不行,因为Ubuntu的root默认没有密码;正确做法是使用自己平时登录系统的那个用户账号。
3.2 添加打印机的完整步骤
在Administration页面点击“Add Printer”,CUPS会自动扫描局域网里的打印机。如果DeskJet 1212已经连到同一个Wi-Fi,大概率会出现在“Discovered Network Printers”列表里,显示为“HP DeskJet 1210 series”后面跟着MAC地址。
选择它之后,会出现连接地址,通常是一段IPP地址,格式类似:
ipp://192.168.1.200/ipp/print如果你在局域网里给打印机配过静态IP,也可以手动添加这个地址。接着填写打印机名称、描述和位置。这里有个坑:打印机名称建议用简短无空格的英文,比如HP-DeskJet-1212,避免之后命令行操作时还要处理空格转义的问题。
下一步选择驱动程序。如果CUPS识别出来了,会直接建议“使用IPP Everywhere(driverless)”。如果你装了HPLIP,也可以在列表里手动选择“HP DeskJet 1210 series, hpcups”。两条路线我都试过,IPP Everywhere更稳。
最后一步勾选“Share This Printer”,这一步千万别漏掉,不勾选共享的话,局域网其他设备没法看到这个AirPrint队列。
3.3 共享与访问控制:让局域网设备真正看到队列
勾选了共享,还需要确认cupsd.conf里的权限规则覆盖了/printers路径。默认配置一般允许本机访问所有Location,但为了局域网设备能提交打印任务,加上下面这段更保险:
<Location /printers/> Order allow,deny Allow localhost Allow @LOCAL </Location>改完重启CUPS:
sudo systemctl restart cups3.4 打印测试页验证基本链路
添加完成后,回到打印机列表,点击这个打印机,选择“Print Test Page”。等待十几秒,如果打印机正常出纸,且测试页内容和页面结构没有乱码或错位,说明驱动链路没问题。
如果测试页卡住,先用命令查队列状态:
lpstat -t确认队列不是“disabled”或者“stopped”。队列状态异常时,先启用打印机:
sudo cupsenable HP-DeskJet-1212然后再重新发送测试任务。
4. 打通AirPrint的关键环节:avahi广播与mDNS服务发现
4.1 AirPrint背后的协议逻辑
AirPrint不是一种新协议,它是IPP打印协议加Bonjour服务发现的组合。苹果设备在局域网里通过mDNS/DNS-SD协议查询_ipp._tcp广播,找到可用的打印服务,然后通过IPP协议提交打印数据。
当我们把1212加入CUPS并设置为共享后,CUPS会自动注册一个IPP服务,由avahi-daemon负责在局域网里广播。也就是说,此时iPhone看到的“HP DeskJet 1210 series @ 主机名”打印队列,是CUPS在广播,而不是1212固件在广播。这也是为什么CUPS环境里avahi-daemon必须开机自启。
4.2 用avahi-browse验证服务是否真的在广播
配置完别急着拿手机试,先在Linux主机上确认mDNS广播已经生效:
avahi-browse -rt _ipp._tcp正常输出会显示一个或多个服务条目,其中包含你的打印机名称、主机名、IP地址和端口631。这里我踩过一次坑:输出里始终看不到打印机服务,排查了一圈发现是avahi-daemon虽然服务在跑,但系统里出现了多个网络接口,avahi默认绑定在一个非局域网接口上。解决办法是在/etc/avahi/avahi-daemon.conf里检查接口绑定配置,必要时指定allow-interfaces=eth0这样的参数。
如果avahi-browse能正常看到服务,而iPhone仍然搜不到打印机,就要考虑是不是路由器的AP隔离开启,导致仅允许多设备,但要阻止AP隔离,因为隔离状态下客户端mDNS无法互通。
4.3 固定IP和网络环境一样重要
打印机在局域网里依赖IP地址通信。如果路由器DHCP分配给打印机的地址经常变化,CUPS里的IPP后端可能会找不到打印机,表现为“打印任务发送失败”或“设备离线”。
我给1212设置固定IP的经验是在路由器后台做DHCP静态绑定,把打印机MAC地址固定到某个IP,比如192.168.1.200。这样CUPS队列里的后端地址始终不变,手机搜索打印服务也不会因为IP漂移而间歇性失败。
用命令行添加固定地址的队列也可以直接指定:
lpadmin -p HP-DeskJet-1212 -E -v ipp://192.168.1.200/ipp/print -m everywhere4.4 iPhone/Mac实测连接与打印
完成上述配置后,iPhone上打开一个文档,点分享菜单里的“打印”,等待一两秒就能看到名为“HP DeskJet 1210 series @ 主机名”的打印机队列。选它、设置份数和双面,点击打印即可。
Mac上更简单,系统设置里的“打印机与扫描仪”里点击“+”号,系统会自动发现AirPrint打印机列表,选择CUPS发布的那个队列就可以正常打印。打印时Mac会走IPP协议提交任务,CUPS再转交给1212,整个过程不需要额外安装HP驱动。
5. 高频故障排查:从CUPS服务未跑到打印任务卡死
5.1 统信UOS上报“CUPS服务器未运行”的排查链路
很多统信UOS用户打开打印设置时,会直接看到“CUPS服务器未运行”的提示。这里的排查路径很固定,按顺序来:
先看服务状态:
systemctl status cups如果提示Unit cups.service could not be found,说明CUPS根本没装,直接补装:
sudo apt install cups如果提示服务处于failed状态,看日志:
journalctl -u cups -n 50最常见的原因是DBus服务异常或者缺失运行时目录。重启一下相关服务:
sudo systemctl restart dbus cups还有一个容易被忽略的点:在部分精简版统信系统里,CUPS服务被设成了“masked”,即被屏蔽状态。解除屏蔽:
sudo systemctl unmask cups sudo systemctl enable --now cups5.2 CUPS后台“默认密码打不开”的真相
这个问题在搜索引擎里热度很高,核心误解是很多人认为CUPS后台有一个类似admin/admin的默认账号。实际上,CUPS的Web认证完全对接Linux系统的PAM认证,也就是说,浏览器里弹出的用户名密码,就是你Linux系统的用户名和密码。
在Ubuntu以及大多数桌面Linux上,root用户默认没有密码,所以不要试图用root去登录。正确做法是用一个已加入lpadmin组的普通用户登录。我之前就犯过这个错,用root登录一直提示认证失败,换成自己的日常用户账号后一次通过。
如果你确认用户名密码都对,但仍然进不去,检查一下是不是在远程用IP地址访问时被Location规则拦住了。远程访问时需要确认cupsd.conf里已经包含Allow @LOCAL,否则认证通过也会返回“Forbidden”。
5.3 奔图等国产打印机报“操作中出现一个错误成功”的处理
这个错误是典型的中文翻译灾难,“操作中出现一个错误”和“成功”同时出现在一句话里,自相矛盾,但实际原因通常是PPD驱动安装不完整或者打印机端到端协议协商失败。虽然这一篇的主角是HP 1212,但公网搜索引擎里这个报错跟“奔图+COPS”几乎绑定在一起,值得顺带说清楚。
按照我的经验,碰到这类错误先看奔图官网有没有提供Linux驱动包。很多国产打印机品牌虽然支持Linux系统,但驱动包更新节奏慢,经常出现适用于CUPS 2.2的PPD在CUPS 2.4上不兼容的情况。下载对应的驱动deb包后手动重新安装:
sudo dpkg -i pantum-*.deb sudo systemctl restart cups如果重装驱动后问题依旧,清理半残留的PPD文件:
ls /etc/cups/ppd/ sudo rm /etc/cups/ppd/Pantum-*.ppd然后在CUPS后台重新添加打印机。这条思路对绝大多数“操作中出现一个错误成功”都有效,本质就是让PPD重新生成。
5.4 麒麟系统重装CUPS后的权限与端口问题
麒麟系统重装CUPS的场景比较多见,重装之后用户最先遇到的就是所有打印队列全部消失,因为队列配置和PPD文件都存在/etc/cups/下面,被干净卸载时一并清理了。
我给出的重装策略是:
sudo apt purge cups cups-client cups-common cups-filters sudo apt install cups cups-client cups-common cups-filters重装后立刻检查三件事:
第一,当前用户是否还在lpadmin组:
groups $USER第二,CUPS是否正常监听端口:
ss -tlnp | grep 631第三,avahi-daemon有没有重新起来:
systemctl status avahi-daemon这三步检查做完,基本能定位麒麟系统里重装CUPS后“服务在跑但就是打不了”的问题。个别麒麟版本还会默认启用严格的安全策略,需要额外放行631端口的访问,这个在图形化安全设置里解除即可。
5.5 打印任务卡在“Pending/已停止”的通用处理
使用AirPrint时间长了,难免遇到队列里任务一直“Pending”不动,或者直接显示“已停止”。这种问题不一定是配置错误,多数是打印机休眠后CUPS未能及时唤醒设备。
先看队列:
lpstat -t如果打印机状态是“disabled”,恢复启用:
sudo cupsenable HP-DeskJet-1212如果队列里卡了很多任务,直接清空:
cancel -a HP-DeskJet-1212然后重启一次CUPS:
sudo systemctl restart cupsLinux打印服务器最稳的状态是“随时可接受任务,但不要有积压任务”,所以定期清队列是个好习惯。
6. 稳定运行后的日常使用:休眠唤醒、队列维护与演进思路
6.1 打印机休眠后AirPrint搜不到怎么办
1212进过深度休眠之后,不仅iPhone搜不到,有时连CUPS里都显示“不可用”。这个问题的根源是打印机的mDNS广播在休眠时暂停了,而CUPS缓存里残留了过期状态。
我的处理经验是:当你需要打印而手机搜不到打印机时,在Linux主机上先ping一下打印机的IP,有时候一次ping就能把它唤醒:
ping -c 2 192.168.1.200如果ping完还是不行,重启avahi让广播重新生效:
sudo systemctl restart avahi-daemon考虑到这台机器是打印服务器,我后来干脆在CUPS里设置了一个定时任务,每两小时向打印机发送一次空请求,让它不至于长时间无人问津而进入深度休眠。具体做法是用crontab配合一个简单的lp命令,打印一行空白页到队列,再用cancel取消,保持设备热状态。
6.2 打印任务的生命周期与日志容量
CUPS跑久了,/var/log/cups/下的日志文件会持续增长。对家用小主机来说,磁盘空间一般不是问题,但日志文件过大时会拖慢页面加载速度。
我习惯把日志级别调低一点,改/etc/cups/cups-files.conf:
LogLevel warn AccessLog none PageLog none然后定期清理日志目录:
sudo rm -rf /var/log/cups/error_log* sudo systemctl restart cups另外,如果有小孩或多人共用打印机,可以在CUPS里设置配额,限制每周打印页数:
lpadmin -p HP-DeskJet-1212 -o job-quota-period=604800 -o job-page-limit=100这样每周最多打印100页,避免墨水和纸张无意义消耗。
6.3 关于HPLIP升级和固件更新的提醒
打印机固件更新这件事,在Linux上要谨慎。HP官方的固件更新工具在Windows和macOS上做得顺手,Linux下通常通过HPLIP的hp-firmware来操作,但不是所有机型都支持。1212这种入门机型,刷固件风险不小,如果现在用得好,建议尽量别折腾。
HPLIP本身的升级,我建议按需升级而非追新。遇到过几次HPLIP从3.22升级到3.23后,CUPS队列里的驱动配置需要重新生成的例子。升级前先备份/etc/cups/目录:
sudo cp -r /etc/cups /etc/cups.bak万一升级后打印队列出问题,直接恢复备份再重启服务:
sudo systemctl stop cups sudo cp -r /etc/cups.bak/* /etc/cups/ sudo systemctl start cups6.4 这条链路还能延伸到哪些设备
CUPS+AirPrint的架构不局限于让苹果设备打印。因为CUPS后端还可以安装Samba共享,Windows电脑可以通过\\主机名\打印机名的方式直接使用这个队列,Android设备也可以借助PrintHand等支持IP打印的应用走同一个CUPS服务。打印服务器一旦架起来,整个家庭或小办公室就统一进了一个打印入口,后续加装任何打印机,只是在CUPS后台多添加一台设备的事。
我现在家里这台小主机上跑着CUPS,管理着DeskJet 1212和一台黑白激光打印机,所有设备打印都走同一个Web后台,状态一清二楚。最后再分享一个小技巧:如果哪天AirPrint又搜不到打印机,别急着重启整台主机,先sudo systemctl restart avahi-daemon,大多数情况下十秒钟就能恢复。这个动作我一个月里至少要做一次,算是摸透这台入门打印机的脾气了。