使用QEMU模拟CUPS的旧式打印机驱动程序

2020-05-29 20:32:19

在本指南中,我将解释如何在ARM-Linux上设置CUPS网络打印服务器,该服务器仍然可以使用针对其他体系结构的旧打印机驱动程序或已停产的打印机驱动程序,使用Docker with QEMU平台仿真。因此,例如,我们可以使用ARM服务器容器内模拟的32位Linux打印机驱动程序。在我的示例中,我将设置一台Dell 1250c打印机,但它也应该可以与其他设备配合使用。

有很长一段时间,我在家里使用Dell 1250c打印机,连接到运行OpenWRT的TP-Link路由器,作为简单的网络打印解决方案。使用此设置,只要客户端操作系统仍然支持旧式和专有戴尔驱动程序,我就可以从本地网络中的每台计算机进行打印。

很快,我想用我自己的家庭服务器取代TP-Link路由器,这是一台运行ArchLInux的小型廉价的ARM计算机。即使在这个平台上使用CUPS安装和配置打印服务器也很容易,但是需要开放源码的打印驱动程序。戴尔官方仅对此设备的Windows和MacOS提供有限的驱动程序支持。2011年起,Xerox Phaser 6000的备用驱动程序与此戴尔打印机兼容,支持Linux,但仅限于32位PC体系结构。我不能在我的手臂平台上使用它。

因此,我必须以某种方式使用CUPS和ARM板上的打印驱动程序“模拟”32/64位环境,才能再次使用这台打印机。我使用QEMU和Docker实现了这一点,使用的是试验性的、鲜为人知的容器配置。

在ARM板上,安装Docker并引导名为ArchLInux-cupsd的x64 ArchLInux容器。我们还需要AUR包qemu-user-static-bin。以下命令在ArchLInux ARM上进行了测试,但原则上安装程序应该也可以在其他发行版上运行。

Pacman-S docker qemu-user-static-bingpasswd-a picout dockersystemctl enable--now dockerDOCKER_CLI_ENTIFICATION=enable docker run--特权\-v/dev/bus/usb/:/dev/bus/usb/\-p 631:631\-dit\--始终重新启动\-entry point/usr/bin/cupsd\--name ArchLInux-cupsd--Platform Linux。

Docker和容器将在引导时自动启动,并将CUPS配置和网络打印端口631转发到主机。请确保在防火墙上打开此端口。

最后一个命令将在容器内生成一个shell。我们现在将安装CUPS守护程序和专有打印驱动程序。根据驱动程序的不同,您必须向包管理器添加自定义存储库。

除了安装依赖项之外,我们还将设置root密码,因为稍后我们将在CUPS Web管理界面中使用它。

启动CUPS打印服务器之前,请修改配置文件以允许远程访问。下面的示例在网络安全方面非常宽松,因此您可能需要根据需要进行更改。

[.]侦听0.0.0.0:631[.]#限制对服务器的访问.<;location/&>order Allow,Deny Allow all<;/location&>#限制对管理页面的访问.<;location/admin&>order Allow,Deny Allow all<;/location&>[.]。

检查容器内是否可以识别您的USB连接的打印机,并检查权限是否正确。

现在,您可以通过https://<;YOUR_SERVER_IP>;:631/admin/上的Web配置界面照常设置打印机(使用打印服务器的本地IP地址)。旧式打印机驱动程序也应该可用且工作正常。

在最后一步中,我们将配置Avahi,这是一个将我们的网络打印机通告给本地网络的守护进程。我猜CUPS可以和Avahi一起运行得很好,但是在Docker中没有Systemd支持(在Podman中也没有多平台支持),在容器中同时运行就有点复杂了。因此,我决定在主机系统本身的Docker容器之外运行Avahi。

创建以下avahi-service文件,但一定要替换以下部分:name、rp、ty、adminurl和note。部分adminurl非常重要,它将与CUPS使用的内部打印机名称相对应。转到https://<;YOUR_SERVER_IP>;:631/printers/,,单击您配置的打印机并记下打印机名称。

standalone=';no';?>;<;!--*-nxml-*-->;<;!DOCTYPE服务组系统";avahi-service.dtd";>;<;service-group>;<;名称>;/名称>;服务<;<;类型>;_ipp._tcp<;/类型>;<;subtype>;_universal._sub._ipp._tcp<;/subtype>;<;port>;631<;/port>;<;txt-Record>;txtver=1<;/txt-Record>;<;txt-Record>;qTotal=1<;/txt-Record>;<;txt-record>;rp=printers/Dell_1250c_Color_Printer<;/txt-record>;<;txt-Record>;ty=戴尔1250c<;/txt-Record>;<;txt-record>;adminurl=http://192.168.178.2:631/printers/Dell_1250c_Color_Printer<;/txt-record>;<;txt-Record>;备注=戴尔1250c<;/txt-Record>;<;txt-record>;priority=0<;/txt-record>;<;txt-Record>;product=(GPL Ghostscript)<;/txt-Record>;<;txt-Record>;打印机状态=3<;/txt-Record>;<;txt-record>;printer-type=0x801046<;/txt-record>;<;txt-record>;Transparent=T<;/txt-record>;<;txt-Record>;Binary=T<;/txt-Record>;<;txt-Record>;传真=F<;/txt-Record>;<;txt-Record>;Color=T<;/txt-Record>;<;txt-Record>;双面=T<;/txt-Record>;<;txt-Record>;Staple=F<;/txt-Record>;<;txt-Record>;Copies=T<;/txt-Record>;<;txt-record>;Collate=F<;/txt-record>;<;txt-Record>;Punch=F<;/txt-Record>;<;txt-Record>;/txt-Record>;<;txt-Record>;Scan=F<;/txt-Record>;<;txt-record>;pdl=application/octet-stream,应用程序/pdf,应用程序/PostScript,图像/jpeg,图像/png,图像/urf;/txt-Record>;<;txt-Record>;urf=w8,SRGB24,cp1,rs600<;/txt-Record

根据您的设置,您应该在systemd-Resolution中禁用多播DNS,因为我们将结合使用avahi和nss-mds。

您的Linux客户系统将使用网络打印机,一旦CUPS和Avahi在那里运行,它将自动检测打印机。使用以下命令查看您的服务器是否正在播发打印机。

Avahi-BROWSE-ART+wlan0 IPv4 Dell 1250c_ip._tcp local=wlan0 IPv4 Dell 1250c_ip._tcp local hostname=[picoud.local]address=[192.168.178.2]port=[631]txt=[";URF=w8,SRGB24,CP1,Rs600";";PDL=application/octet-stream,application/pdf,application/postscript。";Punch=F";";Colate=F";";副本=T";";装订=F";";双面=T";";颜色=T";";传真=F";";二进制=T";";透明=T";";打印机类型=0x801046&#。";Priority=0";";备注=DELL 1250c";";adminurl=http://192.168.178.2:631/printers/Dell_1250c_Color_Printer";";ty=DELL_1250c_Color_Printer";";rp=printers/Dell_1250c_Color_Printer";";qTotal=1";";txtver=1";]。

在iOS 13、Windows 10和最新版本的Ubuntu上,无需安装任何驱动程序即可发现和使用打印机。

*此表单收集您的姓名、电子邮件和内容,以便我们可以跟踪网站上的评论。有关更多信息,请查看我们的隐私政策,在该政策中,您将获得有关我们存储您的数据的位置、方式和原因的更多信息。