LWN:Fedora 关于无驱动打印的讨论!

共 5032字,需浏览 11分钟

 ·

2021-06-27 10:17


关注了就能看到更多这么棒的文章哦~

Fedora contemplates the driverless printing future

By Jonathan Corbet
June 4, 2021
DeepL assisted translation
https://lwn.net/Articles/857502/

在很久很久以前(真不愿承认已经那么久远了),编者在管理一个系统管理(system-administration)团队。那时,大多数日常痛点基本上必定来自两类设备:调制解调器(Modem)和打印机。现在,调制解调器比以前用得更加广泛了,但实际上多数都隐藏在一些接口控制器(interface controller)中,而且(通常)能够完美地工作了。不过,打印机仍然在不断制造问题,迫使人们重新思考人生。不过,在大家没有留意的地方,其实情况已经变得越来越好了。只不过正如最近在 Fedora project 的对话所说,要想利用这些改进,会需要一些改变,以及更多的信心。

一直以来,要想让打印机在 Linux 上正常工作,至少需要找到并安装正确的打印机驱动程序和 PostScript printer definition(PPD)文件,这样系统才可以用各种方式来与打印机正常通信。这个过程通常还需要安装一个单独的软件包,比如 hplip 这种,都是由打印机供应商提供的。一些供应商过去对 Linux 的支持一直比其他家好,但几乎所有厂商的产品都不能如人们所希望的那样完美运行。虽然这些年来 Linux 上的打印机设置方面有了明显的改善,但人们仍然挺害怕安装新的打印机。

The Internet Printing Protocol(互联网打印协议)

值得提醒一下,在 Linux 上处理打印工作的 CUPS 系统的维护者们一直有一个未解决的 issue,就是要求移除 CPUS 对打印机驱动程序(printer driver)的支持。Fedora 开发邮件列表在 5 月下旬也讨论了这个想法。打印机这个领域即将发生巨变,用户们自然会好奇这些变化何时发生、以及对他们有什么影响。

那些没有关注过打印技术发展的人可能会想,为什么会需要删除打印机驱动?驱动是使打印机能实际工作的东西呀。答案就是互联网打印协议(IPP),或者更具体地说,是它的一个衍生版本,名为 IPP Everywhere。思路很简单:如果所有的打印机都执行相同的协议,这样任何软件都可以利用它们来打印,而不需要安装特殊的驱动程序了。或者说,根本不需要进行任何配置(configuration)工作?类似很多其他技术演进,IPP Everywhere 的出发点似乎也是为了能与智能手机更好地配合,不过它在更广泛场景中也是很有用处的。

在 IPP Everywhere 描绘的未来中,打印机直接就能工作。它们会通过 multicast DNS 把自己公布出去,让网络上的其他机器可以发现自己。该协议允许打印机广告它有哪些能力、接受控制,因此像双面打印和纸盘选择这样的功能都可以正常工作。IPP Everywhere 预先定义了要打印的材料的若干组已知格式(format),因此不需要特殊的驱动来进行格式转换。用户只需要说明他们想要打印了,然后在可用的打印机和打印选项中进行选择、安装好打印机需要的新碳粉盒、然后打印出来的东西就可以用完扔到垃圾桶了。这个打印体验简直是美好得要上天了。

或者说,未来会成为一个打印天堂。鉴于 IPP Everywhere 自 2010 年以来就一直存在,人们可能觉得我们是不是应该早就达到这个要求了,其实不然,这里还有一些遗留问题。

Does it work?

CUPS 早就支持 IPP Everywhere 了,而且各大发行版普遍也启用了这种功能。但似乎它仍然不是 Linux 上使用打印机的缺省方式。例如,在网上搜索如何在 Linux 上设置编者的 Brother 激光打印机,搜索结果是 Brother 公司的驱动网页。按上面的步骤的话,虽然经过一个有点麻烦的过程打印机是可以很好地工作,但这并不是一个透明(transparent)或无驱动(driverless)的体验。

不过,这台打印机应该是支持 IPP Everywhere 的,avahi-browse 的输出中也可以发现这台设备。安卓设备就可以成功地用它来打印。这意味着在现代版本的 Linux 中,当我们试图打印一个文件时,打印机应该自动出现,根本不需要设置打印队列。虽然这个打印机确实出现了,但我们如果试图用它来打印的话,还没来得及点击 "打印" 按钮,打印对话框就挂掉了。这种体验可能算是无驱动的(driverless),而且还会减少纸张浪费,但肯定不是人们想要的结果。

如果我们明确添加一个打印队列呢?在刚刚全新安装的 Fedora 34 系统上启动 "add a printer" 对话框会出现一个完全空白的对话框,这肯定也不是打印机用户所期望看到的。输入打印机的 IP 地址之后(大多数用户输入这些 IP 地址的时候都会非常麻利……),就会出现下面的显示:其中有五个选项,但普通人总是搞不懂应该选择哪个。事实上,只有列表中的最后一个选项是有效的,而且要花好几分钟才能打印出一页,对于那些没有接触过 CUPS 的内部逻辑的用户来说,完全没法搞清楚为什么。

相反,如果一个人简单地告诉 CUPS 将打印机作为 IPP Everywhere 设备使用,其命令如下:

# lpadmin -p NewPrinter -E -v ipp://10.0.0.16/ipp -m everywhere

打印机立即就能正常工作了。当然,它一开始就先向 Fedora 系统抱怨说它需要新碳粉盒了,Fedora 系统也把这个请求准确地传递给了用户。因此,IPP Everywhere 确实完成了双向交流的作用,但似乎还没有完全到位。

大多数发行版提供商都努力在支持无驱动打印(driverless printing)。感兴趣的话,可以在网上找到 Arch Linux、Debian(和 Ubuntu)、Fedora、Gentoo、Red Hat 等的步骤说明。SUSE 和 openSUSE 似乎是最主要的例外,如果不是编者我的搜索技能有问题的话。

Old printers

理论上来说,几乎过去十年制造的所有打印机都应该是支持 IPP Everywhere 的。看起来大多数都支持,尽管认证打印机(certified printer)名单里明显缺少一些供应商。但并不是每个人都有那么新的打印机,因为打印机可以工作很多年。从 CUPS(以及使用它的 Linux 发行版)中移除打印机驱动,就意味着移除了对这些设备的支持。对于拥有这些硬件的用户来说,这样做是不合适的。

原本用来解决这个问题的方案就是 "打印机应用程序(printer applications)":能够与某一类打印机对话的程序,并且自己实现了 IPP Everywhere 协议,从而将这些打印机连接到 CUPS。现在只有少数一些这样的程序。其中包括 LPrint,可以驱动一些标签打印机(label printers)。支持其他设备的工作还正在进行中,包括在开发 "foo2zjs",可以显示为 IPP Everywhere 打印机,但底层仍然需要特殊的驱动程序才能工作。在今年的 OpenPrinting Google Summer of Code 的规划中,一个重头戏就是要开发出更多的打印机应用程序。

这并不能满足所有的用户,许多人在折腾了很久之后才终于让他们的打印机正常工作起来,并且不愿意在新系统中再次经历一遍这个折腾过程。有些人也担心会有一些 CUPS 能支持的打印机永远得不到打印机应用程序的支持。这确实很有可能,但目前还不清楚有多少用户会因为这些古老设备失去支持而受到影响。还有人抱怨说,这个过渡过程会导致很多问题,而却没有什么实际好处。Solomon Peachy 这样回答这个问题:

现代的(>2010 年)网络打印机能直接工作起来,不需要本地驱动(local drivers)。CUPS-shared 打印机也可以正常工作,并不需要本地驱动。有智能手机的人可以用大多数 CUPS-attached 打印机打印,同样不需要驱动程序。[…]

我们比以往任何时候都更接近拥有一个通用打印系统了,它不与任何特定的操作系统或客户端绑定,而且无论打印机在哪里或是如何连接的,它的行为都是一致的。这一切的基础是基于正式的标准化协议(同样重要的是,也是基于明确定义好的行为)、自由软件的参考实现,以及一致性测试的。

对许多人来说,尽管通用的打印系统能像预期的那样运行良好,但是它也无法很快到来。如果出现这种情况的话,可能就不会有人为失去打印机驱动程序而感到悲哀了。

Fake printers

不过,在 Fedora 的讨论中还出现了另一个问题。在一个打印机只是网上的一个符号的世界里,有什么可以防止攻击者架设假的打印机来捕捉到他们感兴趣的文件?关于这一点,似乎并没有多少人在考虑。正如 Zdenek Dohnal 所说。"CUPS discovery 设计时就是为了在安全的私人局域网上运行的,所以它假设你会有保护措施来防止有人连接到你的 WIFI。" Peachy 补充说,如果一个攻击者在本地网络上有足够能力来伪造一台打印机,那么他们可能就可以有权限做比这更糟糕的事情。

IPP 确实有认证(authentication)等方面的规定,但采用这些策略的话,就会导致该协议首先要提供的方便性的损失。因此,对安全(security)的总体态度可能仍然是 Dohnal 所描述的那样:本地网络(local network)本身需要是安全的。

在一个相关 issue 上,有一些参与了讨论的人担心一些 IPP Everywhere 设备的工作方式是把这些打印要求发送到基于云服务(cloud-based service)的位置来执行的。事实上,在向上述 Brother 打印机打印时,Android 打印对话框就警告说文件可能会经过第三方的服务器,当然在这种情况下似乎并没有真的发生这种情况。当互联网瘫痪时如果本地打印机就会失效,这肯定不是我们所期望的,但不知为什么,人们似乎正朝着这个方向前进。

When?

CUPS 项目多年来一直致力于实现无驱动(driverless)的世界。PPD 文件在 2009 年的 1.4 版本中首次被废弃(deprecated),尽管当时并没有什么替代方案。该项目最终在 2019 年的 2.3 版本中废弃了打印机驱动程序(printer drivers)。不过,"废弃(deprecated)" 并不等于 "删除(removed)",deprecated 是为了让人们注意到即将到来的改变。从 PPD 文件(目前仍然支持)就可以看出,deprecated 到最终被删除之间,可能会需要很长一段时间。

据说计划在 CUPS 的下一个主版本中移除打印机驱动,目前看来还没有明确的主版本发布日期。自 2020 年 4 月的 2.3.3 版本发布以来,该项目就再也没有发布过任何版本,所以目前进展似乎并不快。可能还是有一些时间可以让发行版提供商和用户们为这个变动做好准备。

这是一件好事。哪怕大多数打印机都能得到 IPP Everywhere 的支持,也还会有很多用户可以依赖打印机驱动程序(printer driver),也还有很多使用旧打印机的用户。要想让首批提供 CUPS 2.4 版本的发行版不会导致大量打印机无法工作的话,就需要做大量的工作和测试。如果能做到这一点,也许打印机就终于可以和调制解调器一样,不再需要折腾半天才能工作起来了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~


浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报